python中的nmap模塊(編寫掃描器)


模塊功能

目前Nmap模塊已具備如下各種功能。

  • 主機發現功能。向目標計算機發送信息,然后根據目標的反應來確定它是否處於開機並聯網的狀態。
  • 端口掃描 。向目標計算機的指定端口發送信息,然后根據目標端口的反應來判斷它是否開放。
  • 服務及版本檢測。向目標計算機的指定端口發送特制的信息,然后根據目標的反應來檢測它運行服務的服務類型和版本。
  • 操作系統檢測。
    除了這些基本功能之外,Nmap還實現一些高級的審計技術,例如,偽造發起掃描端的身份,進行隱蔽的掃描,規避目標的防御設備(例如防火牆),對系統進行安全漏洞檢測,並提供完善的報告選項。再后來的不斷發展中,隨着Nmap強大的腳本引擎NSE的推出,任何人都可以自己向Nmap中添加新的功能模塊。

安裝Nmap及其模塊

Nmap的安裝Windows下去官網下載就可以了,作者遇到的問題也已經專門做了筆記,這是筆記鏈接
在這里需要強調一下,我們要安裝的模塊是python-nmap 而不是 nmap ,切記切記!如果裝錯了模塊,后面是無法完成實例化的!

pip install python-nmap #安裝模塊命令

基本用法

  1. python-nmap模塊實例化

最常用的是PortScanner類,這個類實現Nmap工具功能的封裝。對這個類進行實例化很簡單,只需要如下語句便可實現。

import nmap
nm=nmap.PortScanner()

PortScannerAsync類和PortScanner類的功能相似,但是這個類可以實現異步掃描,對這個類的實例化語句如下。

import nmap
nm=nmap.PortScannerAsync()
  1. 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)                                           #輸出掃描結果
  • 運行結果

在這里插入圖片描述


免責聲明!

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



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