汉语翻译:shan66。

预估议案费:300元。

递交方法:发送邮件至林微#360.cn,或登陆电脑版网页提交。

文中将为阅读者详解QuickZip v4.60中跨站脚本攻击系统漏洞的有关专业知识,该系统漏洞自2010年发生至今,其设计方案仅适用32位Windows XP。因而,我打算试着在64位Windows 7上再现这一系统漏洞,这将是一个(有意思的)挑戰!

认证性检测(Proof of Concept的简称)

因而,我在exploy-db中爬取了QuickZip v4.60 Windows XP系统漏洞,并将应用它建立一个简洁的PoC来开启奔溃。

0x0eedfade怎么解决-0x0eedfade解决方法-第1张图片上边的编码建立了一个压缩包,在其中只包括一个名叫4064A的文档,拓展名叫”。txt”。Header_1.header_2和header_3是ZIP文档构造需要的文章标题。我不详说了,但是你能在这儿多看一下。

假如您在QuickZip中开启创好的ZIP文档并试着获取其內容(或只需双击鼠标文件夹名称),QuickZip将奔溃。

掌握更多的有关奔溃的信息内容。

行吧,使我们运作PoC,看一下发生什么事。

应用上边的Python脚本制作建立一个ZIP文档,应用QuickZip开启它,运行ImmunityDebugger,额外到QuickZip过程,双击鼠标QuickZip中的文件夹名称开启奔溃。留意:大家会持续反复这一全过程!

0x0eedfade怎么解决-0x0eedfade解决方法-第2张图片非常好,坠毁已经按照计划开展。此外,这儿有一个除外,能够在显示屏下边见到“载入[00190000]时浏览违反规定”。这代表大家尝试载入一个失效的基址,这开启了一个出现异常。

下面,使我们科学研究一下SEH链。

0x0eedfade怎么解决-0x0eedfade解决方法-第3张图片好,来看我们可以操纵nSEH表针了!下面,大家试着测算偏移。

相抵

一如既往,我觉得用莫娜(https://GitHub.com/corelan/mona)来实现许多每日任务。

最先,大家转化成一个包括4064个唯一标识符的模版,并将其放进PoC漏洞检测编码的合理负荷中:

0x0eedfade怎么解决-0x0eedfade解决方法-第4张图片再度开启奔溃,看一下会产生哪些。

0x0eedfade怎么解决-0x0eedfade解决方法-第5张图片嗯,奔溃看上去有点儿不一样。这儿的情况是,LEAVE命令尝试从局部变量跳回0EEDFADE详细地址,但这也是程序流程的失效基址。

除此之外,大家好像控制不了SEH。

0x0eedfade怎么解决-0x0eedfade解决方法-第6张图片可是,一定要注意,大家事实上是在内核模块中(请参照Immunity对话框的名字:“CPU–主线任务程,控制模块核心ba”)。应用SHIFT F9将执行权回到给程序流程,查询是不是开启了另一个出现异常,但在QuickZip控制模块中。

0x0eedfade怎么解决-0x0eedfade解决方法-第7张图片0x0eedfade怎么解决-0x0eedfade解决方法-第8张图片

太棒了,看上去成功了!太棒了,看上去成功了!

应用下列指令让mona测算全部偏位:

0x0eedfade怎么解决-0x0eedfade解决方法-第9张图片0x0eedfade怎么解决-0x0eedfade解决方案-第10张图片

在这儿,大家最有兴趣的偏位是nSEH field: offset 292。这儿,大家最有兴趣的偏移是nSEH字段名:偏移292。

使我们用偏位信息内容升级PoC,并试着再度开启奔溃。

0x0eedfade怎么解决-0x0eedfade解决方法-第11张图片0x0eedfade怎么解决-0x0eedfade解决方法-第12张图片

太棒了,大家操纵了SEH!使我们将出现异常发送给程序流程(SHIFT F9),并进一步调研发生什么事。太棒了,大家操纵了SEH!使我们将出现异常传送给程序流程(SHIFT F9)并进一步调研发生什么事。

0x0eedfade怎么解决-0x0eedfade解决方法-第13张图片自然,开启了另一个出现异常,由于43434343是这一程序流程的失效基址,可是使我们看一下局部变量上发生什么事——一般是SEH外溢,大家必须启用一组POP-POP-RET命令来回到缓冲区域。

寻找这种的表明非常容易,但最先,大家务必了解什么标识符是容许的。这也是大家必须特别关注的下一个难题。

不太好的人物角色

一般来说,大部分全是这种的。为什么呢?由于大家的外溢是对于文件夹名称主要参数的,而且文件夹名称中采用的标识符种类是比较有限:一般只有打印出ASCII标识符。

假如应用手动式方式,那麼应用mona解析xml会耗费太长期来寻找全部的坏标识符,因此这儿简易假定我能应用ASCII表格中除0x00.0x0a和0x0d(各自表明NULL.回车符和回车符)以外的全部标识符(值最大的0x7F的标识符)。

这一假定很有可能比具体情况更难(由于我必须防止应用能够结合实际应用的标识符),或是假如假定中的一些标识符事实上是不正确的,很有可能会使得大量的难题。

我不太喜欢这一假定,可是为了更好地开展这种训练,我在这例外一下。

我只必须记牢,分外当心,假如有哪些事儿产生,我需要再度查验坏的人物角色。有点儿探险,但很有意思。再次!

持续性有机化学污染物质

使我们根据mona寻找一个简易实用的POP-POP-RET命令:

0x0eedfade怎么解决-0x0eedfade解决方法-第14张图片0x0eedfade怎么解决-0x0eedfade解决方法-第15张图片

这儿寻找许多結果(7909!),但突显的数据看上去最有期待——所有由英文字母数字字符构成,坐落于QuickZip.exe二进制文件自身中,有希望使其更具有混合开发特点,由于我们不期待依靠特殊的电脑操作系统DLL。这儿发觉了许多結果(7909!),但突显的数据看上去最有期待——所有由英文字母数字字符构成,坐落于QuickZip.exe二进制文件自身,这有希望使其更混合开发,由于大家不愿依靠特殊的电脑操作系统DLL。

这儿唯一的情况是0x00字节数,可是因为程序流程的详细地址空,每一个详细地址都以0x00开始,因此使我们尝试看一下它是不是会危害人们的漏洞检测编码。

升级PoC系统漏洞编码,用x33 x28 x42 x00更换现阶段意味着SEH的CCCC,再度开启奔溃并调研SEH链。

0x0eedfade怎么解决-0x0eedfade解决方法-第16张图片好的,来看大家的详细地址沒有错码,合乎大家的预估。设定一个中断点(F2),随后按SHIFT F9将决策权迁移给程序流程。

0x0eedfade怎么解决-0x0eedfade解决方法-第17张图片如您所闻,大家将跳转至POP-POP-RET命令,使我们与F8一起实际操作,并在RETN 4命令后终止。

0x0eedfade怎么解决-0x0eedfade解决方法-第18张图片太棒了,大家早已进到重力梯度...可是有一个难题:由于NULL字节数,SEH链以后的一切都被锯断了,因此大家沒有被赋予了过多的空去做一切事儿。

shellcode在哪儿?

好,大家来剖析一下,看一下大家的进度。

大家想方设法摆脱了它,操纵了SEH,这很好!难题是咱们的重力梯度受限于十分比较有限的字段名,并且由于大家务必应用NULL字节数的详细地址来启用POP-POP-RET命令,因此大家的重力梯度被锯断了,交给shellcode的空室内空间也不是非常大。

那麼它有多大呢?别忘记,为了更好地获得SEH,大家还填好了重力梯度的开始:

0x0eedfade怎么解决-0x0eedfade解决方案-第19张图片那麼大家有多少个空房间呢?一共292字节数。悲剧的是,这种还不够。

殊不知,这个问题好像能够根据蛋猎手来处理!

Egghunter仅仅一堆命令,在程序流程的运行内存上空检索一个特殊且已经知道的字节数编码序列(“egg”),一旦寻找,便会跳转到这一地区。

因此大家无须担忧他们的机壳编码会在哪儿完毕。我们可以启用eghtunter方法,它会为大家寻找他们!

听起来不错,但下一个难题是,重力梯度的“截至”一部分确实在运行内存中吗?使我们看一下。

使我们转化成3764个单标识符模版(在空字节数后添充大家的重力梯度),并且用他们更换目前的A。

0x0eedfade怎么解决-0x0eedfade解决方法-第20张图片大家引起了坠毁。在我们获得第一个出现异常时,不必将出现异常传送给程序流程,反而是启用下列指令来检索运行内存中之前转化成的模版:

0x0eedfade怎么解决-0x0eedfade解决方法-第21张图片0x0eedfade怎么解决-0x0eedfade解决方法-第22张图片

棒极了! 重力梯度的全部“断开”一部分依然在运行内存中,因此大家应当能取得成功地应用egghunter来获得用户的shellcode。干得好!重力梯度的全部“断开”一部分依然在运行内存中,因而人们应当能取得成功地应用egghunter来获得用户的shellcode。

生鸡蛋猎手

如今我们可以应用egghunter来获得机壳编码,可是大家仅有292个字节数可以用。事实上,大家可以用292字节数空做许多事儿,可是别忘记,大家只有应用极其比较有限的字段名。

大家试着用metasploit的x86/alpha_mixed encoder对egghunter开展编号,看一下这以后还剩是多少空。

最先,使我们转化成蛋猎人的重力梯度。请记牢,大家应用的是64位电脑操作系统,因而大家还要选择相对应的egghunter方法(大量详细资料,请浏览https://www . corelan . be/index . PHP/2011/11/18/wow 64-egg hunter/):

0x0eedfade怎么解决-0x0eedfade解决方法-第23张图片留意:我应用了bufferedregister = eax选择项,由于伺服电机必须寻找它在运行内存中的部位,便于它能够编解码合理负荷。最开始,承担此项工作中的方法没有ASCII可打印出字段名内,因而它会毁坏大家的重力梯度。

特定bufferregister选择项大部分是告知伺服电机不要担心怎样在运行内存中找出自身的部位。大家将提早搞好此项工作中,并将其详细地址纳入EAX登记册。那样,大家编号的egghunter便是纯ASCII标识符(有关转化成英文字母数据shellcode的详细信息能够在这儿寻找)。

大家发布了PoC漏洞检测编码,以体现到迄今为止大家工作中的实效性。

0x0eedfade怎么解决-0x0eedfade解决方法-第24张图片使我们开启一次奔溃,把决策权交到程序流程,实行POP-POP-RET命令。随后,在CPU对话框中往上翻转,寻找egghunter合理负荷的完毕部位和一组EC ECX命令(意味着标识符a)。

0x0eedfade怎么解决-0x0eedfade解决方法-第25张图片好的,看上去是有,也好像是恰当的:沒有应用不符合规定的标识符!

跳回来。

如今咱们有越多的事儿要考虑到——这儿最重要的一点是,大家必须把生鸡蛋猎手的详细地址放到EAX,随后跳到那边。

在空中间的比较有限時间内,大家怎样实现这一点?最先,大家有多少个空房间?通过简易测算,它是146字节数(nseh偏移减掉egghunter的尺寸)。

146字节数能干什么?大家只必须写几个命令,但他们务必归属于容许的比较有限字段名。在这样的情形下,我们不能应用以及在egghunter中采用的通用性伺服电机,由于大家压根沒有充分的空来达到它。

因而,大家必须建立自身的伺服电机!听起来很头痛,但事实上比看上去简易多了。

最先,大家一起来看看现阶段在栏目中的部位。

0x0eedfade怎么解决-0x0eedfade解决方法-第26张图片大家仅有4个字节数能够跳回重力梯度并逐渐撰写订制的伺服电机。与此同时,这四个字节数最好英文字母数据。幸运的是,有好几个常用的命令,尤其是在那种状况下!

在这些方面,我们可以参照殖民http://buffered.io/posts/jumping-with-bad-chars/.共享的有关专业技能

简单点来说,我们可以简单地应用JO和JNO命令向大家的重力梯度启用近迁移命令。可是大家能跳有多远呢?在使用一些容许的标识符自动换行后,我发现了一些欠佳标识符会被转化成A2,转化成十进制时是92,这应当会给企业给予一定的空来建立大家的自定伺服电机。

0x0eedfade怎么解决-0x0eedfade解决方法-第27张图片0x0eedfade怎么解决-0x0eedfade解决方法-第28张图片

让人惊讶的是,此次自动跳转到你们的重力梯度! 如今,建立自定伺服电机,撰写命令,自动跳转到egg hunting方法。让人震惊的是,大家此次跳到你们的重力梯度上!如今,建立一个自定伺服电机,撰写命令,并自动跳转到生鸡蛋捕猎程序流程。

自定伺服电机

为了更好地自动跳转到eghunter,大家必须写许多命令,由于沒有不应用“坏”标识符的同时方式。

要处理这个问题,大家应该保证以下几个方面:

找到我们要写的命令的操作码。

应用单一的数学课命令(即ADD和SUB),并根据容许的标识符将以上流程中操作码的值放进大家选择的存储器(如EAX)中。

大家将该存储器的值载入局部变量,进而将人们需要的命令载入ESP偏向的储存地区。

听起来很繁杂?但也没那麼糟。

最先,大家必须调节局部变量以载入大家操纵的运行内存地区。仔细观察ESP的值和大家当下的部位(上边的截屏),我们可以看到大家必须将ESP偏位0x62C(0x0018FB58(EIP值)减掉0x0018F528(ESP值),随后减掉0x4 (空字节数用以添充))。

0x0eedfade怎么解决-0x0eedfade解决方法-第29张图片0x0eedfade怎么解决-0x0eedfade解决方法-第30张图片

棒极了,大家的重力梯度彻底与局部变量能够完美搭配了,下边逐渐撰写大家的伺服电机。太棒了,大家的重力梯度与局部变量彻底配对。使我们逐渐撰写伺服电机。

留意:因为pop esp命令(x5c),ZIP文档的信息看上去会有一些不一样。X5c意味着一个反斜杠,被QuickZip表述为一个文件夹名称……这在未来也许也有一些危害,但如今早已算不得什么了。

0x0eedfade怎么解决-0x0eedfade解决方法-第31张图片如今,大家必须做的最终一件事是写一组命令,将egghunter的起止详细地址放进EAX并自动跳转到它。

为了更好地防止“坏”标识符,大家将在EAX存储器中设定大家必须的操作码的值,并将其上传到大家优化过的局部变量上。那样,大家必须的命令将被载入大家操纵的运行内存地区。

下边是一个表述的事例。

0x0eedfade怎么解决-0x0eedfade解决方法-第32张图片使我们升级漏洞检测编码并运作它。

0x0eedfade怎么解决-0x0eedfade解决方法-第33张图片太棒了,大家早已取得成功地在EAX设置了大家必须的值,并把它推倒局部变量上,事实上写出了大家必须的命令!

使我们对全部剩下的字节数做一样的事儿。

通过以上解决后,新的PoC应如下所示所显示:

0x0eedfade怎么解决-0x0eedfade解决方法-第34张图片0x0eedfade怎么解决-0x0eedfade解决方法-第35张图片

实行以后:实行后:

0x0eedfade怎么解决-0x0eedfade解决方法-第36张图片太棒了,大家早已取得成功用合理标识符撰写了需要的编码!如今只需跳回该地区并实行它。大家还必须将大家载入的临时性0xDEADBEEF详细地址更改成具体偏移,前提条件是我们知道它是啥……但为时过早。

弹跳

悲剧的是,大家沒有很多的空用以自动跳转:在人们的伺服电机编码以后有5个字节数,在伺服电机编码以前仅有4个字节数。所以,大家必须选择对应的命令,使我们跳到刚撰写的编码。

实际上,因为性情的限定,大家事实上做不来很多事儿。一切简洁明了的向后自动跳转命令都包括失效标识符,没法调用到恰当的部位。因而,大家应当考虑到是不是器重之前应用的自动跳转。

使我们看一下大家现阶段有着的重力梯度。

0x0eedfade怎么解决-0x0eedfade解决方法-第36张图片大家必须想象力丰富。使我们再次应用SEH的JNO弹跳,再度返回大家操纵的记忆地区。我们可以在当今伺服电机的重力梯度开始加一些NOP,随后根据自定伺服电机用别的自动跳转命令遮盖,进而自动跳转到刚写好的编码。

嘿,这能可以吗?我解释一下。

大家必须应用的自动跳转命令可能是一个简洁的JMP $ -16( xeb xee),但悲剧的是它包括失效标识符,因此它不宜大家。殊不知,一切含有合理标识符的自动跳转命令都是会离大家很远。

殊不知!我们可以应用订制的伺服电机来解决他们,如同我把egghunter的详细地址放到EAX一样,只需调节偏移并改动编码。

最先,加上大家的JMP命令。随后,改动大家的初始局部变量,便于SEH弹跳能够精确地抵达大家的原始部位。最终,在伺服电机的开始加一些NOP,后边会讲到。下边大家将详解它的原理。

这儿,使我们从订制伺服电机前边的NOP逐渐。因为大家必须一个合理有效的字段名,我们可以应用x41 x41(INC ECX)做为NOP。

下面,实行局部变量调节。从当今情况看来,大家必须进一步挪动6个字节数才可以载入要遮盖的地区。因而,我们可以作出对应的调节。

最终,大家必须用伺服电机撰写JNZ $ -16( x75 xee)命令。使我们用新的命令更换最终2个x90(请记牢,大家在这儿应用了Little–Endianness,因此大家必须相反写)。

最终,编码如下所示所显示:

0x0eedfade怎么解决-0x0eedfade解决方法-第38张图片一旦实行,将产生下列状况:

撞击被开启。

启用POP-POP-RET命令。

获得JNO的自动跳转详细地址$ 92。

重新开始实行自定伺服电机。

编码最后将抵达在流程3中自动跳转的JNO命令。

再度获得JNO的自动跳转详细地址,但这一次,大家登陆的第一条命令是刚载入的16字节跳转命令。

获得自动跳转命令的自动跳转详细地址。

应用自定伺服电机撰写要实行的命令。

使我们看一下发生什么事。

实行订制伺服电机后:

0x0eedfade怎么解决-0x0eedfade解决方法-第39张图片获得JMP的自动跳转详细地址。

0x0eedfade怎么解决-0x0eedfade解决方法-第40张图片写命令前登陆,提前准备实行。

0x0eedfade怎么解决-0x0eedfade解决方法-第41张图片太棒了,恰好是大家所希望的!如今大家只必须搞清楚用哪种值来替代0xDEADBEEF!

使我们来统计一下——ESP的当今值是0x0018FB4E,而egghunter编码从0x0018FA90逐渐,这代表大家必须从EAX减去0xBE才可以使EAX偏向大家的到达站。

大家逐渐改动系统漏洞编码。大家也没有从EAX减去0xBE,反而是减掉了0xBE。PoC应改动如下所示:

0x0eedfade怎么解决-0x0eedfade解决方法-第42张图片0x0eedfade怎么解决-0x0eedfade解决方法-第43张图片

有一个警示强调在文档结尾有一些废弃物,但没事儿,由于依然能够取得成功开启该文件。文档结尾有一些废弃物的警示,但是没事儿,由于文档或是能够取得成功开启的。

使我们开启一个奔溃,看一下此次大家是不是能在运行内存中寻找这一模版。

0x0eedfade怎么解决-0x0eedfade解决方法-第44张图片我的上帝,它就在那里!!!

机壳编码

如今,大家只必须安裝基本方法来解决shellcode——大家必须找到欠佳标识符,随后在shell code以前插进一个“egg”(w00 tw 00t)并两端对齐局部变量。

找坏人物角色的关键点我不详说了,由于我这儿早已那么干了。幸运的是,对咱们而言,这一重力梯度中唯一的坏标识符是x00.x0a和x0d。

大家还必须在shellcode的开始插进w00tw00t标识符,以保证egghunter可以精准定位它,并将实行权重值偏向“egg”以后的第一条命令。

最终,大家必须两端对齐局部变量,以保证ESP偏向16字节数倍率的详细地址。其根本原因是一些“SIMD”(单指令.多数据信息)命令能够并行处理处理运行内存中的好几个字,因而规定这种字的起止详细地址是16字节数的倍率。

如果我们沒有恰当两端对齐局部变量,shellcode将没办法工作中。我们可以非常容易地应用单独命令AND esp,0xFFFFFFF0来两端对齐局部变量,换句话说,恰好在w00t w00t“egg”以后,具体shellcode以前。

针对这一定义证实,大家将应用msfvenom转化成一个简洁的shellcode,弹出来计算方式,如下所示所显示:

0x0eedfade怎么解决-0x0eedfade解决方法-第45张图片0x0eedfade怎么解决-0x0eedfade解决方法-第46张图片0x0eedfade怎么解决-0x0eedfade解决方法-第47张图片

在我们开启转化成的cst.zip文件时,大家的漏洞检测编码便会运作,几秒(由于egghunter根据应用软件的运行内存寻找“蛋”)后,大家应当见到计算方式被开启。在我们开启转化成的cst.zip文件时,大家的漏洞检测编码可能运作。几秒后(由于egghunter根据应用软件的运行内存找到“蛋”),大家应当见到计算方式打开了。

0x0eedfade怎么解决-0x0eedfade解决方法-第48张图片成功了。!

汇总

在这篇文章中,大家早已取得成功地再次建立了64位版本号的QuickZip漏洞检测编码,而且它还可以在Windows 7上运作!

总的来说,大家根据应用极其比较有限且容许的字段名(基本上可以用ASCII打印出)建立了一个egghunter漏洞检测编码,编译程序了我们自己的伺服电机,并抵达egghunter编码,最终根据在运行内存中自动跳转抵达shellcode。

应当强调的是:

找到容许应用的标识符,错误时记牢他们。

假如缓冲区域不足大,不要气馁——充分发挥你的想像力!

依据开发设计系统漏洞的服务平台,保证应用恰当的egghunter编码(32位和64位)。

撰写属于自己的伺服电机并沒有那麼难,可是必须大批量的训练和细心。

保证在实行shellcode以前两端对齐局部变量。

评论(0条)

刀客源码 游客评论