mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
259 lines
11 KiB
Markdown
259 lines
11 KiB
Markdown
# 21 - Pentesting FTP
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## Osnovne informacije
|
||
|
||
**File Transfer Protocol (FTP)** služi kao standardni protokol za prenos datoteka preko računarske mreže između servera i klijenta.\
|
||
To je **plain-text** protokol koji koristi **novi redni karakter `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
|
||
```
|
||
### Aktivne i Pasivne Konekcije
|
||
|
||
U **Aktivnom FTP-u** FTP **klijent** prvo **inicira** kontrolnu **konekciju** sa svog porta N na komandni port FTP servera – port 21. **Klijent** zatim **sluša** port **N+1** i šalje port N+1 FTP serveru. FTP **server** zatim **inicira** data **konekciju**, sa **svojeg porta M na port N+1** FTP klijenta.
|
||
|
||
Međutim, ako FTP klijent ima podešen firewall koji kontroliše dolazne data konekcije sa spolja, tada aktivni FTP može biti problem. Moguće rešenje za to je Pasivni FTP.
|
||
|
||
U **Pasivnom FTP-u**, klijent inicira kontrolnu konekciju sa svog porta N na port 21 FTP servera. Nakon toga, klijent izdaje **passv komandu**. Server zatim šalje klijentu jedan od svojih brojeva portova M. I **klijent** **inicira** data **konekciju** sa **svojeg porta P na port M** FTP servera.
|
||
|
||
Izvor: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
|
||
|
||
### Debagovanje konekcije
|
||
|
||
**FTP** komande **`debug`** i **`trace`** mogu se koristiti da se vidi **kako se komunikacija odvija**.
|
||
|
||
## Enumeracija
|
||
|
||
### Prikupljanje banera
|
||
```bash
|
||
nc -vn <IP> 21
|
||
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
|
||
```
|
||
### Povezivanje 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
|
||
```
|
||
### Unauth enum
|
||
|
||
Sa **nmap**
|
||
```bash
|
||
sudo nmap -sV -p21 -sC -A 10.10.10.10
|
||
```
|
||
Možete koristiti komande `HELP` i `FEAT` da dobijete neke informacije o FTP serveru:
|
||
```
|
||
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 login
|
||
|
||
_anonymous : anonymous_\
|
||
\_anonymous :_\
|
||
\_ftp : ftp_
|
||
```bash
|
||
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](../../generic-hacking/brute-force.md#ftp)
|
||
|
||
Ovde možete pronaći lepu listu sa podrazumevanim ftp akreditivima: [https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt)
|
||
|
||
### Automated
|
||
|
||
Anonimni login i bounce FTP provere se po defaultu izvode pomoću nmap sa **-sC** opcijom ili:
|
||
```bash
|
||
nmap --script ftp-* -p 21 <ip>
|
||
```
|
||
## Browser connection
|
||
|
||
Možete se povezati na FTP server koristeći pregledač (kao što je Firefox) koristeći URL kao:
|
||
```bash
|
||
ftp://anonymous:anonymous@10.10.10.98
|
||
```
|
||
Napomena da ako **web aplikacija** šalje podatke koje kontroliše korisnik **direktno na FTP server**, možete poslati dvostruko URL kodirane `%0d%0a` (u dvostruko URL kodiranju ovo je `%250d%250a`) bajtove i naterati **FTP server da izvrši proizvoljne radnje**. Jedna od ovih mogućih proizvoljnih radnji je preuzimanje sadržaja sa servera koji kontroliše korisnik, izvođenje skeniranja portova ili pokušaj komunikacije sa drugim uslugama zasnovanim na običnom tekstu (kao što je http).
|
||
|
||
## Preuzmi sve fajlove sa FTP-a
|
||
```bash
|
||
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š korisnički nalog/lozinka sadrži specijalne karaktere, [sledeća komanda](https://stackoverflow.com/a/113900/13647948) može biti korišćena:
|
||
```bash
|
||
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
|
||
```
|
||
## Neki FTP komandi
|
||
|
||
- **`USER username`**
|
||
- **`PASS password`**
|
||
- **`HELP`** Server označava koji su komandi podržani
|
||
- **`PORT 127,0,0,1,0,80`** Ovo će označiti FTP serveru da uspostavi vezu sa IP 127.0.0.1 na portu 80 (_morate staviti 5. karakter kao "0" i 6. kao port u decimalnom formatu ili koristiti 5. i 6. za izražavanje porta u heksadecimalnom formatu_).
|
||
- **`EPRT |2|127.0.0.1|80|`** Ovo će označiti FTP serveru da uspostavi TCP vezu (_označeno sa "2"_) sa IP 127.0.0.1 na portu 80. Ova komanda **podržava IPv6**.
|
||
- **`LIST`** Ovo će poslati listu fajlova u trenutnom folderu
|
||
- **`LIST -R`** Lista rekurzivno (ako je dozvoljeno od strane servera)
|
||
- **`APPE /path/something.txt`** Ovo će označiti FTP da sačuva podatke primljene iz **pasivne** veze ili iz **PORT/EPRT** veze u fajl. Ako ime fajla postoji, podaci će se dodati.
|
||
- **`STOR /path/something.txt`** Kao `APPE` ali će prepisati fajlove
|
||
- **`STOU /path/something.txt`** Kao `APPE`, ali ako postoji, neće uraditi ništa.
|
||
- **`RETR /path/to/file`** Mora se uspostaviti pasivna ili port veza. Tada će FTP server poslati označeni fajl kroz tu vezu
|
||
- **`REST 6`** Ovo će označiti serveru da sledeći put kada pošalje nešto koristeći `RETR` treba da počne od 6. bajta.
|
||
- **`TYPE i`** Postavi prenos na binarni
|
||
- **`PASV`** Ovo će otvoriti pasivnu vezu i označiti korisniku gde može da se poveže
|
||
- **`PUT /tmp/file.txt`** Učitaj označeni fajl na FTP
|
||
|
||
.png>)
|
||
|
||
## FTPBounce napad
|
||
|
||
Neki FTP serveri dozvoljavaju komandu PORT. Ova komanda se može koristiti da se serveru označi da želite da se povežete na drugi FTP server na nekom portu. Tada možete koristiti ovo da skenirate koji portovi na hostu su otvoreni preko FTP servera.
|
||
|
||
[**Saznajte ovde kako da zloupotrebite FTP server za skeniranje portova.**](ftp-bounce-attack.md)
|
||
|
||
Takođe možete zloupotrebiti ovo ponašanje da naterate FTP server da komunicira sa drugim protokolima. Možete **učitati fajl koji sadrži HTTP zahtev** i naterati ranjivi FTP server da **pošalje na proizvoljni HTTP server** (_možda da dodate novog admin korisnika?_) ili čak učitati FTP zahtev i naterati ranjivi FTP server da preuzme fajl sa drugog FTP servera.\
|
||
Teorija je jednostavna:
|
||
|
||
1. **Učitajte zahtev (unutar tekstualnog fajla) na ranjivi server.** Zapamtite da ako želite da komunicirate sa drugim HTTP ili FTP serverom morate promeniti linije sa `0x0d 0x0a`
|
||
2. **Koristite `REST X` da izbegnete slanje karaktera koje ne želite da pošaljete** (možda da biste učitali zahtev unutar fajla morali ste da stavite neki zaglavlje slike na početku)
|
||
3. **Koristite `PORT` da se povežete na proizvoljni server i uslugu**
|
||
4. **Koristite `RETR` da pošaljete sačuvani zahtev serveru.**
|
||
|
||
Veoma je verovatno da će ovo **izbaciti grešku kao** _**Socket not writable**_ **jer veza ne traje dovoljno dugo da pošalje podatke sa `RETR`**. Predlozi da pokušate da izbegnete to su:
|
||
|
||
- Ako šaljete HTTP zahtev, **stavite isti zahtev jedan za drugim** dok ne dobijete **\~0.5MB** barem. Ovako:
|
||
|
||
{{#file}}
|
||
posts.txt
|
||
{{#endfile}}
|
||
|
||
- Pokušajte da **napunite zahtev sa "junk" podacima vezanim za protokol** (govoreći o FTP-u možda samo junk komande ili ponavljajući `RETR` instrukciju da dobijete fajl)
|
||
- Samo **napunite zahtev sa puno null karaktera ili drugih** (podeljenih na linije ili ne)
|
||
|
||
U svakom slučaju, ovde imate [stari primer o tome kako zloupotrebiti ovo da naterate FTP server da preuzme fajl sa drugog FTP servera.](ftp-bounce-download-2oftp-file.md)
|
||
|
||
## Filezilla Server Ranjivost
|
||
|
||
**FileZilla** obično **vezuje** na **lokalno** **Administrativnu uslugu** za **FileZilla-Server** (port 14147). Ako možete da kreirate **tunel** sa **vašeg računara** da pristupite ovom portu, možete **povezati** na **njega** koristeći **praznu lozinku** i **kreirati** **novog korisnika** za FTP uslugu.
|
||
|
||
## Konfiguracione datoteke
|
||
```
|
||
ftpusers
|
||
ftp.conf
|
||
proftpd.conf
|
||
vsftpd.conf
|
||
```
|
||
### Post-Exploitation
|
||
|
||
Podrazumevana konfiguracija vsFTPd može se naći u `/etc/vsftpd.conf`. Ovde možete pronaći neke opasne postavke:
|
||
|
||
- `anonymous_enable=YES`
|
||
- `anon_upload_enable=YES`
|
||
- `anon_mkdir_write_enable=YES`
|
||
- `anon_root=/home/username/ftp` - Direktorijum za anonimne korisnike.
|
||
- `chown_uploads=YES` - Promeni vlasništvo nad anonimno otpremljenim datotekama
|
||
- `chown_username=username` - Korisnik koji dobija vlasništvo nad anonimno otpremljenim datotekama
|
||
- `local_enable=YES` - Omogući lokalnim korisnicima da se prijave
|
||
- `no_anon_password=YES` - Ne traži lozinku od anonimnih korisnika
|
||
- `write_enable=YES` - Dozvoli 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'
|
||
```
|
||
{{#include ../../banners/hacktricks-training.md}}
|