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

15 KiB

21 - Testowanie penetracyjne FTP

Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

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 poleceń 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, to 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 wydaje polecenie passv. Serwer następnie wysyła klientowi jeden ze swoich numerów portów 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/

Debugowanie połączenia

Polecenia FTP debug i trace mogą być używane do zobaczenia, jak zachodzi komunikacja.

Wyliczanie

Pobieranie banera

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

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

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 brutalnej siły

Tutaj znajdziesz fajną listę domyślnych poświadczeń ftp: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt

Zautomatyzowane

Testy anonimowego logowania i odbicia FTP są domyślnie wykonywane przez nmap z opcją -sC lub:

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:

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 arbitralne akcje. Jedną z możliwych arbitralnych 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 zwykłym (np. http).

Pobierz wszystkie pliki z 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

Jeśli twój użytkownik/hasło zawiera znaki specjalne, można użyć następującej komendy:

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, że serwer FTP nawiąże połączenie TCP (oznaczone przez "2") z adresem IP 127.0.0.1 na porcie 80. To polecenie obsługuje IPv6.
  • LIST Spowoduje wysłanie listy plików w bieżącym folderze
  • LIST -R Lista 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 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 Spowoduje, że serwer następnym razem, gdy wyśle coś za pomocą RETR, rozpocznie od 6. bajtu.
  • TYPE i Ustawia transfer na binarny
  • PASV Spowoduje otwarcie połączenia pasywnego i wskaże użytkownikowi, gdzie może się połączyć
  • PUT /tmp/plik.txt Wysyła wskazany plik na serwer FTP

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.

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 posłużyć do dodania 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 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.txt" %} posts.txt {% endfile %}

  • Spróbuj wypełnić żądanie "śmieciami" związanymi z protokołem (w przypadku FTP może to być po prostu polecenia "śmieci" 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 stary przykład, jak wykorzystać to, aby sprawić, że serwer FTP pobierze plik z innego serwera FTP.

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źć 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ł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 - Pozwól 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 Automatyczne Polecenia

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'
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!