Nmap擴展開發(三)

Nmap擴展開發(三)

來自專欄一葉知安9 人贊了文章

由於傳播、利用此文所提供的信息而造成的任何直接或者間接的後果及損失,均由使用者本人負責,一葉知安以及文章作者不為此承擔任何責任。

一葉知安擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。未經一葉知安允許,不得任意修改或者增減此文章內容,不得以任何方式將其用於商業目的。

0X01 擴展腳本對象-主機

在進行主機掃描的時候會執行hostrule這個函數,從以往的nmap擴展腳本代碼中我們都可以發現在hostrule這個函數中做了一些針對host操作的動作。

hostrule有一個參數,變數名叫host,我們可以把它理解為一個對象,在這裡稱之為對象是為了方便讀者理解,在lua中實際它的數據類型是一個多維的table(表),具有很多屬性。由於這些rule函數都是被動調用的,我們只能在函數內部對形參進行操作了。

參考:nmap.org/book/nse-api.h

通過上面這個表格我們能夠清楚的了解到從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


推薦閱讀:

TAG:黑客Hacker | 信息安全 | Web安全測試 |