簡介
python-nmap是一個使用nmap進行端口掃描的python庫,它可以很輕易的生成nmap掃描報告,並且可以幫助系統管理員進行自動化掃描任務和生成報告。同時,它也支持nmap腳本輸出。
可以看到python-nmap只有四個py文件(__init__.py, nmap.py, test.py, test_nmap.py),下面就一一進行解讀
__init__.py
除去幾十行的注釋外,真正的代碼只有四行,基本內容就是從同目錄的nmap.py下導入一些基本信息:作者(__author__),版本(__version__),最后修改日期(__last_modification__),這些在nmap.py下都有寫
test.py
test.py也只有簡單的幾行,運行時就是打印出本地的Host,猜測是用來測試是否可以利用nmap的掃描功能
nmap.py
nmap.py用於調用nmap的功能進行掃描,主要的掃描函數為PortScanner(object):
class PortScanner(object):
PortScanner類的英文注釋就寫着功能:PortScanner class allows to use nmap from python(PortScanner類允許在python使用nmap)
def __init__(self, nmap_search_path=('nmap', '/usr/bin/nmap', '/usr/local/bin/nmap', '/sw/bin/nmap', '/opt/local/bin/nmap')):
主要功能就是在nmap_search_path查找nmap的路徑(從nmap_search_path可以看出在Windows下使用得自己添加路徑)和初始化PortScanner模塊,包括本機上nmap的路徑(self._nmap_path),掃描的結果(self._scan_result),nmap的主版本(self._nmap_version_number), nmap的子版本(self._nmap_subversion_number), nmap輸出的版本信息(self._nmap_last_output),是否找到nmap(is_nmap_found)
def get_nmap_last_output(self):
返回文本輸出,可能用於調試,這里有作者的英文注釋
def nmap_version(self):
如果檢查到nmap返回nmap的版本信息
def listscan(self, hosts='127.0.0.1'):
不進行掃描,但解析目標主機並返回一個主機列表
def scan(self, hosts='127.0.0.1', ports=None, arguments='-sV', sudo=False):
調用nmap的掃描功能進行掃描,以json格式輸出
def analyse_nmap_xml_scan(self, nmap_xml_output=None, nmap_err='', nmap_err_keep_trace='', nmap_warn_keep_trace=''):
對nmap的掃描結果進行處理,掃描結果是XML形式,轉化為json形式打印出來
def __getitem__(self, host):
返回目標ip
def all_hosts(self):
以列表形式返回目標ip
def command_line(self):
返回輸入的命令行
def scaninfo(self):
以結構體形式返回掃描信息
def scanstats(self):
以結構體形式返回掃描狀態
def has_host(self, host):
如果目標主機有回應就返回True(檢查是否有目標主機)
def csv(self):
把csv輸出轉化為文本返回
def __scan_progressive__(self, hosts, ports, arguments, callback, sudo):
用於PortScannerAsync的回調
class PortScannerAsync(object):
允許異步使用python中的nmap,每個主機的掃描結果都會通過回調返回,進行多線程掃描
def __init__(self):
調用PortScanner()檢查nmap所在的系統和和nmap版本
def __del__(self):
用於對self._process清零,self._process用來存放掃描信息
def scan(self, hosts='127.0.0.1', ports=None, arguments='-sV', callback=None, sudo=False):
調用多線程掃描,並且結果通過回調函數返回
def stop(self):
停止當前的掃描過程
def wait(self, timeout=None):
等待當前掃描進程的結束和超時
def still_scanning(self):
檢查當前進程是否還在掃描
class PortScannerYield(PortScannerAsync):
針對主機的掃描結果調用Yield進行處理
def __init__(self):
調用PortScanner()檢查nmap所在的系統和和nmap版本
def scan(self, hosts='127.0.0.1', ports=None, arguments='-sV', sudo=False):
把掃描結果放到迭代器里進行回調
class PortScannerHostDict(dict):
PortScannerHostDict:用於存儲和訪問主機掃描結果的字典類
def hostnames(self):
以列表形式返回主機名
def hostname(self):
返回第一個主機名,為了兼容性問題,不甚理解
def state(self): def uptime(self):
兩個都是返回主機的狀態信息
def all_protocols(self):
all_protocols:以列表形式返回掃描的協議
def all_tcp(self): def has_tcp(self, port): def tcp(self, port):
三個函數的作用就是列出掃描到的TCP端口的信息
def all_udp(self): def has_udp(self, port): def udp(self, port):
三個函數的作用就是列出掃描到的UDP端口的信息
def all_ip(self): def has_ip(self, port): def ip(self, port):
三個函數的作用就是列出掃描到的IP端口的信息
def all_sctp(self): def has_sctp(self, port): def sctp(self, port):
三個函數的作用就是列出掃描到的SCTP端口的信息
class PortScannerError(Exception):
為PortScanner檢測異常的類
返回異常信息
def __get_last_online_version():
通過查詢官網獲得最新的python-nmap的版本信息,如0.6.1
def convert_nmap_output_to_encoding(value, code="ascii"):
對Unicode編碼的scan_result對象進行編碼的轉換,作為字典返回
test_nmap.py
test_nmap.py是用來對python-nmap進行測試和對nmap是否正常運行的檢查,無論是pdb庫還是nose測試框架都經常用於python的測試和調試
class Pdb(Plugin):
提供調試選項,如果在程序測試時遇到錯誤或故障會放到pdb里進行調試
def options(self, parser, env):
定義命令行選項:包括--pdb, --pdb-failures, --pdb-errors
def configure(self, options, conf):
通過檢查異常來匹配哪一個類型的異常觸發插件
def addError(self, test, err):
如果配置調試結果是調試錯誤把錯誤放入pdb
def addFailure(self, test, err):
如果配置調試結果是調試失敗把錯誤放入pdb
def debug(self, err):
不甚理解,猜測是輸出錯誤信息
def setup_module():
設置掃描模塊進行掃描
def test_wrong_args():
測試輸入的錯誤參數
def test_host_scan_error():
測試主機掃描的錯誤
def xmlfile_read_setup():
測試是否能讀取xml文件
def test_command_line():
測試輸入命令行的命令是否合法
def test_scan_info():
測試掃描信息是否存在
def test_all_hosts(): def test_host(): def test_host_no_hostname(): def test_port():
45.33.32.156是nmap的官網里的一個機器人,用來測試nmap是否能正確的運行
def test_listscan():
測試列表掃描主機的結果
def test_csv_output():
測試輸出格式是否為CSV
def test_listscan():
測試列表掃描
def test_ipv6():
測試對IPV6的掃描
def test_ipv4_async():
測試IPV4的異步掃描
def test_ipv6_async():
測試IPV6的異步掃描
def scan_localhost_sudo_arg_O():
掃描本地主機用戶的信息
def test_sudo():
測試主機信息
def test_parsing_osmap_osclass_and_others():
測試是否獲得主機的信息
def test_all_protocols():
測試本地主機的信息
def xmlfile_read_setup_multiple_osmatch():
讀取osmatch_output.xml文件,設置osmatch的xml格式輸出
def test_multipe_osmatch():
檢查主機的osmatch里是否存在一些信息
def test_convert_nmap_output_to_encoding():
測試是否對nmap掃描結果進行了編碼
def test_WARNING_case_sensitive():
測試warning的警告信息是否存在
def test_scan_progressive():
測試異步掃描的情況
總結
總的來說,就是寫一個python腳本來調用nmap工具里的功能,不過里面的思路還是值得我們去了解和學習的,可能分析的內容不是很全面和存在一些問題,存在疑問的可以和我交流,最后給出我在源碼處的一些筆記和注釋,結合博客一起看。
https://github.com/QKSword/python-nmap-analyse