對於端口掃描,使用的最多的就是nmap這個工具,不想python已經強大到,提供了nmap這個掃描端口的模塊。
本片文章主要介紹nmap模塊的兩個常用類:
- PortScanner()類,實現一個nmap工具的端口掃描功能的封裝;
- PortScannerHostDict()類,實現存儲與訪問主機的掃描結果。
安裝:這里需要安裝的是python-nmap模塊,不是nmap模塊,pip install python-nmap。
PortScanner()類的一些常用方法:
1. scan()方法:
scan(self,host='127.0.0.1',ports=None,arguments='-sV')
實現指定主機,端口,nmap命令行參數的掃描。
參數說明:
- hosts:字符串類型,表示掃描的主機的地址,格式可以用"scanme.nmap.org","127.0.0.1/24"表示;
- ports:字符串類型,表示要掃描的端口,可以用"22,80,443-1000"表示;
- arguments:字符串類型,表示nmap命令行參數,格式為"-sU -sX -sC"表示。
import nmap #實例化 nm = nmap.PortScanner()
#端口掃描
nm.scan('www.baidu.com','22,80,443','-sV')
2. command_line(self)方法
返回的掃描方法映射到具體的nmap命令行
nm.command_line()
3. scaninfo(self)方法
返回nmap掃描信息,格式為字典類型
nm.scaninfo()
4. all_hosts(self)方法
返回nmap掃描的主機清單,格式為列表類型
nm.all_hosts()
------------------------------------------------------
PortScannerHostDict()類的一些常用方法
1. hostname(self)方法
返回掃描對象的主機名
nm['61.135.169.125'].hostname()
2. state(self)方法
返回掃描對象的狀態,包括四種狀態(up,down,unknown,skipped)
nm['61.135.169.125'].state()
3. all_protocols(self)方法
返回掃描的協議
nm['61.135.169.125'].all_protocols()
4.all_tcp(self)方法
返回TCP協議掃描的端口
nm['61.135.169.125'].all_tcp()
5.tcp(self,port)方法
返回掃描TCP協議port的信息
nm['61.135.169.125'].tcp(443)
實踐:實現高效的端口掃描
實踐代碼采用scan()方法的arguments參數指定為 "-v -PE -p + 端口",-v表示啟用細節模式,可以返回非up狀態主機清單;-PE 表示采用TCP同步掃描(TCP,SYN)方式;-p指定掃描端口范圍。程序輸出部分采用了三個for循環體,第一層遍歷掃描主機,第二層遍歷協議,第三層遍歷端口,最后輸出主機狀態。
import sys
import nmap
scan_row=[]
input_data = input('Please input hosts and port: ')
scan_row = input_data.split(" ")
if len(scan_row)!=2:
print("Input errors,example \"192.168.1.0/24 80,443,22\"")
sys.exit(0)
#接收用戶輸入的主機
hosts=scan_row[0]
#接收用戶輸入的端口
port=scan_row[1]
try:
#創建端口掃描對象
nm = nmap.PortScanner()
except nmap.PortScannerError:
print('Nmap not found', sys.exc_info()[0])
sys.exit(0)
except:
print("Unexpected error:", sys.exc_info()[0])
sys.exit(0)
try:
#調用掃描方法,參數指定掃描主機hosts,nmap掃描命令行參數arguments
nm.scan(hosts=hosts, arguments=' -v -sS -p '+port)
except Exception as e:
print("Scan erro:"+str(e))
#遍歷掃描主機
for host in nm.all_hosts():
print('----------------------------------------------------')
#輸出主機及主機名
print('Host : %s (%s)' % (host, nm[host].hostname()))
#輸出主機狀態,如up、down
print('State : %s' % nm[host].state())
for proto in nm[host].all_protocols():
#遍歷掃描協議,如tcp、udp
print('----------')
#輸入協議名
print('Protocol : %s' % proto)
#獲取協議的所有掃描端口
lport = nm[host][proto].keys()
#端口列表排序
list(lport).sort()
#遍歷端口及輸出端口與狀態
for port in lport:
print('port : %s\tstate : %s' % (port, nm[host][proto][port]['state']))