Introdução ao Volatility 3

Aenean lorem ex, semper vitae tristique eu, venenatis sit amet eros. Aenean blandit scelerisque euismod.

Este não é um artigo que tem a pretensão de ensinar análise de memória ou a utilizar o Volatility. Isso, vocês encontrarão por aqui, na Academia Forense Digital, no curso de Análise de Memória. Aliás, foi este curso que me deu a base e a orientação necessárias para realizar esta pesquisa, na qual busquei traçar um perfil comparativo entre a versão 2.6 do Volatility (cujo suporte oficial foi encerrado recentemente, em agosto de 2021) e a versão atual que é a 3. Na verdade, a denominação correta da versão vigente em setembro de 2021, data que este artigo foi criado, é Volatility 3 Framework 1.2.0, mas doravante será utilizada, apenas, a forma reduzida para nos referirmos a ela.

Esta foi, realmente, uma mudança que deve ser acompanhada com muita atenção, porque implica, diretamente, na leitura dos dumps de memória. O último build do Windows, incrementado na versão 2.6, foi o profile 15.19041. Não houve upgrade para o atual, o 10.0.19042, e já estamos na iminência de um novo, a partir do surgimento do Windows 11, principalmente.

Muitos concordam que o Volatility é a mais popular e eficiente ferramenta open source para análise de memória volátil, entre todas as outras, porém, a versão 3 trouxe, até agora, poucas mudanças significativas, e os aspectos positivos parecem ser menores do que os negativos. As alterações não ficaram somente limitadas aos poucos plugins que constam nesta versão, à sintaxe diferente e à resolução das “famigeradas” dependências, referentes ao Python, e que demandam uma preparação básica e mais demorada, antes de usar a ferramenta pela primeira vez. É trabalhoso desde o início e o Volatility 2.6 deixará saudades. Bastava colocar no PATH das variáveis de ambiente, o caminho da pasta onde o binário estava armazenado e digitar na linha de comando, a partir de qualquer diretório. Entre as principais dicas que este artigo se propõe a trazer, será apresentada a preparação do ambiente onde o Volatility 3 será utilizado.

Foram constatadas tentativas de compensar a inexistência de plugins importantes, através da combinação entre argumentos, e a dispensa da informação do profile ao digitar os comandos, o que não parecem vantagens a serem celebradas. Quando executamos um plugin, o tempo de processamento é mostrado no prompt, algo que não acontecia na versão anterior. A percepção que se tem, devido ao cronômetro, é que esta nova versão parece ser mais lenta, portanto, é recomendável, ao utilizá-la, levar em consideração o tamanho do dump de memória e a versão do build.

Os testes foram feitos em uma licença temporária da versão Enterprise do Windows 10, disponibilizada para a máquina virtual VMWare 16, configurada com 8GB de RAM e rodando no SSD do hospedeiro, que conta com um processador i7. É uma configuração razoável, mas que quando utilizada com a versão 2.6 do Volatility, traz o resultado muito mais rápido. O tamanho do arquivo de memória utilizado foi de 16GB. Mas não desanime! Não é uma regra o fato de que tudo o que acontece em um equipamento vá acontecer com o seu ou com o de qualquer outro usuário.

A boa notícia para os amantes do Linux e do macOS (categoria na qual me incluo, em relação ao Linux) é que também encontrarão plugins específicos para estes sistemas. Porém, acredito que duas questões têm que ser levadas em consideração, já que estão bastante entrelaçadas: o fato do tempo para entregar um laudo e que existem mais plugins para Windows. Conforme a dinâmica do momento, deve ser colocada de lado a preferência por um determinado sistema e utilizar aquele que for mais prático e completo, porque como em qualquer segmento, seja financeiro, comércio ou tecnologia, é o resultado que importa e gostos individuais não podem atrasar ou prejudicar o andamento do trabalho.

O formato de saída dos resultados de cada plugin é sugerido como uma forma alternativa e eficiente para organizar as análises, por tempo, por ordem alfabética ou por qualquer outra dimensão que proporcione ampla visualização e agilidade. Não existe priorizar estética, mas sim, resultado. A estética a gente deixa para o corpo do laudo. Faça da forma que for melhor para você e se esta sugestão te ajudar, já ficarei satisfeito e certo de que todo o tempo utilizado para produzir este artigo foi bem empregado e que valeu a pena.

Vamos em frente!!!

 

INSTALAÇÃO DO PYTHON, DAS DEPENDÊNCIAS E DO VOLATILITY 3

  1. Acessar: https://www.python.org/ para fazer o download do executável da última versão do Python.

Marcar Add Python 3.8 to PATH para incluir o Python nas variáveis de ambiente e instalar, clicando em Next, aceitando as opções já carregadas.

Após concluir, abrir o prompt do Windows ou o Power Shell e digitar os comandos abaixo para testar se a instalação foi bem-sucedida:

python –version

pip –version

  1. Instalar o PEfile e atualizar pelo CMD, conforme orientação.

https://pypi.org/project/pefile/

pip install pefile

  1. Instalar o GIT.

https://git-scm.com/downloads

  1. Baixar e instalar o Volatility 3 através do bash do GIT.

git clone https://github.com/volatilityfoundation/volatility3.git

 

  1. Instalação do yara-python.

Instalar direto pelo bash do git evitará notificações de upgrade, logo após a instalação:

git clone https://github.com/VirusTotal/yara-python.git

pip install yara-python

 

  1. Instalação do Capstone.

Seguindo o mesmo conceito anterior, instalar pelo bash do git:

git clone https://github.com/aquynh/capstone.git

pip install capstone

 

  1. Testar pelo prompt do Windows e a partir do diretório Volatility 3 para ver a lista de plugins disponíveis e suas respectivas descrições. No meu caso, ele está em no caminho C:\Users\User:

python vol.py -h

 

  1. É bem provável que, ao listar os plugins do Volatility 3, seja apresentada a seguinte mensagem ao final:

The following plugins could not be loaded (use -vv to see why): volatility3.plugins.windows.cachedump, volatility3.plugins.windows.hashdump, volatility3.plugins.windows.lsadump.

Isto é facilmente resolvido, baixando e instalando o arquivo pycryptodome, ainda pelo bash do git:

https://files.pythonhosted.org/packages/88/7f/740b99ffb8173ba9d20eb890cc05187677d

f90219649645aca7e44eb8ff4/pycryptodome-3.10.1.tar.gz

pip install pycryptodome

 

  1. Além da opção de deixar que os símbolos sejam buscados e criados pelo próprio Volatility 3, durante a sua execução (foi o que eu fiz), eles também podem ser baixados no endereço:

https://downloads.volatilityfoundation.org/volatility3/symbols/windows.zip

e em seguida, descompactados e colocados na pasta, seguindo o caminho indicado:

C:\Users\User\volatility3\volatility3\symbols\windows

 

  1. Realize novo teste no CMD do Windows, listando os plugins para constatar se o erro ainda permanece. Caso apareça, apenas, a lista com os plugins, sem que a mensagem se repita, está na hora de começar a utilizar o programa e conhecer as mudanças nesta nova versão.

PLUGINS E DIFERENÇAS NA SINTAXE

Algo que realmente não foi levado em consideração, é que a versão 2.6 do Volatility não deveria ter sido descontinuada enquanto a nova versão não pudesse ser validada como, no mínimo, tão eficiente quanto sua antecessora. Esta até parece ter sido a ideia inicial, mas não foi o que acabou acontecendo. Na verdade, funciona assim: se quisermos utilizar a versão anterior, ficaremos limitados ao último profile do Windows acrescentado; se precisarmos utilizar a versão 3, basicamente pela questão do building, teremos que nos adaptar à nova sintaxe e à demora no processamento, além de contornarmos a ausência de alguns plugins como o psxview, o procdump, o connections e o connscan, entre outros. São 113 plugins na versão 2.6 contra apenas 51, nesta nova versão, disponíveis para serem utilizados nos arquivos de dump do Windows.

Não será mais necessário informar o profile referente ao sistema operacional, algo presente na versão anterior e fornecido pelo comando imageinfo. Pode parecer vantagem, mas se levarmos em consideração um determinado momento, em que a única evidência a ser analisada que tivermos em mãos for um dump de memória, e não houver o clone do disco e/ou os registros do Windows, teremos que fornecer informações sobre o sistema e sobre a data que a aquisição foi realizada, executando o pluing windows.info.Info, substituto genérico do imageinfo.

Basicamente, a sintaxe normal mais simples é:

python vol.py -f dump_de_memória plugin

A sintaxe do plugin pode variar, por exemplo, entre windows.pslist.PsList ou windows.registry.hivelist.HiveList, só para servir como noção de tamanho. E não podemos esquecer os diversos argumentos que são combinados, tais como os de renderização e de saída dos resultados, entre outros:

python vol.py -f dump_de_memória -r ‘csv’ plugin > resultado.csv

 Ou seja:

python vol.py -f C:\Desktop\dump\memdump.mem -r ‘csv’ windows.pslist.PsList > C:\Desktops\outputs\pslist.csv

Recado para os desenvolvedores Python: criem scripts para execução de plugins que utilizam muitos argumentos.

A questão da ausência do procdump, que ainda será mostrada, mas que farei menção agora, foi contornada combinando o PsList com o argumento dump, que é digitado da seguinte maneira: – – dump. Já o -p, que referenciava o processo a ser extraído, agora é digitado como – – pid.

Estas são algumas mudanças que estão ligadas às funcionalidades mais comuns quando utilizamos o Volatility. Não há intenção alguma de esgotar o assunto e outras diferenças serão vistas com detalhes, mais adiante.

PREPARAÇÃO PARA ANÁLISE

A análise começa buscando diversas linhas de raciocínio, por isso é importante a fase de preparação e organização dos dados que, quando realizada em sua totalidade, aplicada em dispositivos de armazenamento de memórias não-voláteis, por ferramentas como o Autopsy ou o IPED, recebe o nome de indexação de evidências.

Informações do Sistema contido na imagem

Já foi mencionado, anteriormente, que o plugin imageinfo foi substituído, mas vale a pena lembrar que informações importantes podem ser obtidas pelo plugin windows.info.Info, tais como o horário que o arquivo de dump da memória foi criado. O padrão de horário configurado no Volatility 3 é o UTC. A coleta da memória ilustrada na figura abaixo, foi feita 3 horas a menos do informado, representando o horário de Brasília em relação ao UTC, que é -3.

python vol.py -f dump_memória windows.info.Info

Direcionar a saída do resultado para um arquivo txt pode ser uma boa opção para melhor visualização e análise no caso deste plugin,

python vol.py -f dump_memória windows.info.Info > resultado_info.txt

A partir deste momento, começa a pré-análise, o que pode ser entendida como a preparação através da escolha do que será analisado, do que parece suspeito. Antes de listar os processos do sistema que existiam no momento da aquisição da memória, é recomendável obtermos entendimento sobre os principais processos do sistema operacional para sabermos se está acontecendo algo que não deveria.

Listar os processos

O tempo para processar um pid (processo) individual pelo plugin PsList é, praticamente, o mesmo que para processar a lista inteira. Para uma melhor visualização dos resultados na tela, combinar o renderizador ‘pretty‘ foi uma escolha interessante e provou que também pode ser aplicada a diversos outros plugins.

python vol.py -f dump_memória -r ‘pretty’ windows.pslist.PsList

Converter o resultado em um arquivo que possa ser manipulado, fornecerá um apoio eficaz. Ao utilizar as funcionalidades do Excel, o arquivo em formato csv pode ser salvo como uma planilha xlsx, o que irá proporcionar vantagens durante a investigação e a análise, permitindo filtrar todos os processos encerrados ou ordená-los pelo Pid (ou PPid) em ordem crescente, por exemplo.

Observação importante: é necessário o entendimento de que, neste artigo, sempre que for mencionado o termo “manipulação”, estará sendo feita referência à ordenação, classificação e filtragem dos valores retornados, que permitem agilidade na investigação e melhor visualização no momento da análise.

python vol.py -f dump_memória -r ‘csv’ windows.pslist.PsList > resultado_pslist.csv

Árvore de processos

O plugin PsTree permite a visualização efetiva dos processos com os seus antecessores, aqueles que os originaram. Através deste plugin, podemos investigar a origem e ao que se destina o processo pai, diretamente ligado ao processo que julgamos, a princípio, suspeito. A preferência de quem fará a análise é que vai determinar se o resultado printado na tela será convencional ou formatado, por exemplo, com o renderizador pretty. Ambos os formatos são boas opções.

python vol.py -f dump_memória windows.pstree.PsTree

python vol.py -f dump_memória -r ‘pretty’ windows.pstree.PsTree

Outra boa opção de saída de arquivo para este plugin é o formato txt, devido às ligações entre os processos pais e filhos, que podem ser melhor visualizados assim do que em uma planilha do Excel.

python vol.py -f dump_memória windows.pstree.PsTree > resultado_pstree.txt

Buscando mais processos

PsScan tem como objetivos principais, buscar e revelar processos escondidos dentro de outros processos (porque malwares também são processos) e processos não linkados, terminados de forma anormal. Porém, o resultado deste plugin foi, praticamente, o mesmo do PsList e provou que o psxview, presente na versão anterior, está fazendo falta.

python vol.py -f dump_memória -r ‘pretty’ windows.psscan.PsScan

Resultado do PsScan sem o parâmetro “pretty”

Processos e suas conexões

Três plugins muito úteis na versão 2.6 do Volatility, o connscan, o connections e o sockscan, não estão presentes, pelo menos por enquanto. Ficou por conta dos plugins NetScan e NetStat, a visualização dos soquetes e suas conexões abertas, além das estruturas de conexão mais recentes.

NetStat é um plugin que sempre vai funcionar em um equipamento ligado.

python vol.py -f dump_memória -r ‘pretty’ windows.netstat.NetStat

Pode parecer insistência, mas renderizar o resultado para saída csv e, posteriormente, salvar como planilha do Excel, traz alguns benefícios durante a análise do que parece ser suspeito ou do que já se sabe que tem que ser procurado como, por exemplo, organizar os processos pelos seus PIDs em ordem crescente, fltrando todos que estavam estabelecendo conexões no momento do dump da memória.

python vol.py -f dump_de_memória -r ‘csv’ windows.netstat.NetStat > diretório_destino\arquivo.csv

Porém, todo bônus carrega consigo, pelo menos, um ônus, então, apesar da facilidade no momento da busca pelos artefatos que serão analisados, a renderização exigirá maior poder de processamento e tempo, variando conforme a configuração do equipamento.

NetScan mostra as conexões de redes abertas. Ele combina e utiliza a mesma metodologia dos plugins connscan e sockscan, conforme afirma o seu criador, AAron Walters, no livro em que é coautor, a obra mais completa sobre análise em memória volátil que existe: “The Art of Memory Forensics: Detecting Malware and Threats in Windows, Linux, and Mac Memory”. Esta lógica, talvez, tenha motivado a redução da quantidade de plugins nesta nova versão, promovendo a fusão entre aqueles que possuem funcionalidades específicas, relacionadas a um mesmo aspecto de análise.

python vol.py -f dump_de_memória -r ‘pretty’ windows.netscan.NetScan

python vol.py -f dump_de_memória -r ‘csv’ windows.netscan.NetScan > diretório_destino\arquivo.csv

Listando processos que possam conter códigos maliciosos

É importante lembrar que a proposta deste artigo é mostrar uma dentre as diversas funcionalidades do Volatility em relação à análise de memória volátil, com ênfase nas diferenças entre a versão 3.0 e a versão 2.6. Os plugins utilizados a seguir, estão relacionados à desconfiança de que um determinado equipamento possa estar infectado por algum (ou alguns) malwares, devido ao elevado processamento e consumo de memória, mesmo com quase nenhum processo ativo em primeiro plano. O foco é analisar os que foram considerados suspeitos, após os resultados dos plugins anteriores.

Malfind é o primeiro a ser utilizado para constatarmos se existe algum código malicioso injetado no processo.

python vol.py -f dump_de_memória windows.malfind.Malfind — pid processo_suspeito

Nada foi encontrado! Em seguida, foi utilizado o plugin Handles para verificar se o resultado apresenta alguma parte do processo que tenha sofrido alguma mutação. Considerar que na coluna type poderá aparecer o termo Mutant, ao invés do offset do processo.

python vol.py -f dump_de_memória windows.handles.Handles — pid processo_suspeito

Na versão anterior, era possível buscar, especificamente, pelos arquivos que sofreram mutações utilizando Mutant na sintaxe, junto com o plugin handles, mas no Volatility 3, este comando já não funciona mais. Entretanto, foi mantido o plugin MutantScan para realizar esta busca. Infelizmente, o único argumento permitido passou a ser o help. O resultado desse plugin é amplo, relacionando os processos aos seus respectivos offsets, porém desorganizado e extremamente demorado, como mostrado abaixo.

python vol.py -f dump_de_memória windows.mutantscan.MutantScan

Uma outra observação: os processos acima, por tratarem apenas de análises pontuais, sem geração de listagens, não foram renderizados, mas pode ser interessante direcionar os resultados para um arquivo txt.

Dois processos que foram relacionados pelo plugin Handles foram escolhidos, sendo que apenas um apresentou o termo Mutant na coluna type. De qualquer maneira, servirão para os nossos propósitos didáticos, já que irão proporcionar a exibição de mais uma mudança ocorrida nesta nova versão do Volatility, que é a ausência do procdump, o plugin de extração de um determinado processo, pela combinação do plugin Pslist com os argumentos — pid, que relaciona o processo desejado seguido por — dump, que informa à ferramenta que será realizado o dump do processo. À princípio, o resultado é armazenado dentro da própria pasta do Volatility 3, mas pode ser direcionado para um diretório específico.

python vol.py -f dump_de_memória windows.pslist.PsList — pid processo_suspeito — dump

Após realizar o upload do processo extraído para o Vírus Total, foi comprovado que não se trata de um malware (pelo menos, conhecido) e, caso exista o interesse, outras análises poderão ser feitas como, por exemplo, verificar se algum dos processos está associado ao perfil do usuário (principalmente ao do administrador) ou, até mesmo, se o equipamento está minerando criptomoedas, através de crypto-jacking.

Conclusão

A reflexão proporcionada por este estudo e por tudo que o envolveu, inclusive a busca por informações bastante escassas, vagas e, praticamente, inexistentes, evidenciou  como é necessária a participação de desenvolvedores de aplicações em Python na comunidade responsável pelo Volatility 3. Quanto maior for o time de desenvolvedores, maior será a agilidade na criação de novos plugins para suprir aqueles que ainda não foram disponibilizados, para criar funcionalidades até então inexistentes e também para solucionar prováveis problemas de compatibilidade com as novas builds que ainda irão surgir. Vamos lembrar ao mundo, que não é só na China, nos EUA, na Rússia, e até no Irã, que estão as pessoas mais inteligentes no setor de TI. Guardadas as devidas diferenças entre as nações e toda a história pregressa, devemos, cada vez mais, mostrar que o Brasil produz talentos diversos, não só no esporte, mas também em setores de inteligência e que aquilo que entendem como “jeitinho brasileiro” trata-se, na verdade, de flexibilidade e superação.

Vida longa ao Volatility!!

 

Autor: Vladmir Rodrigues
https://www.linkedin.com/in/vladimir-rodrigues-5a729b139/

Conheça nossos treinamentos

Próximos Eventos

Evento

AFD Summit 2022

Dias 26 e 27 de Março das 8h às 19h. Clique aqui para saber mais sobre o evento.

Evento

AFD Summit 2022

Dias 26 e 27 de Março das 8h às 19h. Clique aqui para saber mais sobre o evento.

Evento

AFD Summit 2022

Dias 26 e 27 de Março das 8h às 19h. Clique aqui para saber mais sobre o evento.