# 21 - Pentesting FTP
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! * Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com) * **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Compartilhe seus truques de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [repositório hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
Encontre vulnerabilidades que são mais importantes para que você possa corrigi-las mais rapidamente. O Intruder rastreia sua superfície de ataque, executa varreduras proativas de ameaças, encontra problemas em toda a sua pilha de tecnologia, desde APIs até aplicativos da web e sistemas em nuvem. [**Experimente gratuitamente**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoje. {% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %} *** ## Informações Básicas O **Protocolo de Transferência de Arquivos (FTP)** é um protocolo de rede padrão usado para a transferência de arquivos de computador entre um cliente e um servidor em uma rede de computadores.\ É um protocolo de **texto simples** que usa como **caractere de nova linha `0x0d 0x0a`**, então às vezes você precisa **conectar usando `telnet`** ou **`nc -C`**. **Porta Padrão:** 21 ``` PORT STATE SERVICE 21/tcp open ftp ``` ### Conexões Ativas e Passivas No **FTP Ativo**, o **cliente FTP** primeiro **inicia** a **conexão de controle** a partir da sua porta N para a porta de comando do servidor FTP - porta 21. O **cliente** então **escuta** na porta **N+1** e envia a porta N+1 para o servidor FTP. O servidor FTP então **inicia** a **conexão de dados**, da sua porta M para a porta N+1 do cliente FTP. No entanto, se o cliente FTP tiver um firewall configurado que controle as conexões de dados recebidas de fora, o FTP ativo pode ser um problema. E uma solução viável para isso é o FTP passivo. No **FTP Passivo**, o cliente inicia a conexão de controle a partir da sua porta N para a porta 21 do servidor FTP. Após isso, o cliente emite um comando **passv**. O servidor então envia ao cliente um dos seus números de porta M. E o **cliente** **inicia** a **conexão de dados** da sua porta P para a porta M do servidor FTP. Fonte: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/) ### Depuração da Conexão Os comandos **`debug`** e **`trace`** do FTP podem ser usados para ver **como está ocorrendo a comunicação**. ## Enumeração ### Banner Grabbing ```bash nc -vn 21 openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any ``` ### Conectar ao FTP usando starttls O protocolo FTP (File Transfer Protocol) é amplamente utilizado para transferir arquivos entre um cliente e um servidor. No entanto, o FTP não é um protocolo seguro, pois as informações são transmitidas em texto simples, o que pode permitir que um invasor intercepte e leia os dados confidenciais. Para aumentar a segurança da conexão FTP, é possível usar o comando `AUTH TLS` ou `AUTH SSL` para estabelecer uma conexão segura. No entanto, uma abordagem mais moderna é usar o comando `STARTTLS`, que permite que a conexão seja atualizada para uma conexão segura após a negociação inicial. Aqui está um exemplo de como conectar ao FTP usando `STARTTLS`: 1. Abra um terminal e digite o seguinte comando: ```bash ftp ``` 2. Conecte-se ao servidor FTP digitando o seguinte comando: ```bash open ``` 3. Faça o login com suas credenciais de usuário e senha. 4. Após fazer o login, digite o seguinte comando para iniciar a negociação `STARTTLS`: ```bash quote AUTH TLS ``` ou ```bash quote AUTH SSL ``` 5. Se a negociação for bem-sucedida, a conexão será atualizada para uma conexão segura. A partir desse ponto, todas as informações transmitidas entre o cliente e o servidor FTP serão criptografadas, garantindo a confidencialidade dos dados. É importante ressaltar que nem todos os servidores FTP suportam o comando `STARTTLS`. Portanto, verifique se o servidor que você está tentando acessar oferece suporte a essa funcionalidade antes de tentar estabelecer uma conexão segura. ``` 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 [] lftp 10.10.10.208:~> login username Password ``` ### Enumeração não autorizada Com **nmap** ```bash sudo nmap -sV -p21 -sC -A 10.10.10.10 ``` Você pode usar os comandos `HELP` e `FEAT` para obter algumas informações do servidor 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...) ``` ### Login anônimo _anônimo : anônimo_\ _anônimo :_\ _ftp : ftp_ ```bash ftp >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 ``` ### [Força bruta](../../generic-methodologies-and-resources/brute-force.md#ftp) Aqui você pode encontrar uma lista completa com as credenciais padrão do ftp: [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) ### Automatizado Os testes de login anônimo e bounce FTP são realizados por padrão pelo nmap com a opção **-sC** ou: ```bash nmap --script ftp-* -p 21 ``` ## Conexão do navegador Você pode se conectar a um servidor FTP usando um navegador (como o Firefox) usando uma URL como: ```bash ftp://anonymous:anonymous@10.10.10.98 ``` Observe que se um **aplicativo da web** estiver enviando dados controlados por um usuário **diretamente para um servidor FTP**, você pode enviar bytes de codificação de URL dupla `%0d%0a` (na codificação de URL dupla, isso é `%250d%250a`) e fazer com que o **servidor FTP execute ações arbitrárias**. Uma dessas possíveis ações arbitrárias é baixar conteúdo de um servidor controlado pelo usuário, realizar varreduras de porta ou tentar se comunicar com outros serviços baseados em texto simples (como http). ## Baixar todos os arquivos do 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 ``` ## Alguns comandos FTP * **`USER nome_de_usuário`** * **`PASS senha`** * **`HELP`** O servidor indica quais comandos são suportados * **`PORT 127,0,0,1,0,80`** Isso indicará ao servidor FTP para estabelecer uma conexão com o IP 127.0.0.1 na porta 80 (_você precisa colocar o 5º caractere como "0" e o 6º como a porta em decimal ou usar o 5º e 6º para expressar a porta em hexadecimal_). * **`EPRT |2|127.0.0.1|80|`** Isso indicará ao servidor FTP para estabelecer uma conexão TCP (_indicada por "2"_) com o IP 127.0.0.1 na porta 80. Este comando **suporta IPv6**. * **`LIST`** Isso enviará a lista de arquivos na pasta atual * **`LIST -R`** Listar recursivamente (se permitido pelo servidor) * **`APPE /caminho/alguma_coisa.txt`** Isso indicará ao FTP para armazenar os dados recebidos de uma conexão **passiva** ou de uma conexão **PORT/EPRT** em um arquivo. Se o nome do arquivo existir, ele anexará os dados. * **`STOR /caminho/alguma_coisa.txt`** Semelhante ao `APPE`, mas ele substituirá os arquivos * **`STOU /caminho/alguma_coisa.txt`** Semelhante ao `APPE`, mas se o arquivo existir, não fará nada. * **`RETR /caminho/para/arquivo`** Deve ser estabelecida uma conexão passiva ou de porta. Em seguida, o servidor FTP enviará o arquivo indicado por essa conexão * **`REST 6`** Isso indicará ao servidor que na próxima vez que ele enviar algo usando `RETR`, ele deve começar no 6º byte. * **`TYPE i`** Define a transferência para binário * **`PASV`** Isso abrirá uma conexão passiva e indicará ao usuário onde ele pode se conectar * **`PUT /tmp/arquivo.txt`** Fazer upload do arquivo indicado para o FTP ![](<../../.gitbook/assets/image (227).png>) ## Ataque FTPBounce Alguns servidores FTP permitem o comando PORT. Esse comando pode ser usado para indicar ao servidor que você deseja se conectar a outro servidor FTP em alguma porta. Em seguida, você pode usar isso para verificar quais portas de um host estão abertas por meio de um servidor FTP. [**Aprenda aqui como abusar de um servidor FTP para verificar portas.**](ftp-bounce-attack.md) Você também pode abusar desse comportamento para fazer com que um servidor FTP interaja com outros protocolos. Você pode **fazer upload de um arquivo contendo uma solicitação HTTP** e fazer com que o servidor FTP vulnerável **a envie para um servidor HTTP arbitrário** (_talvez para adicionar um novo usuário administrador?_) ou até mesmo fazer upload de uma solicitação FTP e fazer com que o servidor FTP vulnerável faça o download de um arquivo para um servidor FTP diferente.\ A teoria é simples: 1. **Faça upload da solicitação (dentro de um arquivo de texto) para o servidor vulnerável.** Lembre-se de que, se você quiser conversar com outro servidor HTTP ou FTP, precisará alterar as linhas com `0x0d 0x0a` 2. **Use `REST X` para evitar enviar os caracteres que você não deseja enviar** (talvez para fazer upload da solicitação dentro do arquivo, você precise adicionar algum cabeçalho de imagem no início) 3. **Use `PORT` para se conectar ao servidor e serviço arbitrários** 4. **Use `RETR` para enviar a solicitação salva para o servidor.** É altamente provável que isso **gere um erro como** _**Socket not writable**_ **porque a conexão não dura o suficiente para enviar os dados com `RETR`**. Sugestões para tentar evitar isso são: * Se você estiver enviando uma solicitação HTTP, **coloque a mesma solicitação uma após a outra** até **\~0.5MB** pelo menos. Assim: {% file src="../../.gitbook/assets/posts (1).txt" %} posts.txt {% endfile %} * Tente **preencher a solicitação com dados "lixo" relativos ao protocolo** (ao falar com FTP, talvez apenas comandos lixo ou repetindo a instrução `RETR` para obter o arquivo) * Apenas **preencha a solicitação com muitos caracteres nulos ou outros** (divididos em linhas ou não) De qualquer forma, aqui está um [exemplo antigo de como abusar disso para fazer um servidor FTP fazer o download de um arquivo de um servidor FTP diferente.](ftp-bounce-download-2oftp-file.md) ## Vulnerabilidade do Filezilla Server O **FileZilla** geralmente **vincula** a um **serviço administrativo** **local** para o **FileZilla-Server** (porta 14147). Se você puder criar um **túnel** da **sua máquina** para acessar esta porta, você pode **conectar-se** a **ele** usando uma **senha em branco** e **criar** um **novo usuário** para o serviço FTP. ## Arquivos de configuração ``` ftpusers ftp.conf proftpd.conf vsftpd.conf ``` ### Pós-Exploração A configuração padrão do vsFTPd pode ser encontrada em `/etc/vsftpd.conf`. Aqui, você pode encontrar algumas configurações perigosas: * `anonymous_enable=YES` * `anon_upload_enable=YES` * `anon_mkdir_write_enable=YES` * `anon_root=/home/username/ftp` - Diretório para usuários anônimos. * `chown_uploads=YES` - Altera a propriedade dos arquivos enviados anonimamente. * `chown_username=username` - Usuário que recebe a propriedade dos arquivos enviados anonimamente. * `local_enable=YES` - Permite que usuários locais façam login. * `no_anon_password=YES` - Não solicita senha para usuários anônimos. * `write_enable=YES` - Permite os comandos: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE e SITE. ### Shodan * `ftp` * `port:21`
Encontre vulnerabilidades que são mais importantes para que você possa corrigi-las mais rapidamente. O Intruder rastreia sua superfície de ataque, realiza varreduras proativas de ameaças, encontra problemas em toda a sua pilha de tecnologia, desde APIs até aplicativos da web e sistemas em nuvem. [**Experimente gratuitamente**](https://www.intruder.io/?utm_source=referral&utm_campaign=hacktricks) hoje. {% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %} *** ## Comandos Automáticos do 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' ```
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! * Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com) * **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Compartilhe seus truques de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [repositório hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.