欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

巧用python和libnmapd,提取Nmap掃描結(jié)果

 更新時間:2016年08月23日 14:31:13   投稿:mdxy-dxy  
本文將會講述一系列如何使用一行代碼解析 nmap 掃描結(jié)果,其中會在 Python 環(huán)境中使用到 libnmap 里的 NmapParser 庫,這個庫可以很容易的幫助我們解析 nmap 的掃描結(jié)果

每當我進行內(nèi)網(wǎng)滲透面對大量主機和服務時,我總是習慣使用自動化的方式從 nmap 掃描結(jié)果中提取信息。這樣有利于自動化檢測不同類型的服務,例如對 web 服務進行路徑爆破,測試 SSL/TLS 服務使用的密鑰或協(xié)議,以及其他有針對性的測試。
我在滲透測試中也會經(jīng)常使用到 IPthon 或 *nix shell,而這些又都能夠通過 Python 來訪問,無論是直接在腳本中使用、在 REPL 環(huán)境下使用,還是將代碼寫入到磁盤上然后通過 shell 命令訪問都是非常好用的。


為了完成這些,libnmap 庫會提供很好的幫助。本文將會講述一系列如何使用一行代碼解析 nmap 掃描結(jié)果,其中會在 Python 環(huán)境中使用到 libnmap 里的 NmapParser 庫,這個庫可以很容易的幫助我們解析 nmap 的掃描結(jié)果。
我希望本文不僅僅是提供給你可以直接復制粘貼的代碼,還可以了解到 IPython 也是滲透測試時一個非常好用的數(shù)據(jù)處理工具。


配置
解析 nmap 掃描結(jié)果的第一步是你要進行一次 nmap 掃描。我不打算在這里關(guān)注過多的細節(jié)部分,但是你想要直接使用本文的代碼,你需要將掃描結(jié)構(gòu)保存到一個 xml 文件中(-oX 或者 -oA)并且在開放端口上執(zhí)行了服務偵測(-sV)和運行相關(guān)腳本(-sC)。
本文的命令假設(shè)你在一個 Python REPL 環(huán)境如 IPython 并且安裝 libnmap 模塊(可以使用easy_install 或 pip 安裝)的環(huán)境下執(zhí)行。
開始前,你需要設(shè)置下相應的環(huán)境,首先導入 NmapParser 模塊并讀入你的 xml 掃描結(jié)果文件(實例中名為”up_hosts_all_ports_fullscan.xml”位于當前工作目錄下)
 

復制代碼 代碼如下:
from libnmap.parser import NmapParser
nmap_report = NmapParser.parse_fromfile('up_hosts_all_ports_fullscan.xml')

本文的余下部分會包含一系列使用一行代碼提取各種各樣有用的信息。全部的示例都假設(shè) nmap 掃描結(jié)果保存在一個如上所示的文件中。下面的會給出一些基本的示例代碼,如果你想在 IPython 中直接運行它們,請先運行上面的代碼,這樣它會直接在控制臺輸出方便你的查看。我通常會先做好這一步,這樣我就可以確保輸出的數(shù)據(jù)跟預期的一樣。
然后,你可以選擇一個變量名并使用 “=” 將數(shù)據(jù)賦值給這個變量,這樣你就可以在隨后的代碼中直接調(diào)用,或者將其寫入到磁盤上以便 shell 命令使用。如果有些東西你想使用多次,可以粘貼一些代碼段到 Python 腳本中,或者想加入一些更加復雜的邏輯但這樣可能會使 REPL 環(huán)境難以處理,我會在最后一節(jié)中講述如何快速的執(zhí)行這些操作。

端口信息
開放指定端口號的主機
顯示所有開放指定端口號的主機。生成一個包含主機地址(string)的列表。下面以 443 端口為例,你可以修改成你自己需要的值。
 

復制代碼 代碼如下:

 [ a.address for a in nmap_report.hosts if (a.get_open_ports()) and 443 in [b[0] for b in a.get_open_ports()] ]
 

開放端口數(shù)量

顯示一系列主機開放端口的數(shù)量。生成一個包含端口數(shù)量(int)的列表,并進行排序。
 

復制代碼 代碼如下:

 sorted(set([ b[0] for a in nmap_report.hosts for b in a.get_open_ports()]), key=int)
 

主機開放端口對應的服務,按端口號進行分組

顯示所有主機開放的端口號,按端口號進行分組和排序。生成一個包含多個列表的列表(即列表的每個元素也為列表),其中每個成員列表第一個元素為端口號(int),第二個元素為一個包含開放對應端口主機 IP 地址(string)的列表。

復制代碼 代碼如下:

 [ [a, [ b.address for b in nmap_report.hosts for c in b.get_open_ports() if a==c[0] ] ] for a in sorted(set([ b[0] for a in nmap_report.hosts for b in a.get_open_ports()]),key=int) ]
SSL/TLS 和 HTTP/HTTPS

使用 SSL 的主機和端口

顯示所有使用 SSL 的主機和端口。這是通過查找是否有服務使用了 “SSL” 通道或者相關(guān)腳本檢測的結(jié)果中包含 pem 證書。生成一個包含一系列列表的列表,每個成員列表中包含主機地址(string)和端口號(int)。
 

復制代碼 代碼如下:

 [ [a.address, b.port] for a in nmap_report.hosts for b in a.services if b.tunnel=='ssl' or "'pem'" in str(b.scripts_results) ]

下面的內(nèi)容包含上述相同的信息,但不在是一個包含列表的列表,而是使用 join 函數(shù)創(chuàng)建了一個包含 “主機:端口號”(string) 的列表。
 

復制代碼 代碼如下:

 [ ':'.join([a.address, str(b.port)]) for a in nmap_report.hosts for b in a.services if b.tunnel=='ssl' or "'pem'" in str(b.scripts_results) ]

包含 web 服務的主機和端口

顯示所有的 web 服務及其對對應的端口號和協(xié)議(http 或 https)。這會生成一個包含多個列表的列表,其中每個成員列表包含協(xié)議(string)、地址(string)和端口號(int)。但這里會有些問題,nmap 在報告使用 https 的網(wǎng)站時,有些時候會顯示服務是 “https”,而有時則會顯示為使用 “ssl” 通道的 “http”,所以我調(diào)整了下數(shù)據(jù)格式以便統(tǒng)一輸出。
 

復制代碼 代碼如下:

 [ [(b.service + b.tunnel).replace('sl',''), a.address, b.port] for a in nmap_report.hosts for b in a.services if b.open() and b.service.startswith('http') ]

這里還是相同的信息,只不過是在原先包含協(xié)議、主機和端口號的列表中增加了url(string)。

復制代碼 代碼如下:

 [ (b.service + b.tunnel).replace('sl','') + '://' + a.address + ':' + str(b.port) + '/' for a in nmap_report.hosts for b in a.services if b.open() and b.service.startswith('http') ]

其他服務信息
未知服務

顯示所有 nmap 無法識別的服務。生成一個包含多個列表的列表,其中每個成員列表包含地址(string)、端口號(int)和 nmap 掃描的端口指紋(string)。生成這些信息,主要是為了方便后續(xù)人工審查那些特定的服務,而不會參與到任何自動化的過程中。

復制代碼 代碼如下:

 [ [ a.address, b.port, b.servicefp ] for a in nmap_report.hosts for b in a.services if (b.service =='unknown' or b.servicefp) and b.port in [c[0] for c in a.get_open_ports()] ]

nmap 識別出的軟件
顯示 nmap 掃描中識別出的所有軟件。生成按產(chǎn)品字母排序的列表。

復制代碼 代碼如下:

 sorted(set([ b.banner for a in nmap_report.hosts for b in a.services if 'product' in b.banner]))

軟件對應的主機和端口號,按產(chǎn)品分組
顯示掃描出軟件對應的主機和端口,按產(chǎn)品分組。生成一個包含多個列表的列表,其中每個成員列表的第一個元素為軟件的名稱(string),隨后是另一個列表包含地址(string)和端口號(int)。

復制代碼 代碼如下:

 [ [ a, [ [b.address, c.port] for b in nmap_report.hosts for c in b.services if c.banner==a] ] for a in sorted(set([ b.banner for a in nmap_report.hosts for b in a.services if 'product' in b.banner])) ]

同上相同的信息,只是輸出略有不同。同樣還是生成一個包含多個列表的列表,成員列表的第一個元素還是軟件的名稱(string),但第二個是一個包含 “主機:端口號” 的列表。

復制代碼 代碼如下:

 [ [ a, [ ':'.join([b.address, str(c.port)]) for b in nmap_report.hosts for c in b.services if c.banner==a] ] for a in sorted(set([ b.banner for a in nmap_report.hosts for b in a.services if 'product' in b.banner])) ]

搜索指定關(guān)鍵詞相關(guān)的主機和端口
顯示所有與給定關(guān)鍵詞相關(guān)聯(lián)的主機和端口,從 nmap 掃描結(jié)果的原始文本中查找包含產(chǎn)品名稱、服務名稱等等。下面以 “Oracle” 為例。生成一個包含多個列表的列表,其中每個成員列表包含主機地址(string)和端口號(int)。

復制代碼 代碼如下:

 [ [a.address, b.port] for a in nmap_report.hosts for b in a.services if b.open() and 'Oracle' in str(b.get_dict()) + str(b.scripts_results) ]

 
同上一樣的方法,只是將存儲的信息修改后一律使用小寫進行搜索(下面示例為小寫的 “oracle”),輸出格式還是跟上面一樣。
復制代碼 代碼如下:

 [ [a.address, b.port] for a in nmap_report.hosts for b in a.services if b.open() and 'oracle' in (str(b.get_dict()) + str(b.scripts_results)).lower() ]

 
其他的事情

相同的證書名稱
顯示找到的 SSL 證書和使用 nmap 腳本解析后得到證書名稱相同的部分。這樣在當你從一個 IP 地址開始掃描且反向 DNS 失效的時候,可以幫助確定系統(tǒng)的主機名。生成一個包含多個列表的列表,其中每個成員列表包含 IP 地址(string)和提取出的主機名(string)。
 

復制代碼 代碼如下:

 [ [a.address, c['elements']['subject']['commonName'] ] for a in nmap_report.hosts for b in a.services for c in b.scripts_results if c.has_key('elements') and c['elements'].has_key('subject') ]

處理以上結(jié)果的方法

正向前面所說,上述的例子,當你直接粘貼進 IPython REPL 時只是將輸出打印在屏幕上。這的確不錯,因為這樣你可以隨時查看到自己感興趣的信息,但你可能還會想做更多的事情。之所以去生成上述信息,一大好處就在于你可以根據(jù)結(jié)果輕松執(zhí)行一些自動化的操作。
如果你已經(jīng)很熟悉 Python,應當可以很容易完成這些工作,那么你可以跳過這一節(jié)。但如果你不熟悉,那么本節(jié)會講述一些很基本的知識,告訴你如何使用上述的代碼段。

保存到磁盤
如果你想將上述代碼段的輸出結(jié)果保存到磁盤上的文本文件中,你需要將輸出的列表轉(zhuǎn)換為適當?shù)淖址袷?具體取決于你的需求),然后在將這個字符串寫入文件。在 Python 中,你可以使用 join 函數(shù)來整合這些列表并將其寫入文件,這里只是一個示例。
我們想要從生成的列表中提取出支持 SSL 的主機和端口,并將它們保存到一個新的文件中,這樣可以在 bash 中使用循環(huán)來完成并使用命令行工具來進行測試。
我通常會在 IPython 中使用一行代碼來完成這些,雖然一行代碼會比較方便,但這里為了方便閱讀和理解,我會將代碼拆分出來說。
讓我們來解析之前生成了一個包含 “主機:端口” 的列表,請注意我們使用了 str 函數(shù)將端口號從整數(shù)類型裝換為了字符類型,這樣使得它也能夠使用 join 函數(shù)與其他字符串拼接在一起。
 

復制代碼 代碼如下:

 [ ':'.join([a.address, str(b.port)]) for a in nmap_report.hosts for b in a.services if b.tunnel=='ssl' or "'pem'" in str(b.scripts_results) ]

讓我們來給上面這段代碼的結(jié)果分配名為 “ssl_services” 變量,以方便后續(xù)的調(diào)用。
 

復制代碼 代碼如下:

 ssl_services = [ ':'.join([a.address, str(b.port)]) for a in nmap_report.hosts for b in a.services if b.tunnel=='ssl' or "'pem'" in str(b.scripts_results) ]

現(xiàn)在,讓我們來使用 join 函數(shù)將列表的每一個元素拼接起來并使用 (‘\n') 進行換行,然后給它分配一個名為 “ssl_services_text” 的變量。

復制代碼 代碼如下:

 ssl_services_text = '\n'.join(ssl_services)

隨后,我們就可以在當前工作目錄下創(chuàng)建一個名為 “ssl_services_file.txt” 的新文建,并將 “ssl_services_text” 變量的內(nèi)容寫入其中。
 

復制代碼 代碼如下:

 open('ssl_services_file.txt','w').write(ssl_services_text)

就這么簡單,后續(xù)你可以根據(jù)自己的需要來使用文件內(nèi)容了。

使用其他 Python 代碼
也許你還會想用其他的 Python 代碼來完成上述工作?同樣很簡單,下面就是另一個示例,這里我們遍歷每一個 nmap 識別出的 web 服務及其網(wǎng)頁的請求結(jié)果。
下面會生成一個包含 URLs 的列表,我們分配一個名為 “urls” 的變量給它。
 

復制代碼 代碼如下:

 urls = [ (b.service + b.tunnel).replace('sl','') + '://' + a.address + ':' + str(b.port) + '/' for a in nmap_report.hosts for b in a.services if b.open() and b.service.startswith('http') ]

下一步,我們先進行一些準備工作,導入 requests 模塊,然后設(shè)置一個簡單的 getAndSave 函數(shù)進行 web 請求并將返回結(jié)果保存到磁盤上,文件名按 url 自動生成。你可能會注意到下面代碼中,在 get 請求中使用了 “verify=False” 選項,這會在發(fā)送請求時忽略證書驗證的錯誤,這個選項經(jīng)常在測試內(nèi)部機器時使用,因為內(nèi)部機器基本不會有可信的證書頒發(fā)機構(gòu)頒發(fā)的 SSL 證書。
 

復制代碼 代碼如下:

 import requests
def getAndSave(url):
r = requests.get(url, verify=False)
open('_'.join(url.split('/')[2:]).replace(':',''),'wb').write(r.text.encode('utf8'))

現(xiàn)在,讓我們增加一些代碼來遍歷每一個 url,請求每個站點的 robots.txt 文件,并將其保存到本地以供后續(xù)使用。
 

復制代碼 代碼如下:

 for a in urls:
getAndSave(a + 'robots.txt')

這樣就會將每一個站點的 robots.txt 文件爬取到當前工作目錄下。這只是一個很簡單的例子。

總結(jié)

希望你在閱讀完本文后,可以自己靈活的使用 Python 解析 nmap 掃描結(jié)果。

相關(guān)文章

  • pytorch之關(guān)于PyTorch結(jié)構(gòu)介紹

    pytorch之關(guān)于PyTorch結(jié)構(gòu)介紹

    這篇文章主要介紹了pytorch之關(guān)于PyTorch結(jié)構(gòu)的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • pytorch?transforms圖像增強實現(xiàn)方法

    pytorch?transforms圖像增強實現(xiàn)方法

    這篇文章主要介紹了pytorch?transforms圖像增強的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • Python命令行解析模塊詳解

    Python命令行解析模塊詳解

    這篇文章主要介紹了Python命令行解析模塊詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • python+pygame實現(xiàn)簡易五子棋小游戲的三種方式

    python+pygame實現(xiàn)簡易五子棋小游戲的三種方式

    這篇文章主要介紹了使用python實現(xiàn)簡易五子棋小游戲,文中提供了三種實現(xiàn)方式,解決思路和部分實現(xiàn)代碼,感興趣的朋友可以參考下
    2023-03-03
  • Python使用defaultdict解決字典默認值

    Python使用defaultdict解決字典默認值

    本文主要介紹了Python使用defaultdict解決字典默認值,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Python?opencv應用實現(xiàn)圖片切分操作示例

    Python?opencv應用實現(xiàn)圖片切分操作示例

    這篇文章主要為大家介紹了Python?opencv應用實現(xiàn)圖片切分的操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Python設(shè)計模式之命令模式簡單示例

    Python設(shè)計模式之命令模式簡單示例

    這篇文章主要介紹了Python設(shè)計模式之命令模式,簡單介紹了命令模式的概念、原理,并結(jié)合實例形式分析了Python命令模式的定義與使用相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • Python中函數(shù)的各種類型參數(shù)解讀

    Python中函數(shù)的各種類型參數(shù)解讀

    這篇文章主要介紹了Python中函數(shù)的各種類型參數(shù)用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 初探Python元編程之理解并使用元編程改變代碼的代碼示例

    初探Python元編程之理解并使用元編程改變代碼的代碼示例

    在Python編程中,有一種強大的技術(shù)允許我們在運行時修改或生成代碼,這就是元編程,Python的元編程工具包括裝飾器,元類,以及函數(shù)和類的各種動態(tài)修改技術(shù),這篇文章將向你介紹元編程的基本概念,并通過實例講解如何使用元編程
    2023-07-07
  • 利用python?制作詞云特效詳情

    利用python?制作詞云特效詳情

    這篇文章主要介紹了利用python?制作詞云特效詳情,?詞云?也是數(shù)據(jù)可視化的一種形,根據(jù)關(guān)鍵詞的出現(xiàn)頻率而生成的一幅圖像,人們只要掃一眼就能夠明白其文章主旨,下文詳細介紹,需要的朋友可以參考一下
    2022-04-04

最新評論