.. | ||
ftp-bounce-attack.md | ||
ftp-bounce-download-2oftp-file.md | ||
README.md |
21 - Pentesting FTP
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Grundinformationen
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, sodass Sie manchmal mit telnet
oder nc -C
verbinden müssen.
Standardport: 21
PORT STATE SERVICE
21/tcp open ftp
Verbindungen Aktiv & Passiv
In Aktivem 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 passivem 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 zum Port M des FTP-Servers.
Quelle: https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/
Verbindungs-Debugging
Die FTP-Befehle debug
und trace
können verwendet werden, um zu sehen, wie die Kommunikation erfolgt.
Enumeration
Banner-Grabbing
nc -vn <IP> 21
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
Mit StartTLS zu FTP verbinden
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 einige 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 finden Sie eine schöne Liste mit Standard-FTP-Anmeldeinformationen: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt
Automatisiert
Anonyme Anmeldungen und Bounce-FTP-Überprüfungen werden standardmäßig von nmap mit der -sC-Option durchgeführt oder:
nmap --script ftp-* -p 21 <ip>
Browserverbindung
Sie können sich mit einem FTP-Server über einen Browser (wie Firefox) mit einer URL wie:
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, 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.
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/
Einige FTP-Befehle
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 (du musst das 5. Zeichen als "0" und das 6. als den Port im Dezimalformat angeben oder das 5. und 6. Zeichen 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 OrdnerLIST -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 eine Datei zu speichern. Wenn der Dateiname existiert, werden die Daten angehängt.STOR /path/something.txt
WieAPPE
, aber es wird die Dateien überschreibenSTOU /path/something.txt
WieAPPE
, 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 VerbindungREST 6
Dies wird dem Server anzeigen, dass er beim nächsten Mal, wenn er etwas mitRETR
sendet, im 6. Byte beginnen soll.TYPE i
Setze den Transfer auf binärPASV
Dies öffnet eine passive Verbindung und zeigt dem Benutzer, wo er sich verbinden kannPUT /tmp/file.txt
Lade die angegebene Datei auf den FTP hoch
FTPBounce-Angriff
Einige FTP-Server erlauben den Befehl PORT. Dieser Befehl kann verwendet werden, um dem Server anzuzeigen, dass du dich mit einem anderen FTP-Server an einem bestimmten Port verbinden möchtest. Dann kannst du dies verwenden, um zu scannen, welche Ports eines Hosts über einen FTP-Server offen sind.
Hier lernen, wie man einen FTP-Server missbraucht, um Ports zu scannen.
Du könntest dieses Verhalten auch ausnutzen, um einen FTP-Server mit anderen Protokollen interagieren zu lassen. Du könntest 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:
- Lade die Anfrage (in einer Textdatei) auf den anfälligen Server hoch. Denk daran, dass du, wenn du mit einem anderen HTTP- oder FTP-Server kommunizieren möchtest, die Zeilen mit
0x0d 0x0a
ändern musst. - Verwende
REST X
, um das Senden der Zeichen zu vermeiden, die du nicht senden möchtest (vielleicht musstest du, um die Anfrage in die Datei hochzuladen, einige Bildheader am Anfang hinzufügen). - Verwende
PORT
, um dich mit dem beliebigen Server und Dienst zu verbinden. - Verwende
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 das zu vermeiden, sind:
- Wenn du eine HTTP-Anfrage sendest, setze die gleiche Anfrage nacheinander bis ~0.5MB mindestens. So:
{% file src="../../.gitbook/assets/posts.txt" %} posts.txt {% endfile %}
- Versuche, die Anfrage mit "Müll"-Daten, die sich auf das Protokoll beziehen, zu füllen (wenn du mit FTP sprichst, vielleicht nur Müllbefehle oder wiederhole die
RETR
-Anweisung, um die Datei zu erhalten). - Fülle die Anfrage einfach mit vielen Nullzeichen oder anderen (getrennt in Zeilen oder nicht).
Wie auch immer, hier hast du ein altes Beispiel, wie man dies missbrauchen kann, um einen FTP-Server eine Datei von einem anderen FTP-Server herunterladen zu lassen.
Filezilla-Server-Sicherheitsanfälligkeit
FileZilla bindet normalerweise an lokal einen Administrationsdienst für den FileZilla-Server (Port 14147). Wenn du einen Tunnel von deinem Rechner zu diesem Port erstellen kannst, kannst du dich mit einem leeren Passwort 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 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 Dateienchown_username=username
- Benutzer, der den Eigentum an anonym hochgeladenen Dateien erhältlocal_enable=YES
- Erlaube lokalen Benutzern, sich anzumeldenno_anon_password=YES
- Frage anonym nicht nach einem Passwortwrite_enable=YES
- Erlaube Befehle: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE und SITE
Shodan
ftp
port:21
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'
{% hint style="success" %}
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstütze HackTricks
- Überprüfe die Abonnementpläne!
- Tritt der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folge uns auf Twitter 🐦 @hacktricks_live.
- Teile Hacking-Tricks, indem du PRs an die HackTricks und HackTricks Cloud GitHub-Repos einreichst.