mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
259 lines
17 KiB
Markdown
259 lines
17 KiB
Markdown
# 21 - Pentesting FTP
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## Basic Information
|
||
|
||
Το **File Transfer Protocol (FTP)** χρησιμεύει ως πρότυπο πρωτόκολλο για τη μεταφορά αρχείων μέσω ενός υπολογιστικού δικτύου μεταξύ ενός διακομιστή και ενός πελάτη.\
|
||
Είναι ένα **plain-text** πρωτόκολλο που χρησιμοποιεί ως **new line character `0x0d 0x0a`** οπότε μερικές φορές χρειάζεται να **connect using `telnet`** ή **`nc -C`**.
|
||
|
||
**Default Port:** 21
|
||
```
|
||
PORT STATE SERVICE
|
||
21/tcp open ftp
|
||
```
|
||
### Συνδέσεις Ενεργές & Παθητικές
|
||
|
||
Στο **Active FTP**, ο FTP **πελάτης** πρώτα **ξεκινά** τη σύνδεση ελέγχου από την θύρα N του στην θύρα εντολών του FTP Server – θύρα 21. Ο **πελάτης** στη συνέχεια **ακούει** στη θύρα **N+1** και στέλνει τη θύρα N+1 στον FTP Server. Ο FTP **Server** τότε **ξεκινά** τη σύνδεση δεδομένων, από **την θύρα M του στην θύρα N+1** του FTP Client.
|
||
|
||
Αλλά, αν ο FTP Client έχει ρυθμισμένο ένα τείχος προστασίας που ελέγχει τις εισερχόμενες συνδέσεις δεδομένων από το εξωτερικό, τότε το active FTP μπορεί να είναι πρόβλημα. Και, μια εφικτή λύση γι' αυτό είναι το Passive FTP.
|
||
|
||
Στο **Passive FTP**, ο πελάτης ξεκινά τη σύνδεση ελέγχου από την θύρα N του στην θύρα 21 του FTP Server. Μετά από αυτό, ο πελάτης εκδίδει μια **εντολή passv**. Ο server τότε στέλνει στον πελάτη έναν από τους αριθμούς θύρας του M. Και ο **πελάτης** **ξεκινά** τη σύνδεση δεδομένων από **την θύρα P του στην θύρα M** του FTP Server.
|
||
|
||
Source: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
|
||
|
||
### Αποσφαλμάτωση σύνδεσης
|
||
|
||
Οι εντολές **FTP** **`debug`** και **`trace`** μπορούν να χρησιμοποιηθούν για να δουν **πώς συμβαίνει η επικοινωνία**.
|
||
|
||
## Αριθμητική
|
||
|
||
### Λήψη Banner
|
||
```bash
|
||
nc -vn <IP> 21
|
||
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
|
||
```
|
||
### Συνδεθείτε στο FTP χρησιμοποιώντας starttls
|
||
```
|
||
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
|
||
|
||
Με **nmap**
|
||
```bash
|
||
sudo nmap -sV -p21 -sC -A 10.10.10.10
|
||
```
|
||
Μπορείτε να χρησιμοποιήσετε τις εντολές `HELP` και `FEAT` για να αποκτήσετε κάποιες πληροφορίες από τον FTP server:
|
||
```
|
||
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...)
|
||
```
|
||
### Ανώνυμη σύνδεση
|
||
|
||
_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-hacking/brute-force.md#ftp)
|
||
|
||
Εδώ μπορείτε να βρείτε μια ωραία λίστα με προεπιλεγμένα ftp credentials: [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)
|
||
|
||
### Automated
|
||
|
||
Anon login και έλεγχοι bounce FTP εκτελούνται από προεπιλογή από το nmap με την επιλογή **-sC** ή:
|
||
```bash
|
||
nmap --script ftp-* -p 21 <ip>
|
||
```
|
||
## Σύνδεση μέσω προγράμματος περιήγησης
|
||
|
||
Μπορείτε να συνδεθείτε σε έναν FTP server χρησιμοποιώντας ένα πρόγραμμα περιήγησης (όπως ο Firefox) χρησιμοποιώντας μια διεύθυνση URL όπως:
|
||
```bash
|
||
ftp://anonymous:anonymous@10.10.10.98
|
||
```
|
||
Σημειώστε ότι αν μια **web application** στέλνει δεδομένα που ελέγχονται από έναν χρήστη **άμεσα σε έναν FTP server** μπορείτε να στείλετε διπλό URL encode `%0d%0a` (σε διπλό URL encode αυτό είναι `%250d%250a`) bytes και να κάνετε τον **FTP server να εκτελεί αυθαίρετες ενέργειες**. Μία από αυτές τις πιθανές αυθαίρετες ενέργειες είναι να κατεβάσετε περιεχόμενο από έναν server που ελέγχεται από χρήστη, να εκτελέσετε σάρωση θυρών ή να προσπαθήσετε να επικοινωνήσετε με άλλες υπηρεσίες που βασίζονται σε απλό κείμενο (όπως το http).
|
||
|
||
## Κατεβάστε όλα τα αρχεία από το FTP
|
||
```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
|
||
```
|
||
Αν το όνομα χρήστη/κωδικός σας έχει ειδικούς χαρακτήρες, η [παρακάτω εντολή](https://stackoverflow.com/a/113900/13647948) μπορεί να χρησιμοποιηθεί:
|
||
```bash
|
||
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
|
||
```
|
||
## Ορισμένες εντολές FTP
|
||
|
||
- **`USER username`**
|
||
- **`PASS password`**
|
||
- **`HELP`** Ο διακομιστής υποδεικνύει ποιες εντολές υποστηρίζονται
|
||
- **`PORT 127,0,0,1,0,80`** Αυτό θα υποδείξει στον διακομιστή FTP να δημιουργήσει μια σύνδεση με την IP 127.0.0.1 στην θύρα 80 (_πρέπει να βάλετε τον 5ο χαρακτήρα ως "0" και τον 6ο ως την θύρα σε δεκαδικό ή να χρησιμοποιήσετε τον 5ο και 6ο για να εκφράσετε την θύρα σε δεκαεξαδικό_).
|
||
- **`EPRT |2|127.0.0.1|80|`** Αυτό θα υποδείξει στον διακομιστή FTP να δημιουργήσει μια σύνδεση TCP (_υποδεικνύεται από το "2"_) με την IP 127.0.0.1 στην θύρα 80. Αυτή η εντολή **υποστηρίζει IPv6**.
|
||
- **`LIST`** Αυτό θα στείλει τη λίστα των αρχείων στον τρέχοντα φάκελο
|
||
- **`LIST -R`** Λίστα αναδρομικά (αν επιτρέπεται από τον διακομιστή)
|
||
- **`APPE /path/something.txt`** Αυτό θα υποδείξει στον FTP να αποθηκεύσει τα δεδομένα που λαμβάνονται από μια **παθητική** σύνδεση ή από μια **PORT/EPRT** σύνδεση σε ένα αρχείο. Αν το όνομα αρχείου υπάρχει, θα προσθέσει τα δεδομένα.
|
||
- **`STOR /path/something.txt`** Όπως το `APPE` αλλά θα αντικαταστήσει τα αρχεία
|
||
- **`STOU /path/something.txt`** Όπως το `APPE`, αλλά αν υπάρχει δεν θα κάνει τίποτα.
|
||
- **`RETR /path/to/file`** Πρέπει να έχει δημιουργηθεί μια παθητική ή μια σύνδεση port. Στη συνέχεια, ο διακομιστής FTP θα στείλει το υποδεικνυόμενο αρχείο μέσω αυτής της σύνδεσης
|
||
- **`REST 6`** Αυτό θα υποδείξει στον διακομιστή ότι την επόμενη φορά που θα στείλει κάτι χρησιμοποιώντας `RETR` θα πρέπει να ξεκινήσει από το 6ο byte.
|
||
- **`TYPE i`** Ορίστε τη μεταφορά σε δυαδική
|
||
- **`PASV`** Αυτό θα ανοίξει μια παθητική σύνδεση και θα υποδείξει στον χρήστη πού μπορεί να συνδεθεί
|
||
- **`PUT /tmp/file.txt`** Ανεβάστε το υποδεικνυόμενο αρχείο στον FTP
|
||
|
||
.png>)
|
||
|
||
## Επίθεση FTPBounce
|
||
|
||
Ορισμένοι διακομιστές FTP επιτρέπουν την εντολή PORT. Αυτή η εντολή μπορεί να χρησιμοποιηθεί για να υποδείξει στον διακομιστή ότι θέλετε να συνδεθείτε σε άλλον διακομιστή FTP σε κάποια θύρα. Στη συνέχεια, μπορείτε να το χρησιμοποιήσετε για να σαρώσετε ποιες θύρες ενός host είναι ανοιχτές μέσω ενός διακομιστή FTP.
|
||
|
||
[**Μάθετε εδώ πώς να καταχραστείτε έναν διακομιστή FTP για να σαρώσετε θύρες.**](ftp-bounce-attack.md)
|
||
|
||
Μπορείτε επίσης να καταχραστείτε αυτή τη συμπεριφορά για να κάνετε έναν διακομιστή FTP να αλληλεπιδρά με άλλα πρωτόκολλα. Μπορείτε να **ανεβάσετε ένα αρχείο που περιέχει ένα HTTP αίτημα** και να κάνετε τον ευάλωτο διακομιστή FTP **να το στείλει σε έναν αυθαίρετο HTTP διακομιστή** (_ίσως για να προσθέσετε έναν νέο διαχειριστή;_) ή ακόμη και να ανεβάσετε ένα αίτημα FTP και να κάνετε τον ευάλωτο διακομιστή FTP να κατεβάσει ένα αρχείο από έναν διαφορετικό διακομιστή FTP.\
|
||
Η θεωρία είναι απλή:
|
||
|
||
1. **Ανεβάστε το αίτημα (μέσα σε ένα αρχείο κειμένου) στον ευάλωτο διακομιστή.** Θυμηθείτε ότι αν θέλετε να μιλήσετε με έναν άλλο HTTP ή FTP διακομιστή πρέπει να αλλάξετε γραμμές με `0x0d 0x0a`
|
||
2. **Χρησιμοποιήστε `REST X` για να αποφύγετε την αποστολή των χαρακτήρων που δεν θέλετε να στείλετε** (ίσως για να ανεβάσετε το αίτημα μέσα στο αρχείο που χρειάζεστε να βάλετε κάποια κεφαλίδα εικόνας στην αρχή)
|
||
3. **Χρησιμοποιήστε `PORT` για να συνδεθείτε στον αυθαίρετο διακομιστή και υπηρεσία**
|
||
4. **Χρησιμοποιήστε `RETR` για να στείλετε το αποθηκευμένο αίτημα στον διακομιστή.**
|
||
|
||
Είναι πολύ πιθανό ότι αυτό **θα προκαλέσει ένα σφάλμα όπως** _**Socket not writable**_ **επειδή η σύνδεση δεν διαρκεί αρκετά για να στείλει τα δεδομένα με `RETR`**. Προτάσεις για να προσπαθήσετε να το αποφύγετε είναι:
|
||
|
||
- Αν στέλνετε ένα HTTP αίτημα, **βάλτε το ίδιο αίτημα το ένα μετά το άλλο** μέχρι **\~0.5MB** τουλάχιστον. Έτσι:
|
||
|
||
{{#file}}
|
||
posts.txt
|
||
{{#endfile}}
|
||
|
||
- Προσπαθήστε να **γεμίσετε το αίτημα με "σκουπίδια" δεδομένα σχετικά με το πρωτόκολλο** (μιλώντας για FTP ίσως απλά σκουπίδια εντολές ή επαναλαμβάνοντας την εντολή `RETR` για να αποκτήσετε το αρχείο)
|
||
- Απλά **γεμίστε το αίτημα με πολλούς μηδενικούς χαρακτήρες ή άλλους** (διαχωρισμένους σε γραμμές ή όχι)
|
||
|
||
Ούτως ή άλλως, εδώ έχετε ένα [παλιό παράδειγμα για το πώς να καταχραστείτε αυτό για να κάνετε έναν διακομιστή FTP να κατεβάσει ένα αρχείο από έναν διαφορετικό διακομιστή FTP.](ftp-bounce-download-2oftp-file.md)
|
||
|
||
## Ευπάθεια Διακομιστή Filezilla
|
||
|
||
**FileZilla** συνήθως **δεσμεύει** σε **τοπικό** μια **Διοικητική υπηρεσία** για τον **FileZilla-Server** (θύρα 14147). Αν μπορείτε να δημιουργήσετε ένα **τούνελ** από **τη μηχανή σας** για να αποκτήσετε πρόσβαση σε αυτή τη θύρα, μπορείτε να **συνδεθείτε** σε **αυτήν** χρησιμοποιώντας έναν **κενό κωδικό πρόσβασης** και να **δημιουργήσετε** έναν **νέο χρήστη** για την υπηρεσία FTP.
|
||
|
||
## Αρχεία ρυθμίσεων
|
||
```
|
||
ftpusers
|
||
ftp.conf
|
||
proftpd.conf
|
||
vsftpd.conf
|
||
```
|
||
### Post-Exploitation
|
||
|
||
Η προεπιλεγμένη ρύθμιση του vsFTPd μπορεί να βρεθεί στο `/etc/vsftpd.conf`. Εδώ, μπορείτε να βρείτε κάποιες επικίνδυνες ρυθμίσεις:
|
||
|
||
- `anonymous_enable=YES`
|
||
- `anon_upload_enable=YES`
|
||
- `anon_mkdir_write_enable=YES`
|
||
- `anon_root=/home/username/ftp` - Κατάλογος για ανώνυμους.
|
||
- `chown_uploads=YES` - Αλλαγή ιδιοκτησίας των ανώνυμα ανεβασμένων αρχείων
|
||
- `chown_username=username` - Χρήστης που αποκτά την ιδιοκτησία των ανώνυμα ανεβασμένων αρχείων
|
||
- `local_enable=YES` - Ενεργοποίηση τοπικών χρηστών για σύνδεση
|
||
- `no_anon_password=YES` - Μην ζητάτε κωδικό από ανώνυμους
|
||
- `write_enable=YES` - Επιτρέψτε τις εντολές: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE, και SITE
|
||
|
||
### Shodan
|
||
|
||
- `ftp`
|
||
- `port: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'
|
||
```
|
||
{{#include ../../banners/hacktricks-training.md}}
|