十一、Kali Linux 2 基于结构化异常处理的渗透

基于SEH的渗透

在上一章中,我们讲解了如何针对一个软件来编写它的渗透模块,这个编写的过程并不复杂,主要是找到一个地址固定的“JMP ESP”指令。另外我们还介绍了一些有用的技能,这包括了如何找到改写EIP内容的地址,如何使用NOP指令来进行填充,如何确定坏字符等。

不过,随着Windows操作系统的安全性不断提高(尤其是Windows 10等系统的推出),这种简单的利用“JMP ESP”指令去执行数据区域代码方法已经很难实现了,不过很快就有人发现了一个新的途径,那就是Windows下的结构化异常处理(SEH)机制。有过编程经验的读者一定会对try/except或者try/catch这种结构不陌生,其实这就是结构化异常处理。

try:

        //要执行的代码

except:

        //异常处理代码

一、SEH 溢出的原理

常见的错误有很多种,例如在进行除法的时候,如果使用0作为了除数,就会出现异常。当异常出现的时候,就是异常处理程序起作用的时候。图中给出了一个程序执行异常。

 

异常处理程序(exception handler)是用来捕获在程序执行期间生成的异常和错误的代码模块,这种机制可以保证程序继续执行而不崩溃。Windows操作系统中也有默认的异常处理程序,在一个应用程序崩溃的时候,我们一般会看到系统弹出一个“程序遇到错误,需要关闭”的窗口。当程序产生了异常之后,就会从栈中加载catch代码的地址并调用catch代码。因此,如果以某种方式设法覆盖了栈中异常处理程序的catch代码地址,我们就能够控制这个应用程序。接着来看一个使用了异常处理程序的应用程序在栈中是如何安排其内容的。图给出了如果我们向程序提供了大量的A从而导致溢出之后的内存分布。

 

每一条SEH记录都是由8字节所组成,其中前面的4字节是它后面的SEH异常处理程序的地址,后面的4字节是catch块的地址。一个应用程序可能有多个异常处理程序,因此一个SEH记录将前4个字节用来保存下一条SEH记录的地址。

 

二、编写基于 SEH 溢出渗透模块的要点

基于SEH溢出进行渗透的思路:

1)引起应用程序的异常,这样才可以调用异常处理程序。

2)使用一条POP/POP/RETN指令的地址来改写异常处理程序的地址,因为我们需要将执行切换到下一条SEH记录的地址(catch异常处理程序地址前面的4字节)。之所以使用POP/POP/RET,是因为用来调用catch块的内存地址保存在栈中,指向下一个异常处理程序指针的地址就是ESP+8(ESP是栈顶指针)。因此,两个POP操作就可以将执行重定向到下一条SEH记录的地址。

3)在第一步输入数据的时候,我们已经将下一条SEH记录的地址替换成了跳转到攻击载荷的JMP指令的地址。因此,当第二个步骤结束时,程序就会跳过指定数量的字节去执行ShellCode。

4)当成功跳转到ShellCode之后,攻击载荷就会执行,我们也获得了目标系统的管理权限。

POP POP RET指令

使用!mona seh获得

bad chars

"\x00\x7e\x2b\x26\x3d\x25\x3a\x22\x0a\x0d\x20\x2f\x5c\x2e"

三、编写 SEH 渗透溢出模块

connect
    print_status("Sending exploit...")
    sploit = "GET "
    sploit << rand_text_alpha_upper(4061)
    sploit << generate_seh_record(target.ret)
    sploit << make_nops(19)
    sploit << payload.encoded
    sploit << " HTTP/1.1\r\n\r\n"
    sock.put(sploit)
    print_good("Exploit Sent")
    handler
    disconnect

总结:

在本章中,我们介绍了如何使用 Python 编写渗透模块,这种方法要比直接溢出拥有更广的的应用性,几乎可以应用在所有的操作系统中。另外,也可以访问 exploit-db 网站,在这个网站你可以找到世界上大多数漏洞的渗透模块,而且这些模块可以直接运行。在本章最后还使用 Python 编写了一段可以强迫目标程序自动启动计算机的程序,我们同样可以像上一章最后那样使用 Metasploit 来辅助完成最后一次渗透攻击。在下一章将会学习对网络中的数据包进行抓取并且进行分析,使用Wireshark抓包工具。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值