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

Olá!

Bem-vindo à parte 4 da série de publicações de análise de memória. Nesta postagem explico como usar o Volatility. Na postagem anterior, fiz uma introdução do Volatility Framework. Nesta postagem, vamos dar uma olhada como utilizar o programa e seus plug-ins afim de analisar uma imagem de memória de amostra.

Utilizo uma imagem de exemplo que extraí de um laptop com o Windows 7 Pro SP1 64 bits compilação 6.1.7601. Abaixo estão os links das postagens anteriores:

NOTA: Quando você for trabalhar NÃO UTILIZE A IMAGEM ORIGINAL! Sempre deve trabalhar com cópia, conferindo os hashes antes.

Para começar, podemos verificar nossa imagem de memória do Windows e ter mais informações sobre ela com o plug-in de informações de imagem. Executamos Volatility especificando a opção -f com o nome da imagem da memória e o nome do plug-in (imageinfo).

No diretório onde se encontra a imagem da memória, digitei o comando volatility –f Win7WinPmemVOL.raw imageinfo, sendo que Win7WinPmemVOL.raw é o nome que dei ao arquivo de imagem.

IMAGEM: Do Autor

O plug-in imageinfo exibe informações sobre a imagem, incluindo o tipo e a versão do sistema operacional. Como você pode ver, a saída sugere a utilização de vários profiles. Teste qual perfil funciona melhor.

Obviamente, não uso todos os plug-ins disponíveis por uma questão de brevidade, mas nesta postagem mostrarei apenas os mais relevantes.

A primeira coisa que devemos fazer é enumerar os processos ativos que estavam sendo executados no destino quando adquirimos a imagem da memória. Para fazer isso, podemos usar o plug-in pslist. Para isso digite o comando volatility  –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} pslist  

IMAGEM: Do Autor

IMAGEM: Do Autor

A saída mostra informações como o nome do processo, ID do processo, ID do processo “pai” e hora de início. A saída também pode ser redirecionada para um arquivo usando a opção de arquivo de saída.

volatility –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} –output-file {NOME_DO_ARQUIVO_DE_SAÍDA} pslist

IMAGEM: Do Autor

Também processos ocultos ou encerrados podem ser enumerados com o plug-in psscan. Na imagem que extraí não encontrei nenhum.

volatility  –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} psscan

IMAGEM: Do Autor

Um plug-in muito utilizado para descobrir o horário de encerramento do(s) processo(s) é o plug-in psxview demonstrado abaixo:

volatility –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} psxview

IMAGEM: Do Autor

IMAGEM: Do Autor

O plug-in dlllist exibe todas as DLL’s referenciadas por todos os processos. Uma boa prática seria restringir a pesquisa especificando a opção pid, devido a vasta quantidade que normalmente encontrará de processos. Então, o comando a ser aplicado:

volatility –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} –pid {NÚMERO_DO_PROCESSO} dlllist

IMAGEM: Do Autor

Assim o Volatility gera todas as DLL’s relativas aos processos específicos. Para exibir os módulos e drivers do kernel, usamos o plug-in modules.

volatility –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} modules

IMAGEM: Do Autor

Se quisermos exibir também os módulos ocultos ou residuais, temos o plug-in modscan.

volatility –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} modscan

IMAGEM: Do Autor

O plug-in printkey nos permite ver o valor das chaves de registro em cache. Temos que especificar também a opção –K para o nome da chave de registro. A saída exibe o subcaso (quando houver) e seus valores.

volatility –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} printkey –K “Microsoft\\Windows\\CurrentVersion\\Run”

IMAGEM: Do Autor

O plug-in malfind faz uma varredura automatizada a procura de malwares utilizando uma base de dados de “normalidade” do próprio Volatility.

volatility –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} malfind –output-file {NOME_DO_ARQUIVO_DE_SAÍDA} malfind

IMAGEM: Do Autor

IMAGEM: Do Autor

Agora entrando um pouco na parte de redes, temos o plug-in netscan, que enumera as conexões de rede no destino.

volatility –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} netscan

IMAGEM: Do Autor

Como no exemplo, na saída podemos observar a conexão UDP iniciada pelo chrome.exe. Há também um plug-in que exibe o cache ou histórico de IP. Para efetuar uma pesquisa direcionando a todos os eventos de uma aplicação podemos utilizar o comando grep depois de utilizarmos a tecla pipe. Vou dar um exemplo:

IMAGEM: Do Autor

Para completar a visualização das conexões de rede, podemos utilizar os plug-ins connections e sockets.

volatility –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} connections

volatility –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} sockets

Não consegui ilustrar devido esses plug-ins serem incompatíveis com os profiles sugeridos para a imagem que selecionei para a postagem.

Agora verificaremos a imagem em busca de regras que possam revelar malware em execução no alvo. Yara é uma ferramenta para identificar e classificar malware com base em regras que incluem conjuntos de assinaturas que podem ser baixados do repositório Yara em https://github.com/Yara-Rules/rules . Elas estão divididas em várias categorias.

IMAGEM: Do Autor

Você pode clonar o repositório, ou baixar os arquivos que deseja. No meu caso, fiz a clonagem no diretório /root e renomeei para yara_rules.

O plug-in para usar em Volatility é o yarascan. Devemos especificar o caminho do arquivo de regras Yara para usar a opção de varredura. Por exemplo, se você deseja verificar a imagem em busca de assinaturas do malware EK_ZEUS (um Exploit Kit), devemos especificar o arquivo de regra Yara correspondente.

volatility –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} yarascan –yara-file {DIRETÓRIO_DO_ARQUIVO_REGRA/EK_ZEUS.yar}

IMAGEM: Do Autor

Nessa varredura nada foi encontrado. Você pode também executar a varredura com todos os exploit kits fornecidos no repositório (por exemplo) utilizando o yara file exploit_kits_index.yar.

IMAGEM: Do Autor

Nessa varredura foi encontrado um processo que foi considerado malicioso – Processo MsMpEng.exe – Pid 812. Na verdade, esse processo tem o nome de Microsoft Malware Protection Engine do Windows Defender. Quando encontrar algo nas varreduras procure informações sobre o que foi encontrado.

Todos os arquivos com terminação _index.yar apontam para um diretório correspondente. O utilizado anteriormente aponta para o diretório /exploit_kits, assim como o arquivo malware_index.yar aponta para o diretório /malware, e assim por diante.

Para mais informações de como utilizar plug-ins para extrair e examinar vários tipos de artefatos de memória acesse: https://github.com/volatilityfoundation/volatility/wiki

Com o plug-in yarascan o perito pode verificar se o conteúdo do cache em memória reflete algum achado de interesse, considerando os processos do navegador acessados na data/hora do evento sob investigação. Conteúdos visualizados no cache, que poderiam contar mais sobre o ocorrido são aqueles voltados ao histórico de visita a sites, informações equivalentes àquelas que poderiam ser vistas no histórico do navegador, mantido em disco. Porém, é comum usuários apagarem sem problemas essas informações no próprio navegador enquanto em uso, mesmo sem intenção de esconder vestígios.

volatility –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} yarascan –Y “Cache” –pid {PID_ESCOLHIDO}

IMAGEM: Do Autor

Para melhor identificar a presença de URLs no cache que analisarmos, procure pelos indicadores “REDR”, “URL” e/ou “LEAK”.

volatility –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} yarascan –Y “/(URL|REDR|LEAD)/” –pid {PID_ESCOLHIDO}

IMAGEM: Do Autor

Agora, imagine que uma pessoa mal-intencionada acessou diretórios protegidos incompatibilizando com suas permissões de usuário. Vasculharemos se houve esse ocorrido com o plug-in shellbags, enviando seus resultados para um arquivo de saída. Utilizo dessa vez o próprio STDOUT do Linux.

volatility –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} shellbags > {NOME_DO_ARQUIVO_DE_SAÍDA}

IMAGEM: Do Autor

Com o a ferramenta nano, nativa no Kali Linux, abri o arquivo de saída para analisar…

IMAGEM: Do Autor

IMAGEM: Do Autor

IMAGEM: Do Autor

… e verifico que o resultado possui informações de acesso e modificações realizadas pelo usuário dessa máquina. Como o plug-in está relacionado aos registros do Windows, acesso a diretórios, conexões realizadas pela internet, acesso a arquivos, ou seja, um histórico de eventos ocorridos, realizando o processo de extração e análise de imagem de memória posso “cruzar” informações com as informações obtidas pela ferramenta RegRipper, já explicado aqui nesse blog. Caso não conheça a postagem, segue link:

https://douglasmendes.code.blog/2020/05/21/analise-de-registros-do-windows-analise-forense/

 Caso queira saber a localização da paginação em memória virtual (DTB) de todos os PID’s, gere um arquivo contendo o resultado de exame do plug-in memmap

volatility –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} memmap > {NOME_DO_ARQUIVO_DE_SAÍDA}

IMAGEM: Do Autor

IMAGEM: Do Autor

Lembrando que, como a saída desse comando é extensa, você pode optar por requerer apenas a saída do PID desejado, acrescentando –pid como explicado em dlllist anteriormente.

Com o plug-in filescan você obtém o local onde encontra o arquivo “cruzando” o espaço de memória RAM ocupado. É um dos plug-ins que considero mais interessantes.

volatility –profile={PERFIL_ESCOLHIDO} –f {NOME_DO_ARQUIVO} filescan > {NOME_DO_ARQUIVO_DE_SAÍDA}

IMAGEM: Do Autor

IMAGEM: Do Autor

Para não ficar apenas falando do Windows, farei algumas menções de plug-ins para Linux. A imagem de memória que utilizei para os plug-ins expostos abaixo são de uma máquina com sistema operacional Debian 8 Jessie.

Com o plug-in linux_bash obtive a listagem dos comandos executados no objeto questionado ainda persistentes na RAM.

volatility –f {NOME_DO_ARQUIVO} –profile={PERFIL_ESCOLHIDO} linux_bash > {NOME_DO_ARQUIVO_DE_SAÍDA}

IMAGEM: Do Autor

IMAGEM: Do Autor

Com o plug-in linux-psaux obtive a listagem dos processos em execução no objeto questionado quanto à execução do dump.

volatility –f {NOME_DO_ARQUIVO} –profile={PERFIL_ESCOLHIDO} linux_psaux > {NOME_DO_ARQUIVO_DE_SAÍDA}

IMAGEM: Do Autor

IMAGEM: Do Autor

Com o plug-in linux_threads obtive a listagem das threads identificadas na RAM.

volatility –f {NOME_DO_ARQUIVO} –profile={PERFIL_ESCOLHIDO} linux_threads > {NOME_DO_ARQUIVO_DE_SAÍDA}

IMAGEM: Do Autor

IMAGEM: Do Autor

Com o plug-in linux_netstat obtive a listagem das conexões de rede ativas na máquina que explorei.

IMAGEM: Do Autor

IMAGEM: Do Autor

Boa! Nesta postagem, cobrimos alguns dos plug-ins do Volatility Framework mais relevantes para analisar uma imagem de memória do Windows 7, também algumas considerações de plug-ins para analisar uma imagem de memória com sistema operacional Debian 8, encerrando por aqui as postagens sobre análise de memória. Comente!

Até logo!

Deixe um comentário