20 KiB
21 - Pentesting FTP
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Try Hard Security Group
{% embed url="https://discord.gg/tryhardsecurity" %}
Basic Information
Το File Transfer Protocol (FTP) χρησιμεύει ως πρότυπο πρωτόκολλο για τη μεταφορά αρχείων μέσω ενός υπολογιστικού δικτύου μεταξύ ενός διακομιστή και ενός πελάτη.
Είναι ένα πρωτόκολλο απλού κειμένου που χρησιμοποιεί ως χαρακτήρα νέας γραμμής 0x0d 0x0a
οπότε μερικές φορές χρειάζεται να συνδεθείτε χρησιμοποιώντας 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/
Αποσφαλμάτωση σύνδεσης
Οι εντολές FTP debug
και trace
μπορούν να χρησιμοποιηθούν για να δουν πώς συμβαίνει η επικοινωνία.
Αριθμητική
Λήψη Banner
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
Εδώ μπορείτε να βρείτε μια ωραία λίστα με προεπιλεγμένα ftp credentials: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt
Automated
Η ανώνυμη σύνδεση και οι έλεγχοι bounce FTP εκτελούνται από προεπιλογή από το nmap με την επιλογή -sC ή:
nmap --script ftp-* -p 21 <ip>
Browser connection
Μπορείτε να συνδεθείτε σε έναν FTP server χρησιμοποιώντας έναν περιηγητή (όπως ο Firefox) χρησιμοποιώντας μια διεύθυνση URL όπως:
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
wget -m ftp://anonymous:anonymous@10.10.10.98 #Donwload all
wget -m --no-passive ftp://anonymous:anonymous@10.10.10.98 #Download all
Αν το όνομα χρήστη/κωδικός σας έχει ειδικούς χαρακτήρες, η παρακάτω εντολή μπορεί να χρησιμοποιηθεί:
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
Επίθεση FTPBounce
Ορισμένοι διακομιστές FTP επιτρέπουν την εντολή PORT. Αυτή η εντολή μπορεί να χρησιμοποιηθεί για να υποδείξει στον διακομιστή ότι θέλετε να συνδεθείτε σε άλλον διακομιστή FTP σε κάποια θύρα. Στη συνέχεια, μπορείτε να το χρησιμοποιήσετε για να σαρώσετε ποιες θύρες ενός host είναι ανοιχτές μέσω ενός διακομιστή FTP.
Μάθετε εδώ πώς να καταχραστείτε έναν διακομιστή FTP για να σαρώσετε θύρες.
Μπορείτε επίσης να καταχραστείτε αυτή τη συμπεριφορά για να κάνετε έναν διακομιστή FTP να αλληλεπιδρά με άλλα πρωτόκολλα. Μπορείτε να μεταφορτώσετε ένα αρχείο που περιέχει ένα HTTP αίτημα και να κάνετε τον ευάλωτο διακομιστή FTP να το στείλει σε έναν αυθαίρετο HTTP διακομιστή (ίσως για να προσθέσετε έναν νέο διαχειριστή χρήστη;) ή ακόμη και να ανεβάσετε ένα αίτημα FTP και να κάνετε τον ευάλωτο διακομιστή FTP να κατεβάσει ένα αρχείο από έναν διαφορετικό διακομιστή FTP.
Η θεωρία είναι απλή:
- Μεταφορτώστε το αίτημα (μέσα σε ένα αρχείο κειμένου) στον ευάλωτο διακομιστή. Θυμηθείτε ότι αν θέλετε να μιλήσετε με άλλον HTTP ή FTP διακομιστή πρέπει να αλλάξετε γραμμές με
0x0d 0x0a
- Χρησιμοποιήστε
REST X
για να αποφύγετε την αποστολή των χαρακτήρων που δεν θέλετε να στείλετε (ίσως για να ανεβάσετε το αίτημα μέσα στο αρχείο έπρεπε να βάλετε κάποια κεφαλίδα εικόνας στην αρχή) - Χρησιμοποιήστε
PORT
για να συνδεθείτε στον αυθαίρετο διακομιστή και υπηρεσία - Χρησιμοποιήστε
RETR
για να στείλετε το αποθηκευμένο αίτημα στον διακομιστή.
Είναι πολύ πιθανό ότι αυτό θα προκαλέσει ένα σφάλμα όπως Socket not writable επειδή η σύνδεση δεν διαρκεί αρκετά για να στείλει τα δεδομένα με RETR
. Προτάσεις για να προσπαθήσετε να το αποφύγετε είναι:
- Αν στέλνετε ένα HTTP αίτημα, βάλτε το ίδιο αίτημα το ένα μετά το άλλο μέχρι ~0.5MB τουλάχιστον. Έτσι:
{% file src="../../.gitbook/assets/posts.txt" %} posts.txt {% endfile %}
- Προσπαθήστε να γεμίσετε το αίτημα με "σκουπίδια" δεδομένα σχετικά με το πρωτόκολλο (μιλώντας για FTP ίσως απλά σκουπίδια εντολές ή επαναλαμβάνοντας την εντολή
RETR
για να αποκτήσετε το αρχείο) - Απλά γεμίστε το αίτημα με πολλούς μηδενικούς χαρακτήρες ή άλλους (διαχωρισμένους σε γραμμές ή όχι)
Ούτως ή άλλως, εδώ έχετε ένα παλιό παράδειγμα για το πώς να καταχραστείτε αυτό για να κάνετε έναν διακομιστή FTP να κατεβάσει ένα αρχείο από έναν διαφορετικό διακομιστή FTP.
Ευπάθεια Διακομιστή 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
Try Hard Security Group
{% 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'
{% hint style="success" %}
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Υποστήριξη HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.