21 - Pentesting FTP
Reading time: 11 minutes
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
Informations de base
Le File Transfer Protocol (FTP) sert de protocole standard pour le transfert de fichiers à travers un réseau informatique entre un serveur et un client.
C'est un protocole en texte clair qui utilise comme caractĂšre de nouvelle ligne 0x0d 0x0a
donc parfois vous devez vous connecter en utilisant telnet
ou nc -C
.
Port par défaut : 21
PORT STATE SERVICE
21/tcp open ftp
Connexions Actives & Passives
Dans FTP Actif, le client FTP initie d'abord la connexion de contrĂŽle depuis son port N vers le port de commande du serveur FTP â le port 21. Le client Ă©coute ensuite le port N+1 et envoie le port N+1 au serveur FTP. Le serveur FTP initie alors la connexion de donnĂ©es, depuis son port M vers le port N+1 du client FTP.
Cependant, si le client FTP a un pare-feu configuré qui contrÎle les connexions de données entrantes de l'extérieur, alors le FTP actif peut poser problÚme. Une solution envisageable à cela est le FTP Passif.
Dans FTP Passif, le client initie la connexion de contrÎle depuis son port N vers le port 21 du serveur FTP. AprÚs cela, le client émet une commande passv. Le serveur envoie alors au client l'un de ses numéros de port M. Et le client initie la connexion de données depuis son port P vers le port M du serveur FTP.
Source: https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/
Débogage de connexion
Les commandes FTP debug
et trace
peuvent ĂȘtre utilisĂ©es pour voir comment la communication se dĂ©roule.
ĂnumĂ©ration
Récupération de banniÚre
nc -vn <IP> 21
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
Se connecter Ă FTP en utilisant 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
Avec nmap
sudo nmap -sV -p21 -sC -A 10.10.10.10
Vous pouvez utiliser les commandes HELP
et FEAT
pour obtenir des informations sur le serveur 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...)
Connexion anonyme
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
Ici, vous pouvez trouver une belle liste avec des identifiants FTP par défaut : https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt
Automatisé
Les connexions anonymes et les vérifications de rebond FTP sont effectuées par défaut par nmap avec l'option -sC ou :
nmap --script ftp-* -p 21 <ip>
Connexion au navigateur
Vous pouvez vous connecter Ă un serveur FTP en utilisant un navigateur (comme Firefox) avec une URL comme :
ftp://anonymous:anonymous@10.10.10.98
Notez que si une application web envoie des données contrÎlées par un utilisateur directement à un serveur FTP, vous pouvez envoyer des octets doublement encodés en URL %0d%0a
(dans un double encodage URL, c'est %250d%250a
) et faire en sorte que le serveur FTP effectue des actions arbitraires. L'une de ces actions arbitraires possibles est de télécharger du contenu depuis un serveur contrÎlé par un utilisateur, d'effectuer un scan de ports ou d'essayer de communiquer avec d'autres services basés sur du texte en clair (comme http).
Télécharger tous les fichiers depuis 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
Si votre nom d'utilisateur/mot de passe contient des caractĂšres spĂ©ciaux, la commande suivante peut ĂȘtre utilisĂ©e :
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
Quelques commandes FTP
USER username
PASS password
HELP
Le serveur indique quelles commandes sont supportéesPORT 127,0,0,1,0,80
Cela indiquera au serveur FTP d'établir une connexion avec l'IP 127.0.0.1 sur le port 80 (vous devez mettre le 5Úme caractÚre comme "0" et le 6Úme comme le port en décimal ou utiliser le 5Úme et 6Úme pour exprimer le port en hex).EPRT |2|127.0.0.1|80|
Cela indiquera au serveur FTP d'établir une connexion TCP (indiquée par "2") avec l'IP 127.0.0.1 sur le port 80. Cette commande supporte IPv6.LIST
Cela enverra la liste des fichiers dans le dossier actuelLIST -R
Liste récursive (si autorisé par le serveur)APPE /path/something.txt
Cela indiquera au FTP de stocker les données reçues d'une connexion passive ou d'une connexion PORT/EPRT dans un fichier. Si le nom de fichier existe, il ajoutera les données.STOR /path/something.txt
CommeAPPE
mais cela écrasera les fichiersSTOU /path/something.txt
CommeAPPE
, mais si le fichier existe, il ne fera rien.RETR /path/to/file
Une connexion passive ou une connexion port doit ĂȘtre Ă©tablie. Ensuite, le serveur FTP enverra le fichier indiquĂ© via cette connexionREST 6
Cela indiquera au serveur que la prochaine fois qu'il enverra quelque chose en utilisantRETR
, il devrait commencer au 6Ăšme octet.TYPE i
Définir le transfert en binairePASV
Cela ouvrira une connexion passive et indiquera Ă l'utilisateur oĂč il peut se connecterPUT /tmp/file.txt
Télécharger le fichier indiqué sur le FTP
Attaque FTPBounce
Certains serveurs FTP permettent la commande PORT. Cette commande peut ĂȘtre utilisĂ©e pour indiquer au serveur que vous souhaitez vous connecter Ă un autre serveur FTP Ă un certain port. Ensuite, vous pouvez l'utiliser pour scanner quels ports d'un hĂŽte sont ouverts via un serveur FTP.
Apprenez ici comment abuser d'un serveur FTP pour scanner des ports.
Vous pourriez Ă©galement abuser de ce comportement pour faire interagir un serveur FTP avec d'autres protocoles. Vous pourriez tĂ©lĂ©charger un fichier contenant une requĂȘte HTTP et faire en sorte que le serveur FTP vulnĂ©rable l'envoie Ă un serveur HTTP arbitraire (peut-ĂȘtre pour ajouter un nouvel utilisateur admin ?) ou mĂȘme tĂ©lĂ©charger une requĂȘte FTP et faire en sorte que le serveur FTP vulnĂ©rable tĂ©lĂ©charge un fichier d'un autre serveur FTP.
La théorie est simple :
- TĂ©lĂ©chargez la requĂȘte (dans un fichier texte) sur le serveur vulnĂ©rable. N'oubliez pas que si vous souhaitez communiquer avec un autre serveur HTTP ou FTP, vous devez changer les lignes avec
0x0d 0x0a
- Utilisez
REST X
pour Ă©viter d'envoyer les caractĂšres que vous ne souhaitez pas envoyer (peut-ĂȘtre pour tĂ©lĂ©charger la requĂȘte Ă l'intĂ©rieur du fichier, vous deviez mettre un en-tĂȘte d'image au dĂ©but) - Utilisez
PORT
pour vous connecter au serveur et au service arbitraires - Utilisez
RETR
pour envoyer la requĂȘte sauvegardĂ©e au serveur.
Il est trÚs probable que cela provoque une erreur comme Socket not writable car la connexion ne dure pas assez longtemps pour envoyer les données avec RETR
. Des suggestions pour essayer d'éviter cela sont :
- Si vous envoyez une requĂȘte HTTP, mettez la mĂȘme requĂȘte l'une aprĂšs l'autre jusqu'Ă ~0.5MB au moins. Comme ceci :
- Essayez de remplir la requĂȘte avec des donnĂ©es "junk" relatives au protocole (en parlant Ă FTP, peut-ĂȘtre juste des commandes junk ou rĂ©pĂ©ter l'instruction
RETR
pour obtenir le fichier) - Juste remplir la requĂȘte avec beaucoup de caractĂšres nuls ou autres (divisĂ©s sur des lignes ou non)
Quoi qu'il en soit, voici un ancien exemple sur la façon d'abuser de cela pour faire télécharger un fichier d'un autre serveur FTP.
Vulnérabilité du serveur Filezilla
FileZilla lie généralement un service administratif pour le FileZilla-Server (port 14147) à local. Si vous pouvez créer un tunnel depuis votre machine pour accéder à ce port, vous pouvez vous connecter à celui-ci en utilisant un mot de passe vide et créer un nouvel utilisateur pour le service FTP.
Fichiers de configuration
ftpusers
ftp.conf
proftpd.conf
vsftpd.conf
Post-Exploitation
La configuration par dĂ©faut de vsFTPd peut ĂȘtre trouvĂ©e dans /etc/vsftpd.conf
. Ici, vous pourriez trouver certains paramĂštres dangereux :
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_root=/home/username/ftp
- Répertoire pour les utilisateurs anonymes.chown_uploads=YES
- Changer la propriété des fichiers téléchargés anonymementchown_username=username
- Utilisateur à qui la propriété des fichiers téléchargés anonymement est attribuéelocal_enable=YES
- Activer la connexion des utilisateurs locauxno_anon_password=YES
- Ne pas demander de mot de passe aux utilisateurs anonymeswrite_enable=YES
- Autoriser les commandes : STOR, DELE, RNFR, RNTO, MKD, RMD, APPE, et 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.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'
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.