二、Nmap模塊
功能
1、主機發現功能
向目標計算機發送信息,然後根據目標的反應來確定它是否處於開機並聯網的狀態。
2、端口掃描
向目標計算機的指定端口發送信息,然後根據目標端口的反應來判斷它是否開放。
3、服務及版本檢測
向目標計算機的目標端口發送特製的信息,然後根據目標的反應來檢測它運行服務的服務類型和版本。
4、操作系統檢測
python-nmap
- python-nmap是一個可以幫助使用 Nmap功能的 Python 模塊文件。
- 在python-nmap模塊的幫助下,可以輕鬆地在自己的程序中使用Nmap掃描的結果,也可以編寫程序自動化地完成掃描任務。
- 模塊的作者的個人網站爲http://xael.org/
- 如果希望在Python中正常使用python-nmap模塊,必須先在系統中安裝Nmap;因爲在這個模塊文件中會調用Nmap的一些功能
- Windows操作系統下直接下載安裝即可
- Linux操作系統中則需要使用如下命令。
sudo apt-get install python-pip
sudo apt-get install python3-pip
sudo apt-get install nmap
sudo pip install python-nmap
基本用法
python-nmap模塊的核心就是
PortScanner、PortScannerAsync、PortScannerError、PortScannerHostDict、PortScannerYield等5個類
其中最爲重要的是PortScanner類
實例化
- nmap.ProtScanner()
這個類實現Nmap工具功能的封裝
- nmap.PortScannerAsync()
PortScannerAsync類和PortScanner類的功能相似,但是這個類可以實現異步掃描
函數-PortScanner類
- scan()
scan(self, hosts='127.0.0.1', ports=None, arguments='-sV',sudo=False)
用來對指定目標進行掃描,其中需要設置的三個參數包括hosts、ports和arguments
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,8080”。如果要掃描的是連續的端口範圍,可以用橫線,形式爲“1-1000”
參數arguments的值也是字符串類型,這個參數實際上就是Nmap掃描時所使用的參數,
- “-sP”表示對目標進行Ping主機在線掃描,
- “-PR”表示對目標進行一個ARP的主機在線掃描,
- “-sS”表示對目標進行一個TCP半開(SYN)類型的端口掃描,
- “-sT”表示對目標進行一個TCP全開類型的端口掃描,
- “-O”表示掃描目標的操作系統類型,
- “-sV”表示掃描目標上所安裝網絡服務軟件的版本。
如果要對192.168.1.101的1~500端口進行一次TCP半開掃描
掃描一個網段的主機IP
nm.scan("192.168.43.0\24")
返回一個被掃描的所有主機列表
nm.all_hosts()
返回在當前掃描中使用的命令行
nm.command_line()
- csv()
返回值是一個CSV(逗號分隔值文件格式)的輸出,如圖所示。顯示一個比較工整的掃描結果
- has_host(self, host)
檢查是否有host的掃描結果,如果有返回True,沒有返回False
- scaninfo()
列出一個掃描信息的結構
函數-PortScannerAsync類
- scan()
scan(self, hosts='127.0.0.1',ports=None, arguments='-sV', callback=None, sudo=False)
callback回調函數,參數爲(host, scan_date)
- still_scanning()
如果掃描正在進行,返回True,否則返回False
- wait(self, timeout=None)
等待時間
- stop()
停止當前掃描
使用python-nmap模塊來編寫一個掃描器
import nmap
nm = nmap.PortScanner()
nm.scan("192.168.0.121", "1-1000")
for host in nm.all_hosts():
print("-"*50)
print("Host : {} ({})".format(host, nm[host].hostname()))
print("State : {}".format(nm[host].state()))
for proto in nm[host].all_protocols():
print("-"*50)
print("Protocol:{}".format(proto))
lport = nm[host][proto].keys()
lport.sort()
for port in lport:
print("port:{}\tstate:{}".format(port, nm[host][proto][port]['state']))
掃描器2:查看某網段有多少臺終端設備
import nmap
nm = nmap.PortScanner()
nm.scan(hosts='192.168.0.0/24', arguments='-sP')
hosts_list=[(x, nm[x]['status']['state'])for x in nm.all_hosts()]
for host,status in hosts_list:
print(host+'is'+status)