# 21 - Pentesting FTP
Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)! * Arbeiten Sie in einem **Cybersicherheitsunternehmen**? Möchten Sie Ihr **Unternehmen in HackTricks bewerben**? Oder möchten Sie Zugriff auf die **neueste Version von PEASS oder HackTricks im PDF-Format** haben? Überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)! * Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family) * Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com) * **Treten Sie der** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie mir auf **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an das [hacktricks-Repository](https://github.com/carlospolop/hacktricks) und das [hacktricks-cloud-Repository](https://github.com/carlospolop/hacktricks-cloud) senden**.
Finden Sie die wichtigsten Schwachstellen, damit Sie sie schneller beheben können. Intruder verfolgt Ihre Angriffsfläche, führt proaktive Bedrohungsscans durch und findet Probleme in Ihrer gesamten Technologie-Stack, von APIs über Webanwendungen bis hin zu Cloud-Systemen. [**Probieren Sie es heute kostenlos aus**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks). {% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %} *** ## Grundlegende Informationen Das **File Transfer Protocol (FTP)** dient als Standardprotokoll für den Dateitransfer über ein Computernetzwerk zwischen einem Server und einem Client.\ Es handelt sich um ein **Klartextprotokoll**, das als **neues Zeichen `0x0d 0x0a`** verwendet, daher müssen Sie manchmal eine Verbindung mit `telnet` oder `nc -C` herstellen. **Standardport:** 21 ``` PORT STATE SERVICE 21/tcp open ftp ``` ### Aktive und passive Verbindungen Bei **Active FTP** initiiert der FTP-**Client** zuerst die Kontrollverbindung von seinem Port N zum Befehlsport des FTP-Servers - Port 21. Der **Client** hört dann auf Port **N+1** und sendet Port N+1 an den FTP-Server. Der FTP-**Server** initiiert dann die Datenverbindung 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 Active FTP ein Problem darstellen. Eine mögliche Lösung dafür ist Passive FTP. Bei **Passive FTP** initiiert der Client die Kontrollverbindung von seinem Port N zum Port 21 des FTP-Servers. Danach gibt der Client einen **passv-Befehl** aus. Der Server sendet dem Client dann eine seiner Portnummern M. Und der **Client** initiiert die Datenverbindung von seinem Port P zum Port M des FTP-Servers. Quelle: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/) ### Verbindungsdebugging Die **FTP**-Befehle **`debug`** und **`trace`** können verwendet werden, um zu sehen, **wie die Kommunikation stattfindet**. ## Enumeration ### Banner Grabbing ```bash nc -vn 21 openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any ``` ### Verbindung zu FTP mit StartTLS herstellen Um eine sichere Verbindung zu einem FTP-Server herzustellen, können Sie das StartTLS-Protokoll verwenden. StartTLS ermöglicht es Ihnen, eine unverschlüsselte FTP-Verbindung zu einem Server herzustellen und dann auf eine verschlüsselte Verbindung umzuschalten. Um eine Verbindung zu einem FTP-Server mit StartTLS herzustellen, befolgen Sie die folgenden Schritte: 1. Öffnen Sie ein Terminal oder eine Befehlszeile. 2. Geben Sie den Befehl `ftp` gefolgt von der IP-Adresse oder dem Hostnamen des FTP-Servers ein. Zum Beispiel: `ftp 192.168.0.1` oder `ftp ftp.example.com`. 3. Geben Sie Ihren Benutzernamen und Ihr Passwort ein, wenn Sie dazu aufgefordert werden. 4. Sobald Sie mit dem FTP-Server verbunden sind, geben Sie den Befehl `quote AUTH TLS` ein, um die StartTLS-Verbindung zu initiieren. 5. Der Server wird Ihnen eine Bestätigung geben und die Verbindung auf eine verschlüsselte Verbindung umschalten. 6. Sie können nun FTP-Befehle verwenden, um Dateien hochzuladen, herunterzuladen oder andere Aktionen auf dem Server auszuführen. Bitte beachten Sie, dass nicht alle FTP-Server StartTLS unterstützen. Stellen Sie sicher, dass der Server, mit dem Sie sich verbinden möchten, diese Funktion aktiviert hat. ``` lftp lftp :~> set ftp:ssl-force true lftp :~> set ssl:verify-certificate no lftp :~> connect 10.10.10.208 lftp 10.10.10.208:~> login Usage: login [] lftp 10.10.10.208:~> login username Password ``` ### Unauth enum Mit **nmap** ```bash sudo nmap -sV -p21 -sC -A 10.10.10.10 ``` Sie können die Befehle `HELP` und `FEAT` verwenden, um Informationen über den FTP-Server zu erhalten: ``` HELP 214-The following commands are recognized (* =>'s unimplemented): 214-CWD XCWD CDUP XCUP SMNT* QUIT PORT PASV 214-EPRT EPSV ALLO* RNFR RNTO DELE MDTM RMD 214-XRMD MKD XMKD PWD XPWD SIZE SYST HELP 214-NOOP FEAT OPTS AUTH CCC* CONF* ENC* MIC* 214-PBSZ PROT TYPE STRU MODE RETR STOR STOU 214-APPE REST ABOR USER PASS ACCT* REIN* LIST 214-NLST STAT SITE MLSD MLST 214 Direct comments to root@drei.work FEAT 211-Features: PROT CCC PBSZ AUTH TLS MFF modify;UNIX.group;UNIX.mode; REST STREAM MLST modify*;perm*;size*;type*;unique*;UNIX.group*;UNIX.mode*;UNIX.owner*; UTF8 EPRT EPSV LANG en-US MDTM SSCN TVFS MFMT SIZE 211 End STAT #Info about the FTP server (version, configs, status...) ``` ### Anonymer Login _anonymous : anonymous_\ _anonymous :_\ _ftp : ftp_ ```bash ftp >anonymous >anonymous >ls -a # List all files (even hidden) (yes, they could be hidden) >binary #Set transmission to binary instead of ascii >ascii #Set transmission to ascii instead of binary >bye #exit ``` ### [Brute force](../../generic-methodologies-and-resources/brute-force.md#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](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt) ### Automatisiert Anonyme Anmeldung und Bounce-FTP-Checks werden standardmäßig von nmap mit der **-sC**-Option oder durchgeführt: ```bash nmap --script ftp-* -p 21 ``` ## Browser-Verbindung Sie können eine Verbindung zu einem FTP-Server über einen Browser (wie Firefox) herstellen, indem Sie eine URL wie folgt verwenden: ```bash ftp://anonymous:anonymous@10.10.10.98 ``` Beachten Sie, dass wenn eine **Webanwendung** Daten, die von einem Benutzer kontrolliert werden, **direkt an einen FTP-Server** sendet, können Sie doppeltes URL-Encoding `%0d%0a` (im doppelten URL-Encoding `%250d%250a`) Bytes senden und den **FTP-Server dazu bringen, beliebige Aktionen** auszuführen. Eine mögliche beliebige Aktion ist das Herunterladen von Inhalten von einem vom Benutzer kontrollierten Server, das Durchführen von Portscans oder das Versuchen, mit anderen textbasierten Diensten (wie HTTP) zu kommunizieren. ## Alle Dateien von FTP herunterladen ```bash wget -m ftp://anonymous:anonymous@10.10.10.98 #Donwload all wget -m --no-passive ftp://anonymous:anonymous@10.10.10.98 #Download all ``` Wenn Ihr Benutzername/Passwort Sonderzeichen enthält, kann der [folgende Befehl](https://stackoverflow.com/a/113900/13647948) verwendet werden: ```bash wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/ ``` ## Einige FTP-Befehle * **`USER Benutzername`** * **`PASS Passwort`** * **`HELP`** Der Server gibt an, welche Befehle unterstützt werden. * **`PORT 127,0,0,1,0,80`** Damit wird der FTP-Server angewiesen, eine Verbindung mit der IP-Adresse 127.0.0.1 und dem Port 80 herzustellen (_Sie müssen das 5. Zeichen als "0" und das 6. Zeichen als den Port in Dezimal angeben oder das 5. und 6. Zeichen verwenden, um den Port in Hexadezimal auszudrücken_). * **`EPRT |2|127.0.0.1|80|`** Damit wird der FTP-Server angewiesen, eine TCP-Verbindung (_angegeben durch "2"_) mit der IP-Adresse 127.0.0.1 und dem Port 80 herzustellen. Dieser Befehl **unterstützt IPv6**. * **`LIST`** Damit wird die Liste der Dateien im aktuellen Ordner gesendet. * **`LIST -R`** Rekursive Liste (falls vom Server erlaubt) * **`APPE /Pfad/etwas.txt`** Damit wird der FTP angewiesen, die empfangenen Daten aus einer **passiven** Verbindung oder aus einer **PORT/EPRT**-Verbindung in einer Datei zu speichern. Wenn der Dateiname bereits existiert, werden die Daten angehängt. * **`STOR /Pfad/etwas.txt`** Ähnlich wie `APPE`, aber es werden die Dateien überschrieben. * **`STOU /Pfad/etwas.txt`** Ähnlich wie `APPE`, aber wenn die Datei existiert, wird nichts unternommen. * **`RETR /Pfad/zur/Datei`** Es muss eine passive oder eine Port-Verbindung hergestellt werden. Dann sendet der FTP-Server die angegebene Datei über diese Verbindung. * **`REST 6`** Damit wird dem Server angezeigt, dass er beim nächsten Mal, wenn er etwas mit `RETR` sendet, ab dem 6. Byte beginnen soll. * **`TYPE i`** Setzt den Transfer auf binär. * **`PASV`** Damit wird eine passive Verbindung geöffnet und dem Benutzer mitgeteilt, wo er sich verbinden kann. * **`PUT /tmp/datei.txt`** Lädt die angegebene Datei auf den FTP-Server hoch. ![](<../../.gitbook/assets/image (227).png>) ## FTPBounce-Angriff Einige FTP-Server erlauben den Befehl PORT. Mit diesem Befehl kann dem Server mitgeteilt werden, dass eine Verbindung zu einem anderen FTP-Server an einem bestimmten Port hergestellt werden soll. Dadurch kann über einen FTP-Server gescannt werden, welche Ports eines Hosts geöffnet sind. [**Hier erfahren Sie, wie Sie einen FTP-Server missbrauchen können, um Ports zu scannen.**](ftp-bounce-attack.md) Sie könnten dieses Verhalten auch missbrauchen, um einen FTP-Server mit anderen Protokollen interagieren zu lassen. Sie könnten eine Datei hochladen, die eine HTTP-Anfrage enthält, und den verwundbaren FTP-Server diese an einen beliebigen HTTP-Server senden lassen (_vielleicht um einen neuen Administrator-Benutzer hinzuzufügen?_) oder eine FTP-Anfrage hochladen und den verwundbaren FTP-Server eine Datei für einen anderen FTP-Server herunterladen lassen.\ Die Theorie ist einfach: 1. **Laden Sie die Anfrage (in einer Textdatei) auf den verwundbaren Server hoch.** Beachten Sie, dass Sie, wenn Sie mit einem anderen HTTP- oder FTP-Server kommunizieren möchten, Zeilen mit `0x0d 0x0a` ändern müssen. 2. **Verwenden Sie `REST X`, um die Zeichen zu vermeiden, die Sie nicht senden möchten** (vielleicht mussten Sie, um die Anfrage in die Datei hochzuladen, einen Bildheader am Anfang einfügen). 3. **Verwenden Sie `PORT`, um eine Verbindung zum beliebigen Server und Dienst herzustellen.** 4. **Verwenden Sie `RETR`, um die gespeicherte Anfrage an den Server zu senden.** Es ist sehr wahrscheinlich, dass dies einen Fehler wie _**Socket not writable**_ **verursacht, da die Verbindung nicht lange genug besteht, um die Daten mit `RETR` zu senden**. Vorschläge, um dies zu vermeiden, sind: * Wenn Sie eine HTTP-Anfrage senden, **senden Sie die gleiche Anfrage hintereinander**, bis mindestens **\~0,5 MB** erreicht sind. Wie hier: {% file src="../../.gitbook/assets/posts (1).txt" %} posts.txt {% endfile %} * Versuchen Sie, **die Anfrage mit "Junk"-Daten relativ zum Protokoll zu füllen** (bei FTP vielleicht nur Junk-Befehle oder das `RETR`-Kommando wiederholen, um die Datei zu erhalten). * Füllen Sie die Anfrage einfach mit vielen Nullzeichen oder anderen Zeichen (aufgeteilt in Zeilen oder nicht). Wie auch immer, hier finden Sie ein [altes Beispiel, wie man dies missbrauchen kann, um einen FTP-Server eine Datei von einem anderen FTP-Server herunterladen zu lassen.](ftp-bounce-download-2oftp-file.md) ## Filezilla Server-Schwachstelle **FileZilla** bindet normalerweise einen **Administrativen Dienst** für den **FileZilla-Server** (Port 14147) **lokal**. Wenn Sie eine **Tunnelverbindung** von **Ihrem Rechner** zu diesem Port herstellen können, können Sie sich **mit einem leeren Passwort** damit **verbinden** und einen **neuen Benutzer** für den FTP-Dienst erstellen. ## Konfigurationsdateien ``` ftpusers ftp.conf proftpd.conf vsftpd.conf ``` ### Post-Exploitation Die Standardkonfiguration von vsFTPd befindet sich in `/etc/vsftpd.conf`. Hier finden Sie einige gefährliche Einstellungen: * `anonymous_enable=YES` * `anon_upload_enable=YES` * `anon_mkdir_write_enable=YES` * `anon_root=/home/username/ftp` - Verzeichnis für anonyme Benutzer. * `chown_uploads=YES` - Ändert den Besitzer von anonym hochgeladenen Dateien * `chown_username=username` - Benutzer, dem der Besitz von anonym hochgeladenen Dateien übertragen wird * `local_enable=YES` - Ermöglicht lokalen Benutzern die Anmeldung * `no_anon_password=YES` - Fragt nicht nach einem Passwort für anonyme Benutzer * `write_enable=YES` - Erlaubt Befehle: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE und SITE ### Shodan * `ftp` * `port:21`
Finden Sie die wichtigsten Sicherheitslücken, damit Sie sie schneller beheben können. Intruder überwacht Ihre Angriffsfläche, führt proaktive Bedrohungsscans durch und findet Probleme in Ihrer gesamten Technologie-Stack, von APIs über Webanwendungen bis hin zu Cloud-Systemen. [**Probieren Sie es noch heute kostenlos aus**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks). {% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %} *** ## HackTricks Automatische Befehle ``` Protocol_Name: FTP #Protocol Abbreviation if there is one. Port_Number: 21 #Comma separated if there is more than one. Protocol_Description: File Transfer Protocol #Protocol Abbreviation Spelled out Entry_1: Name: Notes Description: Notes for FTP Note: | Anonymous Login -bi <<< so that your put is done via binary wget --mirror 'ftp://ftp_user:UTDRSCH53c"$6hys@10.10.10.59' ^^to download all dirs and files wget --no-passive-ftp --mirror 'ftp://anonymous:anonymous@10.10.10.98' if PASV transfer is disabled https://book.hacktricks.xyz/pentesting/pentesting-ftp Entry_2: Name: Banner Grab Description: Grab FTP Banner via telnet Command: telnet -n {IP} 21 Entry_3: Name: Cert Grab Description: Grab FTP Certificate if existing Command: openssl s_client -connect {IP}:21 -starttls ftp Entry_4: Name: nmap ftp Description: Anon login and bounce FTP checks are performed Command: nmap --script ftp-* -p 21 {IP} Entry_5: Name: Browser Connection Description: Connect with Browser Note: ftp://anonymous:anonymous@{IP} Entry_6: Name: Hydra Brute Force Description: Need Username Command: hydra -t 1 -l {Username} -P {Big_Passwordlist} -vV {IP} ftp Entry_7: Name: consolesless mfs enumeration ftp Description: FTP enumeration without the need to run msfconsole Note: sourced from https://github.com/carlospolop/legion Command: msfconsole -q -x 'use auxiliary/scanner/ftp/anonymous; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/ftp_version; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/bison_ftp_traversal; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/colorado_ftp_traversal; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/titanftp_xcrc_traversal; set RHOSTS {IP}; set RPORT 21; run; exit' ```
Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)! * Arbeiten Sie in einem **Cybersicherheitsunternehmen**? Möchten Sie Ihr **Unternehmen in HackTricks bewerben**? Oder möchten Sie Zugriff auf die **neueste Version von PEASS oder HackTricks im PDF-Format** haben? Überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)! * Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family). * Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com). * **Treten Sie der** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie mir auf **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an das [hacktricks repo](https://github.com/carlospolop/hacktricks) und das [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)** einreichen.