# 21 - Testowanie penetracyjne FTP
Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)! * Czy pracujesz w **firmie zajmującej się cyberbezpieczeństwem**? 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).
**Grupa Try Hard Security**
{% 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ół **czystego tekstu**, 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 **swojego 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 **swojego 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 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 [] 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 >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 sprawdzanie bounce FTP są domyślnie wykonywane przez nmap z opcją **-sC** lub: ```bash nmap --script ftp-* -p 21 ``` ## 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** przesył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 zwykłym tekście (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 polecenie wskaże serwerowi FTP nawiązanie połączenia 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 do wyrażenia portu w systemie szesnastkowym_). * \*\*`EPRT |2|127.0.0.1|80|`\*\*To polecenie wskaże serwerowi FTP nawiązanie połączenia TCP (_oznaczone przez "2"_) z adresem IP 127.0.0.1 na porcie 80. To polecenie **obsługuje IPv6**. * **`LIST`** To polecenie wyśle listę plików w bieżącym folderze * **`LIST -R`** Lista rekursywnie (jeśli serwer zezwala) * **`APPE /ścieżka/coś.txt`** To polecenie wskaże FTP, aby zapisać otrzymane dane z połączenia **pasywnego** lub z połączenia **PORT/EPRT** do pliku. Jeśli nazwa pliku istnieje, dane zostaną do niego dodane. * **`STOR /ścieżka/coś.txt`** Podobne do `APPE`, ale nadpisze pliki * **`STOU /ścieżka/coś.txt`** Podobne do `APPE`, ale jeśli plik istnieje, nic nie zrobi. * **`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`** To polecenie wskaże serwerowi, że następnym razem, gdy wyśle coś za pomocą `RETR`, powinien zacząć od 6. bajtu. * **`TYPE i`** Ustawia transfer na binarny * **`PASV`** To otworzy połączenie pasywne i wskaże użytkownikowi, gdzie może się połączyć * **`PUT /tmp/plik.txt`** Prześlij wskazany plik na 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, które porty hosta są otwarte 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) do podatnego serwera.** 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 wewnątrz 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.** Bardzo prawdopodobne jest, że **zostanie zgłoszony błąd** _**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 co najmniej **\~0,5 MB**. W ten sposób: {% file src="../../.gitbook/assets/posts (1).txt" %} posts.txt {% endfile %} * Spróbuj **wypełnić żądanie "śmieciami" związanymi z protokołem** (w przypadku rozmowy z FTP może to być po prostu polecenia "śmieci" lub powtarzanie instrukcji `RETR` w celu 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 [stary przykład, 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 komputera**, aby uzyskać dostęp 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źć 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łasność 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` - Pozwala na polecenia: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE i SITE ### Shodan * `ftp` * `port:21` *** **Try Hard Security Group**
{% 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' ```
Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)! * 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).