MISC
1
convert分解gif,在某张gif拿到一张二维码,扫码拿到flag
1 | convert inner.gif inner.png |
2
需改bmp图片高度,拿到压缩包密码
解压后,发现flag中存在一些不可见字符
零宽字节隐写,在线解码,拿到flag
Crypto
1
base85->base64->base32->hex
3
比赛的时候,以为题目是需要爆破替换表啥的,或者是通过给出的密文,确认替换表,结果经群里大佬提醒,发现,原来就是base91->base62->base58->base32就可以拿到flag
base62有个坑点,用比赛给的在线工具和python的base62库,都没有办法成功解码出字符串,用一个其他在线工具才ok的。。。。
在线工具地址
PWN
Web
1
查看验码,base64解码,拿到flag
2
抓包,修改cookie为admin,拿到flag
3
文件包含,直接尝试读取根目录下的flag
1 | http://119.61.19.217:57603/index.php?1=/flag |
4
比赛的时候没做出来,而且时候复盘,发现连门都没找到。
站点是各flask站,可以上传,此题目是HCTF2018的一道魔改题目。原题目需要登录,最终通过伪造jwt来实现绕过拿到flag。比赛时题目没有登录,根据群里大佬发的照片,拿到源码之后,能够看到有个路径下存在模板注入,找到路径之后模板注入应该就可以getshell了。现在以HCTF2018的环境进行部分复现。
知识点:
0x0 站点可以上传zip并且进行在线解压,可以通过创建软链接压缩包的方式,读取到服务器上对应文件的内容。
0x1 flask使用jwt进行session构造的时候,如果能够拿到网卡的mac地址,可以得到随机数,从而实现对应username的jwt的伪造。
0x2 比赛题目应该是用到了模板注入。
zip软链接方式
以本题环境为例,加入需要读取服务器上/etc/passwd的内容,通过以下方式构造payload
1 | ln -s /etc/passwd passwd #在本地创建一个passwd的软链接,当然软链接名字可以随便取 |
因为站点允许上传zip文件,并且会在线解压并读取文件内容,所以通过此方式可以实现读取服务器上的文件。
如图,成功读取到了服务器上的/etc/passwd文件。
这时,可以通过/proc/self/environ文件的软链接,读取到服务器上的env中的变量。同理构造payload,读取到uwsgi的配置文件
目前由于题目docker环境有问题,实际配置文件路径比这个复杂。
然后通过读取配置文件,拿到main.py文件的内容(路径也很复杂),然后看到站点的session管理部分内容。
这里已知,random以服务器网卡mac地址的10进制为随机数种子,这时候需要读取网卡的mac地址。
1 | ln -s /proc/net/dev dev #查看dev名称得到网卡名称 |
1 | ln -s /sys/class/net/eth0/address eth0 #查看eth0的软链接 |
拿到网卡地址之后就可以算出随机数种子了。
1 | import uuid |
使用flask_session_manager.py构造jwt,此前通过解码首次登录之后的session的jwt值,确定格式。
修改session之后,拿到flag