作者:
cssembly
·
2014/09/29 11:30
0x00 寫在前面
在烏雲zone裡看到了《HFS 2.3x 遠端命令執行(抓雞駭客末日)》的文章,以前只是分析二進位制漏洞,這種命令注入漏洞還是第一次分析,從網上下了HFS 2.3.279這個版本,執行起來之後,執行POC,四個calc就執行起來了。
poc:
http://localhost:80/?search==%00{.exec|calc.}
PS:分析到最後,google查詢可執行模組中的字串“parserLib
”,才知道這個漏洞是CVE2014-6287。。。。。。一種淡淡的憂傷。不過還是說一下分析的過程吧。
0x01 準備工作
首先是分析前的一些準備工作,用PEiD檢視了一下檔案,加了asp的殼,透過PEiD通用脫殼器簡單的進行脫殼。
透過IDA載入脫殼後的檔案,看到一些函式如圖,根據之前對c++中string類實現的認識,看來應該是使用了靜態編譯,字串處理的庫程式碼被靜態連結到了可執行檔案中。
透過PEid對脫殼後的檔案進行編譯器識別,識別為Borland Delphi 6.0 - 7.0,透過IDA載入相應的簽名庫,對函式進行簽名,這樣就能識別出大量的行內函數,方便分析。透過簽名,已經可以識別出5636個行內函數,這樣分析起來就方便很多。
0x02 分析過程
透過IDA檢視檔案匯入函式,查詢WinExec、ShellExecuteA等程式啟動相關函式,透過交叉引用找到函式呼叫點,透過windbg設定斷點,觀察引數,確實是由ShellExecuteA啟動了計算器。同時檢視程式的呼叫棧。
透過呼叫棧,可已找到sub_531438函式,該函式解釋了exec|calc命令,並啟動了calc。對函式進行分析,可知該函式是對使用者的命令進行解釋執行的函式,相關程式碼如下。
繼續透過呼叫棧,結合IDA對“exec|calc”的傳遞過程進行分析,找到
int __stdcall sub_51E268(signed char *** a1, int a2)
函式,**a1指向需要解釋的字串“\x00{.exec|calc.}”,其中int __cdecl sub_51DFA0(int a1)
函式對“\x00{.exec|calc.}
”對其進行分析並執行。
對於
http://localhost:80/?search=%20{.exec|calc.}
透過對比sub_51E268處**a1指向需要解釋的字串,可以看到{.|
等字元都被編碼了。
可見
http://localhost:80/?search=%00{.exec|calc.}
中%00
導致了{.exec|calc.}
中的特殊字元轉換失敗,因此需要對轉換函式進行定位。在模組中對“&#”字串進行查詢,定位得到
int __fastcall sub_528EB0(int a1, int a2)
完成對{|等字元進行轉換。
sub_51E390做正規表示式匹配,查詢{|
等字元,當%20{.exec|calc.}
傳遞給該函式時,該函式返回值為2。下面由
sub_4B827C、Sysutils::IntToStr
將字元轉換為10進位制字串形式,最終替換掉原始字串中的{。
對於
http://localhost:80/?search=%00{.exec|calc.}
sub_51E390返回值為0,因此後面的{|等字元不會被轉換,最終導致了後面的命令執行。
檢視
int __fastcall sub_51E390(int a1, int a2)
函式,可以看到“\\{[.:]|[.:]\\}|\\|
”和“m!
”,在分析的過程中,看到過字串“parserLib
”,就google一下。。。。。。。
檢視該漏洞詳情,可以看到和分析的結果一致,由於正規表示式的問題,導致了最終的遠端程式碼執行。
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!