hacktricks/network-services-pentesting/pentesting-ftp
2024-08-04 15:18:23 +00:00
..
ftp-bounce-attack.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 11:39:33 +00:00
ftp-bounce-download-2oftp-file.md Translated ['network-services-pentesting/512-pentesting-rexec.md', 'netw 2024-08-04 15:18:23 +00:00
README.md Translated ['binary-exploitation/basic-stack-binary-exploitation-methodo 2024-07-18 22:19:01 +00:00

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 %}

Try Hard Security Group

{% embed url="https://discord.gg/tryhardsecurity" %}


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 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 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 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 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 : anonyme
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 par 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ées
  • **PORT 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 actuel
  • LIST -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 Comme APPE mais il écrasera les fichiers
  • STOU /path/something.txt Comme APPE, mais s'il 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 connexion
  • REST 6 Cela indiquera au serveur que la prochaine fois qu'il enverra quelque chose en utilisant RETR, il devrait commencer au 6ème octet.
  • TYPE i Définir le transfert en binaire
  • PASV Cela ouvrira une connexion passive et indiquera à l'utilisateur où il peut se connecter
  • PUT /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 :

  1. 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
  2. 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)
  3. Utilisez PORT pour vous connecter au serveur et au service arbitraires
  4. 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 :

{% file src="../../.gitbook/assets/posts.txt" %} posts.txt {% endfile %}

  • 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 remplissez 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 localement un service administratif pour le FileZilla-Server (port 14147). 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 quelques 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 anonymement
  • chown_username=username - Utilisateur à qui la propriété des fichiers téléchargés anonymement est attribuée
  • local_enable=YES - Activer les utilisateurs locaux à se connecter
  • no_anon_password=YES - Ne pas demander de mot de passe aux utilisateurs anonymes
  • write_enable=YES - Autoriser les commandes : STOR, DELE, RNFR, RNTO, MKD, RMD, APPE, et SITE

Shodan

  • ftp
  • port:21

Try Hard Security Group

{% embed url="https://discord.gg/tryhardsecurity" %}


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" %} Apprenez et pratiquez le hacking AWS :HackTricks Formation Expert Red Team AWS (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Formation Expert Red Team GCP (GRTE)

Soutenir HackTricks
{% endhint %}