mirror of
https://github.com/carlospolop/hacktricks
synced 2025-01-20 00:54:52 +00:00
274 lines
15 KiB
Markdown
274 lines
15 KiB
Markdown
# 21 - Pentesting FTP
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
|
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
|
|
|
</details>
|
|
|
|
## Informations de base
|
|
|
|
Le **File Transfer Protocol (FTP)** est un protocole réseau standard utilisé pour le transfert de fichiers informatiques entre un client et un serveur sur un réseau informatique.\
|
|
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 et passives
|
|
|
|
Dans le **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 - port 21. Le **client** écoute ensuite sur 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, le FTP actif peut poser problème. Une solution possible est le FTP passif.
|
|
|
|
Dans le **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 envoie 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/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
|
|
|
|
### Débogage de la connexion
|
|
|
|
Les commandes **`debug`** et **`trace`** du **FTP** peuvent être utilisées pour voir **comment se déroule la communication**.
|
|
|
|
## Énumération
|
|
|
|
### Récupération de la bannière
|
|
```bash
|
|
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
|
|
```
|
|
### Enumération non autorisée
|
|
|
|
Avec **nmap**
|
|
```bash
|
|
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_
|
|
```bash
|
|
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](../../generic-methodologies-and-resources/brute-force.md#ftp)
|
|
|
|
Ici, vous pouvez trouver une belle liste de mots de passe FTP par défaut : [https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt)
|
|
|
|
### Automatisé
|
|
|
|
Les vérifications FTP de connexion anonyme et de rebond sont effectuées par défaut par nmap avec l'option **-sC** ou :
|
|
```bash
|
|
nmap --script ftp-* -p 21 <ip>
|
|
```
|
|
## Connexion du navigateur
|
|
|
|
Vous pouvez vous connecter à un serveur FTP en utilisant un navigateur (comme Firefox) en utilisant une URL comme:
|
|
```bash
|
|
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` (en double encodage URL, cela devient `%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 à partir d'un serveur contrôlé par un utilisateur, d'effectuer une analyse de port 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
|
|
```bash
|
|
wget -m ftp://anonymous:anonymous@10.10.10.98 #Donwload all
|
|
wget -m --no-passive ftp://anonymous:anonymous@10.10.10.98 #Download all
|
|
```
|
|
## Quelques commandes FTP
|
|
|
|
* **`USER nom_utilisateur`**
|
|
* **`PASS mot_de_passe`**
|
|
* **`HELP`** Le serveur indique les commandes 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 en "0" et le 6ème en port décimal ou utiliser le 5ème et le 6ème pour exprimer le port en hexadécimal_).
|
|
* **`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 **prend en charge IPv6**.
|
|
* **`LIST`** Cela enverra la liste des fichiers dans le dossier courant
|
|
* **`LIST -R`** Liste récursivement (si autorisé par le serveur)
|
|
* **`APPE /chemin/quelquechose.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 /chemin/quelquechose.txt`** Comme `APPE` mais il écrasera les fichiers
|
|
* **`STOU /chemin/quelquechose.txt`** Comme `APPE`, mais s'il existe, il ne fera rien.
|
|
* **`RETR /chemin/vers/fichier`** Une connexion passive ou une connexion de 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 doit 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/fichier.txt`** Télécharger le fichier indiqué sur le FTP
|
|
|
|
![](<../../.gitbook/assets/image (227).png>)
|
|
|
|
## Attaque FTPBounce
|
|
|
|
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 certain port. Ensuite, vous pouvez utiliser cela pour scanner les ports d'un hôte via un serveur FTP.
|
|
|
|
[**Apprenez ici comment abuser d'un serveur FTP pour scanner des ports.**](ftp-bounce-attack.md)
|
|
|
|
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 pour un autre serveur FTP.\
|
|
La théorie est facile:
|
|
|
|
1. **Téléchargez la requête (à l'intérieur d'un fichier texte) sur le serveur vulnérable.** N'oubliez pas que si vous voulez parler à 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 voulez pas envoyer** (peut-être pour télécharger la requête à l'intérieur du fichier, vous avez besoin de 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 enregistrée au serveur.**
|
|
|
|
Il est très probable que cela **lance une erreur comme** _**Socket not writable**_ **parce que la connexion ne dure pas assez longtemps pour envoyer les données avec `RETR`**. Les 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,5 Mo** au moins. Comme ceci:
|
|
|
|
{% file src="../../.gitbook/assets/posts (1).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 en répétant l'instruction `RETR` pour obtenir le fichier)
|
|
* Remplissez simplement la requête avec beaucoup de caractères nuls ou autres (divisés en 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 à un serveur FTP à partir d'un autre serveur FTP.](ftp-bounce-download-2oftp-file.md)
|
|
|
|
## Vulnérabilité du serveur Filezilla
|
|
|
|
**FileZilla** se **lie généralement** à un **service administratif local** pour le **serveur FileZilla** (port 14147). Si vous pouvez créer un **tunnel** depuis **votre machine** pour accéder à ce port, vous pouvez **vous connecter** 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 pouvez trouver des 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 reçoit la propriété des fichiers téléchargés anonymement
|
|
* `local_enable=YES` - Autoriser les utilisateurs locaux à se connecter
|
|
* `no_anon_password=YES` - Ne pas demander de mot de passe anonyme
|
|
* `write_enable=YES` - Autoriser les commandes: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE et SITE
|
|
|
|
### Shodan
|
|
|
|
* `ftp`
|
|
* `port:21`
|
|
|
|
## Commandes automatiques HackTricks
|
|
```
|
|
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'
|
|
```
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
|
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) **groupe Discord** ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live).
|
|
* **Partagez vos astuces de piratage en soumettant des PR au [dépôt hacktricks](https://github.com/carlospolop/hacktricks) et au [dépôt hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
|
|
|
</details>
|