Realize simulações de ataque em um clique!

Sumário

Sobre o Infection Monkey 🐵

O Infection Monkey é uma ferramenta open source mantida pela Guardicore criada para realizar atividades de simulação de ataques e violação de políticas de segurança (BAS - Breach and Attack Simulation). Seu objetivo é testar a resiliência de ambientes em redes privadas e nuvens públicas em um cenário pós-exploratório (onde o atacante já está em seu ambiente), com tentativas de violação de políticas de segurança, movimentação lateral e controle total de ambientes, seja ele Windows ou Linux.

Tudo o que é necessário para baixar e configurar o Infection Monkey se encontra em https://www.guardicore.com/infectionmonkey/.

Como funciona?

Ao realizar o deploy de uma instância do Infection Monkey, ele automaticamente realizará um discovery de todo o ambiente que ele possa alcançar e avaliará os riscos de segurança com testes para diferentes cenários, como roubo de credenciais, comprometimento de desktops e domínio, além de outras falhas de segurança. É sugerido que realize esta avaliação periodicamente, assim é possível descobrir falhas após alterações na rede.

perifa_map_infection_monkey

Além de ser bem intuitivo, a solução produz relatórios detalhados com todas as instruções de correção e mapas visuais dos pontos de exploração, de forma que você conseguirá visualizar como sua rede está distribuída.

O que a ferramenta agrega a minha organização?

Para os CISOs, a ferramenta provê resultados quantitativos sobre a exposição aos riscos que podem ajudar na justificativa de investimentos em segurança.

Para os analistas, os resultados demonstra os pontos frágeis em sua rede, ajudando a priorizar a mitigação destes riscos.

Quais são os ambientes suportados?

O Infection Monkey é bem flexível em relação aos ambientes que ele pode ser disponibilizado.

  • VMware
  • AWS
  • Google Cloud Platform
  • GCP
  • Windows
  • Debian Linux
  • Docker

Setup do laboratório

O meu laboratório segue as seguintes características para ajudar na demonstração do que a ferramenta é capaz:

  • Todos os componentes estão na mesma VLAN;
  • Todos os sistemas operacionais estão atualizados;
  • A ferramenta foi configurada para conseguir com sucesso com brute force uma credencial com acesso privilegiado.

Como pode ver optei por deixar uma brecha (credencial) para observar ao máximo a ferramenta.

Os componentes do laboratórios são os seguintes?

Nome Função IP
DC01.perifa.corp (Windows Server 2016) Domain Controler 192.168.210.101
DC02.perifa.corp (Windows Server 2016) Domain Controler 192.168.210.102
WKS01.perifa.corp (Windows 10) Workstation 192.168.210.10
WKS02.perifa.corp (Windows 10) Workstation 192.168.210.11
monkey1.perifa.corp (Debian 10) Infection Monkey 192.168.210.99

O ambiente todo foi construído em VMware Workstation.

Procedimento de instalação

Na máquina monkey1 já instalada, configurada e atualizada, vamos começar a instalar as dependências iniciais e ferramentas que iremos utilizar no futuro.

sudo apt install libcurl4 build-essential vim git net-tools

Gosto de cores no meu terminal, então se preferir você pode configurar o seu também. =)

$ sudo vim /etc/bash.bashrc
...
export LS_OPTIONS='--color=auto'
eval "`dircolors`"
alias ls='ls $LS_OPTIONS'

Solicite o link de download em https://www.guardicore.com/infectionmonkey/. Após o o recebimento do link, realize o download.

Descompacte o TAR.GZ.

$ tar xvzf monkey-island-debian.tar.gz
README.md
monkey_island_deb.deb

Instale o pacote .DEB, se aparecer alguns erros fique tranquilo@

$ sudo dpkg -i monkey_island_deb.deb 

Use o comando APT para instalar todas as dependências e posteriormente o pacote monkey_island_deb.deb

$ sudo apt install -f

O Infection Monkey será instalado e configurado em /var/monkey. Serão instalados dois serviços, o monkey-island (Aplicação) e o monkey-mongo (Bando de Dados.)

Abaixo a estrutura de pastas do serviço.

image-20200727210226606

Vamos verificar se os serviços estão ativos está ativo.

$ sudo systemctl status monkey-*

image-20200724120502719

A aplicação receberá requisições HTTP pela porta 5000/tcp. Vamos ver se ela está aberta.

$ sudo netstat -putan | grep 500
...
tcp        0      0 0.0.0.0:5000            0.0.0.0:*               LISTEN      1926/python
tcp        0      0 0.0.0.0:5001            0.0.0.0:*               LISTEN      1926/python
tcp6       0      0 :::5000                 :::*                    LISTEN      1926/python

Localmente, você conseguirá acessar pelo link https://localhost:5000/

image-20200724121027822

Mas remotamente, ainda temos um problema de certificado. =(

image-20200724121138496

Vamos ter que corrigir o certificado. Antes vamos entrar na pasta de certificados do Infection Monkey e fazer um backup dos arquivos atuais

$ cd /var/monkey/monkey_island/cc
$ sudo mkdir old_cert
$ sudo mv server.crt old_cert/
$ sudo mv server.csr old_cert/
$ sudo mv server.key old_cert/

Ainda na pasta /var/monkey/monkey_island/cc , vamos criar um certificado novo.

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt

Você verá uma saída como a abaixo. Você pode ir digitando ENTER e confirmando tudo.

Generating a RSA private key
............+++++
......+++++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:br
State or Province Name (full name) [Some-State]:sp
Locality Name (eg, city) []:osasco
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Perifa
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Reinicie o serviço da aplicação.

$ sudo systemctl restart monkey-island

Não é necessário configurar para que os serviços iniciem automaticamente, na instalação isso já é configurado.

Pronto! Tudo configurado! Agora é possível acessar remotamente.

image-20200724132251477

Configuração e execução dos ataques

Agora com o servidor devidamente configurado, agora vem a parte mais fácil, por incrível que pareça.

Logo de inicio você terá duas opções para rodar o Monkey, neste caso vamos combinar o scan realizado pelo servidor e realizar o deploy do client em um dos desktops Windows 10.

image-20200724132819883

Primeiro vamos baixar o cliente no Windows 10.

image-20200724132941427

Você poderá executar o comando gerando em PowerShell no Windows, ou simplesmente baixar o cliente pela URL identificada no comando, https://192.168.210.99:5000/api/monkey/download/monkey-windows-64.exe.

powershell [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}; (New-Object System.Net.WebClient).DownloadFile('https://192.168.210.99:5000/api/monkey/download/monkey-windows-64.exe','.\monkey.exe'); ;Start-Process -FilePath '.\monkey.exe' -ArgumentList 'm0nk3y -s 192.168.210.99:5000';

Devido a natureza do software o Windows Defender imediatamente bloqueará o download, você deverá autorizar.

image-20200724135406772

image-20200724135420310

Já no terminal do PowerShell, execute o seguinte comando no diretório onde o cliente foi baixado. Lembrando que a aplicação Monkey Island está no servidor 192.168.210.99.

.\monkey-windows-64.exe -ArgumentList m0nk3y -s 192.168.210.99:5000

Bootloader starting.
Gathering network parameters.
Host Name . . . . . . . . . : WKS01
IP Address. . . . . . . . . : 192.168.210.10
IP Address. . . . . . . . . : 172.16.210.138
Windows version: windows8_or_greater
Sending request.
192.168.210.99 : (null) : {"system":"windows", "os_version":"windows8_or_greater", "hostname":"WKS01", "tunnel":false, "ips": ["192.168.210.10", "172.16.210.138"]}
Retrieved 17 data bytes: {"status":"RUN"}

Bootloader finished.
Bootloader starting.
Gathering network parameters.
Host Name . . . . . . . . . : WKS01
IP Address. . . . . . . . . : 192.168.210.10
IP Address. . . . . . . . . : 172.16.210.138
Windows version: windows8_or_greater
Sending request.
192.168.210.99 : (null) : {"system":"windows", "os_version":"windows8_or_greater", "hostname":"WKS01", "tunnel":false, "ips": ["192.168.210.10", "172.16.210.138"]}
Retrieved 17 data bytes: {"status":"RUN"}

Bootloader finished.

Pronto! Instantes depois você verá o cliente se comunicando com o servidor.

Ainda na tela Run Monkey, clique em Run on Monkey Island Server.

image-20200727203828840

Agora você verá a interação entre o cliente e server, e a partir de agora os monkeys começarão a vasculhar a rede!

image-20200724135839537

Como dito anteriormente, adicionei nas configurações de bruteforce uma credencial válida para ajudar na demonstração, e no fim tivemos o seguinte cenário, onde todas as máquinas do domínio foram exploradas com sucesso.

a41a7f81-4ac9-4a37-8c61-94b1ee100ce7

Mais sobre configurações

Em Configurações é possível realizar ajustes como:

  • Determinar quais técnicas do MITRE ATT&CK serão utilizadas;
  • Configurar lista de credenciais (usuários e senhas) serão utilizados nos ataques de bruteforce e hashes, se os possuir;
  • Configurações de rede, por exemplo quantidade de saltos permitidos e redes escopo;
  • Execução de scripts customizados (Linux ou Windows) após cada exploração com sucesso;
  • Portas a serem escaneadas nas redes alvo;
  • Quais exploits serão utilizados.

Relatórios

O Infection Monkey lhe fornecerá os seguinte relatórios. Clique nos links para baixar um exemplo em PDF.

Security Report

tt_2020-07-27_13-57-23

Zero Trust Report

tt_2020-07-27_13-57-40

ATT&CK Report

tt_2020-07-27_13-57-53

Conclusão 🤔

O Infection Monkey pode ser um grande aliado em assessments de primeiro nível, realizando todo o trabalho a partir de um botão de START!

Obviamente esta solução jamais irá substituir um trabalho de resiliência completo com profissionais experientes e especialistas nas soluções que compõem o ambiente a ser testado. São esses profissionais que são capazes de “tirar coelhos da cartola” quando normalmente não se vê qualquer possibilidade de uma escalação de privilégio. 🐇