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:
- Parte 1:
https://douglasmendes.code.blog/2020/08/01/analise-de-memoria-pt-1-analise-forense - Parte 2:
https://douglasmendes.code.blog/2020/08/09/analise-de-memoria-pt-2-analise-forense - Parte 3:
https://douglasmendes.code.blog/2020/09/05/analise-de-memoria-pt-3-analise-forense/
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!