2022数字中国创新大赛虎符网络安全赛道 HFCTF2022 Qual WriteUp
Web#
babysql#
- 引号和标识符、逻辑符号交替使用,绕过空字符过滤;
- 利用整数溢出错误和 case when 产生布尔注入条件,成功 401,失败 500;
- 用 regexp 和 `column`collate’utf8mb4_bin’ 区分大小写爆破 username 和 password;
- regexp 中使用 \x[hex] 代替特殊字符。
P.S.: 最开始爆破时未考虑大小写情况,后面用 collate 重新判别大小写
exp.py:
1 | import requests |
check_type.py:
1 | import requests |
Baby Router Updater#
- index.htm 注释泄漏 cgi-bin/download.cgi?file=xxx,能够下载 cgi 二进制文件:cgi-bin/download.cgi?file=cgi-bin/upgrade_fw.cgi;
- 逆向 upgrade_fw.cgi,找到验证 fw 文件逻辑,先是一个 RSA Encrypt 得到密钥,再用这个密钥作为 RC4 Key,解密 fw 文件 152 字节开始数据 inflate 结果,得到 /etc/sbin/do-upgrade 执行的原始内容,如果原始内容的 MD5 与 fw 文件 8+128~8+128+16 处 MD5 相同,则执行 /etc/sbin/do-upgrade;
- 由于 RC4 解密的内容是可控的,通过将内容设置为 RC4 密钥流,其输出的明文为全 0,此时设置 MD5 为对应长度全 0 MD5 值,程序会运行至 system(“/etc/sbin/do-upgrade %s”);如果内容不正确,则程序在验证 MD5 后中止,两种不同的操作带来一定的执行时间差异;
- 经过实际测试,一次正确 MD5 值和错误 MD5 值的执行时间差在 30ms 左右,枚举每一位 RC4 密钥流,计算对应全 0 MD5,执行一次请求,同时执行一次将 MD5 值换为错误值的请求,如果两次请求时间差在 30ms 以内,则枚举的 RC4 Key 错误;如果超过了 30ms,则枚举正确,每次执行 30 次测试取平均时间差减小偶然网络堵塞带来的时间抖动。这样,可以爆出若干位 RC4 密钥流;
- 得到 RC4 密钥流后,解出 test_patch.fw 中 patch 格式为一个 tar.gz 文件,其中有 fwversion 指定版本号,upgrade.sh 执行任意命令。编写将 flag 打印/复制到 /ht 目录的脚本,使用 RC4 密钥流以相同方式打包 fw,上传执行成功,得到 flag。
为了最大程度避免网络抖动的影响,做题时根据服务器地址,开了个深圳阿里云主机,ping 值为 4ms。毕竟需要测出 30ms 的差异。
爆出 RC4 密钥流用了两三个小时。
bruteforce.py:
1 | from zlib import compress |
pack.py:
1 | from zlib import compress |
Misc#
Plain Text#
base64 解密后,大小写互换,用 Google 翻译得到英语,flag 为 HFCTF{apple_watermelon}
Quest-Crash#
点击 KEYS * 后抓包,使用换行符堆叠多条命令,利用 https://github.com/redis/redis/issues/2855 EVAL "struct.pack('>I2147483648', '10')" 0
使 redis-server 崩溃,然后点击 getflag 拿到 flag。
Reverse#
fpbe#
- fpbe_bpf__create_skeleton 处找到 bpf bytecode ELF: 0x4F4018;
- 导出后,用 https://github.com/cylance/eBPF_processor IDA 工具逆向 bytecode,逻辑为验证四个等式,可以列出方程:
1
2
3
4
5
6a:r1+0x58 b:r1+0x60 c:r1+0x68 d:r1+0x70
c*0xFB88+d*0x6DC0+b*0x71FB+a*0xCC8E = 0xBE18A1735995
d*0xF1BF+c*0x6AE5+b*0xADD3+a*0x9284 = 0xA556E5540340
d*0xDD85+c*0x8028+b*0x652D+a*0xE712 = 0xA6F374484DA3
d*0x822C+c*0xCA43+b*0x7C8E+a*0xF23A = 0xB99C485A7277 - 解出:
1
2
3
4a = 0x33356832
b = 0x44703873
c = 0x626c4173
d = 0x33527630 - 根据后续逻辑解 hex 得到 flag: HFCTF{0vR3sAlbs8pD2h53}