ANÁLISE DE MEMÓRIA (pt.2) – ANÁLISE FORENSE

Olá!

Nessa segunda postagem sobre Análise de Memória, irei falar sobre aquisição de imagem de memória. Vamos dar uma olhada nas técnicas e ferramentas de aquisição de memória. E mostrar como adquirir uma imagem de RAM com a ferramenta Winpmem.

Link para acesso a primeira postagem: https://douglasmendes.code.blog/2020/08/01/analise-de-memoria-pt-1-analise-forense/

INTRODUÇÃO A AQUISIÇÃO DE MEMÓRIA

Aquisição de memória é o processo de aquisição de uma imagem da memória principal de um sistema em execução. Isso pode ser feito via hardware ou software. O primeiro geralmente usa dispositivos PCI Express ou Firewire, com o Firewire sendo limitado para acessar apenas os quatro gigabytes mais baixos de aquisição baseada em software de memória do sistema, carregando um driver de kernel capaz de ler toda a memória física e copiar em um armazenamento não volátil.

As ferramentas de aquisição de memória são carregadas na RAM do sistema de destino e devem deixar um espaço mínimo nela. Em outras palavras, ocupa a quantidade mínima de espaço possível em RAM. Portanto, as ferramentas CLI geralmente são preferíveis, pois precisam de menos memória para serem executadas. A aquisição pelo software pode ser realizada localmente, executando a ferramenta de aquisição no destino e transferindo a memória para uma unidade externa ou remotamente.

O último implica copiar a ferramenta no destino, executá-la e enviar de volta o despejo de memória para a estação de trabalho forense através do NetCat ou SSH.

FERRAMENTAS DE AQUISIÇÃO DE MEMÓRIA

A aquisição de ferramentas de software depende do tipo de SO. Às vezes, também da versão em execução no sistema de destino. Embora a maioria dessas ferramentas seja comercial e desenvolvida para Windows, existem algumas ferramentas gratuitas que também estão disponíveis no Linux, como o FTK Imager e Pmem. Outra ferramenta disponível no Linux é o LiME, ou extrator de memória Linux (Linux Memory Extractor). Ele precisa ser compilado a partir da fonte para a versão exata do kernel do sistema em questão.

Vamos abordar o Pmem, que faz parte do Framework de análise de memória Rekall. O pacote Pmem oferece uma solução completa de aquisição de memória, e é composto por três ferramentas de aquisição:

  • OSXPmem;
  • WinPmem;
  • LinPmem.

Também pelos drivers de memória relativa do kernel. Pmem salva a imagem da memória de saída no formato forense avançado AFF4.

O WinPmem e o LinPmem você consegue nos links abaixo:

Caso queira conhecer mais sobre o Rekall, pesquise nesses links:

Caso não seja habituado a fazer download pelo GitHub, fica um debate no fórum Stack Overflow, explicando como fazer no Linux:

https://pt.stackoverflow.com/questions/191063/github-baixar-projeto-iniciante

Mas… você também consegue baixar clicando no Botão Code quando estiver acessando pelo navegador web. Você deve escolher uma das três maneiras de download. Caso ainda tenha ficado dúvidas, acesse:

https://entrevistandodados.wordpress.com/2017/09/28/baixando-arquivos-do-github/

AQUISIÇÃO DE MEMÓRIA

Nesse exemplo, criei um cenário para aquisição de RAM de um sistema remoto. Nesse caso, extraí a memória de um sistema operacional Windows com o NetCat instalado utilizando um sistema operacional Kali Linux. Irei falar um pouco sobre o NetCat abaixo.

NETCAT

NetCat, também conhecido como o canivete suíço para hackers, é uma ferramenta de rede ou um utilitário que é usado para ler e gravar dados ao iniciar uma conexão nas portas TCP e UDP. Nesta postagem, aprenderemos como usar NetCat Windows e a versão do NetCat Linux para aquisição de memória.

No Kali Linux essa ferramenta já acompanha o sistema. Para baixar o NetCat Windows, disponibilizo abaixo um tutorial, com links para download e explicações de como monta-lo:

Segue outro link para download do MinGW que encontrei em sitio diferente do relacionado anteriormente. Nesse link não existe instalador. Necessário após descompactar seguir o procedimento de adição de caminho na Variável de Ambiente PATH, em “Editar as variáveis de ambiente do sistema” no Windows (assim como foi explicado no link do sitio infoskirmish.com) : https://sourceforge.net/projects/mingw-w64/

Se você estiver utilizando uma distro do Linux que não possua essa ferramenta instalada, recomendo que observe o site oficial: http://netcat.sourceforge.net/

É bem simples utilizar o NetCat. Tudo que deve fazer é abrir o Terminal (ou CMD no Windows) e inserir os comandos, assim como toda ferramenta CLI. A sintaxe básica para o laboratório é:

  • Para “falar” com um host:
    nc {ENDEREÇO IP} {PORTA DESTINADA A COMUNICAÇÃO}
  • Para “escutar” um host:
    nc –nvlp {PORTA A SER UTILIZADA}

Caso queira consultar o menu de ajuda, digite nc –h.
Recomendo esse blog caso queira explorar essa ferramenta mais afundo:

https;//androidgiggs.com/netcat-tutorial-windows-linux/

Agora daremos andamento ao experimento.

LABORATÓRIO

Para criação do laboratório utilizo uma máquina virtual distro Kali Linux 2020 no software VirtualBox. Ela realiza a função de escuta. Também utilizo uma outra máquina virtual SO Windows 7 SP1 32 bits. Ela realiza a função de comunicador. Ambas as duas máquinas estão em modo bridge, para que a comunicação entre elas ocorra por protocolo IPv4. Não funciona em modo NAT, a não ser que seja utilizado NAT Network. No VMWare Workstation, o modo NAT já funciona como NAT Network por padrão. O VirtualBox em modo NAT utiliza loopback.

O primeiro teste que fiz, inverti as funções de propósito afim de estudo. E, falando do WinPmem, ele não é instalável. Baixei o executável do repositório apenas na máquina Windows, e para fazer uso do programa, deve-se acessar pelo CMD o diretório onde ele está.

Para testar a comunicação entre as duas máquinas, digito na máquina Windows 7 o comando nc –nvlp 9999 deixando ela em função de escuta. E na máquina Kali Linux 2020, digito o comando nc 192.168.0.113 9999, sendo 192.168.0.113 o IPv4 da máquina Windows, e 9999 a porta disponível para comunicação.

IMAGEM: Do Autor

Verificado a comunicação, digitando ctrl+c encerro os comandos. Antes da conexão, consulto e anoto os IPs das máquinas virtuais. No Windows 7 pelo CMD obtenho o IP pelo comando ipconfig

IMAGEM: Do Autor

… e no Linux pelo terminal obtenho o IP pelo comando ifconfig.

IMAGEM: Do Autor
Agora, no Kali Linux (máquina atacante), digito o comando nc –nvlp > Win7Pmem. Esse comando instrui o NetCat a escutar a porta 9999 e transcrever todos os dados recebidos do cliente na máquina-alvo como um arquivo de imagem da saída.

OBSERVE: Win7Pmem é o nome que escolhi para o arquivo que receberá a imagem RAW. Poderia ser qualquer outro nome. Não tem problema se escolher algum outro.

IMAGEM: Do Autor

A versão que tenho feito download do WinPmem é a v3.3.rc3. O arquivo tem que estar no mesmo diretório que o NetCat da máquina-alvo. Na mesma, executo o comando winpmem_v3.3.rc3.exe –volume_format raw –output – | nc 192.168.0.111 9999. Especifico o formato de imagem como RAW, e padrão de saída standard (STDOUT). O WinPmem sempre requer que insira a opção de saída. A sintaxe pura do comando é:

winpmem_{VERSÃO DO ARQUIVO} –{FORMATO DE IMAGEM A SER COLETADA} –{NOME DO ARQUIVO DE SAÍDA, SENDO QUE – SIGNIFICA STDOUT} | nc {IP DO ATACANTE} {PORTA DE CONEXÃO}

IMAGEM: Do Autor

NOTA: Utilizando –volume_format você obtém uma imagem completa RAW, porém, utilizando –format você obtém uma imagem completa RAW dentro de um container AFF4. Nem sempre no Volatility funciona bem. Recomendo a primeira opção sempre.

Como a extração de imagem de um disco rígido gera um arquivo no tamanho da capacidade total de memória do disco, essa ferramenta gerará um arquivo na máquina atacante com o tamanho da capacidade de memória RAM da máquina-alvo.  Quando o arquivo gerado atingir o tamanho, encerre os processos. O WinPmem encerrará por si, mas o NetCat não quebra a conexão automaticamente. Necessária quebra de conexão manual com o comando ctrl+c.

Com o comando ls –lh verifiquei o arquivo que foi obtido e o seu tamanho.

IMAGEM: Do Autor

Testei utilizar a mesma versão em outra máquina com o Windows 10 64 bits, e não funcionou. Essa experiência é baseada em uma ferramenta que não possui um forte suporte técnico. Pelo que tenho pesquisado, de acordo com as versões de Windows, as estruturações de dados são diferenciadas, e é possível que não encontre versões do WinPmem que atenda aos sistemas operacionais Windows mais novos.

Utilizei o LinPmem baixado no repositório do WinPmem e extraí a imagem da memória RAM do Kali Linux conectando pelo NetCat a máquina Windows 7. Funcionou perfeitamente. A sintaxe basicamente é idêntica ao do WinPmem.

IMAGEM: Do Autor

IMAGEM: Do Autor

IMAGEM: Do Autor

Agora trataremos da geração de algoritmo Hash. Supondo que já conheça sobre o assunto, tratarei dos passos de forma bem intuitiva. Na máquina Linux, utilize o comando sha1sum –b {NOME_DO_ARQUIVO_DE_IMAGEM} > {NOME_DO_ARQUIVO_DE_IMAGEM_Hash}.

IMAGEM: Do Autor

Para verificar se o algoritmo Hash bate, digite o comando sha1sum –c {NOME_DO_ARQUIVO_DE_IMAGEM_Hash} lembrando que os dois arquivos devem estar no mesmo diretório.

IMAGEM: Do Autor

E, na imagem extraída pelo LinPmem, utiliza-se a ferramenta CertUtil instalada nativamente no SO. Então na máquina Windows, com a janela do CMD aberta, estando no diretório que a imagem extraída está, digite certutil –hashfile {NOME_DO_ARQUIVO_DE_IMAGEM} >> {NOME_DO_ARQUIVO_DE_IMAGEM_Hash.txt}

IMAGEM: Do Autor

IMAGEM: Do Autor

Caso queira trabalhar com um outro tipo de algoritmo Hash, digite-o no comando certutil após o nome do arquivo, por exemplo: certutil –hashfile kali.mem MD5 >> kaliHash2.txt

IMAGEM: Do Autor

Da mesma maneira, no Linux você pode utilizar ao invés do comando sha1sum usar o md5sum.

IMAGEM: Do Autor

Também existem ferramentas para extração de memória volátil sem precisão de instalação na máquina a ser investigada. Proponho o que tenho encontrado pesquisando como uma boa referência clicando abaixo:

Multiple ways to Capture Memory for Analysis

Uma dica: Caso decida utilizar o WinPmem ou o LinPmem com o NetCat sem o uso da tecla pipe, você deve deixar o Pmem rodando até que crie um arquivo na máquina-alvo, e na sequência deve-se digitar o comando correto. Embora não seja recomendado pois “contamina demais” a memória RAM da máquina a ser investigada, segue como fazer:

  • Na máquina-alvo:
    nc {IP_DA_MÁQUINA_ATACANTE} {NÚMERO_DA_PORTA_DE_COMUNICAÇÃO} < {ARQUIVO}
  • Na máquina atacante:
    nc -nvlp {NÚMERO_DA_PORTA_DE_COMUNICAÇÃO} > {NOME_DO_ARQUIVO_DE_SAÍDA}

Existe também como trabalhar com SSH, que de fato faz um serviço bem melhor, devido transmissão de pacotes pela rede ser feita com maior segurança. Porém, se a máquina a ser investigada rodar sistema operacional que necessite REINICIALIZAÇÃO para ativar o SSH você pode perder os dados voláteis armazenados na memória RAM. Nos sistemas operacionais Linux não há necessidade de reinicialização.

Caso, no Linux, o serviço SSH estiver desabilitado, digite como usuário ROOT:

~# /etc/init.d/ssh start

E, para conferir se o serviço iniciou corretamente, digite:

~# systemctl status ssh

Verificando que o serviço iniciou corretamente, para se comunicar a uma máquina digite:

~# ssh {NOME_DA_CONTA_DA_MAQUINA_ALVO}@{IP_DA_MAQUINA_ALVO}
Por exemplo: ~# ssh John@192.168.0.115

E o comando para copiar arquivos via SSH:

~# scp {NOME_DO_ARQUIVO} {NOME_DA_CONTA_DA_MAQUINA_ALVO}@{IP_DA_MAQUINA_ALVO}:{DIRETÓRIO_DE_DESTINO_NA_MAQUINA_ALVO}
Por exemplo: ~# scp DUMPMEM Doom@192.168.56.3:~

Todas as conexões via SSH necessitam de senhas, o que também dificulta em casos que não se tem uma pessoa que diga. O alvo não é preocupar quem está sendo investigado com abordagens agressivas. E nem todos colaborarão.

No caso do SSH você não deve misturar saídas com a tecla “pipe” assim como nos casos anteriores. Mas você pode copiar o WinPmem (ou o LinPmem) via comando scp para máquina-alvo, executá-lo via ssh depois de se conectar com essa máquina, e recuperar o arquivo criado pelo WinPmem (ou o LinPmem) via scp direto para a máquina atacante.

Feito! Nessa postagem introduzi técnicas de aquisição de memória com ferramentas de software, e mostrei um exemplo prático de como adquirir uma imagem da memória RAM com o WinPmem. Na próxima postagem farei uma introdução do Framework de análise de memória Volatility.

Deixe seus comentários!

Até breve!

2 comentários em “ANÁLISE DE MEMÓRIA (pt.2) – ANÁLISE FORENSE

Deixe um comentário