在烏云zone里看到了《HFS 2.3x 遠程命令執行(抓雞黑客末日)》的文章,以前只是分析二進制漏洞,這種命令注入漏洞還是第一次分析,從網上下了HFS 2.3.279這個版本,運行起來之后,執行POC,四個calc就執行起來了。
poc:
http://localhost:80/?search==%00{.exec|calc.}
PS:分析到最后,google查找可執行模塊中的字符串“parserLib
”,才知道這個漏洞是CVE2014-6287。。。。。。一種淡淡的憂傷。不過還是說一下分析的過程吧。
首先是分析前的一些準備工作,用PEiD查看了一下文件,加了asp的殼,通過PEiD通用脫殼器簡單的進行脫殼。
通過IDA加載脫殼后的文件,看到一些函數如圖,根據之前對c++中string類實現的認識,看來應該是使用了靜態編譯,字符串處理的庫代碼被靜態鏈接到了可執行文件中。
通過PEid對脫殼后的文件進行編譯器識別,識別為Borland Delphi 6.0 - 7.0,通過IDA加載相應的簽名庫,對函數進行簽名,這樣就能識別出大量的內聯函數,方便分析。通過簽名,已經可以識別出5636個內聯函數,這樣分析起來就方便很多。
通過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一下。。。。。。。
查看該漏洞詳情,可以看到和分析的結果一致,由于正則表達式的問題,導致了最終的遠程代碼執行。