打开流量包,发现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: