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

14 KiB
Raw Blame History

21 - Pentesting FTP

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

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ół 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.

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 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.

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.

Ź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 odbywa się komunikacja.

Enumeracja

Przechwytywanie banerów

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

Unauth enum

Z 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 : anonimowy
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

Brute force

Tutaj znajdziesz ładną listę z domyślnymi danymi logowania do ftp: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt

Automated

Anonimowe logowanie i sprawdzenie bounce FTP są wykonywane domyślnie przez nmap z opcją -sC lub:

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:

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).

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 twoja nazwa użytkownika/hasło zawiera znaki specjalne, można użyć następującego polecenia:

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

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.

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.
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)
  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)
  • 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.

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.

Pliki konfiguracyjne

ftpusers
ftp.conf
proftpd.conf
vsftpd.conf

Post-Exploitation

Domyślna konfiguracja vsFTPd znajduje się w /etc/vsftpd.conf. Możesz tutaj 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 - 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

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.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'

{% hint style="success" %} Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks
{% endhint %}