缓冲区溢出:Vanilla EIP Overwrite 与 SEH

secM  575天前

简介

iSmartViewPro是一款应用程序,用于通过PC/笔记本电脑远程管理CCTV摄像头。该软件的1.5版本是一个相对较旧的版本,其中含有多个缓冲区溢出漏洞,多名研究人员在https://www.exploit-db.com/上报告了这些问题。本文的目的是创建一个PoC python脚本,来演示如何利用该应用程序中的这些漏洞。关于缓冲区溢出漏洞的各种缓解技术,如ASLR(地址空间布局随机化),DEP(数据执行保护)和SEHOP(结构化异常处理程序覆盖保护),详情请访问: https://www.synopsys.com/blogs/software-security/detect-prevent-and-mitigate-buffer-overflow-attacks/

Vanilla EIP Overwrite缓冲区溢出

第一种攻击该应用程序的方法是利用经典的缓冲区溢出漏洞,覆盖EIP(指令指针)。存在漏洞的软件外观如图1所示:

 1.png

图1

通过点击“+”号,会弹出一个名为“Save Path for Snapshot and Record file”的字段,实际上,该字段存在安全隐患:

 1.png

图2

为了确认该字段确实存在漏洞,我们可以写入1000个“A”字符:

 1.png

图3,右侧为Immunity Debugger

单击Save按钮,将会出现预期的访问违规(access violation)错误,具体如下图所示:

1.png

图4

其中,Mona脚本是Immunity Debugger的Python插件。Pattern_create命令用于创建一个含有1000个字符的循环模式(用于查找偏移量):

1.png

图5

之后,Mona生成的序列将被保存到一个名为pattern.txt的文件中。同时,该文件的内容被复制粘贴到易受攻击的字段中。这时,我们将得到一个新的访问违规错误,同时EIP寄存器被其他4个字节所覆盖。

1.png

图6

下面,我们使用pattern_offset命令来查找这4个字节在序列中的位置:

1.png

图7

为了确认272是否为正确的偏移量,我们可以发送如下payload:272个“A”字符,4个“B”字符,其余字符都是“C”字符(总共1000个字符)。如果偏移量为272的话,EIP将被字符“B”所覆盖:

1.png

图8

然而,ESP指向了字符“C”所在的缓冲区,具体如图9所示:

 1.png

图9

同样,Mona也可以用来枚举当前进程加载的所有DLL。我们感兴趣的是那些禁用了ASLR(地址空间布局随机化)并且不可重定位(rebasable)的DLL:

 1.png

图10

为此,我们需要在已加载的可执行模块中找到符合上述条件的“jmp esp”gadget。通过这样的指令,我们就可以用gadget的地址覆盖指令指针,并跳转到我们控制之下的缓冲区:

 1.png

图11

上面第一个返回的地址可以用来修改exploit(4个“B”字符)。如果一切顺利的话,我们就能抵达“jmp esp”指令:

 1.png

图12,我们抵达了所需的地址

在利用缓冲区溢出漏洞时,需要考虑可能的坏字符(badcharacter)。坏字符通常会被我们的程序用另一个字符替换掉(有些程序只接受ASCII字符,其他的字符会被转化为ASCII字符)。虽然可以通过多种方法来检查坏字符(例如使用Mona插件),但是这次,我们将通过手动方式进行检查,因为这样更容易,也更快。当然,字节“\x00\x0a\x0d”从一开始就没有考虑在内,因为大多数时候它们被认为是无用的(有很多字符可以使用,根本不需要这3个字符)。我们对“C”序列进行了相应的改造,使其包含从“\x01”到“\xff”之间的字节(当然,不包括“\x0a”和“\x0d”字节),并检查它们在内存中的表示方式:

 1.png

图13,所有的字符都没有被修改过,可以用来构建我们的payload

Msfvenom可用于生成反向Shell payload,这样的话,就能在攻击者的计算机(端口443)上收到一个反向Shell,而无需使用指定的字符并且知道ESP指向我们的缓冲区:

 1.png

图14

在生成包含我们的shellcode的文件并施加于我们的应用程序后,在主机上得到一个反向shell:

 1.png

图15

基于SEH(结构化异常处理)的缓冲区溢出

第二种方法将使用受控字节来覆盖异常处理程序。我们将使用Mona生成的另一个长6000字节的模式(和之前一样),以令应用程序崩溃(同样的字段将被滥用)。如果该操作成功,相关地址将被恶意的payload覆盖:

 1.png

图16

 

Pattern_offset用于确定序列中那4个字节的偏移量:

 1.png

图17

确认偏移量是正确的,现在,我们要控制当前的异常处理程序(0x43434343)和下一个SEH记录(0x42424242):

 1.png

图18

现在,根据SEH的工作方式,我们需要用到一个“pop pop ret” gadget,以便触发异常后,错误地引导SEH处理程序的执行流程。这时,Mona又有了用武之地,它可以用来查找所有可执行模块中的所有与SEH相关的gadget:

 1.png

图19

我们要在DLL中寻找满足下列条件的地址:这个地址既没有经过随机化,也不是用SafeSEH选项编译的,以便用它来替换“CCCC”:

 1.png

图20,我们抵达了“pop pop ret”gadget

“pop pop ret”会从栈中弹出2个值(8个字节),然后跳转到下一个值(在我们的例子中,为0x0019E204)。但是,这个地址指向下一个SEH记录,而且处于攻击者的控制之下。其中,字节(0x42424242)将用于跳过后4个字节,这需要使用一个小技巧,其中涉及两个互斥的无条件跳转(这意味着在每种情况下都将执行其中一个):

 1.png

图21,其中一个跳转操作被执行,我们到达了“D”字符所在的区域

 

使用msfvenom生成反shell,不过这次没有BufferRegister参数:

 1.png

图22

在完成了前面所描述的所有步骤后,最终效果与第一种方法相同:

 1.png

图23

参考资料

[1] https://www.immunityinc.com/products/debugger/

[2] https://www.exploit-db.com/docs/english/17505-structured-exception-handler-exploitation.pdf

[3] 相关软件下载地址:https://www.exploit-db.com/apps/abb435d262bb405f87a8ea4c07fd9d80-MonitoringsoftwareiSmartViewPro1.5.rar

本文由secM整理并翻译,不代表白帽汇任何观点和立场
来源:https://cybergeeks.tech/buffer-overflow-vanilla-eip-overwrite-and-seh/

最新评论

昵称
邮箱
提交评论