21 - Pentesting FTP
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Das File Transfer Protocol (FTP) dient als Standardprotokoll für den Dateitransfer über ein Computernetzwerk zwischen einem Server und einem Client.
Es ist ein Klartext-Protokoll, das als neues Zeilenzeichen 0x0d 0x0a
verwendet, daher müssen Sie manchmal mit telnet
oder nc -C
verbinden.
Standardport: 21
In Aktiv FTP initiiert der FTP Client zuerst die Steuerungs-verbindung von seinem Port N zum Befehlsport des FTP-Servers – Port 21. Der Client hört dann auf Port N+1 und sendet den Port N+1 an den FTP-Server. Der FTP Server initiiert dann die Daten-verbindung von seinem Port M zum Port N+1 des FTP-Clients.
Wenn der FTP-Client jedoch eine Firewall eingerichtet hat, die die eingehenden Datenverbindungen von außen kontrolliert, kann aktives FTP ein Problem darstellen. Eine praktikable Lösung dafür ist passives FTP.
In Passiv FTP initiiert der Client die Steuerungsverbindung von seinem Port N zum Port 21 des FTP-Servers. Danach gibt der Client einen passv Befehl aus. Der Server sendet dann dem Client eine seiner Portnummern M. Und der Client initiiert die Daten-verbindung von seinem Port P zu Port M des FTP-Servers.
Quelle: https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/
Die FTP-Befehle debug
und trace
können verwendet werden, um zu sehen, wie die Kommunikation erfolgt.
Mit nmap
Sie können die Befehle HELP
und FEAT
verwenden, um einige Informationen über den FTP-Server zu erhalten:
anonymous : anonymous &#xNAN;anonymous : &#xNAN;ftp : ftp
Hier finden Sie eine schöne Liste mit Standard-FTP-Anmeldeinformationen: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt
Anonyme Anmeldungen und Bounce-FTP-Überprüfungen werden standardmäßig von nmap mit der -sC Option durchgeführt oder:
Sie können sich mit einem FTP-Server über einen Browser (wie Firefox) mit einer URL wie:
Beachten Sie, dass wenn eine Webanwendung Daten, die von einem Benutzer kontrolliert werden, direkt an einen FTP-Server sendet, Sie doppelte URL-Codierung %0d%0a
(in doppelter URL-Codierung ist dies %250d%250a
) Bytes senden können und den FTP-Server dazu bringen können, willkürliche Aktionen auszuführen. Eine dieser möglichen willkürlichen Aktionen besteht darin, Inhalte von einem vom Benutzer kontrollierten Server herunterzuladen, Port-Scans durchzuführen oder zu versuchen, mit anderen auf Klartext basierenden Diensten (wie http) zu kommunizieren.
Wenn Ihr Benutzername/Passwort Sonderzeichen enthält, kann der folgende Befehl verwendet werden:
USER benutzername
PASS passwort
HELP
Der Server zeigt an, welche Befehle unterstützt werden
PORT 127,0,0,1,0,80
Dies wird dem FTP-Server anzeigen, eine Verbindung mit der IP 127.0.0.1 an Port 80 herzustellen (Sie müssen das 5. Zeichen als "0" und das 6. als den Port im Dezimalformat angeben oder das 5. und 6. verwenden, um den Port im Hexadezimalformat auszudrücken).
EPRT |2|127.0.0.1|80|
Dies wird dem FTP-Server anzeigen, eine TCP-Verbindung (angezeigt durch "2") mit der IP 127.0.0.1 an Port 80 herzustellen. Dieser Befehl unterstützt IPv6.
LIST
Dies sendet die Liste der Dateien im aktuellen Ordner
LIST -R
Liste rekursiv (wenn vom Server erlaubt)
APPE /path/something.txt
Dies wird dem FTP anzeigen, die Daten, die von einer passiven Verbindung oder von einer PORT/EPRT-Verbindung empfangen wurden, in einer Datei zu speichern. Wenn der Dateiname existiert, werden die Daten angehängt.
STOR /path/something.txt
Wie APPE
, aber es wird die Dateien überschreiben
STOU /path/something.txt
Wie APPE
, aber wenn sie existiert, wird nichts unternommen.
RETR /path/to/file
Eine passive oder eine Portverbindung muss hergestellt werden. Dann sendet der FTP-Server die angegebene Datei über diese Verbindung
REST 6
Dies wird dem Server anzeigen, dass er beim nächsten Mal, wenn er etwas mit RETR
sendet, im 6. Byte beginnen soll.
TYPE i
Setzt die Übertragung auf binär
PASV
Dies öffnet eine passive Verbindung und zeigt dem Benutzer, wo er sich verbinden kann
PUT /tmp/file.txt
Hochladen der angegebenen Datei auf das FTP
Einige FTP-Server erlauben den Befehl PORT. Dieser Befehl kann verwendet werden, um dem Server anzuzeigen, dass Sie sich mit einem anderen FTP-Server an einem bestimmten Port verbinden möchten. Dann können Sie dies verwenden, um zu scannen, welche Ports eines Hosts über einen FTP-Server geöffnet sind.
Hier lernen, wie man einen FTP-Server missbraucht, um Ports zu scannen.
Sie könnten dieses Verhalten auch ausnutzen, um einen FTP-Server mit anderen Protokollen interagieren zu lassen. Sie könnten eine Datei hochladen, die eine HTTP-Anfrage enthält und den anfälligen FTP-Server dazu bringen, sie an einen beliebigen HTTP-Server zu senden (vielleicht um einen neuen Admin-Benutzer hinzuzufügen?) oder sogar eine FTP-Anfrage hochladen und den anfälligen FTP-Server dazu bringen, eine Datei von einem anderen FTP-Server herunterzuladen. Die Theorie ist einfach:
Laden Sie die Anfrage (in einer Textdatei) auf den anfälligen Server hoch. Denken Sie daran, dass Sie, wenn Sie mit einem anderen HTTP- oder FTP-Server kommunizieren möchten, die Zeilen mit 0x0d 0x0a
ändern müssen
Verwenden Sie REST X
, um zu vermeiden, die Zeichen zu senden, die Sie nicht senden möchten (vielleicht um die Anfrage in die Datei hochzuladen, mussten Sie am Anfang einen Bildheader einfügen)
Verwenden Sie PORT
, um sich mit dem beliebigen Server und Dienst zu verbinden
Verwenden Sie RETR
, um die gespeicherte Anfrage an den Server zu senden.
Es ist sehr wahrscheinlich, dass dies einen Fehler wie Socket nicht beschreibbar auslöst, weil die Verbindung nicht lange genug dauert, um die Daten mit RETR
zu senden. Vorschläge, um dies zu vermeiden, sind:
Wenn Sie eine HTTP-Anfrage senden, setzen Sie die gleiche Anfrage nacheinander bis ~0.5MB mindestens. So:
Versuchen Sie, die Anfrage mit "Junk"-Daten, die sich auf das Protokoll beziehen, zu füllen (bei FTP vielleicht nur Junk-Befehle oder die RETR
-Anweisung wiederholen, um die Datei zu erhalten)
Füllen Sie einfach die Anfrage mit vielen Nullzeichen oder anderen (auf Zeilen verteilt oder nicht)
Wie auch immer, hier haben Sie ein altes Beispiel, wie man dies missbraucht, um einen FTP-Server eine Datei von einem anderen FTP-Server herunterladen zu lassen.
FileZilla bindet normalerweise lokal einen Administrationsdienst für den FileZilla-Server (Port 14147). Wenn Sie einen Tunnel von Ihrem Rechner zu diesem Port erstellen können, können Sie sich mit einem leeren Passwort verbinden und einen neuen Benutzer für den FTP-Dienst erstellen.
Die Standardkonfiguration von vsFTPd kann in /etc/vsftpd.conf
gefunden werden. Hier könnten einige gefährliche Einstellungen zu finden sein:
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_root=/home/username/ftp
- Verzeichnis für anonym.
chown_uploads=YES
- Ändere den Eigentümer von anonym hochgeladenen Dateien
chown_username=username
- Benutzer, der den Eigentum an anonym hochgeladenen Dateien erhält
local_enable=YES
- Erlaube lokalen Benutzern, sich anzumelden
no_anon_password=YES
- Frage anonym nicht nach einem Passwort
write_enable=YES
- Erlaube Befehle: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE und SITE
ftp
port:21
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)