Taco,一个自动化生成pickle反序列化的工具

本文最后更新于 2026年8月24日 下午

前言

因为上上周打htb的pickle反序列化给我打破防了,所以一气之下写了个自动化pickle反序列化工具,支持自定义文件后缀,由于本人才学python,所以只写了个gen的框架,其他的webui啥的都交给ai了(顺便看看豆包和kimi谁的work牛逼),结果豆包还是牛逼点,免费的kimi真的拉完了

本工具基于python 3.10+开发,支持自定义waf绕过、多编码输出、字节码分析和利用cve实时情报实时更新最新payload
通过nvd api配置来实时更新cve
当前开发环境是python 3.14.6;项目依赖为flask 3.0+和requests 2.31+;代码按python 3.10+作为支持基线,pickle协议界面支持0到5

项目地址:https://github.com/Zomnap/Taco

使用步骤

1
2
3
4
5
6
先安装支持
pip install -r requirements.txt
然后再启动web服务
py app.py
最后点击start.bat启动即可
在点开后会提示输入nvd的api以查询实时有关cve,如果没有的话直接回车即可

该项目结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Taco/
├── app.py #Flask 主程序+API 路由
├── requirements.txt
├── generator/
│ ├── __init__.py
│ ├── payloads.py #Payload 生成引擎(12个gadget链)
│ ├── waf_bypass.py #WAF绕过引擎(6种绕过方案)
│ └── formats.py #Raw/Gzip/Zip/PDF/自定义后缀封装
├── cve/
│ ├── __init__.py
│ └── fetcher.py #NVD CVE获取+本地缓存
├── templates/
│ └── index.html #前端页面
├── static/
│ ├── style.css #暗色主题样式
│ └── app.js #前端交互逻辑
└── cache/ #CVE缓存(自动创建)

接下来是一段README

Payload 模板列表

ID 名称 说明
rce_system RCE - os.system 命令执行,无回显
rce_popen RCE - subprocess.Popen shell=True 执行
rce_popen_capture RCE - check_output 执行并捕获输出
rce_popen_read RCE - os.popen 可读取输出
rce_eval RCE - eval Python 表达式执行
rce_exec RCE - exec 任意 Python 代码
file_read 文件读取 open() 读文件
file_write 文件写入 写文件
reverse_shell 反向 Shell - bash bash -i 反弹
reverse_shell_py 反向 Shell - Python 纯 Python 反弹
bypass_getattr 绕过 - getattr 动态调用绕过检测
bypass_builtins 绕过 - builtins 沙箱内泄漏 exec

WAF 绕过方案

输入被过滤的字符后,工具自动生成以下方案并按过滤命中数排序:

  1. Base64 编码包装 — payload 编码后用 eval 包装
  2. Hex 编码包装 — 同上,用 hex 编码
  3. chr() 拼接绕过 — 被过滤字符用 chr(ord) 动态构造
  4. 无引号 Payload — 完全避免单双引号
  5. Protocol 0 文本格式 — 纯文本可读格式,绕过二进制特征
  6. URL 编码 — 适用于 HTTP 参数注入

WAF 规则输入格式

1
2
3
', ", \n, \r, /, ;        #逗号/空格分隔
abc #直接列出字符
\x00, \t #支持十六进制和转义

API 接口

方法 路径 说明
GET /api/templates 获取所有模板
POST /api/generate 生成单个 payload
POST /api/bypass WAF 绕过生成
POST /api/generate_all 批量生成全部模板
POST /api/disasm 字节码反汇编
GET /api/cves 获取 CVE 列表
GET /api/cve_summary CVE 统计摘要
GET /api/formats 可用文件封装格式
POST /api/package 生成并封装文件,返回 Base64
GET /api/records 查看本地 Payload 记录,可用 cve_id 筛选

生成 Payload 示例

1
2
3
curl -X POST http://127.0.0.1:5001/api/generate \
-H "Content-Type: application/json" \
-d '{"template_id":"rce_system","input":"id","protocol":4}'

文件封装示例

1
2
3
curl -X POST http://127.0.0.1:5001/api/package \
-H "Content-Type: application/json" \
-d '{"template_id":"rce_system","input":"echo test","protocol":4,"format":"zip","filename":"sample.zip","cve_id":"CVE-TEST-1"}'

/api/package只在本地生成文件字节并返回 Base64,不会上传或投递到外部目标。PDF格式把 pickle 字节放入 EmbeddedFile 流,是否会被目标程序读取取决于目标的文件处理逻辑。

WAF 绕过示例

1
2
3
curl -X POST http://127.0.0.1:5001/api/bypass \
-H "Content-Type: application/json" \
-d '{"template_id":"rce_system","input":"cat /flag","waf_filter":"'\''","protocol":4}'

扩展开发

添加新的 Payload 模板

generator/payloads.py 中:

  1. 定义一个实现 __reduce__ 的类
  2. PAYLOAD_TEMPLATES 列表中注册
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MyGadget:
def __init__(self, cmd):
self.cmd = cmd
def __reduce__(self):
return (some_func, (self.cmd,))

PAYLOAD_TEMPLATES.append({
"id": "my_gadget",
"name": "My Gadget",
"description": "说明",
"input_type": "cmd", #cmd/code/filepath/filepath_content/ip_port
"input_label": "命令",
"default_input": "id",
"class": MyGadget,
"tags": ["rce"],
})

添加新的绕过方案

generator/waf_bypass.pygenerate_bypass_payloads() 中添加新的 BypassResult


Taco,一个自动化生成pickle反序列化的工具
https://zomnap.top/2026/08/24/Taco/
作者
Zomnap
发布于
2026年8月24日
许可协议