Nmap擴展開發(三)
來自專欄一葉知安9 人贊了文章
由於傳播、利用此文所提供的信息而造成的任何直接或者間接的後果及損失,均由使用者本人負責,一葉知安以及文章作者不為此承擔任何責任。
一葉知安擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。未經一葉知安允許,不得任意修改或者增減此文章內容,不得以任何方式將其用於商業目的。
0X01 擴展腳本對象-主機
在進行主機掃描的時候會執行hostrule這個函數,從以往的nmap擴展腳本代碼中我們都可以發現在hostrule這個函數中做了一些針對host操作的動作。
hostrule有一個參數,變數名叫host,我們可以把它理解為一個對象,在這裡稱之為對象是為了方便讀者理解,在lua中實際它的數據類型是一個多維的table(表),具有很多屬性。由於這些rule函數都是被動調用的,我們只能在函數內部對形參進行操作了。
參考:https://nmap.org/book/nse-api.html
通過上面這個表格我們能夠清楚的了解到從host這個table中可以讀取到哪些信息。
為了讓讀者吸收,建立一個需求,請大家與我一起完成。
需求:使用Nmap掃描獲得所有主機的MAC地址
由於Nmap沒提供這個需求的解決方案,就需要我們自己來寫一個擴展腳本了~
還是拿之前的test.nse來改一下:
local stdnse = require "stdnse"prerule=function()endhostrule=function(host) mac = host.mac_addr print(stdnse.format_mac(mac))endportrule=function(host,port)endaction=function()endpostrule=function()end
通過host.mac_addr獲取的mac地址是二進位編碼的,我們要轉換成字元串,需要引入stdnse這個擴展包,stdnse包中有一個format_mac函數,能夠將host.mac_addr轉換成字元串。
執行效果如下:
00:50:56:ec:95:4800:50:56:f8:1e:b800:50:56:c0:00:0800:0c:29:b4:48:d7
以上這些MAC地址就是當前內網中的所有主機了。
0X02 擴展腳本對象-埠
埠相對於主機來說,屬性較少,主要是針對埠狀態、埠協議、埠服務、埠服務版本的一些描述。
0X02 [1] 完成一個需求
還是老樣子,假設一個需求,解決這個需求:
需求:獲取當前內網中開放HTTP服務的主機的MAC地址
首先可以分析一下這個需求:
條件:開放了HTTP服務
開放了HTTP服務的主機一般都會開放80/443目的:獲取MAC地址
需要引入stdnse包,調用format_mac函數
如此一來思路清晰了許多,還是從test.nse改起:
local stdnse = require "stdnse"prerule=function()endhostrule=function(host)endportrule=function(host,port) if(port.number == 80 or port.number == 443)then print("[*]Host MAC -> " .. stdnse.format_mac(host.mac_addr)) endendaction=function()endpostrule=function()end
既然是針對服務/埠的需求,我們可以在portrule中進行編寫,肯定有讀者會產生疑問,nmap的-p參數就能指定埠,為何還要再portrule中判斷。
是因為我們最終寫的腳本可能不只是做這一件事,而是做多件事情,以不同的條件限定它去執行哪些代碼。
掃描結果:
通過上面的掃描,我們獲得了內網中開啟HTTP服務的主機的MAC地址,雖然Nmap已經給出了,但是學習都是一步一步來的,後面還有更複雜的需求等著你呢!
0x03 優化輸出格式——表(table)
在stdnse包中有一個函數叫output_table(),它能夠返回一個table數據類型,通過操作這個table,將Key->Value的對應關係數據或列表數據放入,再return,就可以輸出漂亮的格式~
就拿0x01中的test.nse來演示:
local stdnse = require "stdnse"http_table = stdnse.output_table()prerule=function()endhostrule=function(host)endportrule=function(host,port) if(port.number == 80 or port.number == 443)then http_table.http_host_mac = stdnse.format_mac(host.mac_addr) return true endendaction=function() return http_tableendpostrule=function()end
執行效果如下:
可見在portrule返回true的時候才會執行action函數,在腳本剛開始執行前,聲明了一個http_table全局變數,當遇到埠80/443時,會把當前主機的MAC地址裝入http_table,在action中返回。
對象結構圖:
下一章:HTTP包的使用
會介紹HTTP包的使用,並且會教大家寫一些批量檢測HTTP協議相關的漏洞腳本,例如:CVE-2017-12615
推薦閱讀: