有什么東西想拿卻拿不出來?不妨開開腦洞。
緣起是2014年底的時候看到金山做的在線惡意代碼分析系統“Fire eye”(https://fireeye.ijinshan.com/
)。感覺很新鮮,丟了自己攢的幾個樣本丟了上去,分析的結果還算可以。從分析報告來看,它也是一類沙箱檢測工具,把樣本丟到虛擬機里跑,再在虛擬機內外布控,監測樣本的各種行為,最后生成分析報告并給出判斷是否惡意樣本,分析報告里還包含樣本運行時的截圖。
于是我開始有點好奇,這個沙箱大概是個什么樣的,于是自己寫了一些小的檢測程序丟進去,把環境變量、系統信息、網絡配置、進程列表、服務和驅動什么的讀出來顯示在窗體上,這樣從分析報告里的樣本截圖就能讀到這些信息了。
嘛,這里先說一下,本人并不會挖漏洞和逆向,說來慚愧,大學時候的匯編都是補考才過的。就是個小小的.net碼農而已。
然后我在系統環境變量里發現一個別的地方沒有的玩意:%FEKERNEL%
,指向c:\mon\
文件夾,想來應該是“FIRE EYE KERNEL
”,即包含沙箱內部監控程序的核心文件夾。
有了這個發現自然不會放過,另外專門編寫了程序去枚舉和讀取FEKERNEL里的東西,然而發現只要碰了那個文件夾,樣本分析報告就會被隱去大部分內容,和FEKERNEL文件夾直接和間接(比如復制出來之后再讀取復制的文件)相關的內容都被刪掉了,想來應該是做了某種自我保護。只有讀取文件夾大小的操作沒被攔截。
不過既然有了目標,路就好找了。試了幾次找到了繞過保護的辦法,成功讀取到了FEKERNEL里的文件并把詳細信息。下一步當然就是如何拿到里面的東西咯。
里面是大概幾十MB的二進制文件,有EXE有DLL有SYS甚至還有PDB,估計是開發人員方便調試直接把符號文件也一起扔里面了。這么多東西怎么拿出來呢?最初的想法是通過網絡傳出來,然而沙箱的網絡和互聯網是不通的,對用戶的唯一輸出僅限樣本分析報告。
然后我發現早幾年前有人通過編寫樣本在注冊表里寫入HTML代碼內容的鍵值在分析報告頁面成功實施了XSS,覺得這個思路是可行的。然而幾十MB的東西即便壓縮成十幾MB再按BASE64編碼,寫到一個監控程序會監控的地方,仍然沒法全部拿出來,因為太多了。就算畫在窗體上也…………
……慢著,畫在窗體上?
腦袋靈光一閃,這辦法可以啊!我先想到的是把BASE64串按能分辨的最小字號寫在窗體上,然后進一步想到干脆利用窗體上的像素,一個像素表示一個字節,然后直接想到干脆一個像素用RGB分量存儲三個字節,這樣可輸出的數據量就成幾何級數上升。稍微計算了一下,按最高密度的數據傳輸方案,一個窗體能被截圖下來的最大面積足夠“畫下”壓縮過的完整目標數據。
思路有了,東西直接就搞出來了。由于FE只能上傳單個可執行文件樣本,于是把所有用到的東西打包成一個自解壓RAR,并附帶解壓后執行腳本,先繞過保護讀取到FEKERNEL里的所有內容并復制到另外的位置,然后用自帶的WINRAR.EXE通過命令行將其壓縮,最后把壓縮包以二進制打開,把內容“畫”在自己窗體上。
這樣我就順利拿到了FEKERNEL里的所有東西。當然這還得感謝FE在處理樣本截圖的時候沒有做任何有損壓縮,雖然是JPEG格式。
這個漏洞我已在去年提交給烏云:火眼惡意代碼分析系統自保機制繞過導致二進制泄露
總結:如果有什么東西你知道在哪,但沒法直接拿到,不妨冷靜分析一下:
綜合考慮這三方面因素,并仔細分析,就不難達成目標了。