一个基于字体的欺骗工具,用于红队、安全研究以及其他用途。
EvilFontTool 将机器可读的文本隐藏在文档中,而文档向人类读者显示完全不同的文本。它通过使用 Evil Fonts(邪恶字体) 来实现这一点——这种字体故意欺骗观看者,渲染出与计算机所理解的不同字母。通过重映射字体字形,文档的可见字符向人类展示的是一回事,而终端、AI 系统和剪贴板复制粘贴看到的则是另一回事。
由于手机渲染字体的方式,Word docx 演示在移动设备上无法正常工作。
pip install evilfonttool
git clone https://github.com/DoctorEww/EvilFontTool.git
cd EvilFontTool
pip install .
用于开发(可编辑安装):
pip install -e .
通过 pip 自动安装:
fonttools — 字体解析与操作brotli — WOFF2 压缩(由 fonttools 使用)python-docx — DOCX 生成reportlab — PDF 生成pdf2image — PDF 转图像pdfminer.six — PDF 文本/布局提取Pillow — 用于 PDF 管线的图像处理系统要求(不由 pip 安装——必须位于你的 PATH 中):
pdf 命令必需,它会调用 soffice --headless 将 DOCX 转换为 PDF。pdf 命令在 Windows 上处于实验阶段,可能无法按预期工作。
sudo apt install libreofficebrew install --cask libreofficepdf2image 渲染 PDF 页面以供 pdf 命令使用所必需
sudo apt install poppler-utilsbrew install poppler将 poppler 安装到 ~\Documents\poppler 并添加到路径。
irm (irm https://api.github.com/repos/oschwartz10612/poppler-windows/releases/latest).assets[0].browser_download_url -OutFile ~\Documents\poppler.zip
Expand-Archive ~\Documents\poppler.zip ~\Documents\poppler -Force
$bin = (gci ~\Documents\poppler -Recurse -Filter pdftotext.exe)[0].DirectoryName
[Environment]::SetEnvironmentVariable('Path', [Environment]::GetEnvironmentVariable('Path','User') + ";$bin", 'User'); $env:Path += ";$bin"
/usr/share/fontsC:\Windows\Fontspdf 命令在 Windows 上处于实验阶段,可能无法按预期工作。pdf 命令不适用于复杂的 Word 文档,例如分栏。如果你非常希望它支持某个功能,欢迎提交 issue。doc --ttf-dir <ttffonts_dir>(EvilFontTool 自行嵌入字体),或者在 Windows 上使用 Word。LibreOffice 自带的“嵌入字体”选项对 Evil Fonts 无效。pdf 命令完全不依赖 Evil Fonts。它先将 DOCX 渲染为图像(因此可见页面是一张图片,而不是文本),然后在上面绘制完全不可见但可选择的真实计算机文本。复制粘贴和文本提取读取的是那个不可见图层。还有一些其他工具可以做到这一点,但当你已经有一个满意的 DOCX 时,没有比 pdf 命令更简单的了。
如果你想要一个真正的 Evil Font PDF,你需要在没有不可见字母的情况下构建 Word 文档(不可见字母无法在 PDF 转换中保留)。然后直接从 Word 导出,或使用“打印到 PDF”。这样可以保持所有内容在单一图层中,使文档产生与 pdf 命令所用的著名双层技巧不同的 IOC。pdf 命令的存在纯粹是因为手动过程很繁琐,有时你只是想快速获得 Word 文档的 PDF 副本。
TLDR;
pdf 命令 → 双层 PDF,与其他工具机制相同(更知名/更易被检测)。如果有人搞清楚了如何在带不可见字母的情况下实现选项 2,我欠你一杯酒。请提交 issue,我会在 README 中致谢。
所有功能都通过一个 CLI 暴露,包含四个子命令。
create — 生成用于 HTML 或 DOC 文件的字体族evilfonttool create <reference_font> <output_dir> <font_name>
| 参数 | 描述 |
|---|---|
reference_font | 指向 .ttf 或 .woff 源字体的路径 |
output_dir | 写入字体和 CSS 的目录 |
font_name | 生成的字体族的内部名称前缀 |
示例:
evilfonttool create fonts/Arial.ttf output/ 'Arial'
输出:
output/fonts/*.woff — Web 字体,每个字符一个output/ttffonts/*.ttf — 用于文档嵌入的 TTF 字体output/fonts.css — 用于 Web 使用的 @font-face 声明.txt 文件。computer_file 中的每一行必须等于或长于 human_file 中对应的行。web — 生成 Evil Font HTML 文件evilfonttool web <human_file> <computer_file> <output_file>
需要
fonts.css和生成的字体位于输出目录中,以便 HTML 文件使用(或者在 HTML 文件中更改路径)。
| 参数 | 描述 |
|---|---|
input_human_file | 人类读者可见的文本。可以是多行 |
input_computer_file | 机器 / AI 可见的文本。可以是多行 |
output_file | 生成的 HTML 文件的路径 |
示例:
evilfonttool web human.txt computer.txt output/index.html
doc — 生成 Evil Font DOCX 文件evilfonttool doc <human_file> <computer_file> <output_file> <font_name> [--author AUTHOR] [--ttf-dir DIR]
font_name必须与create步骤中使用的名称一致。TTF 字体必须安装在系统上、通过--ttf-dir嵌入,或在 Word 中手动嵌入(文件 -> 选项 -> 保存 -> 嵌入字体),才能使欺骗效果正确呈现。
Word 自带的“嵌入字体”保存选项可以正常工作,但 LibreOffice 的不行——我一直无法让它正确嵌入 Evil Fonts。请改为传递 --ttf-dir:EvilFontTool 会自行将字体直接嵌入 .docx,完全不依赖 Word 或 LibreOffice 的嵌入功能。
示例:
evilfonttool doc human.txt computer.txt output/secret.docx MyFont --author "Finance Team" --ttf-dir output/ttffonts
pdf — 将 Evil Font DOCX 转换为支持复制粘贴的 PDFevilfonttool pdf <input_docx> <output_file> [--ttf-dir DIR] [--dpi DPI] [--soffice PATH] [--ink-font FONT] [--title TITLE] [--author AUTHOR] [--subject SUBJECT] [--producer PRODUCER]
使用 LibreOffice 渲染 DOCX,使 PDF 看起来与文档完全一致,然后将隐藏的有效载荷叠加为不可见的复制图层,以便在所有查看器中都能正常复制粘贴。
Windows: 此命令在 Windows 上处于实验阶段,可能无法按预期工作。
需要 LibreOffice(
soffice)和poppler-utils— 参见 依赖项。
示例:
evilfonttool pdf output/secret.docx output/secret.pdf --ttf-dir output/fonts/ttffonts --title secret
你需要对如何使用此工具负责。 在未经明确授权的情况下,针对系统或个人部署此技术是不道德的,并且可能是非法的。作者提供此工具是为了帮助防御者理解并测试此类漏洞——而不是为了助长攻击。
创建此工具是为了帮助红队成员验证基于字体的攻击对其组织构成的风险。它也是为了帮助蓝队成员、研究人员和系统所有者理解,由于固有地信任用户提供的字体而在安全方面留下的漏洞。以下是给个人和行业的一些实用建议,以应对或缓解现代操作系统和应用程序中字体带来的问题。
curl 输出直接管道传递给 bash / Invoke-Expression 的命令。攻击者很容易切换你正在下载的网站。Win + R 时,用一个可怕的弹窗警告他们这非常危险(我不知道为什么这还没有成为现实……)。欢迎贡献。如果你发现了新的攻击面、字体生成管线的改进,或值得记录的防御技术,请提交 issue 或 PR。
git checkout -b feature/my-feature)由于 Word 文档、PDF 和字体的复杂性,这个工具真的很难测试。如果你发现了可复现的问题,请提交 GitHub issue,我会尽快处理。
请在 issue 中包含以下内容:
mismatch 警告)。.docx / 输入文件。| 参数 | 描述 |
|---|
input_human_file | 人类读者可见的文本。可以是多行 |
input_computer_file | 机器 / AI 可见的文本。可以是多行 |
output_file | 生成的 DOCX 文件的路径 |
font_name | 字体族名称(必须与 create 步骤一致) |
--author | DOCX 文档作者元数据(默认:无) |
--ttf-dir | Evil Font TTF 的目录(例如 <output_dir>/ttffonts)。如果提供,实际使用的字体会直接嵌入 .docx,因此无需在系统中安装即可正确呈现欺骗效果。仅嵌入 human 文件中包含的字母。 |
| 参数 | 描述 |
|---|
input_docx | Evil Font DOCX 的路径(来自 doc 步骤) |
output_file | 生成的 PDF 文件的路径 |
--ttf-dir | Evil Font TTF 的目录(例如 <output_dir>/ttffonts),暴露给 LibreOffice 以便伪装能够正确呈现。仅当字体已系统安装或嵌入文件中时才可省略 |
--dpi | 可见图层的栅格化质量(默认:200) |
--soffice | LibreOffice 可执行文件的路径(默认:soffice) |
--ink-font | 不可见复制图层的 TTF 字体(默认:系统无衬线字体) |
--title | PDF 文档标题元数据(默认:Untitled) |
--author | PDF 文档作者元数据(默认:无) |
--subject | PDF 文档主题元数据(默认:无) |
--producer | PDF 文档生产者元数据(默认:无) |