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


 

對於端口掃描,使用的最多的就是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']))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM