模塊功能
目前Nmap模塊已具備如下各種功能。
- 主機發現功能。向目標計算機發送信息,然后根據目標的反應來確定它是否處於開機並聯網的狀態。
- 端口掃描 。向目標計算機的指定端口發送信息,然后根據目標端口的反應來判斷它是否開放。
- 服務及版本檢測。向目標計算機的指定端口發送特制的信息,然后根據目標的反應來檢測它運行服務的服務類型和版本。
- 操作系統檢測。
除了這些基本功能之外,Nmap還實現一些高級的審計技術,例如,偽造發起掃描端的身份,進行隱蔽的掃描,規避目標的防御設備(例如防火牆),對系統進行安全漏洞檢測,並提供完善的報告選項。再后來的不斷發展中,隨着Nmap強大的腳本引擎NSE的推出,任何人都可以自己向Nmap中添加新的功能模塊。
安裝Nmap及其模塊
Nmap的安裝Windows下去官網下載就可以了,作者遇到的問題也已經專門做了筆記,這是筆記鏈接
在這里需要強調一下,我們要安裝的模塊是python-nmap 而不是 nmap ,切記切記!如果裝錯了模塊,后面是無法完成實例化的!
pip install python-nmap #安裝模塊命令
基本用法
- python-nmap模塊實例化
最常用的是PortScanner類,這個類實現Nmap工具功能的封裝。對這個類進行實例化很簡單,只需要如下語句便可實現。
import nmap
nm=nmap.PortScanner()
PortScannerAsync類和PortScanner類的功能相似,但是這個類可以實現異步掃描,對這個類的實例化語句如下。
import nmap
nm=nmap.PortScannerAsync()
- python-nmap中的函數
首先看一下PortScanner類,這個類中包含了如下幾個函數。
scan()函數:這個函數的完整形式為scan(self,hosts=‘127.0.0.1’,ports=None,arguments=’-sV’,sudo=False),用來對指定目標進行掃描。
這里面的參數hosts的值為字符串類型,表示要掃描的主機,形式可以是IP地址,例如"192.168.1.1",也可以是一個域名,例如"www.nmap.org"
參數ports的值也是字符串類型,表示要掃描的端口。如果要掃描的是單一端口,形式可以為"80"。如果為多個端口,可以用逗號分開,例如"80,443,3389"。如果要掃描的是連續的端口范圍,可以用橫線,例如“1-5000” 。
參數arguments的值也是字符串類型,這個參數實際上就是Nmap掃描所用的參數。
參數 | 作用 |
---|---|
-O | 系統掃描 |
-V,-v,-D,-d,-p | debug信息 |
–fuzzy | 推測操作系統檢測結果 |
-sT | TCP端口掃描(完整三次握手) |
-sU | UDP端口掃描(不回應可能打開,回應則關閉) |
-sL | DNS反向解析 |
-sS | 隱藏掃描(半開SYN) |
-sP | 發現存活主機(直連arp,非直連TCP80,ICMP) |
-sO | 確定主機協議掃描 |
-sW | 對滑動窗口的掃描 |
-sA | TCP ACK掃描 |
-sN | 關閉主機掃描(不管是否存活直接掃描) |
-sF | fin掃描 |
-sX | Xmas掃描(fin psh urg為置位) |
-sI | 完全隱藏(以一個跳板為主機(無流量)掃描另一台主機) |
-sV | 服務器版本 |
-sC | 跟安全有關的腳本 |
-PN | 掃描自己 |
以上就是我常用的指令==參數,還有很多很多,就不一一列舉了。
如果要對192.168.1.101的1~500端口進行一次TCP掃描,可以使用以下命令。
import nmap
nm = nmap.PortScanner()
nm.scan('192.168.1.101','1-500','-sS')
all_hosts()函數:返回一個被掃描的所有主機列表。
command_line()函數:返回在當前掃描中使用的命令行。
csv()函數:返回值是一個CSV(逗號分隔文件格式)的輸出。
如果想看的更清楚一點,可以使用print輸出csv()的內容。
has_host(self,host)函數:檢查是否有host的掃描結果,如果有則返回True,否則返回False。
scaninfo()函數:列出一個掃描信息的結構。
還有一些不常用的操作大家可以自己去實踐一下,這里不做過多介紹。
而PortScannerAsync類中最為重要的函數也是scan(),用法與PortScanner類中的scan()基本一樣,只不過多了一個回調函數。完整的scan()函數格式為scan(self,hosts=‘127.0.0.1’,ports=None,arguments=’-sV’,callback=None,sudo=False)這里面的callback是以(host,scan_data)為參數的函數,也就是整個網段的掃描。
import nmap
nm = nmap.PortScannerAsync()
nm.scan(hosts = '192.168.1.0/24',arguments = '-sP')
這個類提供了以下三個用來實現異步的函數。
still_scanning():如果掃描正在進行則返回Ture,否則返回False。
wait(self,timeout=None):函數表示等待時間。
stop():停止掃描。
編寫一個端口掃描器
好了,現在已經了解python-nmap的用法,接下來就可以使用這個模塊來編寫一個簡單的端口掃描器了。
import nmap #導入模塊
nm = nmap.PortScanner() #導入函數
nm.scan('192.168.1.104','1-1000') #輸入你要掃描的ip與道口
for host in nm.all_hosts(): #返回被掃描的主機列表給host
print('---------------------------------------------------------')
print('Host : %s (%s)' % (host,nm[host].hostname())) #nm[host].hostname()獲取目標主機的主機名
print('State : %s' % nm[host].state()) #nm[host].state()獲取主機的狀態 |up|down|unknow|skipped|
for proto in nm[host].all_protocols(): #nm[host].all_protocols獲取執行的協議['tcp','udp']
print('-----------------------------------------------------')
print('protocol : %s' % proto ) #輸出執行的協議
lport = nm[host][proto].keys() #獲取目標主機所開放的端口賦值給lport
# lport.sort()
for port in lport: #將lport賦值給port並遍歷
print('port : %s\tstate : %s' % (port,nm[host][proto][port]['state'])) #輸出掃描結果
- 運行結果:
編寫一個主機存活掃描器
這里其實換湯不換葯,好好體會一下兩段代碼就會發現他們其實是大同小異的。
import nmap #導入模塊
nm = nmap.PortScanner() #導入函數
nm.scan('192.168.1.0/24',arguments='-sP') #綁定網段與掃描模式
hosts_list = [(x, nm[x]['status']['state']) for x in nm.all_hosts()] #定義字典
for host, status in hosts_list: #將字典里的狀態賦值給host,status
print(host+" is "+status) #輸出掃描結果
- 運行結果