2021年10月14日,山东·青岛,中国工业互联网安全大赛核能行业赛道,上午9:00开始,下午5:30结束。本人与另外2名同事组队参加比赛,经过8个半小时的角逐,最终获得三等奖。这个系列是本次CTF比赛复盘。
CTF准备工作
CTF比赛时间长、无间歇、题量大、难度大。参赛选手应提前准备好常用的CTF工具,应具备快速编写脚本的能力,应做好分工配合。
CTF类型、工具和应对策略
CTF题目常见类别有:流量分析、逆向工程、Web漏洞、其他类型。
流量分析类
重点就是要提前准备好工具和脚本。
应关注常见协议,使用 wireshark 工具全局搜索flag,注意观察包中特别的数据。比如
{ 这类Unicode编码
http.request.method == POST ,常见 Webshell
http.response.code == 200 ,第一次尝试成功的访问
逆向工程类
重点就是要提前准备好工具和脚本。
- 用ExeinfoPE、PEID、DIE等工具查壳,有壳就用工具UPX等脱壳
- 用IDA等工具,静态分析、反编译,找flag
- 必要时动态调试,常用工具ollydbg、x32dbg、x64dbg等
如果发现exe文件过大,那么极有可能是用 pyinstaller 打包的,用工具 pyinstxtractor.py 逆向代码。
Web漏洞
重点就是要提前准备好工具和脚本。
熟练使用 Kali 里面的工具集。
其他类型
重点就是要提前准备好工具和脚本。
图片隐写,使用binwalk或foremost工具分离。使用stegsolve工具分离图层直接找到flag。
修复文件头部信息。
使用john工具暴力破解。
图片一般用010Editor打开,搜索flag、key、f-l-a-g、k-e-y,肉眼观察有没有异常。注意&#开头 分号结尾 格式的Unicode,直接复制出来转成ASCII就行了。
key{you a
re right}
靶场
CTF-wiki(https://ctf-wiki.github.io/ctf-wiki/)是一个关于CTF的社区项目,上面有着各个方向的学习路线与讲解。只是部分讲解并不是很清楚,需要自己多想多动手。
pwnable.tw(pwnable.tw)是一个著名的刷题网站,网站上的题目都十分有意思,可以学到许多新的东西。只是后面部分的题目并没有writeup。
Buuoj(https://buuoj.cn/challenges)是北京联合大学的CTF题目平台,上面有着各种比赛的题目环境,适合大家复现比赛的题目。
墨者学院(https://www.mozhe.cn/bug)
BugKu(https://ctf.bugku.com/)
hacker【脱壳、逆向】
附件是一个EXE文件 ARE_YOU_SDPD.exe。用 DIE (Detect It Easy)查壳,发现是 UPX 加壳。那就用 UPX 脱壳,得到 a.exe。
upx -d ARE_YOU_SDPD.exe -o a.exe
用 IDA 反汇编一下 a.exe,可以找到入口 main 函数,在 main 函数的汇编代码上按F5键看到main 函数的代码。程序逻辑是打印一行,等待用户输入字符串并保存到 Buffer,再在 check_flag 函数里检查用户的输入。双击 check_flag 函数,看到 check_flag 函数逐位检查字符是否匹配,只要把检查的整型转换成对应的 ASCII 字符,就得到了 flag。整型数组为{102,108,97,103,123,121,111,117,45,97,114,101,95,97,95,104,97,99,107,125}
写一段简单的代码,显示一下为 flag{you-are_a_hack} ,但是需要提交 flag{you_are_a_hack}
num = [102, 108, 97, 103, 123, 121, 111, 117, 45,
97, 114, 101, 95, 97, 95, 104, 97, 99, 107, 125]
m = list(map(lambda n: chr(n), num))
print(''.join(m))
隐写 【binwalk工具】
附件是scene.jpg图片。先用 010Editor 查看这个图片,能直接看到图片的头部是否完整正常,能直接看到是否隐藏了flag。使用 Stegsolve 逐个图层看,没有发现异常,尝试用 binwalk 搞定。
binwalk -e scene.jpg
cd _scene.jpg.extracted
zip2john 7FE57.zip >> pass.txt
john pass.txt
发现图片里隐藏的压缩包 7FE57.zip,使用 john 工具暴力破解,发现压缩包的密码是easy。解压缩得到flag.txt,里面就是 flag{hide_1n@_Picture} 。
机房密码【base64、逆向】
附件sixpass.zip,解压发现里面有两个文件,一个 tips.txt,另一个 sixpass.exe 。
tips.txt里面有一段话,经过黑客人员的不屑努力,在上位机上发现了登录密码的一半信息,剩下的一半要靠你们继续努力辣!!! ZmxhZyU3Qmgwd19hX0M= 。这个做 base64 转码,就得到了 flag 的前半部分。注意转码以后有个 %7B ,要对 %7B 、%7D 敏感,这就是左右花括号,所以前半部分是 flag{h0w_a_C 。
运行一下 sixpass.exe,看来是要6位密码。对 sixpass.exe 查壳,发现没有壳。那么用 IDA 打开sixpass.exe反编译,在 main 函数按 F5 得到伪代码。注意圈出来的部分,如果6位数字都不是整型57就错,因此判断6位数字是6个整型57,整型数57就是 ASCII 字符9。
把前后两个半段拼接到一起,就得到 flag{h0w_a_CLEvEr_guy}
鱿鱼游戏【脑洞】
附件解压缩是一个可执行文件 squid_game_protected.exe 。题目描述如下(有提示)
小王由于操作不规范,误将不明U盘插入到上位机中,导致上位机中的某些关键文件被加密,但攻击者在U盘中还留下了一个可执行文件,并且留下了一段话:该程序只有在特定的时间段内才能打开,如果过早或过晚打开该文件,会导致当前目录下的所有文件被加密。如果在规定时间打开了该文件,则会直接得到解密的key来恢复被加密的文件。
注意,题目里的EXE文件不要直接执行,应放入虚拟机,做好快照,再在一个文件夹中执行,避免不必要的损失。这道题很有意思,不是靠技术破解到 flag!
执行一下 squid_game_protected.exe 。多出个文件,Readme.txt 里面是句狠话,出自臭名昭著的勒索病毒 WannaCry ,我偏要再次执行一下。
再次执行时,程序停顿了几秒,然后提示,结果文件夹里的文件都被加密了,实际上只是每个文件的扩展名都变成了.WNCRY。模拟了Wanna Cry 勒索病毒的加密过程,恢复文件只要把扩展名改回去就行。
此后不管怎样执行,提示信息都一样,不会再提示日期时间信息,因此这个程序第一次执行就要破解。
所以要注意,题目里的EXE文件不要直接执行,应放入虚拟机,做好快照,再在一个文件夹中执行,避免不必要的损失。
结合提示信息,分析这个程序只能在 2021.10.15.09:00:00 s 到 2021.10.15.09:00:03 s 之间的时间段内才能执行。那就把操作系统时间改了吧。
先重新解压缩一个 squid_game_protected.exe ,把操作系统时间改成 2021.10.15.08:59:50,再赶紧到命令行窗口,为确保能在 2021.10.15.09:00:00 s 到 2021.10.15.09:00:03 s 之间第一次执行 squid_game_protected.exe,要再大约 2021.10.15.08:59:54 的时候按下回车。
执行直接得到flag —— flag{c4c728d9ccbc87e4b5ce2f}
数据库登录【流量分析】
题目描述
具体描述已经忘记o(╯□╰)o
大概意思就是分析附件里的.pcapng包,找到flag。流量涉及到 MySQL 数据库了。
附件用wireshark打开这个包,全局搜索一下flag,没有发现有用信息。
猜想一般黑客得手是在http访问成功的时候,所以先筛选 http.response.code == 200,发现 No.232985 包 request 请求 GET /test/flag.txt,No.232989 包 response 返回 flag.txt,里面的内容 —— ZmxhZ3t3ZWxjb21lX3
根据提示数据库登录,猜想后半段在数据库的协议中,并且流量中有MySQL协议,而且有很明显的root登录成功和select查询。筛选mysql协议,内容为Response,逐个查看MySQL Protocol的内容,发现No.233219包里面有信息,是base64编码,而且是另外半部分—— RvX3lvdV9maXJzdH0gIA
合并到一起 ZmxhZ3t3ZWxjb21lX3RvX3lvdV9maXJzdH0gIA,再base64转码得到flag —— flag{welcome_to_you_first}
Webshell密码【流量分析】
题目描述:
某次攻防演练中,抓到了一个webshell的流量,请分析出密码,flag形式:flag{密码}
附件webshell.pcapng,全局搜索flag,没有发现有用信息。
因为是Webshell,一般HTTP请求会用到POST方法,筛选 http.response.method == POST。发现攻击者在不断的尝试用户spiderpass的弱口令,一直尝试到 No.2253 包,在此之后就得手了。所以 No.2253 包里面尝试的口令就是flag中{}的部分。 根据提示flag的格式为flag{密码}得到 —— flag{hacked_by_q1ngdao}
传统流量取证
题目描述:
在某次攻防演练中,小王发现流量探针平台突然告警,小王第一时间下载了告警流量包,并进行分析:发现攻击队攻击在攻入内网后,利用了一个内网OA的一个漏洞,获取了某机器权限,并成功下载了一个关键压缩包文件。你能帮忙分析出压缩包里面的内容吗?
附件 告警包.pcapng。根据提示“成功下载了一个压缩包文件”,筛选http.response.code == 200,从后往前找发现 No.2212 是 Response 似乎传输了文件。找到 No.2212 对应的 Request,也就是 No.625 ,发现了“Form item: "z1" = "C:\\security.emtp.zip"”。
接下来,流追踪——TCP 流。 选择下载文件的传输方向,数据以原始数据的方式展示,另存为security.emtp.zip。
把 security.emtp.zip 解压缩得到一个文件 security.emtp 。这个是用工控软件 EasyBuilder Pro 打开的。找到 EasyBuilder Pro v6.05并安装,打开文件 security.emtp,在主界面得到flag —— flag{beSt_nucl@ar}
usb流量分析【usb流量分析】
题目描述:
具体描述忘记了o(╯□╰)o
大概意思是有个U盘插到电脑上,然后经过一些操作导致该电脑重启了。找到这个过程中的flag。
1、USB协议
先引用一段对USB协议的解释
USB是 UniversalSerial Bus(通用串行总线)的缩写,是一个外部总线标准,用于规
范电脑与外部设备的连接和通讯,例如键盘、鼠标、打印机、磁盘或网络适配器等等。
通过对该接口流量的监听,我们可以得到键盘的击键记录、鼠标的移动轨迹、磁盘的
传输内容等一系列信息。
USB有三种方式:USB UART,USB HID,USB Memory
UART或者Universal Asynchronous Receiver/Transmitter。这种方式下,设备只是简单
的将USB用于接受和发射数据,除此之外就再没有其他通讯功能了。
HID是人性化的接口。这一类通讯适用于交互式,有这种功能的设备有:键盘,鼠标,
游戏手柄和数字显示设备。
USB Memory,或者说是数据存储。External HDD, thumb drive / flash drive,等都是
这一类的。
因此通过流量分析,特别是 USB HID 得到键盘击键记录、鼠标移动轨迹等信息来获得flag。
2、键盘流量
键盘流量的特点:
键盘数据包的数据长度一般为8个字节,击键信息集中在第3个字节,每次击键都会产生一个数据包。如果看到给出的数据包中的信息并且只有第3个字节不为00, 那么可以猜测是一个键盘流。
第三字节,键盘的对应关系,查看 10 Keyboard / Keypad Usage (0x07)https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf
第一个字节,每个bit都代表一个控制按键,如果看到这个数据包中第一个字节是 20 或者 02,那么可以认为是按住了 Shift切换。比如,0200040000000000,就是 Left Shift + a,就是大写 A。
bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 |
Right GUI | Right Alt | Right Shift | Right Ctrl | Left GUI | Left Alt | Left Shift | Left Ctrl |
提取敲击键盘的记录,就可能得到flag
3、鼠标流量
鼠标流量
USB协议鼠标数据一般为四个字节
第一个字节, 代表按键。
当取0× 00时,代表没有按键
当取0× 01 时,代表按左键
当取0× 02时,代表当前按键为右键。
第二个字节,可看作为signed byte类型,其最高位为符号位。
当值为正时, 代表鼠标右移像素位;
值为负时, 代表鼠标左移像素位。
第三个字节, 代表垂直上下移动的偏移。
当值为正时, 代表鼠标上移像素位;
值为负时, 代表鼠标下移像素位。
提取鼠标轨迹,并用绘图工具画出来图像,即可能得到flag
4、writeup
附件解压缩得到一个加密的 flag.docx 文件和 一个ez_usb_10月.pcapng 包。需要分析流量包得到密码,打开文件 flag.docx 就能拿到flag了。
wireshark 打开 ez_usb_10月.pcapng 包,筛选 usb.src == "1.12.1" and usb.dst == "host",发现每个发送给host的数据包,都是8个字节,且第3个字节不是00,认定是敲击键盘。
把所有第三个字节提取出来
14, 1a, 08, 15, 17, 28, 1e, 1f, 20, 04, 16, 07, 28, 21, 22, 23
再对照键盘的对应关系就得到密码 qwert123asd456。
q,w,e,r,t,return,1,2,3,a,s,d,return,4,5,6
用密码打开flag.docx就得到 —— flag{keyboard_Usb_yyds}
提取的办法也可以用 kali 里的工具 tshark。
- -r 输入文件
- -T 设置解码结果输出的格式, 默认为text
- -e 如果 -T fields选项指定, -e用来指定输出哪些字段,这里就输出 HID 部分
tshark -r ez_usb.pcapng -T fields -e usbhid.data | sed '/^\s*$/d' > keyboard.txt
入门的黑客
题目描述:
在某次工控攻防演练中,防守方使用蜜罐捕捉到了某黑客在入侵时留下的恶意程序样本,现在要对该黑客进行画像,需要从该恶意程序中分析出反连时的IP和端口信息,看看聪明的你能否能找到他!!! 提交flag形式为flag{ip_端口}
附件解压缩,得到 一个ReadmE.txt,一个二维码 U2FsdGVkX1+idZVN8gu8RY6JEWTGk0ktAXF+N8hyW1U=.png,一个Trojan.rar压缩包(解压缩需要密码)。
ReadmE.txt里面没有什么内容。
某菜鸡黑客在入侵上位机时,不小心留下了自己的信息,看看聪明的你能否找到他!!!
看来要用二维码得到压缩包的解压缩密码。
U2FsdGVkX1+idZVN8gu8RY6JEWTGk0ktAXF+N8hyW1U=.png用微微二维码解码,得到信息 —— IndustrialInternet。此外,其他工具查图没有有用信息。
再看图片名字,似乎可以解码,先base64尝试,得到 Salted__昅� 糆帀d茡I-q~7萺[U。
看到 Salted__开头,再结合U2Fsd开头,确定了这个是AES加密,前面IndustrialInternet是秘钥。解密得到密码 —— mima
在用 mima 把 Trojan.rar 解压缩,得到 Trojan.elf,这个elf放到linux环境里,赋予 0744 权限,执行一下。再用 ss -tup 命令查看这个木马进程在连接哪个IP哪个端口,结合提示得到flag形式为flag{ip_端口} —— flag{192.168.183.139_5678}
wifi破解近源攻击
题目描述:
近源攻击,在攻防演练期间,攻击队队员使用无人机悬停监听技术,成功抓取到了某核电办公网络的Wifi握手包,现在正在进行紧张的破解,你能破解该密码吗? 据得到的信息显示,该办公室设置的密码比较简单,可能是wifi名字和弱口令的组合。flag格式: flag{} + 密码 例如: flag{12345678}
先用aircrack-ng工具,看看哪个wifi有可能突破。发现有一个名为workplace的wifi有握手,那么就这个了。
根据提⽰,该wifi密码为wifi名字和弱⼝令的组合,那可以使⽤字典⽣成器来任意⽣成0-4,5,6……位的字符来测试。目前我还没有掌握字典生成器,先用python脚本生成字典,先生成workplace+4位数字的字典。如果4位的不行,再尝试5,6……位数字的。 提交 flag{workplace1014}
f = open('dict.txt', 'w')
for i in range(1, 10000):
f.write('workplace' + str(i) + '\n')
f.close()
日志分析
题目描述:
核电站新来的运维小王粗心把一个办公网地址映射到外网,遭到大量攻击,你能从日志当中找到有效信息吗。
筛选http协议,发现No.62395包前后有几个POST的http请求,执行了命令注入。先执行了uname,后执行了ls,再后cat hsdhe.bin(这个有用),再后cat index.php等等……
No.62395包,在 Line-based text data: text/html (111 lines) 右键-导出分组字节流-保存为.html,选择all files,浏览器打开这个html文件,就看到 f-l-a-g.txt 字样,前面还有Rar!,看来是个.rar压缩包里藏了flag。
关于rar文件格式,参考 RAR5 文件格式解析 - 乾坤盘的个人技术博客 。或者参考 RAR 5.0 archive format。注意,RAR5文件头(0x526172211A070100),RAR5文件结尾(0x1D77565103050400) 这些显著的特征!
将可疑部分复制为Hex流,在010Editor里面选择Paste from hex,另存为a.rar提取到这个rar文件。
这个rar文件解压缩需要密码,同时也用base64编码提示了你需要一个密码,并且相信你可以找到密码。那就不找密码了,直接 rar2john a.rar >> a.txt,然后 john a.txt 暴力破解,得到密码为goodluck。解压缩a.rar得到f-l-a-g.txt文件,里面就有flag —— flag{hdbw-dnsjpn-jndaj-AHH}