打開流量包,發現dns域名請求的流量中帶有疑似base64的字符串
把dns流量中第一個奇怪的字符串放入cyberchef,base64解碼再轉換為16進制,發現了zip文件頭,找到方向了!
常見文件頭:https://segmentfault.com/a/1190000018886731
那就提取一下吧
tshark -r tunnel.pcap -T fields -e ip.src -e dns.qry.name -Y 'dns' | grep '192.168.1.103' | grep 'evil.im' > out.txt
- -r tunnel.pcap 需要分析的報文記錄文件(pcap格式)
- -T fields 輸出格式,選fields按字段,也可以選json等其他格式,需結合-e 及 -E使用
- -e ip.src
- -e dns.qry.name 提取dns查詢的域名信息
- -Y <display filter>,使用讀取過濾器的語法
- > out.txt 將內容輸出到out.txt文件
- grep 使用正則過濾,過濾出想要的內容
提取出來的內容,有一些重復的部分,而且字符串末尾的.evil.im很礙眼啊,那就通過腳本來解決這些問題吧
給腳本小白們提個醒,該腳本版本是python2的,覺得在windows配環境麻煩的,可以直接選用linux系統如Kali(神器)或者如Ubuntu之類的,直接python2跑腳本,很快啊,就會出結果了
# -*- coding:utf-8 -*-
import base64 f = open('tunnel_out.txt', 'r').readlines() f1 = open('flag.zip', 'w') f2 = open('base.txt', 'w') for i in range(len(f) - 1): # 如果和上一行的信息重復,跳過改行 if f[i] == f[i+1]: continue # 將字符串內容全部提取出來,並替換掉.evil.im為空 a = f[i][14:].strip().replace('.evil.im', '') if len(a) % 4 == 2: a += '==' if len(a) % 4 == 3: a += '=' # 打印 a f2.write(a + '\n') f1.write(base64.b64decode(a)) f1.close() f2.close()
base.txt中存儲着base64加密后的信息
我們還提取出來一個flag.zip壓縮文件,打開看看
發現內有一個加密了的壓縮圖片,這時我們base.txt的內容就排上用途了,肯定就是base64隱寫啦
# -*- coding:utf-8 -*- b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' with open('base.txt', 'rb') as f: bin_str = '' for line in f.readlines(): stegb64 = ''.join(line.split()) rowb64 = ''.join(stegb64.decode('base64').encode('base64').split()) offset = abs(b64chars.index(stegb64.replace('=','')[-1])-b64chars.index(rowb64.replace('=','')[-1])) equalnum = stegb64.count('=') #no equalnum no offset if equalnum: bin_str += bin(offset)[2:].zfill(equalnum * 2) print ''.join([chr(int(bin_str[i:i + 8], 2)) for i in xrange(0, len(bin_str), 8)]) #8 位一組
結果出來了,這就是壓縮文件的密碼了
打開圖片,成功獲得flag
參考的師傅們的WP: