您好,登錄后才能下訂單哦!
Nmap滲透測試腳本是怎樣的 ,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
root@kali:~# nmap -sV -sC scanme.nmap.org
上一個命令運行帶有操作<font color=#00ffff> 系統檢測 (-O)</font>的SYN掃描,即<font color=#00ffff> 服務檢測(-sV)</font>,最重要的是NSE在(-sC)上。 -sC選項啟用NSE并在默認類別中運行任何腳本。 這組腳本被默認為是安全的,它不會執行任何可能會干擾在該服務上運行的服務的目標主機的操作。 但是,某些腳本執行可能引發的操作入侵檢測系統(IDS)和入侵防護系統(IPS)中的警報。
首先我們得了解腳本的分類信息,這樣我們才能更好地把我們自定義的腳本進行歸類利用。
腳本類別 | 描述 |
---|---|
auth | 與用戶認證相關的NSE腳本 |
broadcast | 使用廣播收集網絡信息 |
brute | 暴力破解 |
default | 默認,執行腳本(-sC) |
discovery | 與主機和服務發現相關的腳本 |
dos | 與拒絕服務攻擊有關的腳本 |
exploit | 用于利用安全漏洞的腳本 |
external | 此類別適用于第三方服務的腳本 |
fuzzer | NSE腳本專注于模糊測試 |
intrusive | 入侵腳本 |
malware | 與惡意軟件檢測相關的腳本類別 |
safe | 在所有情況下默認為是安全的腳本 |
vuln | 與檢測和利用安全漏洞相關的腳本 |
version | 高級系統腳本 |
Nmap使用<font color=#00ffff> --script</font>選項進行腳本的選擇。 這個選項后面可以是一個腳本名稱,NSE類別,NSE文件的路徑,包含腳本的文件夾,甚至表達式。使用<font color=#00ffff> --script</font>通過腳本名稱或類別進行選擇腳本。Nmap選項會按名稱執行腳本。 執行時用逗號分隔幾個腳本:
直接加腳本名稱 ,
以下屏幕截圖顯示了http-huawei-hg5xx-vuln腳本的輸出。 此腳本利用華為設備中的遠程漏洞進行檢索,檢索的信息包括PPPoE憑證和無線網絡安全配置:
要選擇整個類別,只需使用類別的名稱(請參閱腳本作為參數。 例如,要運行漏洞類別, 使用以下命令: <> 您也可以用逗號分隔它們來運行多個類別: , <> -選項僅僅是默認選項的別名。 按文件名或文件夾選擇 要執行腳本文件,請使用以下命令: <> 與類別類似,可以通過分離路徑來執行多個腳本 用逗號分隔: , <> 要執行文件夾中包含的所有腳本,只需要傳遞文件夾名稱 舉個栗子: <>
表達式用于描述一組腳本。 我們可以利用腳本選擇表達式的場景: ?舉個栗子:(未利用表達式將匹配任何腳本) 使用不屬于類別的腳本: <> ?或和運算符允許我們構造更復雜的表達式。 以下表達式將匹配不在,或者,或者類別中的任何腳本。 - <> ?如果我們想要執行和中的所有類別腳本。 我們使用: < > ?甚至可以使用通配符*: <> ?當然,我們可以結合使用通配符和表達式。例如: 讓我們運行名稱以開頭的所有腳本,但排除 ,,和腳本: ) 下一個命令將執行以開頭的但不在類別中的所有腳本: “ * ()”<>
--script-args 選項用于在NSE腳本中設置參數。
還是舉個栗子,設置http-title腳本的參數useragent,使用這個表達式:
nmap -sV --script http-title --script-args http.useragent =“Mozilla 1337“<target>
當然有時你也可以在忽略腳本名稱設置參數(以下兩條表達意思是一致的):
nmap -p80 --script http-trace --script-args path <target>
nmap -p80 --script http-trace --script-args http-trace.path <target>
如果你使用共享參數名稱的腳本,就必須避免參數沖突。例如下面中的uri參數,公用的時候要是需要進行額外的設置時就必須加上完整的腳本名稱,避免參數之間的沖突。
$ , = , = <> $ , = , = <>
編寫NSE腳本我們需要有lua編程語言的基礎,可以回去自己學習一下。我這里簡單列出編寫腳本之前必須了解的一些語法。其他的就自己回去學習吧。轉載于菜鳥教程:http://www.runoob.com/lua/lua-tutorial.html
輕量級: 它用標準C語言編寫并以源代碼形式開放,編譯后僅僅一百余K,可以很方便的嵌入別的程序里。
可擴展: Lua提供了非常易于使用的擴展接口和機制:由宿主語言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來就內置的功能一樣。
其它特性
支持面向過程(procedure-oriented)編程和函數式編程(functional programming);
自動內存管理;只提供了一種通用類型的表(table),用它可以實現數組,哈希表,集合,對象;
語言內置模式匹配;閉包(closure);函數也可以看做一個值;提供多線程(協同進程,并非操作系統所支持的線程)支持;
通過閉包和table可以很方便地支持面向對象編程所需要的一些關鍵機制,比如數據抽象,虛函數,繼承和重載等
標示符 標示符用于定義一個變量,函數獲取其他用戶定義的項。標示符以一個字母 到 或 到 或下劃線 開頭后加上個或多個字母,下劃線,數字(到)。 最好不要使用下劃線加大寫字母的標示符,因為的保留字也是這樣的。 不允許使用特殊字符如 @, $, 和 % 來定義標示符。 是一個區分大小寫的編程語言。因此在 中 與 是兩個不同的標示符。以下列出了一些正確的標示符: 關鍵詞 以下列出了 的保留關鍵字。保留關鍵字不能作為常量或變量或其他用戶自定義標示符: 一般約定,以下劃線開頭連接一串大寫字母的名字(比如 )被保留用于 內部全局變量 數據類型 是動態類型語言,變量不要類型定義,只需要為變量賦值。 值可以存儲在變量中,作為參數傳遞或結果返回。 中有個基本類型分別為:、、、、、、和。 數據類型描述 這個最簡單,只有值屬于該類,表示一個無效值(在條件表達式中相當于)。 包含兩個值:和。 表示雙精度類型的實浮點數 字符串由一對雙引號或單引號來表示 由 或 編寫的函數 表示任意存儲在變量中的數據結構 表示執行的獨立線路,用于執行協同程序 中的表()其實是一個( ),數組的索引可以是數字或者是字符串。在 里, 的創建是通過來完成,最簡單構造表達式是{},用來創建一個空表。 (空) 類型表示一種沒有任何有效值,它只有一個值 變量 變量在使用前,必須在代碼中進行聲明,即創建該變量。 編譯程序執行代碼之前編譯器需要知道如何給語句變量開辟存儲區,用于存儲變量的值。 變量有三種類型:全局變量、局部變量、表中的域。 中的變量全是全局變量,那怕是語句塊或是函數里,除非用 顯式聲明為局部變量。 局部變量的作用域為從聲明位置開始到所在語句塊結束。 變量的默認值均為 。 = = () = = () (,) = = (,); (,) 執行以上實例輸出結果為: $
Nmap的目錄結構
我們只需要簡單的了解一下它的結構即可,了解它的目錄結構是為了清楚Nse腳本存放的位置。這里有幾個注意點:
1.編寫的腳本的后綴為nse
2.編寫之后的NSE腳本存放在script文件夾內,這樣腳本才可以生效
3.必須使用--script選項進行調用Nse腳本
NSE腳本的編寫流程
在書寫NSE腳本之前我們必須了解它的書寫步驟,為了方便大家理解,我把一個NSE腳本的書寫分為了四步。
1.導入腳本編寫所需庫
2.編寫腳本描述信息
3.確定Rule類型
4.編寫Action
可能此時你還有點蒙,沒關系,我們看一下圖思路就清晰了。
Namp nse 腳本模板結構如圖所示:
文章看到這里大家肯定想接下來肯定要開始編寫NSE腳本了吧。還不行呢,我們先舉個幾個栗子來說說四個Rule類型的區別。
Rule的四種類型
Rule:用于描述腳本的觸發規則,返回值只有true和false兩種。返回值決定了后面action對應的函數是否執行,注意:true(執行),flase(不執行)。它有四種類型分別是Prerule,Hostrule,Portrule,Postrule。
下面的幾個栗子的環境為:
1.Window 2.phpstudy 3.nmap-7.6 4.zzcms8.2(對應zzcms.im)
基礎參數擴展
HOST | TABLE類型 |
---|---|
host.os | 操作系統信息 |
host.ip | tagret(目標主機)對應的ip,例如下面的127.0.0.1 |
host.name | tagert在命令行對應的名字,例如下面的zzcms.im |
host.targetname | 同上host.name,我個人是這樣認為的 |
host.directly_connected | 判斷目標主機是否與本機在同一個子網 |
host.mac_addr | mac地址 (必須是同一子網的設備這個命令才有效) |
port | table類型 |
port.number | 端口號 |
port.protocol | 協議 |
port.service | 服務 http或https |
port.version | 版本信息 |
port.state | 端口狀態 |
Prerule
Prerule會在Namp沒有掃描之前進行觸發。
舉個栗子:我們新建一個prerule.nse文件,然后我們把它存放在script文件夾下。只要"RongRi AnQuan NSE script Prerule test"打印在Namp掃描之前,就可以證明Prerule會在Namp沒有掃描之前進行觸發。
= = = = {,} = (,) = (, )
我們都知道在測試階段我們難免會出現錯誤,那假設我們出現了錯誤我們應該如何解決呢。這時我們需要借助Nmap的調試模式進行調試。還是老規矩舉個栗子:那我這里新建一個preruleDebug.nse文件讓它打印系統信息故意讓其出錯(至于為啥會出錯后面會解釋),然后調試一下給大家看。我們只需要加上-d選項即可進入調試模式,那一般我這邊是-d 3,3代表的是等級,等級越高,越詳細。-d 3打印的調試的信息已經足夠詳細了,所以我習慣選擇-d 3.
= = = = {,} = (,) = (, )
錯誤界面如圖所示:
調試模式如圖所示:
我們從圖中可以看到出錯原因是因為prerule threw an error!看到詳細原因是因為attempt to index a nil value (local 'host')意思是說host是個無效值。原因是:我們知道prerule是在Nmap掃描之前觸發腳本的。那也就是說我們是無法在action中打印出操作系統信息。好了,到這里大家也應該知道如何調試錯誤了。
聽說,對比產生美
我們都知道對比產生美,那我們在這個錯誤的模板上改一下規則讓它變成hostrule,看看結果如何。
Hostrule
Hostrule會在Namp執行主機發現或探測進行觸發。
舉個栗子:新建一個hostrule.nse文件。復制上面preruleDebug.nse的代碼,但是做一點改動,就是Rule的類型改為Hostrule。然后運行能否打印我們想要的系統信息(嘻嘻,結果當然是成功打印啦)。
= = = = {,} = (,) = (, )
Portrule
Portrule會在Namp執行端口掃描時觸發腳本。
舉個栗子:新建portrule.nse文件,代碼如下,然后我們掃描幾個端口然后看看是否在掃描端口的時候打印出“Hongri Anquan yumu”和host.ip。
= = = = = = {,} = (,) == == (,) = {} = (,) (,(, )) (, )
結果如下:
再舉一個栗子:小試牛刀,我們寫一個Nse腳本來獲取zzcms8.2網站上的客服電話號碼。
參數知識擴展
HTTP | 庫 |
---|---|
get() | 發起get請求,請求結果以一個table的形式返回 |
host | 要請求的主機 |
path | 要檢索的路徑 |
options | 可選,允許調用者控制socket,請求頭的table |
port | 要檢索的端口 |
post() | 發起post請求,請求結果以一個table的形式返回 |
ignored | 向后兼用,一般填寫nil,忽略即可 |
postdata | post數據,字符串或者table格式 |
host | 要請求的主機 |
path | 要檢索的路徑 |
options | 可選,允許調用者控制socket,請求頭,超時時間的table |
port | 要檢索的端口 |
注意小細節
-- 1.方法解釋
-- string.match(str, pattern, init)
-- string.match()只尋找源字串str中的第一個配對. 參數init可選, 指定搜尋過程的起點, 默認為1。
-- 在成功配對時, 函數將返回配對表達式中的所有捕獲結果; 如果沒有設置捕獲標記, 則返回整個配對字符串. 當沒有---- 成功的配對時, 返回nil。
-- 2.亂碼問題解決方法
-- 打印的response.body(響應體)在cmder可能會顯示亂碼。解決方法如下:
-- cmd命令行窗口字符編碼切換為UTF-8,命令行中執行:chcp 65001
= = = = = = = = = {,} = (,) , = = (,,) = (,) ~= ..
Portrule會在Namp結束時觸發腳本,通常用于掃描結果的數據提取和整理。
舉個栗子: 觸發時候打印"Hongri Anquan test postrule"
= = = = {,} = (,) = (, )
需要詳細zzcms8.2代碼審計的內容請到:https://bbs.ichunqiu.com/thread-36147-1-1.html
那我這里本地搭建了環境,然后我先簡單使用火狐測試一下是否存在反射型xss。廢話不說,打字累人,看操作。
嗯,只要玩過web滲透的都應該知道此時源碼當中肯定插入了<script>alert(1)</script>,這點必須清楚,因為這是我們后面編寫Nse腳本思路。
好。我們來看看圖,確定編寫思路。
看完四步的你應該很清晰如何編寫我們的腳本了,那就開干吧。我這里新建一個zzcmsxss.nse,代碼如下:
= = = = = = = = = {,,,} = (,) == == = = (, ) (,) (,) = {} = = = ( .. ) ={ = { []=, []=, []=, [] = , [] = , []=.. .., []=, []=, []=, []=, } } = { []=, []=, []= } = (,,,,,) == (,) ~= (,(,)) (, ) (,(,)) (, )
結果如下(保存有xml的輸出格式):
看完上述內容,你們掌握Nmap滲透測試腳本是怎樣的 的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。