whitel1st/docem
GitHub: whitel1st/docem
docem 是一个基于 Python 的工具,用于在常见文档格式中批量嵌入 XXE 和 XSS 负载,以便安全测试和攻击向量生成。
Stars: 677 | Forks: 106
```
_|_|_|
_| _| _|_| _|_|_| _|_| _|_|_| _|_|
_| _| _| _| _| _|_|_|_| _| _| _|
_| _| _| _| _| _| _| _| _|
_|_|_| _|_| _|_|_| _|_|_| _| _| _|
version 1.5
```
一个实用工具,用于在 docx、odt、pptx 等文档中嵌入 XXE 和 XSS 负载——这些文档都是包含大量 xml 文件的 zip 压缩包。
此工具是与 [ShikariSenpai](https://twitter.com/ShikariSenpai) 和 [ansjdnakjdnajkd](https://twitter.com/ansjdnakjdnajkd) 共同研究文档内部结构的副项目。
## 这是什么
许多常见的文档格式,如 doc、docx、odt 等,仅仅是内部含有少量 xml 文件的 zip 文件。

那我们为什么不尝试在其中嵌入 XXE 负载呢?
这在 Will Vandevanter (`_will_is`) 的一篇精彩 [research](http://oxmlxxe.github.io/reveal.js/slides.html#/) 中已经实现。
要创建带有嵌入负载的文档,有一个著名的工具叫 [oxml_xxe](https://github.com/BuffaloWill/oxml_xxe)。
但是,当你需要在不同位置创建数百个带负载的文档时,使用 `oxml_xxe` 并不方便。
于是就有了 Docem。
它的工作方式如下:你指定一个示例文档——该文档包含 `magic_symbols`(在示例中标记为 `፨`,在程序中为常量 `XXCb8bBA9XX`),这些符号将被 XXE 或 XSS 负载替换。
此外还有三种不同的 `payload_type`——每种类型决定了在文档的给定文件中如何处理每个 `magic_symbol`。
每个 `payload_type` 在 `Usage` 部分有说明。
下面是一个小示意图:

负载模式

程序界面

## 安装
```
pip3 install -r requirements.txt
```
## 使用 Docem
```
python3 docem.py --help
```
- 必需参数
- `-s` - 指向 `sample file` 或 `sample directory` 的路径。该示例将用于创建带有攻击向量的文档。
- `-pt` - 负载类型
- `xss` - XSS - 跨站脚本
- `xxe` - XXE - 外部 XML 实体
- 可选
- `-pm` - 负载模式
- `per_document` - (默认模式)对每个负载,将负载嵌入所有文件的所有位置并创建新文档
- `per_file` - 对每个负载,在文档的每个文件中,将负载嵌入该文件的所有位置并创建新文档
- `per_place` - 对每个负载,在每个文件的每个位置嵌入负载并创建新文档
- `-pf` - 负载文件
- `-sx` - 示例扩展名——当示例是目录时使用
- `-h` - 打印帮助信息
示例
```
./docem.py -s samples/marked/docx_sample_oxml_xxe_mod0/ -pt xxe -pf payloads/xxe_special_6.txt -pm per_document -sx docx
./docem.py -s samples/marked/docx_sample_oxml_xxe_mod1/ -pt xxe -pf payloads/xxe_special_1.txt -pm per_file -sx docx
./docem.py -s samples/marked/sample_oxml_xxe_mod1.docx -pt xxe -pf payloads/xxe_special_2.txt -pm per_place
./docem.py -s samples/marked/docx_sample_oxml_xxe_mod0/ -pt xss -pf payloads/xss_tiny.txt -pm per_place -sx docx
```
相当于 `oxml_xxe` 创建的 `docx` 文件。下面的命令将创建带有嵌入 XXE 负载的 docx 文件。
```
./docem.py -s samples/marked/docx_sample_oxml_xxe_mod0/ -pt xss -pf payloads/xxe_special_6.txt -pm per_document -sx docx
```
工具输出保存在 `./tmp/` 文件夹下
## 如何创建自定义示例
### 通过新文件夹示例
1. 将文档 `new_sample_from_folder.docx` 解压到文件夹 `new_sample_from_folder/`,或将已有的清晰示例从 `samples/clear/` 复制到 `samples/marked/new_sample_from_folder/`
2. 添加魔法符号 `XXCb8bBA9XX`(在本说明的示例中显示为 `፨`),放在希望嵌入负载的位置
3. 使用新示例运行工具:`-s samples/new_sample_from_folder/ -sx docx`
### 通过新文件示例
1. 在你的自定义文档 `new_sample.docx` 的各个位置添加魔法符号 `XXCb8bBA9XX`
2. 使用新示例:`-s new_sample.docx`
## 工具使用的负载文件格式
### XSS 负载
格式:TXT 文件,包含字符串列表。例如:
```
标签:Apache-2.0, DNS解析, docx, Linter, meg, odt, OpenStack, pptx, PyCQA, Python 安全, Python脚本, SpotBugs, xlsx, XML注入, 代码检查, 信息安全, 开源项目, 抽象语法树, 网络安全, 逆向工具, 隐私保护