端口掃描器:
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端口