Windows的ASLR绕过技巧:利用未经允许执行的插件实现

Windows的ASLR绕过技巧:利用未经允许执行的插件实现

ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。据研究表明ASLR可以有效的降低缓冲区溢出攻击的成功率,如今Linux、FreeBSD、Windows等主流操作系统都已采用了该技术。

本文为一篇短文,用到了如下一些软件,安装这些软件主要是为了实现针对微软IE的ASLR进行绕过。

DivX Player 10.0.2

Yahoo Messenger 11.5.0.228

AOL Instant Messenger 7.5.14.8

这些软件包含了一系列的lib库,这些库加载到内存时并未进行ASLR,原因是这些库在编译时,没有设置dynamicbase标志。(译注:有关dynamicbase请参照此文http://msdn.microsoft.com/zh-cn/library/bb384887.aspx)。这些库可以在IE中被轻易的加载,因为这些库已经注册在系统中,因此可以未经允许而执行,并不会提示用户是否需要执行。(译注:文中含义可能是,当这些库被IE加载时,不会提示用户,系统会认为内存中的库作为IE进程的一部分了。)如下为这些库的ProgID或者ClassID。

clip_image001

clip_image001[1]

 

可以通过“Manage Add-ons”来查看哪些库可以未经允许即可加载。访问方法为:Internet Explorer=>“工具”=>“管理插件”

clip_image002

clip_image002[1]

然后选择“Run without Permission”

clip_image003

clip_image003[1]

如下的脚本可以用来测试这些库是否已经被加载,或者点击此处来立即运行它。如果一个库已经被加载了,基地址x0100000000将会被重定位。值得注意的是雅虎的Yahoo Messager对象检查并未工作所以会失败,但是如果这个库被安装了,那么它仍会被载入。当然有关“AOL Instant Messenger”取决于你的下载版本,最新版本8.0.6.1并未包含“Aim.dll”。

<HTML>

<SCRIPT language="JavaScript">

//

if (DivX1() == "DivX")

{

   document.write("DivX VOD Helper Plug-in npovshelper.dll loaded<br>");

}

if (DivX2() == "DivX")

{

   document.write("DivX Web Player (DivXBrowserPlugin) npdivx32.dll loaded<br>");

}

if (DivX3() == "DivX")

{

   document.write("DivX Web Player (RoviStreamPlayer) npdivx32.dll loaded<br>");

}

if (Aol() == "AIM")

{

   document.write("AOL Messenger isAim.dll loaded<br>");

}

if (Yahoo() == "YahooM")

{

   document.write("Yahoo Messenger YPagerChecker.dll loaded<br>");

}

//

function DivX1() 

{

var divxver = "";

var divx = 0;

var err = 0;

try {

         divx = new ActiveXObject("OVSHelper.OVSHelperCOM.1") 

   } catch (err) {

      document.write("DivX VOD Helper Plug-in npovshelper.dll failed<br>");

   }

if ((typeof divx) == "object") {

      divxver = "DivX";

   }

return divxver;

}

function DivX2() 

{

var divxver = "";

var divx = 0;

var err = 0;

try {

         divx = new ActiveXObject("npdivx.DivXBrowserPlugin.1")

   } catch (err) {

      document.write("DivX Web Player (DivXBrowserPlugin) npdivx32.dll failed<br>");

   }

if ((typeof divx) == "object") {

      divxver = "DivX";

   }

return divxver;

}

function DivX3() 

{

var divxver = "";

var divx = 0;

var err = 0;

try {

         divx = new ActiveXObject("nprovi.RoviStreamPlayer.1")

   } catch (err) {

      document.write("DivX Web Player (RoviStreamPlayer) npdivx32.dll failed<br>");

   }

if ((typeof divx) == "object") {

      divxver = "DivX";

   }

return divxver;

}

function Aol() 

{

var aolver = "";

var aol = 0;

var err = 0;

try {

         aol = new ActiveXObject("isaim.aimlocator.1")

   } catch (err) {

      document.write("AOL Messenger isAim.dll failed<br>");

   }

if ((typeof aol) == "object") {

      aolver = "AIM";

   }

return aolver;

}

function Yahoo() 

{

var yahoover = "";

var yahoo = 0;

var err = 0;

try {

         yahoo = new ActiveXObject("YPagerChecker.MessengerChecker.1")  

   } catch (err) {

      document.write("Yahoo Messenger YPagerChecker.dll failed<br>");

   }

if ((typeof yahoo) == "object") {

      yahoover = "YahooM";

   }

return yahoover;

}

</SCRIPT>

</HTML>

在Process Explorer中可以看到如下情况:

clip_image004

clip_image004[1]

利用未设置dynamicbase标志的模块实现ASLR的绕过现在恐怕已经是过时的新闻了,现在有如下几种办法来解决。

    1、安装微软的EMET,它支持多项减灾技术,其中一项是地址空间布局随机化(ASLR),强制模块地址对指定的进程随机化。(译注:有关EMET参见http://www.microsoft.com/en-us/download/details.aspx?id=29851

    2、升级IE到版本10或者11,这两个版本安装了补丁包,使得在Win7下强制ASLR。

    3、升级系统到Windows 8,该版本的操作系统将支持强制ASLR,IE会通知OS随机化浏览器加载的所有模块。(译注:有关强制ASLR参见http://support.microsoft.com/kb/2639308

http://www.insanitybit.com/2012/11/09/windows-8-takes-aslr-to-the-next-level/

    4、通过插件管理窗口,将相应的库设置为无效。

如果运行IE10、IE11或者EMET,所有的地址都会被随机化处理,如下图所示:

clip_image005

clip_image005[1]