python做端口服务banner识别

之前看过别人做mongo的POC,用socket实现的,这里也可能不应该叫做POC,叫做端口扫描,mongo默认端口是27017,细心的人可能发现mongo不仅支持TCP连接,而且还支持HTTP连接,HTTP会给出一个成功的响应,例如:mongo
You are trying to access MongoDB on the native driver port. For http diagnostic access, add 1000 to the port number
就可以针对 mongo 未授权和已授权,不同环境下的响应作出POC,虽然这不是最好的,也要给我们WEB狗一条生路,不能赶进杀绝吧。
而27017这个端口也实现了TCP连接,一个端口多种用途,这就是所谓的端口复用了,可能是考虑到用户体验? 某些应用总是会使用端口复用,端口复用如果用在rootkit里面+iptables规则会很隐蔽的哦,能做好事亦能做坏事;

回到做端口对应服务banner识别,一直用nmap识别端口,nmap是怎么实现的端口服务种类呢,有的是http有的是tcp或udp,http的比较好说,通过response判断就可以了,甚至肉眼直接看就好了,tcp和udp的可以用telnet去连接看返回的banner,tcp的比http的复杂,又分为主动式banner和被动式banner,主动式banner就是连接后会返回banner,被动式banner就是连接后,需要发消息告诉他我要banner信息,他会返回banner信息;

朋友给了一个案例:https://github.com/AnthraX1/InsightScan/blob/master/scanner.py 工具写的比较全噢、

原本是研究的 jdwp,其中发现一些问题,通过http和tcp两种情况来判断 jdwp服务是否存在、

1.socket 可以获取banner, http 是关闭的(可以获取banner);
2.scoket不可以获取banner,http是开启的(可以获取banner);
3.socket 可以获取banner, http 是开启的(都可以获取banner) 忽略这种情况;
4.scoket不可以获取banner,http是关闭的(都不可以获取banner)忽略这种情况;

针对 2.scoket不可以获取banner,http是开启的(可以获取banner) 这种情况 如果不存在的话, POC 只有1个, 如果存在的话 POC 会有2个。 这种情况一般不会把http转换为tcp去用,如果确定socket开启的话也是有可能存在漏洞的!jdwp 服务正常应该也类似mongo使用的端口复用吧,实际中利用 jdwp 是使用tcp协议,所以不用去管http是否开启了,POC如下:

# -*- coding: utf-8 -*-
import sys,socket
reload(sys)
sys.setdefaultencoding( "utf-8" )
#设置socket超时时间
socket.setdefaulttimeout(0.5)

ip = "10.1.5.243"
port = 8000

connet_res = socket.socket()
response = connet_res.connect_ex((ip, port))
if response == 0:
  connet_res.send('testing')#被动连接时
  banner = connet_res.recv(1024)#阻塞函数
  connet_res.close()
print u'当前端口:',port,u'Banner信息为:',banner

通过nmap识别端口服务:
nmap -p 8000 –script=banner 127.0.0.1 #普通方式识别 -》 HTTP
nmap -p 8000 –script=banner 127.0.0.1 -Pn #深入识别 -》 TCP

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.