攻防世界 MISC 高手进阶 tunnel
提示:pyshark和tshark都可以解析流量,提取想要的数据。
流量分析
过滤器为dns && ip.dst == 8.8.8.8
,发现这个DNS的请求很像Base64,A是ipv4记录,AAAA是ipv6记录。
由于ipv4和ipv6发送的都是一样的流量,所以我们把过滤器改一下,我们过滤出ipv4的。
过滤器为dns && ip.dst == 8.8.8.8 && dns.qry.type == 1
这次我们拿到的全部都是A记录的了,写个代码把Base64字符串拿出来。
python代码如下:
import pyshark
cap = pyshark.FileCapture("tunnel.pcap", display_filter="dns && ip.dst == 8.8.8.8 && dns.qry.type == 1", tshark_path="D:/Program Files/Wireshark/tshark.exe")
with open("base64_str.txt", "w") as f:
for c in cap:
base64_str = str(c.dns.qry_name).split(".")[0]
f.write(base64_str + "\n")
运行后,运行目录获得base64_str.txt
,如图:
用在线网站解码第一段,点我进入在线网站。
解码出错了,所以说后面还要补上 =
符号,这个不明白的去看一下Base64编码流程。
直接上工具,就好了,或者去网站找Base64的补 =
符号代码,或者看我的博文,戳我即可。
已经自动补全=
,并拿到了Base64隐写的结果,password: B@%MG"6FjbS8^c#r
拿到第一行补全后的Base64字符串解码,获得16进制,50 4B 03 04
文件头,这不纯纯的ZIP格式,所以写代码拿到这个ZIP文件。
先把Base64补全=
后的字符串保存到本地,然后Python代码如下:
import base64
# 读取没有补全的base64
with open("base64_str.txt", "r") as f:
data = f.read()
data = data.splitlines()
# 先补全base64的`=`,保存到本地
with open("base64_str补全=后.txt", "w") as f:
for line in data:
missing_padding = len(line) % 4
if missing_padding != 0:
line += "=" * (4 - missing_padding)
f.write(line + "\n")
# 读取每行Base64,然后解码保存为flag.zip
with open("base64_str补全=后.txt", "r") as f:
data = f.read()
data = data.splitlines()
with open("flag.zip", "wb") as f:
for line in data:
f.write(base64.b64decode(line.encode("utf-8")))
运行结果,本地出现flag.zip
,成功拿到了。
用之前的Base64隐写的pass密码解压flag.zip
,如图:
FLAG:flag{D01n't_5pY_0nmE}
本题要素
1.要熟悉DNS的流量,会使用pyshark,或者其他方式解析流量,比如tshark命令。
2.熟悉Base64编码,会补全 =
符号
3.熟悉Base64隐写。