hacktricks/network-services-pentesting/pentesting-ftp/README.md

286 lines
14 KiB
Markdown
Raw Normal View History

# 21 - Pentesting FTP
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
<summary>Support HackTricks</summary>
2022-04-28 16:01:33 +00:00
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
## Podstawowe informacje
2024-02-11 01:46:25 +00:00
**Protokół transferu plików (FTP)** służy jako standardowy protokół do transferu plików w sieci komputerowej między serwerem a klientem.\
Jest to **protokół w formacie tekstowym**, który używa jako **znaku nowej linii `0x0d 0x0a`**, więc czasami musisz **połączyć się używając `telnet`** lub **`nc -C`**.
2024-02-11 01:46:25 +00:00
**Domyślny port:** 21
```
PORT STATE SERVICE
21/tcp open ftp
```
### Połączenia Aktywne i Pasywne
W **Aktywnym FTP** klient FTP najpierw **inicjuje** połączenie kontrolne z portu N do portu komend serwera FTP port 21. Klient następnie **nasłuchuje** na porcie **N+1** i wysyła port N+1 do serwera FTP. Serwer FTP następnie **inicjuje** połączenie danych, z **jego portu M do portu N+1** klienta FTP.
2022-10-02 18:09:01 +00:00
Jednak, jeśli klient FTP ma skonfigurowany zaporę, która kontroluje przychodzące połączenia danych z zewnątrz, to aktywne FTP może stanowić problem. A wykonalnym rozwiązaniem jest Pasywne FTP.
2022-10-02 18:09:01 +00:00
W **Pasywnym FTP**, klient inicjuje połączenie kontrolne z portu N do portu 21 serwera FTP. Po tym, klient wydaje **komendę passv**. Serwer następnie wysyła klientowi jeden ze swoich numerów portu M. A **klient** **inicjuje** połączenie **danych** z **jego portu P do portu M** serwera FTP.
2022-10-02 18:09:01 +00:00
2024-02-11 01:46:25 +00:00
Źródło: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
2022-10-02 18:09:01 +00:00
2024-02-11 01:46:25 +00:00
### Debugowanie połączenia
2022-10-02 18:09:01 +00:00
Polecenia **FTP** **`debug`** i **`trace`** mogą być używane do zobaczenia **jak odbywa się komunikacja**.
## Enumeracja
### Przechwytywanie banerów
```bash
2021-03-28 16:47:37 +00:00
nc -vn <IP> 21
2020-09-19 19:49:07 +00:00
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
```
2024-02-11 01:46:25 +00:00
### Połączenie z FTP za pomocą starttls
```
2021-03-25 11:29:43 +00:00
lftp
lftp :~> set ftp:ssl-force true
lftp :~> set ssl:verify-certificate no
lftp :~> connect 10.10.10.208
2024-02-11 01:46:25 +00:00
lftp 10.10.10.208:~> login
2021-03-25 11:29:43 +00:00
Usage: login <user|URL> [<pass>]
lftp 10.10.10.208:~> login username Password
```
### Unauth enum
2021-03-25 11:29:43 +00:00
Z **nmap**
2022-10-02 18:09:01 +00:00
```bash
sudo nmap -sV -p21 -sC -A 10.10.10.10
```
2024-02-11 01:46:25 +00:00
Możesz użyć poleceń `HELP` i `FEAT`, aby uzyskać informacje o serwerze FTP:
```
HELP
214-The following commands are recognized (* =>'s unimplemented):
2024-02-11 01:46:25 +00:00
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
2022-10-02 18:09:01 +00:00
FEAT
211-Features:
2024-02-11 01:46:25 +00:00
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
2022-10-02 18:09:01 +00:00
STAT
#Info about the FTP server (version, configs, status...)
```
2024-02-11 01:46:25 +00:00
### Logowanie anonimowe
_anonymous : anonimowy_\
_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-methodologies-and-resources/brute-force.md#ftp)
Tutaj znajdziesz ładną listę z domyślnymi danymi logowania do ftp: [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
2021-07-06 18:13:26 +00:00
Anonimowe logowanie i sprawdzenie bounce FTP są wykonywane domyślnie przez nmap z opcją **-sC** lub:
2021-07-06 18:13:26 +00:00
```bash
nmap --script ftp-* -p 21 <ip>
```
## Połączenie przez przeglądarkę
Możesz połączyć się z serwerem FTP za pomocą przeglądarki (takiej jak Firefox) używając adresu URL takiego jak:
```bash
ftp://anonymous:anonymous@10.10.10.98
```
Zauważ, że jeśli **aplikacja webowa** wysyła dane kontrolowane przez użytkownika **bezpośrednio do serwera FTP**, możesz wysłać podwójne kodowanie URL `%0d%0a` (w podwójnym kodowaniu URL to `%250d%250a`) i sprawić, że **serwer FTP wykona dowolne akcje**. Jedną z tych możliwych dowolnych akcji jest pobranie zawartości z serwera kontrolowanego przez użytkownika, przeprowadzenie skanowania portów lub próba komunikacji z innymi usługami opartymi na czystym tekście (takimi jak http).
2024-02-11 01:46:25 +00:00
## Pobierz wszystkie pliki z FTP
```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
```
Jeśli twoja nazwa użytkownika/hasło zawiera znaki specjalne, można użyć [następującego polecenia](https://stackoverflow.com/a/113900/13647948):
```bash
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
```
## Niektóre komendy FTP
* **`USER username`**
* **`PASS password`**
* **`HELP`** Serwer wskazuje, które komendy są obsługiwane
* \*\*`PORT 127,0,0,1,0,80`\*\*To wskaże serwerowi FTP nawiązanie połączenia z IP 127.0.0.1 na porcie 80 (_musisz wpisać 5-ty znak jako "0" i 6-ty jako port w systemie dziesiętnym lub użyć 5-tego i 6-tego do wyrażenia portu w systemie szesnastkowym_).
* \*\*`EPRT |2|127.0.0.1|80|`\*\*To wskaże serwerowi FTP nawiązanie połączenia TCP (_wskazane przez "2"_) z IP 127.0.0.1 na porcie 80. Ta komenda **obsługuje IPv6**.
* **`LIST`** To wyśle listę plików w bieżącym folderze
* **`LIST -R`** Lista rekurencyjna (jeśli dozwolone przez serwer)
* **`APPE /path/something.txt`** To wskaże FTP na zapisanie danych otrzymanych z **pasywnego** połączenia lub z połączenia **PORT/EPRT** do pliku. Jeśli nazwa pliku istnieje, dane zostaną dołączone.
* **`STOR /path/something.txt`** Jak `APPE`, ale nadpisze pliki
* **`STOU /path/something.txt`** Jak `APPE`, ale jeśli istnieje, nie zrobi nic.
* **`RETR /path/to/file`** Musi być nawiązane pasywne lub portowe połączenie. Następnie serwer FTP wyśle wskazany plik przez to połączenie
* **`REST 6`** To wskaże serwerowi, że następnym razem, gdy wyśle coś używając `RETR`, powinien zacząć od 6. bajtu.
* **`TYPE i`** Ustaw transfer na binarny
* **`PASV`** To otworzy pasywne połączenie i wskaże użytkownikowi, gdzie może się połączyć
* **`PUT /tmp/file.txt`** Prześlij wskazany plik do FTP
![](<../../.gitbook/assets/image (386).png>)
2024-02-11 01:46:25 +00:00
## Atak FTPBounce
Niektóre serwery FTP pozwalają na komendę PORT. Ta komenda może być użyta do wskazania serwerowi, że chcesz połączyć się z innym serwerem FTP na pewnym porcie. Następnie możesz użyć tego do skanowania, które porty hosta są otwarte przez serwer FTP.
[**Dowiedz się tutaj, jak nadużyć serwera FTP do skanowania portów.**](ftp-bounce-attack.md)
Możesz również nadużyć tego zachowania, aby sprawić, że serwer FTP będzie współdziałał z innymi protokołami. Możesz **przesłać plik zawierający żądanie HTTP** i sprawić, by podatny serwer FTP **wysłał je do dowolnego serwera HTTP** (_może, aby dodać nowego użytkownika admina?_) lub nawet przesłać żądanie FTP i sprawić, by podatny serwer FTP pobrał plik z innego serwera FTP.\
2024-02-11 01:46:25 +00:00
Teoria jest prosta:
1. **Prześlij żądanie (w pliku tekstowym) do podatnego serwera.** Pamiętaj, że jeśli chcesz rozmawiać z innym serwerem HTTP lub FTP, musisz zmienić linie na `0x0d 0x0a`
2. **Użyj `REST X`, aby uniknąć wysyłania znaków, których nie chcesz wysyłać** (może, aby przesłać żądanie w pliku, musiałeś dodać nagłówek obrazu na początku)
2024-02-11 01:46:25 +00:00
3. **Użyj `PORT`, aby połączyć się z dowolnym serwerem i usługą**
4. **Użyj `RETR`, aby wysłać zapisane żądanie do serwera.**
Jest bardzo prawdopodobne, że **spowoduje to błąd taki jak** _**Socket not writable**_ **ponieważ połączenie nie trwa wystarczająco długo, aby wysłać dane za pomocą `RETR`**. Sugestie, aby spróbować tego uniknąć, to:
* Jeśli wysyłasz żądanie HTTP, **umieść to samo żądanie jedno po drugim** aż do **\~0.5MB** przynajmniej. Tak jak to:
{% file src="../../.gitbook/assets/posts.txt" %}
posts.txt
{% endfile %}
* Spróbuj **wypełnić żądanie "śmieciowymi" danymi związanymi z protokołem** (rozmawiając z FTP, może po prostu śmieciowe komendy lub powtarzając instrukcję `RETR`, aby uzyskać plik)
2024-02-11 01:46:25 +00:00
* Po prostu **wypełnij żądanie dużą ilością znaków null lub innych** (podzielonych na linie lub nie)
W każdym razie, oto [stary przykład, jak nadużyć tego, aby sprawić, że serwer FTP pobierze plik z innego serwera FTP.](ftp-bounce-download-2oftp-file.md)
## Wrażliwość serwera Filezilla
**FileZilla** zazwyczaj **wiąże** się z **lokalnym** **serwisem administracyjnym** dla **FileZilla-Server** (port 14147). Jeśli możesz stworzyć **tunel** z **twojej maszyny** do dostępu do tego portu, możesz **połączyć się** z **nim** używając **pustego hasła** i **utworzyć** **nowego użytkownika** dla usługi FTP.
2024-02-11 01:46:25 +00:00
## Pliki konfiguracyjne
```
ftpusers
ftp.conf
proftpd.conf
2022-10-02 21:20:06 +00:00
vsftpd.conf
```
### Post-Exploitation
2022-10-02 21:20:06 +00:00
Domyślna konfiguracja vsFTPd znajduje się w `/etc/vsftpd.conf`. Możesz tutaj znaleźć niebezpieczne ustawienia:
2022-10-02 21:20:06 +00:00
* `anonymous_enable=YES`
* `anon_upload_enable=YES`
* `anon_mkdir_write_enable=YES`
* `anon_root=/home/username/ftp` - Katalog dla anonimowych.
* `chown_uploads=YES` - Zmień właściciela anonimowo przesłanych plików
* `chown_username=username` - Użytkownik, który otrzymuje własność anonimowo przesłanych plików
* `local_enable=YES` - Zezwól lokalnym użytkownikom na logowanie
* `no_anon_password=YES` - Nie pytaj anonimowych o hasło
* `write_enable=YES` - Zezwól na polecenia: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE i SITE
2022-10-02 21:20:06 +00:00
### Shodan
* `ftp`
* `port:21`
## HackTricks Automatic Commands
```
2021-08-12 13:00:24 +00:00
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
2021-08-15 17:23:50 +00:00
Entry_1:
2024-02-11 01:46:25 +00:00
Name: Notes
Description: Notes for FTP
Note: |
Anonymous Login
-bi <<< so that your put is done via binary
2021-08-15 17:23:50 +00:00
2024-02-11 01:46:25 +00:00
wget --mirror 'ftp://ftp_user:UTDRSCH53c"$6hys@10.10.10.59'
^^to download all dirs and files
2021-08-15 17:23:50 +00:00
2024-02-11 01:46:25 +00:00
wget --no-passive-ftp --mirror 'ftp://anonymous:anonymous@10.10.10.98'
if PASV transfer is disabled
2021-08-15 17:23:50 +00:00
2024-02-11 01:46:25 +00:00
https://book.hacktricks.xyz/pentesting/pentesting-ftp
2021-08-15 17:23:50 +00:00
Entry_2:
2024-02-11 01:46:25 +00:00
Name: Banner Grab
Description: Grab FTP Banner via telnet
Command: telnet -n {IP} 21
2021-08-15 17:23:50 +00:00
Entry_3:
2024-02-11 01:46:25 +00:00
Name: Cert Grab
Description: Grab FTP Certificate if existing
Command: openssl s_client -connect {IP}:21 -starttls ftp
2021-08-15 17:23:50 +00:00
Entry_4:
2024-02-11 01:46:25 +00:00
Name: nmap ftp
Description: Anon login and bounce FTP checks are performed
Command: nmap --script ftp-* -p 21 {IP}
2021-08-15 17:23:50 +00:00
Entry_5:
2024-02-11 01:46:25 +00:00
Name: Browser Connection
Description: Connect with Browser
Note: ftp://anonymous:anonymous@{IP}
2021-09-13 15:27:07 +00:00
Entry_6:
2024-02-11 01:46:25 +00:00
Name: Hydra Brute Force
Description: Need Username
Command: hydra -t 1 -l {Username} -P {Big_Passwordlist} -vV {IP} ftp
Entry_7:
2024-02-11 01:46:25 +00:00
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'
2021-08-12 13:00:24 +00:00
```
{% hint style="success" %}
Ucz się i ćwicz Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Ucz się i ćwicz Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
<summary>Wsparcie HackTricks</summary>
2022-04-28 16:01:33 +00:00
* Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)!
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Dziel się trikami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów github.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}