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 文件。 ![diag0](pics/diag0.png "diag0") 那我们为什么不尝试在其中嵌入 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` 部分有说明。 下面是一个小示意图: ![diag1](pics/diag1.png "diag1") 负载模式 ![diag2](pics/diag2.png "diag1") 程序界面 ![screenshot](pics/screenshot.png "screenshot") ## 安装 ``` 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 文件,包含字符串列表。例如: ``` ``` ### XXE 负载 工具使用 **特殊格式** 来处理 XXE 负载。如果你想添加额外的负载,请参考下面的示例。 格式:TXT 文件,包含字典列表。例如 ``` {"vector":"]>","reference":"&xxe_canary_0;"} {"vector":"]>","reference":"&xxe_canary_2;"} ``` - `vector` - 必需关键字——脚本会搜索它 - `]>` - 负载。注意所有双引号 `"` 必须使用反斜杠 `\` 转义为 `\"` - `reference` - 必需关键字——脚本会搜索它 - `&xxe_canary_0;` - 将在所有带有魔法符号的位置添加的引用 ## 功能与待办 - 功能 - [x] 读取带负载的文件 - [x] XXE 自定义负载文件 - [x] XSS 负载文件 - 待办 - [x] 添加不仅在 xml 中而且在解压文件中嵌入的能力 - [ ] 添加标志以指定在 XXE 中使用的自定义 URL - [ ] 添加标志以指定在 XSS 中使用的自定义 URL
标签:Apache-2.0, DNS解析, docx, Linter, meg, odt, OpenStack, pptx, PyCQA, Python 安全, Python脚本, SpotBugs, xlsx, XML注入, 代码检查, 信息安全, 开源项目, 抽象语法树, 网络安全, 逆向工具, 隐私保护