欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

巧用python和libnmapd,提取Nmap掃描結果

系統 1844 0

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


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


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

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

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

端口信息
開放指定端口號的主機
顯示所有開放指定端口號的主機。生成一個包含主機地址(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()] ]
?

開放端口數量

顯示一系列主機開放端口的數量。生成一個包含端口數量(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” 通道或者相關腳本檢測的結果中包含 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) ]

下面的內容包含上述相同的信息,但不在是一個包含列表的列表,而是使用 join 函數創建了一個包含 “主機:端口號”(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 服務及其對對應的端口號和協議(http 或 https)。這會生成一個包含多個列表的列表,其中每個成員列表包含協議(string)、地址(string)和端口號(int)。但這里會有些問題,nmap 在報告使用 https 的網站時,有些時候會顯示服務是 “https”,而有時則會顯示為使用 “ssl” 通道的 “http”,所以我調整了下數據格式以便統一輸出。
?

復制代碼 代碼如下:

?[ [(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') ]

這里還是相同的信息,只不過是在原先包含協議、主機和端口號的列表中增加了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)。生成這些信息,主要是為了方便后續人工審查那些特定的服務,而不會參與到任何自動化的過程中。

復制代碼 代碼如下:

?[ [ 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 掃描中識別出的所有軟件。生成按產品字母排序的列表。

復制代碼 代碼如下:

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

軟件對應的主機和端口號,按產品分組
顯示掃描出軟件對應的主機和端口,按產品分組。生成一個包含多個列表的列表,其中每個成員列表的第一個元素為軟件的名稱(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])) ]

搜索指定關鍵詞相關的主機和端口
顯示所有與給定關鍵詞相關聯的主機和端口,從 nmap 掃描結果的原始文本中查找包含產品名稱、服務名稱等等。下面以 “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 失效的時候,可以幫助確定系統的主機名。生成一個包含多個列表的列表,其中每個成員列表包含 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') ]

處理以上結果的方法

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

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

復制代碼 代碼如下:

?[ ':'.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) ]

讓我們來給上面這段代碼的結果分配名為 “ssl_services” 變量,以方便后續的調用。
?

復制代碼 代碼如下:

?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) ]

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

復制代碼 代碼如下:

?ssl_services_text = '\n'.join(ssl_services)

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

復制代碼 代碼如下:

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

就這么簡單,后續你可以根據自己的需要來使用文件內容了。

使用其他 Python 代碼
也許你還會想用其他的 Python 代碼來完成上述工作?同樣很簡單,下面就是另一個示例,這里我們遍歷每一個 nmap 識別出的 web 服務及其網頁的請求結果。
下面會生成一個包含 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 模塊,然后設置一個簡單的 getAndSave 函數進行 web 請求并將返回結果保存到磁盤上,文件名按 url 自動生成。你可能會注意到下面代碼中,在 get 請求中使用了 “verify=False” 選項,這會在發送請求時忽略證書驗證的錯誤,這個選項經常在測試內部機器時使用,因為內部機器基本不會有可信的證書頒發機構頒發的 SSL 證書。
?

復制代碼 代碼如下:

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

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

復制代碼 代碼如下:

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

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

總結

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本成人在线网站 | av大片在线 | 日操夜操天天操 | 久久久久国产一区二区三区四区 | 色综合色综合色综合色综合 | 成人伊人 | 亚洲在线视频网站 | 天天操天天干天天爽 | 日韩网红少妇无码视频香港 | 高清视频一区 | av成人免费在线观看 | 国产成人精品视频免费 | 狠狠干av | 国产精品成人观看视频国产 | 午夜精品视频在线观看 | 国产精品免费视频网站 | 可米影院| 免费看成年视频网页 | 一区二区三区在线免费观看 | 性欧美xxxx极品摘花 | 欧美第一色 | 特色特色大片在线 | 国产露脸精品爆浆视频 | 91看片在线观看 | www国产成人免费观看视频,深夜成人网 | 99色吧| 欧美日韩中文字幕在线观看 | 日日操夜夜爽 | 成人在线| 欧美综合自拍亚洲综合百度 | 好看的91视频 | 色www精品视频在线观看 | 韩国三级午夜理伦三级三 | 久久伊人一区二区三区四区 | 天天干网 | 亚洲一区中文字幕 | 精品国产欧美一区二区 | 天天操网 | 视频一区二区中文字幕 | 激情黄视频 | 国产亚洲精品久久无码小说 |