記一次遠端命令執行漏洞的挖掘過程
*本文作者:r0yanx,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。
前言
最近為甲方做滲透測試發現了一個遠端命令執行漏洞,可以通過惡意引數傳遞執行bash命令,本文回顧一下漏洞的挖掘過程。
發現
1、通過nessus掃描器的Sitemap模組,發現了可疑目錄:
2、根據sitemap的目錄資訊,開啟URL: ofollow" rel="nofollow,noindex" target="_blank">http://x.x.x.x:28076/file/ ,發現存在未授權訪問漏洞:
3、逐個檢視裡面的檔案,找到了一些比較有意思的JSP:
4、蒙了一下dirFiles.jsp的 引數,使用”path”作為引數名可列出目錄、檔案資訊,URL: http://x.x.x.x:28076/file/dirFiles.jsp?path= 。
5、同樣的方法,發現show.jsp存在任意檔案讀取漏洞,URL: http://x.x.x.x:28076/file/show.jsp?path=/etc/passwd 。
6、結合上面的目錄資訊和任意檔案讀取漏洞,對JSP檔案簡單審計一下,發現logContentNewest.jsp會呼叫一個bash指令碼,便猜想能否使用它構造命令執行:
測試
logContentNewest.jsp正常執行是這樣的,可自定義path引數的值,如/etc/passwd,來查詢這個檔案裡面的內容:
分析logContentNewest.jsp和 被呼叫的sh指令碼,得知path引數最終會傳入sh指令碼的FILE_PATH變數,然後呼叫下面的判斷邏輯。從下面程式碼我們可以看到,函式的功能是判斷FILE_PATH變數的值是否存在,而這個變數的值目前是可控的。
最初想通過新增雙引號閉合if條件判斷引數注入命令,沒有成功。
payload:/etc/passwd" ];ls;then echo 1;fi;if [ -e "123.txt;
從上圖可以看到,payload的雙引號不見了,在自己的Linux測試一下,發現bash在這種情況下會過濾雙引號,因此排除了存在過濾雙引號的可能。
經過多次測試,最終可用反引號“或者$()進行命令執行,如`ifconfig`:
payload:"`ifconfig`"
命令結果的回顯是因為判斷不存在FILA_PATH檔名的檔案後,會把變數值返回
echo "the file($FILE_PATH) dose not exist!"
拓展知識:Linuxbash中可以使用反引號“、$()等方式將bash命令的執行結果儲存到變數中,如a=$(ifconfig):
結果顯示不完整,只能看到返回的第一行的結果,沒關係,可以簡單優化一下:
payload:"`ifconfig |xargs`"
拓展知識:xargs可以將stdin中以空格或換行符進行分隔的資料,形成以空格分隔的引數(arguments),傳遞給其他命令。因為以空格作為分隔符,所以有一些檔名或者其他意義的名詞內含有空格的時候,xargs可能會誤判。簡單來說,xargs是給其他命令傳遞引數的一個過濾器,是構建單行命令的重要元件之一。 但是這裡僅僅只是通過xargs的特性讓它把多行內容轉換成一行來更好地顯示結果,當然也可以使用其他方法來實現:
在看看nmap內網掃描的結果,同樣的漏洞元件在內網中還發現了很多…
小結
漏洞是由於程式呼叫bash指令碼傳參時沒有做過濾,通過$(cmd)這樣的方式來執行命令並將結果存入變數中,在指令碼判斷檔案不存在時會返回檔名,造成了回顯。
漏洞修復方法:
嚴格控制檔名引數值,先判斷檔名或檔案路徑是否合法可修復漏洞。
*本文作者:r0yanx,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。