python-nmap的函數學習


 

簡介


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

 


免責聲明!

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



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