top of page

【Tech Tip】建構自定義的 NSE 和探索指令

這是一系列與Nmap和CyberScope手持式網路安全測試儀相關的NetAlly文章中的第三篇,對於那些對Nmap和Nmap Scripting Engine(NSE)不太熟悉的人來說,所呈現的內容可能相對複雜;有鑑於這一點,我們建議您參加兩個NetAlly網路研討會,Blake將在其中討論在這裡呈現的NSE訊息,並實際展示指令在CyberScope上的運作。


在不斷變化的網路安全領域中,擁有像CyberScope這樣強大的工具,是保護企業網路至關重要的工具,正如我們在之前的文章中所看到的,CyberScope可以執行Nmap,這是一個受歡迎且多用途的網路掃描工具,當Nmap與NSE結合時,其效能更加強大;透過建立自訂的NSE指令,您可以根據特定的安全需求量身定制Nmap,自動執行任務,並從網路掃描中取得有價值的洞察;在這個逐步指南中,我們將會帶您一步一步完成自訂 NSE 指令的過程,讓您能夠充分發揮Nmap的潛力;我們將要建立的NSE指令可以由任何人執行,並且不需要透過任何付費服務,我們鼓勵您在電腦上跟著進行,按照順序執行這些步驟。


準備事項:

  • 能夠執行 Nmap 的筆記型電腦或桌上型電腦

  • 基本了解 Nmap 的使用方法和指令

  • 對 Lua 程式語言有基本的了解(儘管不是必要的) (這是官方 Lua 程式語言的連結)

步驟 1:確定目標


首先,要明確您自訂的 NSE 指令的目標;是想要偵測漏洞、收集特定資訊,還是執行特殊的網路探索?明確目標將引導您的指令開發,確保您專注於建立有價值的工具;您的 NSE 指令不需要做到應有盡有,可以建立多個小指令,而不是一個龐大的指令;以我們的指令範例來說,目標是在執行 AutoTest 時取得額外的廣域網路(WAN)IP資訊。我們想要增加自主系統編號(ASN)、ASN組織和WAN IP的位置資訊,這些資訊有助於確定正在使用的互聯網路由,以及在使用像 AWS、Netflix、Office 365 等服務時,將流量發送到哪個地理分佈的雲端服務。


步驟2:建立環境


確保在您的系統上安裝了Nmap,您可以從Nmap官方網站下載最新版本;此外,選擇一個支援Lua 指令的文字編輯器、或整合式開發環境(IDE),熱門的選擇包括VSCode、Sublime Text,甚至像Notepad++這樣的簡單文字編輯器。


步驟3:研究現有的 NSE 指令(選擇性)


在深入探討指令之前,請先探索Nmap指令函示庫中豐富的現有NSE指令,分析這些指令將提供的最佳實踐、指令結構、以及Nmap API使用的寶貴見解;從他人的經驗學習可以節省您的時間,並幫助您避免常見的問題。Nmap預先安裝了許多NSE指令,您可以在Windows上的C:\Program Files\Nmap\,或非Windows系統上的 /usr/share/local/nmap 和 /usr/share/nmap/ 資料夾中找到這些指令。


步驟4:NSE 指令開發

A. 定義指令參數和相依性:

  • 辨識並確定指令是否需要使用到其他已經存在的程式庫或功能模組,這些程式庫或模組可能包含了一些已經定義好的功能,可以幫助您更容易地達到指令的目標;如果您的指令需要使用到這些程式庫或模組,您需要在指令中引入它們,以便可以使用其中的功能和方法。這可以大大簡化指令的開發過程,因為您可以重複使用已經存在的程式碼,而不需要重新寫一遍;這樣的相依性可能是由Nmap Scripting Engine(NSE)提供的,也可能是由其他第三方程式庫提供的。

  • 增加一個簡短的描述,說明指令的目的和用途。

  • 輸入作者資訊、授權使用細節,以及指令的類別。

  • 宣告任何指令參數,這可以讓使用者根據需要自訂掃描;例如,假設您正在開發一個自定義的Nmap掃描指令,您可以定義一個參數來指定要掃描的目標IP地址,使用者在執行指令時可以透過命令行輸入這個IP地址,這樣您的指令就會根據這個IP地址進行相應的掃描;在我們的案例中,我們沒有任何參數。

----- FORMAT WITH <CODE> -----
local http = require "http"
local json = require "json"
local oops = require "oops"
local stdnse = require "stdnse"
local table = require "table"

description = [[
Tries to identify information regarding the detected WAN IP of the network from which script is ran. 

This script relies on the <code>http://ipapi.co</code> information and takes no parameters.
]]

---
-- @usage
-- nmap --script ip-info-ipapi
--
--
-- @output
-- | IP: 10.0.0.1
-- | Network: 10.0.0.0/8
-- | ASN: ASXXXXX
-- | ORG: ISP-#
-- |_Location: Minneapolis, Minnesota, US
--
author = "Blake Krone <hello@mobiadroit.com"
license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
categories = {"discovery","external","safe"}

---- END FORMAT -----

B. 撰寫指令主體:

  • 初始化指令變數並處理使用者定義的參數(如果適用)。

  • 定義何時應該執行指令元素:prerule、hostrule()、portrule()、postrule()

  • 建構掃描、數據檢索和報告的邏輯。

  • 利用Nmap的API,例如 nmap.scan()、nmap.get_port_state() 等,來收集網路資訊;在我們的範例中,我們正在執行基本的 http.get(),就像您在瀏覽器中存取網站服務一樣。

  • 優雅地處理可能的錯誤和異常情況。

---- CODE ----
prerule = function()
  return true
end

-- No limit on requests. A free registration for an API key is a prerequisite
local ipapi = function()
  local output = {} -- This is where we store the output from the script
  local response = http.get("ipapi.co", 443, "/json") -- Perform the request to the ipapi service
  local stat, data = oops.raise(
    "Unable to parse ipapi.co response", -- If we have an error, raise and report as such.
    json.parse(response.body)) -- Otherwise we parse the response body as JSON
  if not stat then
    return stat, data
  end

  table.insert(output, ("IP: %s"):format(data.ip)) -- Add the IP information to the output table
  table.insert(output, ("Network: %s"):format(data.network)) -- Add the Subnet / Network information to the output table
  table.insert(output, ("ASN: %s"):format(data.asn)) -- Add the ASN information to the output table
  table.insert(output, ("ORG: %s"):format(data.org)) -- Add the ASN Organization information to the output table
  table.insert(output, ("Location: %s, %s, %s"):format(data.city,data.region,data.country)) -- Add the location information to the output table
  if(data.in_eu) then
    table.insert(output, ("EU Member State")) -- If the location is an EU Member State, add that information to the output table
  end
  
  return true, output -- Return true as the script completed successfully with the output table data
end

action = function()
  return oops.output(ipapi()) -- Run the ipapi lookup function, return output or error
end
---- END ----

C. 測試和除錯:

  • 在不同的目標系統上測試您的指令,確保其功能和準確性。

  • 使用如Python中的print() 或其他除錯訊息輸出,來排除任何出現的問題。

  • 考慮使用“-d”選項執行您的指令,以啟用NSE除錯。

將您的指令上傳到CyberScope進行測試很簡單,首先上傳到Link-Live,然後將指令推送到您的CyberScope設備上即可。
將您的指令上傳到CyberScope進行測試很簡單,首先上傳到Link-Live,然後將指令推送到您的CyberScope設備上即可。

將您的指令上傳到CyberScope進行測試很簡單,首先上傳到Link-Live,然後將指令推送到您的CyberScope設備上即可。


第五步:優化效率


隨著指令的演進,優化其性能以有效處理大規模掃描是至關重要的,考慮使用平行化和多執行緒技術 (threading techniques) 來提高速度和資源使用效率,這兩種技術的目標都是充分利用電腦運算的資源和提高執行效率;您還可以實施快取機制,以減少重複掃描,增強整體效率。


第六步:添加文件檔和詮釋資料(Metadata)


對於可能想要使用您的指令的使用者來說,文件檔非常重要,在指令內部加入注釋,解釋指令的目的、功能以及任何值得注意的執行細節;此外,定義詮釋資料(Metadata),例如:作者的名稱、指令版本、許可證以及所需的任何相依性。


第七步:安全性和倫理考慮


在網路安全領域,負責任的掃描是一項核心原則,在部署您的指令之前,請確保它遵守倫理準則和法律規範,在對任何網路進行掃描或探測之前,請始終尋求適當的授權。

在部署您的指令之前,請確保它遵守倫理準則和法律規範。


步驟8:分享與部署


當您的指令完成並通過測試後,可以考慮與Nmap社群共享,您可以將指令貢獻給Nmap指令庫,或在GitHub等平台上分享,為使用者提供清晰的安裝和使用指南,使指令對其他人更加易於使用。


恭喜您!您已成功創建了自訂Nmap Scripting Engine指令,為您的Nmap掃描開啟了新的可能性,利用NSE的功能,將Nmap調整為屬於您獨特的安全需求,透過分享您的創作,為蓬勃發展的Nmap社群做出貢獻。


請記住,要以倫理和負責任的態度來進行掃描,確保您與之互動的網路的安全和完整性;有了您的新指令,您現在更有能力加強網路防禦,在不斷變化的網路安全領域中提前應對潛在威脅;對於那些有興趣的人或更高階的使用者,我們建議查看這裡的官方幫助指南,以取得更多的訊息;開始享受 NSE 指令的樂趣吧!


Author bio 作者簡歷


Blake Krone

Blake Krone 是一名獨立的智慧行動的顧問和開發者,主要的工作重點是為財星美國500強和初創公司提供下一代先進的設備和智慧行動的企業導入案例,頻藉著過去佈署大型的單點網路經驗,撰寫了許多訓練教材和技術簡報,來分享所獲得的知識和見解;當他不是在為客戶建置網路環境的時候,就是在建構資料分析工具並實測終端裝置和工具。


網路研討會


延伸閱讀

歡迎 訂閱翔宇科技主題式電子報 >,您將可同步掌握最新的產業新訊以及技術文章。
bottom of page