7.python實現高效端口掃描器之nmap模塊

 

對於端口掃描,使用的最多的就是nmap這個工具,不想python已經強大到,提供了nmap這個掃描端口的模塊。python

本片文章主要介紹nmap模塊的兩個經常使用類:tcp

  • PortScanner()類,實現一個nmap工具的端口掃描功能的封裝;
  • PortScannerHostDict()類,實現存儲與訪問主機的掃描結果。

安裝:這裏須要安裝的是python-nmap模塊,不是nmap模塊,pip install python-nmap。工具

PortScanner()類的一些經常使用方法:spa

1. scan()方法:命令行

scan(self,host='127.0.0.1',ports=None,arguments='-sV')

實現指定主機,端口,nmap命令行參數的掃描。code

參數說明:對象

  • 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)方法blog

返回的掃描方法映射到具體的nmap命令行排序

nm.command_line()

3. scaninfo(self)方法ip

返回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']))

相關文章
相關標籤/搜索