mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-11 22:03:10 +00:00
296 lines
15 KiB
Markdown
296 lines
15 KiB
Markdown
# 21 - Testowanie penetracyjne FTP
|
|
|
|
<details>
|
|
|
|
<summary><strong>Nauka hakowania AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
* Czy pracujesz w **firmie z branży cyberbezpieczeństwa**? Chcesz zobaczyć, jak Twoja **firma jest reklamowana na HackTricks**? lub chcesz mieć dostęp do **najnowszej wersji PEASS lub pobrać HackTricks w formacie PDF**? Sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
|
|
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
|
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Dołącz do** [**💬**](https://emojipedia.org/speech-balloon/) [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** mnie na **Twitterze** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**repozytorium hacktricks**](https://github.com/carlospolop/hacktricks) **i** [**repozytorium hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|
|
|
|
**Grupa Try Hard Security**
|
|
|
|
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
|
|
|
{% embed url="https://discord.gg/tryhardsecurity" %}
|
|
|
|
***
|
|
|
|
## Podstawowe informacje
|
|
|
|
**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ół tekstowy**, który używa jako **znaku nowej linii `0x0d 0x0a`**, dlatego czasami musisz **połączyć się za pomocą `telnet`** lub **`nc -C`**.
|
|
|
|
**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.
|
|
|
|
Jednak jeśli klient FTP ma ustawiony firewall kontrolujący przychodzące połączenia danych z zewnątrz, aktywny FTP może stanowić problem. Rozwiązaniem tego problemu jest pasywny FTP.
|
|
|
|
W **Pasywnym FTP** klient inicjuje połączenie kontrolne z portu N do portu 21 serwera FTP. Następnie klient wysyła polecenie **passv**. Serwer następnie wysyła klientowi jeden ze swoich numerów portu M. Klient następnie **inicjuje** połączenie danych z **jego portu P do portu M** serwera FTP.
|
|
|
|
Źródło: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
|
|
|
|
### Debugowanie połączenia
|
|
|
|
Polecenia **FTP** **`debug`** i **`trace`** mogą być używane do zobaczenia, **jak zachodzi komunikacja**.
|
|
|
|
## Wyliczanie
|
|
|
|
### Pobieranie banera
|
|
```bash
|
|
nc -vn <IP> 21
|
|
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
|
|
```
|
|
### Połączenie z FTP za pomocą 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
|
|
```
|
|
### Nieautoryzowane wyliczanie
|
|
|
|
Z użyciem **nmap**
|
|
```bash
|
|
sudo nmap -sV -p21 -sC -A 10.10.10.10
|
|
```
|
|
Możesz użyć poleceń `HELP` i `FEAT`, aby uzyskać informacje o serwerze 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...)
|
|
```
|
|
### Logowanie anonimowe
|
|
|
|
_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
|
|
```
|
|
### [Atak siłowy](../../generic-methodologies-and-resources/brute-force.md#ftp)
|
|
|
|
Tutaj znajdziesz fajną listę domyślnych poświadczeń 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)
|
|
|
|
### Zautomatyzowane
|
|
|
|
Anonimowe logowanie i testy odbicia FTP są domyślnie wykonywane przez nmap z opcją **-sC** lub:
|
|
```bash
|
|
nmap --script ftp-* -p 21 <ip>
|
|
```
|
|
## Połączenie przeglądarki
|
|
|
|
Możesz połączyć się z serwerem FTP za pomocą przeglądarki (np. Firefox) za pomocą adresu URL:
|
|
```bash
|
|
ftp://anonymous:anonymous@10.10.10.98
|
|
```
|
|
Zauważ, że jeśli **aplikacja internetowa** 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`) bajtów i sprawić, że **serwer FTP wykona dowolne akcje**. Jedną z 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 tekście oczyszczonym (np. http).
|
|
|
|
## 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 twój użytkownik/hasło zawiera znaki specjalne, można użyć [następującej komendy](https://stackoverflow.com/a/113900/13647948):
|
|
```bash
|
|
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
|
|
```
|
|
## Kilka poleceń FTP
|
|
|
|
* **`USER nazwa_użytkownika`**
|
|
* **`PASS hasło`**
|
|
* **`HELP`** Serwer wskazuje, które polecenia są obsługiwane
|
|
* \*\*`PORT 127,0,0,1,0,80`\*\*To spowoduje, że serwer FTP nawiąże połączenie z adresem IP 127.0.0.1 na porcie 80 (_musisz ustawić 5. znak jako "0" i 6. jako numer portu w systemie dziesiętnym lub użyć 5. i 6. znaku, aby wyrazić port w systemie szesnastkowym_).
|
|
* \*\*`EPRT |2|127.0.0.1|80|`\*\*Spowoduje to, że serwer FTP nawiąże połączenie TCP (_oznaczone jako "2"_) z adresem IP 127.0.0.1 na porcie 80. To polecenie **obsługuje IPv6**.
|
|
* **`LIST`** Wyśle listę plików w bieżącym katalogu
|
|
* **`LIST -R`** Lista plików rekursywnie (jeśli serwer zezwala)
|
|
* **`APPE /ścieżka/coś.txt`** Spowoduje, że FTP zapisze otrzymane dane z połączenia **pasywnego** lub z połączenia **PORT/EPRT** do pliku. Jeśli nazwa pliku istnieje, dane zostaną do niego dołączone.
|
|
* **`STOR /ścieżka/coś.txt`** Podobne do `APPE`, ale nadpisze pliki
|
|
* **`STOU /ścieżka/coś.txt`** Podobne do `APPE`, ale jeśli plik istnieje, nie zrobi nic.
|
|
* **`RETR /ścieżka/do/pliku`** Należy nawiązać połączenie pasywne lub portowe. Następnie serwer FTP wyśle wskazany plik przez to połączenie
|
|
* **`REST 6`** Spowoduje, że serwer następnym razem, gdy wyśle coś za pomocą `RETR`, rozpocznie od 6. bajtu.
|
|
* **`TYPE i`** Ustawia transfer na binarny
|
|
* **`PASV`** Otwiera połączenie pasywne i wskaże użytkownikowi, gdzie może się połączyć
|
|
* **`PUT /tmp/plik.txt`** Wysyła wskazany plik na serwer FTP
|
|
|
|
![](<../../.gitbook/assets/image (227).png>)
|
|
|
|
## Atak FTPBounce
|
|
|
|
Niektóre serwery FTP pozwalają na użycie polecenia PORT. To polecenie można wykorzystać, aby wskazać serwerowi, że chcesz połączyć się z innym serwerem FTP na określonym porcie. Następnie można użyć tego do skanowania otwartych portów hosta za pośrednictwem serwera FTP.
|
|
|
|
[**Dowiedz się tutaj, jak wykorzystać serwer FTP do skanowania portów.**](ftp-bounce-attack.md)
|
|
|
|
Można również wykorzystać to zachowanie, aby sprawić, że serwer FTP będzie współpracował z innymi protokołami. Można **przesłać plik zawierający żądanie HTTP** i sprawić, że podatny serwer FTP **wyśle je do dowolnego serwera HTTP** (_może to umożliwić dodanie nowego użytkownika admina?_) lub nawet przesłać żądanie FTP i sprawić, że podatny serwer FTP pobierze plik z innego serwera FTP.\
|
|
Teoria jest prosta:
|
|
|
|
1. **Prześlij żądanie (w pliku tekstowym) na podatny serwer.** Pamiętaj, że jeśli chcesz porozmawiać 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 wysłać** (może być konieczne dodanie nagłówka obrazu na początku, aby przesłać żądanie w pliku)
|
|
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.**
|
|
|
|
Prawdopodobnie pojawi się błąd jak **_Socket not writable_**, ponieważ połączenie nie trwa wystarczająco długo, aby wysłać dane za pomocą `RETR`. Sugerowane sposoby próby uniknięcia tego to:
|
|
|
|
* Jeśli wysyłasz żądanie HTTP, **wysyłaj to samo żądanie jeden po drugim** do przynajmniej **\~0,5 MB**. Na przykład:
|
|
|
|
{% file src="../../.gitbook/assets/posts (1).txt" %}
|
|
posts.txt
|
|
{% endfile %}
|
|
|
|
* Spróbuj **wypełnić żądanie "śmieciami" związanymi z protokołem** (np. w przypadku FTP może to być polecenia "śmieciowe" lub powtarzanie instrukcji `RETR` do pobrania pliku)
|
|
* Po prostu **wypełnij żądanie dużą ilością znaków null lub innych** (podzielonych na linie lub nie)
|
|
|
|
W każdym razie, tutaj masz [stare przykłady, jak wykorzystać to, aby sprawić, że serwer FTP pobierze plik z innego serwera FTP.](ftp-bounce-download-2oftp-file.md)
|
|
|
|
## Luka w zabezpieczeniach serwera Filezilla
|
|
|
|
**FileZilla** zazwyczaj **łączy się** z **usługą administracyjną** dla **FileZilla-Server** (port 14147). Jeśli możesz utworzyć **tunel** z **twojego urządzenia** do dostępu do tego portu, możesz się do **niego podłączyć** używając **pustego hasła** i **utworzyć** nowego użytkownika dla usługi FTP.
|
|
|
|
## Pliki konfiguracyjne
|
|
```
|
|
ftpusers
|
|
ftp.conf
|
|
proftpd.conf
|
|
vsftpd.conf
|
|
```
|
|
### Post-Exploitation
|
|
|
|
Domyślna konfiguracja vsFTPd można znaleźć w `/etc/vsftpd.conf`. Tutaj można znaleźć niektóre niebezpieczne ustawienia:
|
|
|
|
* `anonymous_enable=YES`
|
|
* `anon_upload_enable=YES`
|
|
* `anon_mkdir_write_enable=YES`
|
|
* `anon_root=/home/username/ftp` - Katalog dla anonimowych.
|
|
* `chown_uploads=YES` - Zmiana właściciela anonimowo przesłanych plików
|
|
* `chown_username=username` - Użytkownik, który otrzymuje właściciela anonimowo przesłanych plików
|
|
* `local_enable=YES` - Włącz logowanie lokalnych użytkowników
|
|
* `no_anon_password=YES` - Nie pytaj anonimowego o hasło
|
|
* `write_enable=YES` - Pozwól na polecenia: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE, i SITE
|
|
|
|
### Shodan
|
|
|
|
* `ftp`
|
|
* `port:21`
|
|
|
|
***
|
|
|
|
**Try Hard Security Group**
|
|
|
|
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
|
|
|
{% 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'
|
|
```
|
|
<details>
|
|
|
|
<summary><strong>Nauka hakowania AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
* Czy pracujesz w **firmie z branży cyberbezpieczeństwa**? Chcesz zobaczyć swoją **firmę reklamowaną na HackTricks**? lub chcesz mieć dostęp do **najnowszej wersji PEASS lub pobrać HackTricks w formacie PDF**? Sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
|
|
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
|
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Dołącz do** [**💬**](https://emojipedia.org/speech-balloon/) [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** mnie na **Twitterze** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**repozytorium hacktricks**](https://github.com/carlospolop/hacktricks) **i** [**repozytorium hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|