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.
É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 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 ook
ce 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 :
« 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.
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 :
... 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 :
... 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.
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.
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.
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 :
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:10000
et 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 :
--------------------------------------------- -------------------------------------------- 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 :
/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 :
0 commentaires