mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-24 03:53:29 +00:00
296 lines
15 KiB
Markdown
296 lines
15 KiB
Markdown
# 21 - Pentesting FTP
|
|
|
|
<details>
|
|
|
|
<summary><strong>Lernen Sie AWS-Hacking von Grund auf mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
* Arbeiten Sie in einem **Cybersicherheitsunternehmen**? Möchten Sie Ihr **Unternehmen in HackTricks beworben sehen**? Oder möchten Sie Zugriff auf die **neueste Version des PEASS erhalten oder HackTricks im PDF-Format herunterladen**? Ü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-Merch**](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) **einreichen**.
|
|
|
|
</details>
|
|
|
|
**Try Hard Security Group**
|
|
|
|
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
|
|
|
{% embed url="https://discord.gg/tryhardsecurity" %}
|
|
|
|
***
|
|
|
|
## 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 **Zeilenumbruchszeichen `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 **Aktivem FTP** initiiert der FTP **Client** zuerst die Steuerungsverbindung 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 jedoch der FTP-Client eine Firewall eingerichtet hat, die die eingehenden Datenverbindungen von außen steuert, kann aktives FTP ein Problem darstellen. Eine mögliche Lösung dafür ist passives FTP.
|
|
|
|
Bei **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. Der **Client** initiiert dann 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/)
|
|
|
|
### Verbindungsfehlerbehebung
|
|
|
|
Die **FTP**-Befehle **`debug`** und **`trace`** können verwendet werden, um zu sehen, **wie die Kommunikation stattfindet**.
|
|
|
|
## Enumeration
|
|
|
|
### Banner Abrufen
|
|
```bash
|
|
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**
|
|
```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...)
|
|
```
|
|
### Anonyme Anmeldung
|
|
|
|
_anonymous : anonymous_\
|
|
_anonymous :_\
|
|
_ftp : ftp_
|
|
```bash
|
|
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](../../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 Option **-sC** oder durchgeführt:
|
|
```bash
|
|
nmap --script ftp-* -p 21 <ip>
|
|
```
|
|
## Browser-Verbindung
|
|
|
|
Sie können sich mit einem FTP-Server über einen Browser (wie Firefox) mit einer URL verbinden, wie zum Beispiel:
|
|
```bash
|
|
ftp://anonymous:anonymous@10.10.10.98
|
|
```
|
|
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 beliebige Aktionen ausführen lassen**. Eine mögliche willkürliche Aktion besteht darin, Inhalte von einem vom Benutzer kontrollierten Server herunterzuladen, Portscans durchzuführen oder zu versuchen, mit anderen textbasierten Diensten (wie http) zu kommunizieren.
|
|
|
|
## Alle Dateien vom 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`\*\*Dies gibt dem FTP-Server an, eine Verbindung mit der IP 127.0.0.1 auf Port 80 herzustellen (_Sie müssen das 5. Zeichen als "0" und das 6. als Port in Dezimal setzen oder das 5. und 6. verwenden, um den Port in Hexadezimal auszudrücken_).
|
|
* \*\*`EPRT |2|127.0.0.1|80|`\*\*Dies gibt dem 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**.
|
|
* **`LIST`** Dies sendet die Liste der Dateien im aktuellen Ordner
|
|
* **`LIST -R`** Rekursives Auflisten (falls vom Server erlaubt)
|
|
* **`APPE /Pfad/etwas.txt`** Dies gibt dem FTP an, die empfangenen Daten aus einer **passiven** Verbindung oder aus einer **PORT/EPRT**-Verbindung in einer Datei zu speichern. Wenn der Dateiname existiert, werden die Daten angehängt.
|
|
* **`STOR /Pfad/etwas.txt`** Wie `APPE`, aber es überschreibt die Dateien
|
|
* **`STOU /Pfad/etwas.txt`** Wie `APPE`, aber wenn die Datei existiert, passiert nichts.
|
|
* **`RETR /Pfad/zur/Datei`** Es muss eine passive oder eine Portverbindung hergestellt werden. Dann sendet der FTP-Server die angegebene Datei über diese Verbindung
|
|
* **`REST 6`** Dies gibt dem Server an, dass er beim nächsten Senden von etwas mit `RETR` ab dem 6. Byte beginnen soll.
|
|
* **`TYPE i`** Setzt den Transfer auf binär
|
|
* **`PASV`** Dies öffnet eine passive Verbindung und gibt dem Benutzer an, 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. Dieser Befehl kann verwendet werden, um dem Server anzuzeigen, dass Sie eine Verbindung zu einem anderen FTP-Server an einem bestimmten Port herstellen möchten. Dann können Sie dies verwenden, um zu scannen, welche Ports eines Hosts über einen FTP-Server geöffnet sind.
|
|
|
|
[**Erfahren Sie hier, 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 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:
|
|
|
|
1. **Laden Sie die Anfrage (in einer Textdatei) auf den verwundbaren Server hoch.** Denken Sie daran, dass Sie, wenn Sie mit einem anderen HTTP- oder FTP-Server sprechen möchten, Zeilen mit `0x0d 0x0a` ändern müssen.
|
|
2. **Verwenden Sie `REST X`, um das Senden der Zeichen zu vermeiden, die Sie nicht senden möchten** (vielleicht mussten Sie, um die Anfrage in die Datei hochzuladen, einen Bildheader am Anfang platzieren)
|
|
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 nicht beschreibbar_** **auslöst, weil die Verbindung nicht lange genug besteht, um die Daten mit `RETR` zu senden**. Vorschläge, um zu versuchen, dies zu vermeiden, sind:
|
|
|
|
* Wenn Sie eine HTTP-Anfrage senden, **senden Sie die gleiche Anfrage hintereinander**, bis mindestens **\~0,5 MB**. So:
|
|
|
|
{% 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 haben Sie ein [altes Beispiel, wie man dies missbrauchen kann, um einen FTP-Server dazu zu bringen, eine Datei von einem anderen FTP-Server herunterzuladen.](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 einen **Tunnel** von **Ihrer Maschine** erstellen können, um auf diesen Port zuzugreifen, können Sie **sich** 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 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` - Ändern des Besitzes von anonym hochgeladenen Dateien
|
|
* `chown_username=username` - Benutzer, dem der Besitz von anonym hochgeladenen Dateien übertragen wird
|
|
* `local_enable=YES` - Lokalen Benutzern das Anmelden ermöglichen
|
|
* `no_anon_password=YES` - Kein Passwort von anonymen Benutzern verlangen
|
|
* `write_enable=YES` - Erlauben von Befehlen: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE und SITE
|
|
|
|
### Shodan
|
|
|
|
* `ftp`
|
|
* `port:21`
|
|
|
|
***
|
|
|
|
**Try Hard Security Group**
|
|
|
|
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
|
|
|
{% embed url="https://discord.gg/tryhardsecurity" %}
|
|
|
|
***
|
|
|
|
## 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.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'
|
|
```
|
|
<details>
|
|
|
|
<summary><strong>Erlernen Sie AWS-Hacking von Null auf Held mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
* Arbeiten Sie in einem **Cybersicherheitsunternehmen**? Möchten Sie Ihr **Unternehmen in HackTricks beworben sehen**? Oder möchten Sie Zugriff auf die **neueste Version des PEASS oder HackTricks als PDF herunterladen**? Ü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-Merch**](https://peass.creator-spring.com)
|
|
* **Treten Sie der** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) bei oder der [**Telegram-Gruppe**](https://t.me/peass) 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**.
|
|
|
|
</details>
|