PHP Maniac

Das PHP Blog für PHP-Profis und alle die es werden wollen

Remote File Inclusion (RFI) – Angriffe auf PHP Sicherheitslücken

9 Mai, 2009 (17:23) | Server, Sicherheit | Von: PHP Maniac

Ich möchte heute einige Worte zu Remote File Inclusion (RFI) schreiben, da in den letzten Tagen in meinen Logs einige RFI Einträge aufgetaucht sind. Erkennen kann man diese Angriffe in den Logs recht leicht, da hier eine URL auf dem Webserver aufgerufen wird, an die eine weitere URL als Parameter angehängt wird. Doch mehr dazu später. Gerade in Zeiten von Botnets und dem großflächigem Einsatz von Standardsoftware auf Webservern ist es also äußerst wichtig regelmäßig die veröffentlichten Updates einzuspielen, um nicht leichtfertig (im schlimmsten Fall) die Kontrolle über den eigenen Server zu verlieren.

Was ist Remote File Inclusion?

Was also ist Remote File Inclusion (RFI)? Es handelt sich um eine spezielle Angriffstechnik, die gezielt bekannte Sicherheitslücken in PHP Software ausnutzen soll. Hierbei liegt ein spezielles Skript auf einem entfernten (remote) Server, welches in ein bestehendes Skript eingebunden (inclusion) werden soll. Die URL des entfernten Skripts wird als Parameter an ein verwundbares Skript auf dem Server übergeben, der angegriffen werden soll. Ist das Skript verwundbar, also existiert die Sicherheitslücke in installierten PHP Software, so wird der eingeschleuste Fremdcode durch den Fehler, mit den gleichen Rechten wie das verwundbare Skript, ausgeführt. Je nach Servereinstellungen kann der Angreifer so mehr oder weniger Kontrolle über den Server erlangen.

Da diese Angriffe aber in der Regel automatisiert ausgeführt werden, werden vorerst nur Skripte eingeschleust, die Informationen über den verwundbaren Server sammeln. Der eingeschleuste Code gibt die gesammelten Informationen mit der vom Server erstellten Webseite aus. Somit kann der Bot einfach die Antwort des Servers auswerten und direkt erkennen ob das Skript verwundbar ist. Ist dies der Fall, so speichert er die gewonnenen Informationen in einer Datenbank und der Angreifer kann sich später aus dieser genau die Server heraussuchen, die er gerade benötigt.

Welche Informationen werden gesammelt?

Die gesammelten Informationen können sich natürlich stark von Angreifer zu Angreifer unterscheiden. Im Prinzip kann hier jeder PHP Befehl verwendet werden, um Informationen über den Host zu sammeln. Auch der Versand von Emails oder ein Aufbau von FTP-Verbindungen ist denkbar, da diese Funktionen auf fast allen Hostern aktiviert sind.

Wir wollen uns jetzt mal ein solches Skript für RFI Angriffe etwas genauer anschauen. Es stammt anscheinend von einem Typen mit Nick „Fx29ID“ oder „FeeLCoMz“. Jedenfalls scheinen das die Token zu sein, nach denen er erkennt ob ein Angriff erfolgreich war oder nicht. Hier erst mal ein Teil des Programmcodes, der bei mir eingeschleust werden sollte:

##[ Fx29ID ]##
fx("ID","FeeL"."CoMz");
$P   = @getcwd();
$IP  = @getenv("SERVER_ADDR");
$UID = fx29exec("id");
fx("SAFE",@safemode()?"ON":"OFF");
fx("OS",@PHP_OS);
fx("UNAME",@php_uname());
fx("SERVER",($IP)?$IP:"-");
fx("USER",@get_current_user());
fx("UID",($UID)?$UID:"uid=".@getmyuid()." gid=".@getmygid());
fx("DIR",$P);
fx("PERM",(@is_writable($P))?"[W]":"[R]");
fx("HDD","Used: ".hdd("used")." Free: ".hdd("free")." Total: ".hdd("total"));
fx("DISFUNC",@getdisfunc());
##[ FX29SHEXEC ]##

Hierbei ist fx() eine Funktion, die die Ausgaben des Skripts regelt. Hierbei ist der erste Parameter eine Art Bezeichner, damit der (als zweiter Parameter übergebene) Wert zugeordnet werden kann. Als Wert kann übrigends auch ein Array übergeben werden, dieser wird automatisch mit dem join() Befehl zu einem String umformatiert um ausgegeben zu werden. Die restlichen Funktionen erklären sich größtenteils von selbst. Auffällig ist, dass bei jedem Funktionsaufruf mögliche Fehlermeldungen oder Warnungen von PHP durch das @-Zeichen unterdrückt werden, um wirklich nur die eigentlichen Informationen auszugeben.
Man sieht also, dass hier einfach eine Menge Informationen über den Host gesammelt und ausgegeben werden. Auf meinem Rechner sieht die Ausgabe des Skripts unter Xampp wie folgt aus:

ID: FeeLCoMz
SAFE: OFF
OS: WINNT
UNAME: Windows NT F0 6.0 build 6001
SERVER: 127.0.0.1
USER: user
UID: uid=500(user) gid=544(Administratoren) groups=544(Administratoren)
DIR: D:\www\inject
PERM: [W]
HDD: Used: 736.2 GB Free: 575.64 GB Total: 736.2 GB
DISFUNC:
FeeLCoMz

Wie schon erwähnt, ist scheinbar das „FeeLCoMz“ ein Token, nach dem der Angreifer in der Antwort des Servers sucht. Taucht dieses auf, so ist der Server verwundbar, da er den eingeschleusten Code ausgeführt haben muss. Neben Informationen über den PHP Safe Mode, das Betriebssystem, die IP, Schreibrechten im Verzeichnis und der Festplattenbelegung werden auch die deaktivierten Funktionen von PHP ausgegeben (in diesem Fall gibt es keine). Somit hat der Angreifer schon einen guten Überblick was mit dem System möglich und machbar ist.

Was tun wenn bei RFI Einträgen in den Logs?

Sollten bei euch in den Logs Remote File Inlucsion Einträge auftauchen, heisst dies noch lange nicht, dass ihr auch kompromittiert wurdet. Dies geschieht nämlich nur, wenn eure Software die gesuchte Sicherheitslücke auch wirklich aufweist. Dies lässt sich leicht prüfen, in dem ihr den Link, wie er vom Angreifer aufgerufen wurde, selbst im Browser aufruft. Tauchen dort ungewöhnliche Informationen auf, so habt ihr eventuell ein Problem und solltet schnellstens mit einem Update reagierien oder die Webseite temporär offline nehmen. In den meisten Fällen erhaltet ihr aber nur eine Fehlermeldung, dass die gesuchte Seite so nicht gefunden wurde oder ähnliches. Dann ist erst mal kein Grund zur Panik gegeben, updaten solltet ihr jedoch trotzdem immer…

Be Sociable, Share!

Schreibe einen Kommentar