
Una herramienta de engaño basada en fuentes para red teaming, investigación de seguridad y cualquier otra cosa.
Una herramienta de engaño basada en fuentes para red teaming, investigación de seguridad y lo que sea.
EvilFontTool oculta texto legible por máquina dentro de un documento que muestra un texto completamente distinto a un lector humano. Lo hace mediante Evil Fonts — fuentes que engañan deliberadamente al espectador renderizando una letra distinta de la que entiende el ordenador. Al reasignar los glifos de la fuente, los caracteres visibles del documento muestran a los humanos una cosa, mientras que terminales, sistemas de IA y copiar y pegar ven otra.
Las demos de Word docx NO funcionan en móviles debido a la forma en que los teléfonos móviles renderizan las fuentes.
pip install evilfonttool
git clone https://github.com/DoctorEww/EvilFontTool.git
cd EvilFontTool
pip install .
Para desarrollo (instalación editable):
pip install -e .
Se instalan automáticamente vía pip:
fonttools — análisis y manipulación de fuentesbrotli — compresión WOFF2 (usada por fonttools)python-docx — generación de DOCXreportlab — generación de PDFpdf2image — conversión de PDF a imagenpdfminer.six — extracción de texto/diseño de PDFPillow — manejo de imágenes para el pipeline de PDFRequisitos del sistema (no los instala pip — deben estar en tu PATH):
pdf, que invoca a soffice --headless para convertir DOCX a PDF. El comando pdf es experimental en Windows y puede que no funcione como se espera.
sudo apt install libreofficebrew install --cask libreofficepdf2image para renderizar páginas PDF para el comando pdf
sudo apt install poppler-utilsbrew install popplerInstala poppler en ~\Documents\poppler y añádelo a la ruta.
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 es experimental en Windows y puede que no funcione como se espera.pdf no funciona con documentos de Word complejos, p. ej. columnas. No dudes en abrir un issue si hay alguna característica que realmente quieras que admita.doc --ttf-dir <ttffonts_dir> (EvilFontTool las incrusta por sí mismo) o Word en Windows. La opción "incrustar fuentes" de LibreOffice no funciona con Evil Fonts.El comando pdf no depende en absoluto de Evil Fonts. Renderiza el DOCX a una imagen (de modo que la página visible es una imagen, no texto), y luego dibuja el texto real de la computadora encima como texto totalmente invisible y seleccionable. Copiar y pegar y la extracción de texto leen esa capa invisible en su lugar. Hay algunas otras herramientas que pueden hacer esto, pero ninguna tan fácil como el comando pdf cuando ya tienes un DOCX que te gusta.
Si quieres un PDF con Evil Fonts de verdad, necesitas construir el documento de Word sin letras invisibles (las letras invisibles no sobreviven a la conversión a PDF). A partir de ahí, exporta directamente desde Word o usa "Imprimir a PDF". Esto mantiene todo en una sola capa, dando al documento IOCs distintos al conocido truco de dos capas usado por el comando pdf. El comando pdf existe únicamente porque ese proceso manual es tedioso, y a veces solo quieres una copia rápida en PDF de un documento de Word.
Resumen;
pdf → PDF de dos capas, mismo mecanismo que otras herramientas (más conocido/detectable).Si alguien descubre cómo lograr la Opción 2 con letras invisibles, te debo una bebida. Abre un issue y te daré crédito en el README.
Toda la funcionalidad se expone a través de una única CLI con cuatro subcomandos.
create — Genera la familia de fuentes para usar en archivos HTML o DOCevilfonttool create <reference_font> <output_dir> <font_name>
| Argumento | Descripción |
|---|---|
reference_font | Ruta a una fuente .ttf o .woff |
output_dir | Directorio donde se escribirán las fuentes y el CSS |
Ejemplo:
evilfonttool create fonts/Arial.ttf output/ 'Arial'
Salidas:
output/fonts/*.woff — fuentes web, una por carácteroutput/ttffonts/*.ttf — fuentes TTF para incrustar en documentosoutput/fonts.css — declaraciones @font-face para uso web.txt planos.computer_file debe ser igual o más larga que la línea correspondiente en human_fileweb — Genera un archivo HTML con Evil Fontevilfonttool web <human_file> <computer_file> <output_file>
Requiere que
fonts.cssy las fuentes generadas estén en el directorio de salida para que el archivo HTML pueda usarlas (o cambia la ruta en el archivo HTML).
| Argumento | Descripción |
|---|---|
input_human_file | Texto visible para los lectores humanos. Puede tener varias líneas |
input_computer_file | Texto visible para máquinas / IA. Puede tener varias líneas |
output_file | Ruta para el archivo HTML generado |
Ejemplo:
evilfonttool web human.txt computer.txt output/index.html
doc — Genera un archivo DOCX con Evil Fontevilfonttool doc <human_file> <computer_file> <output_file> <font_name> [--author AUTHOR] [--ttf-dir DIR]
El
font_namedebe coincidir con el nombre usado en el pasocreate. Las fuentes TTF deben estar instaladas en el sistema, incrustadas mediante--ttf-dir, o incrustadas manualmente en Word (archivo -> opciones -> guardar -> incrustar fuentes) para que el engaño se renderice correctamente.
La opción "incrustar fuentes" al guardar de Word funciona bien, pero la de LibreOffice no — nunca logré que incrustara Evil Fonts correctamente. Usa --ttf-dir en su lugar: EvilFontTool incrusta las fuentes por sí mismo, directamente en el .docx, sin depender de la incrustación de Word ni de LibreOffice.
Ejemplo:
evilfonttool doc human.txt computer.txt output/secret.docx MyFont --author "Finance Team" --ttf-dir output/ttffonts
pdf — Convierte un DOCX con Evil Font en un PDF seguro para copiar y pegarevilfonttool pdf <input_docx> <output_file> [--ttf-dir DIR] [--dpi DPI] [--soffice PATH] [--ink-font FONT] [--title TITLE] [--author AUTHOR] [--subject SUBJECT] [--producer PRODUCER]
Renderiza el DOCX con LibreOffice para que el PDF se vea idéntico al documento y luego superpone la carga útil oculta como una capa de copia invisible, de modo que sobrevive al copiar y pegar en cualquier visor.
Windows: Este comando es experimental en Windows y puede que no funcione como se espera.
Requiere LibreOffice (
soffice) ypoppler-utils— consulta Dependencias.
Ejemplo:
evilfonttool pdf output/secret.docx output/secret.pdf --ttf-dir output/fonts/ttffonts --title secret
Eres responsable de cómo uses esta herramienta. Desplegar esta técnica contra sistemas o individuos sin autorización explícita no es ético y puede ser ilegal. Los autores proporcionan esta herramienta para ayudar a los defensores a comprender y probar esta clase de vulnerabilidad — no para habilitar ataques.
Esta herramienta fue creada para ayudar a los red teamers a validar los riesgos de los ataques basados en fuentes contra sus organizaciones. También fue creada para ayudar a los blue teamers, investigadores y propietarios de sistemas a comprender las brechas de seguridad que deja confiar intrínsecamente en fuentes proporcionadas por el usuario. A continuación se presentan algunas recomendaciones prácticas para individuos y para la industria con el fin de abordar o mitigar el problema que las fuentes plantean en los sistemas operativos y aplicaciones modernos.
curl directamente a bash / Invoke-Expression. Es fácil para un atacante cambiar el sitio web del que estás descargando.Win + R con un popup aterrador que diga lo arriesgado que es la primera vez que lo hacen (no sé cómo esto no existe ya...).Las contribuciones son bienvenidas. Si has encontrado una nueva superficie de ataque, una mejora al pipeline de generación de fuentes o una técnica de defensa que valga la pena documentar, abre un issue o un PR.
git checkout -b feature/my-feature)Esta herramienta es muy difícil de probar debido a la complejidad de los documentos de Word, PDFs y fuentes. Si encuentras un problema reproducible, abre un issue en GitHub y lo atenderé tan pronto como pueda.
Por favor incluye lo siguiente en el issue:
mismatch)..docx / entrada mínimo que lo reproduzca, si puedes compartirlo.font_name | Prefijo del nombre interno para la familia de fuentes generada |
| Argumento | Descripción |
|---|
input_human_file | Texto visible para los lectores humanos. Puede tener varias líneas |
input_computer_file | Texto visible para máquinas / IA. Puede tener varias líneas |
output_file | Ruta para el archivo DOCX generado |
font_name | Nombre de la familia de fuentes (debe coincidir con el paso create) |
--author | Metadatos del autor del documento DOCX (por defecto: ninguno) |
--ttf-dir | Directorio de TTFs de Evil Font (p. ej. <output_dir>/ttffonts). Si se indica, las fuentes realmente usadas se incrustan directamente en el .docx, de modo que el engaño se renderice correctamente sin instalarlas en todo el sistema. Solo incrusta letras incluidas en el archivo human. |
| Argumento | Descripción |
|---|
input_docx | Ruta al DOCX con Evil Font (del paso doc) |
output_file | Ruta para el archivo PDF generado |
--ttf-dir | Directorio de TTFs de Evil Font (p. ej. <output_dir>/ttffonts), expuesto a LibreOffice para que el disfraz se renderice. Omítelo solo si las fuentes están instaladas en todo el sistema o incrustadas en el archivo |
--dpi | Calidad de rasterización de la capa visible (por defecto: 200) |
--soffice | Ruta al binario de LibreOffice (por defecto: soffice) |
--ink-font | TTF para la capa de copia invisible (por defecto: una sans del sistema) |
--title | Metadatos del título del documento PDF (por defecto: Untitled) |
--author | Metadatos del autor del documento PDF (por defecto: ninguno) |
--subject | Metadatos del asunto del documento PDF (por defecto: ninguno) |
--producer | Metadatos del productor del documento PDF (por defecto: ninguno) |