hacktricks/network-services-pentesting/pentesting-ftp/README.md
2024-02-10 15:36:32 +00:00

17 KiB

21 - Pentesting FTP

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

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.

{% 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/

Verbindungsdebugging

Die FTP-Befehle debug und trace können verwendet werden, um zu sehen, wie die Kommunikation stattfindet.

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

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 <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 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 Anmeldung und Bounce-FTP-Checks werden standardmäßig von nmap mit der -sC-Option oder durchgeführt:

nmap --script ftp-* -p 21 <ip>

Browser-Verbindung

Sie können eine Verbindung zu einem FTP-Server über einen Browser (wie Firefox) herstellen, indem Sie eine URL wie folgt verwenden:

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

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 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.

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.

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.

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.

{% 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)!