0%

2021自治区第六届个人选拔赛

MISC

1

convert分解gif,在某张gif拿到一张二维码,扫码拿到flag

1
convert inner.gif inner.png

image-20211011180940075

2

需改bmp图片高度,拿到压缩包密码

image-20211011181013807

解压后,发现flag中存在一些不可见字符

image-20211011181052307

零宽字节隐写,在线解码,拿到flag

image-20211011181247618

Crypto

1

base85->base64->base32->hex

image-20211011182500870

3

比赛的时候,以为题目是需要爆破替换表啥的,或者是通过给出的密文,确认替换表,结果经群里大佬提醒,发现,原来就是base91->base62->base58->base32就可以拿到flag

image-20211012184629928

base62有个坑点,用比赛给的在线工具和python的base62库,都没有办法成功解码出字符串,用一个其他在线工具才ok的。。。。

在线工具地址

http://www.atoolbox.net/Tool.php?Id=933

PWN

Web

1

查看验码,base64解码,拿到flag

image-20211011181417195

2

抓包,修改cookie为admin,拿到flag

image-20211011181451998

3

文件包含,直接尝试读取根目录下的flag

1
http://119.61.19.217:57603/index.php?1=/flag

image-20211011181518344

4

比赛的时候没做出来,而且时候复盘,发现连门都没找到。

站点是各flask站,可以上传,此题目是HCTF2018的一道魔改题目。原题目需要登录,最终通过伪造jwt来实现绕过拿到flag。比赛时题目没有登录,根据群里大佬发的照片,拿到源码之后,能够看到有个路径下存在模板注入,找到路径之后模板注入应该就可以getshell了。现在以HCTF2018的环境进行部分复现。

知识点:
0x0 站点可以上传zip并且进行在线解压,可以通过创建软链接压缩包的方式,读取到服务器上对应文件的内容。
0x1 flask使用jwt进行session构造的时候,如果能够拿到网卡的mac地址,可以得到随机数,从而实现对应username的jwt的伪造。
0x2 比赛题目应该是用到了模板注入。

zip软链接方式

以本题环境为例,加入需要读取服务器上/etc/passwd的内容,通过以下方式构造payload

1
2
ln -s /etc/passwd passwd #在本地创建一个passwd的软链接,当然软链接名字可以随便取
zip -y passwd.zip passwd #以zip -y的方式创建软链接的压缩包

因为站点允许上传zip文件,并且会在线解压并读取文件内容,所以通过此方式可以实现读取服务器上的文件。

image-20211012182549021

如图,成功读取到了服务器上的/etc/passwd文件。

这时,可以通过/proc/self/environ文件的软链接,读取到服务器上的env中的变量。同理构造payload,读取到uwsgi的配置文件

image-20211012182827766

目前由于题目docker环境有问题,实际配置文件路径比这个复杂。

然后通过读取配置文件,拿到main.py文件的内容(路径也很复杂),然后看到站点的session管理部分内容。

image-20211012183006342

这里已知,random以服务器网卡mac地址的10进制为随机数种子,这时候需要读取网卡的mac地址。

1
ln -s /proc/net/dev dev #查看dev名称得到网卡名称

image-20211012183750384

1
ln -s /sys/class/net/eth0/address eth0 #查看eth0的软链接

image-20211012183838711

拿到网卡地址之后就可以算出随机数种子了。

1
2
3
4
5
6
7
8
9
10
11
12
import uuid
import random

mac = "02:42:ac:13:00:02"
temp = mac.split(':')
temp = [int(i,16) for i in temp]
temp = [bin(i).replace('0b','').zfill(8) for i in temp]
temp = ''.join(temp)
mac = int(temp,2)
random.seed(mac)
randStr = str(random.random()*100)
print(randStr) #51.744030079796296

使用flask_session_manager.py构造jwt,此前通过解码首次登录之后的session的jwt值,确定格式。

image-20211012184407993

修改session之后,拿到flag

image-20211012184335150

Reverse