端口扫描器:
Python的第三方模块python-nmap可以实现高效的端口扫描。比如服务器的22,21,3389,3306等高危端口是否暴露在了互联网上。python-nmap是Linux命令nmap的封装
在Python安装了nmap后执行代码:
nm=nmap.PortScanner()
nm.scan('192.168.0.8','22,80')
报如下的错误,提示nmap不在path内
Traceback (most recent call last):
File "/home/zhf/zhf/python_prj/auto_manintance/chapter4.py", line 1, in <module>
from namp import *
ImportError: No module named namp
[Finished in 0.1s with exit code 1]
[shell_cmd: python -u "/home/zhf/zhf/python_prj/auto_manintance/chapter4.py"]
[dir: /home/zhf/zhf/python_prj/auto_manintance]
[path: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games]
在/usr/bin中搜索namp发现原来是系统没有安装nmap。由于python-nmap是nmap命令的封装,因此必须先安装nmap
执行命令apt-get install nmap后,在usr/bin后可以找到nmap程序。
nm=nmap.PortScanner()
nm.scan('192.168.0.1-10','2280')
print nm.command_line()
print nm.scaninfo()
print nm.all_hosts()
for host in nm.all_hosts():
print host,,nm[host].state(),nm[host].all_protocols(),nm[host].all_tcp()
得到的结果如下:
nmap -oX - -p 2280 -sV 192.168.0.1-10
{'tcp': {'services': '22,80', 'method': 'syn'}}
['192.168.0.1', '192.168.0.2', '192.168.0.6', '192.168.0.8']
192.168.0.1 up ['tcp'] [22, 80]
192.168.0.2 up ['tcp'] [22, 80]
192.168.0.6 up ['tcp'] [22, 80]
192.168.0.8 up ['tcp'] [22, 80]
nm.command_line():打印出对应的linux的namp命令
nm.scaninfo():得到nm的扫描信息。包括使用的协议,端口以及方法。从结果中可以看到扫描使用的是tcp协议,采用的是syn的方式。
nm.all_hosts():得到所有出来的主机地址,返回一个列表
nm[host].state():得到各个主机的状态,分为up和down
nm[host].all_protocols():返回扫描的协议
nm[host].all_tcp():返回扫描的端口
下面来看一个完整的端口扫描程序
import nmap
def nmap_function():
nm=nmap.PortScanner()
nm.scan('192.168.0.1-10','22,80')
for host in nm.all_hosts():
print host,nm[host].hostname()
print nm[host].state()
for proto in nm[host].all_protocols():
print proto
lport=nm[host][proto].keys()
lport.sort()
for port in lport:
print port,nm[host][proto][port]['state']
if __name__=="__main__":
nmap_function()
运行结果如下:可以看到192.168.0.1的22端口关闭,但是80端口打开。192.168.0.8的22和80端口都关闭
192.168.0.1
up
tcp
22 closed
80 open
192.168.0.8
up
tcp
22 closed
80 closed
先看下192.168.0.1的报文。通过wireshark抓包可以看到发出的syn报文,对于目的地址各发送了2条消息。原因在于需要扫描2个端口。
80端口
22端口
但是从上面的结果可以看出。当扫描80端口的时候TCP三次握手完成,而在扫描22端口的时候对端发送了rst报文终止链接。所以192.168.0.1的80端口是正常工作,而22端口是没有打开的
再来看192.168.0.8的报文:22端口和80端口对端都回复了rst报文,由此证明对应的端口并没有打开
22端口:
80端口