Volatility - CheatSheet

Reading time: 22 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Se você precisa de uma ferramenta que automatize a análise de memória com diferentes níveis de varredura e execute vários plugins do Volatility3 em paralelo, você pode usar autoVolatility3:: https://github.com/H3xKatana/autoVolatility3/

bash
# Full scan (runs all plugins)
python3 autovol3.py -f MEMFILE -o OUT_DIR -s full

# Minimal scan (runs a limited set of plugins)
python3 autovol3.py -f MEMFILE -o OUT_DIR -s minimal

# Normal scan (runs a balanced set of plugins)
python3 autovol3.py -f MEMFILE -o OUT_DIR -s normal

Se você quer algo rápido e louco que lançará vários plugins do Volatility em paralelo, você pode usar: https://github.com/carlospolop/autoVolatility

bash
python autoVolatility.py -f MEMFILE -d OUT_DIRECTORY -e /home/user/tools/volatility/vol.py # It will use the most important plugins (could use a lot of space depending on the size of the memory)

Instalação

volatility3

bash
git clone https://github.com/volatilityfoundation/volatility3.git
cd volatility3
python3 setup.py install
python3 vol.py —h

volatility2

Download the executable from https://www.volatilityfoundation.org/26

Comandos do Volatility

Acesse a documentação oficial em Volatility command reference

Uma nota sobre plugins “list” vs. “scan”

O Volatility tem duas abordagens principais para plugins, que às vezes são refletidas em seus nomes. Plugins “list” tentarão navegar pelas estruturas do Kernel do Windows para recuperar informações como processos (localizar e percorrer a lista encadeada de estruturas _EPROCESS na memória), handles do SO (localizando e listando a tabela de handles, desreferenciando quaisquer ponteiros encontrados, etc). Eles se comportam mais ou menos como a API do Windows se solicitada a, por exemplo, listar processos.

Isso torna os plugins “list” bastante rápidos, mas tão vulneráveis quanto a API do Windows a manipulações por malware. Por exemplo, se um malware usar DKOM para desvincular um processo da lista encadeada _EPROCESS, ele não aparecerá no Gerenciador de Tarefas e nem no pslist.

Os plugins “scan”, por outro lado, adotarão uma abordagem semelhante à escultura da memória para coisas que podem fazer sentido quando desreferenciadas como estruturas específicas. O psscan, por exemplo, lerá a memória e tentará criar objetos _EPROCESS a partir dela (usa a varredura de pool-tag, que busca por strings de 4 bytes que indicam a presença de uma estrutura de interesse). A vantagem é que ele pode encontrar processos que já saíram, e mesmo que o malware interfira na lista encadeada _EPROCESS, o plugin ainda encontrará a estrutura presente na memória (já que ela ainda precisa existir para que o processo seja executado). A desvantagem é que os plugins “scan” são um pouco mais lentos que os plugins “list” e podem, às vezes, gerar falsos positivos (um processo que saiu há muito tempo e teve partes de sua estrutura sobrescritas por outras operações).

De: http://tomchop.me/2016/11/21/tutorial-volatility-plugins-malware-analysis/

Perfis do SO

Volatility3

Conforme explicado no readme, você precisa colocar a tabela de símbolos do SO que deseja suportar dentro de volatility3/volatility/symbols.
Pacotes de tabela de símbolos para os vários sistemas operacionais estão disponíveis para download em:

Volatility2

Perfil Externo

Você pode obter a lista de perfis suportados fazendo:

bash
./volatility_2.6_lin64_standalone --info | grep "Profile"

Se você quiser usar um novo perfil que você baixou (por exemplo, um de linux), você precisa criar em algum lugar a seguinte estrutura de pastas: plugins/overlays/linux e colocar dentro dessa pasta o arquivo zip contendo o perfil. Em seguida, obtenha o número dos perfis usando:

bash
./vol --plugins=/home/kali/Desktop/ctfs/final/plugins --info
Volatility Foundation Volatility Framework 2.6


Profiles
--------
LinuxCentOS7_3_10_0-123_el7_x86_64_profilex64 - A Profile for Linux CentOS7_3.10.0-123.el7.x86_64_profile x64
VistaSP0x64                                   - A Profile for Windows Vista SP0 x64
VistaSP0x86                                   - A Profile for Windows Vista SP0 x86

Você pode baixar perfis do Linux e Mac de https://github.com/volatilityfoundation/profiles

No trecho anterior, você pode ver que o perfil é chamado LinuxCentOS7_3_10_0-123_el7_x86_64_profilex64, e você pode usá-lo para executar algo como:

bash
./vol -f file.dmp --plugins=. --profile=LinuxCentOS7_3_10_0-123_el7_x86_64_profilex64 linux_netscan

Descobrir Perfil

volatility imageinfo -f file.dmp
volatility kdbgscan -f file.dmp

Diferenças entre imageinfo e kdbgscan

A partir daqui: Ao contrário do imageinfo, que simplesmente fornece sugestões de perfil, kdbgscan é projetado para identificar positivamente o perfil correto e o endereço KDBG correto (se houver múltiplos). Este plugin escaneia as assinaturas KDBGHeader vinculadas aos perfis do Volatility e aplica verificações de sanidade para reduzir falsos positivos. A verbosidade da saída e o número de verificações de sanidade que podem ser realizadas dependem de o Volatility conseguir encontrar um DTB, então, se você já conhece o perfil correto (ou se você tem uma sugestão de perfil do imageinfo), então certifique-se de usá-lo.

Sempre dê uma olhada no número de processos que o kdbgscan encontrou. Às vezes, imageinfo e kdbgscan podem encontrar mais de um perfil adequado, mas apenas o válido terá algum processo relacionado (Isso ocorre porque para extrair processos é necessário o endereço KDBG correto).

bash
# GOOD
PsActiveProcessHead           : 0xfffff800011977f0 (37 processes)
PsLoadedModuleList            : 0xfffff8000119aae0 (116 modules)
bash
# BAD
PsActiveProcessHead           : 0xfffff800011947f0 (0 processes)
PsLoadedModuleList            : 0xfffff80001197ac0 (0 modules)

KDBG

O kernel debugger block, referido como KDBG pelo Volatility, é crucial para tarefas forenses realizadas pelo Volatility e vários depuradores. Identificado como KdDebuggerDataBlock e do tipo _KDDEBUGGER_DATA64, contém referências essenciais como PsActiveProcessHead. Esta referência específica aponta para o início da lista de processos, permitindo a listagem de todos os processos, o que é fundamental para uma análise completa da memória.

OS Information

bash
#vol3 has a plugin to give OS information (note that imageinfo from vol2 will give you OS info)
./vol.py -f file.dmp windows.info.Info

O plugin banners.Banners pode ser usado no vol3 para tentar encontrar banners linux no dump.

Hashes/Senhas

Extraia hashes SAM, credenciais em cache de domínio e segredos lsa.

bash
./vol.py -f file.dmp windows.hashdump.Hashdump #Grab common windows hashes (SAM+SYSTEM)
./vol.py -f file.dmp windows.cachedump.Cachedump #Grab domain cache hashes inside the registry
./vol.py -f file.dmp windows.lsadump.Lsadump #Grab lsa secrets

Dump de Memória

O dump de memória de um processo irá extrair tudo do estado atual do processo. O módulo procdump irá apenas extrair o código.

volatility -f file.dmp --profile=Win7SP1x86 memdump -p 2168 -D conhost/

Processos

Listar processos

Tente encontrar processos suspeitos (pelo nome) ou inesperados processos filhos (por exemplo, um cmd.exe como filho de iexplorer.exe).
Pode ser interessante comparar o resultado do pslist com o do psscan para identificar processos ocultos.

bash
python3 vol.py -f file.dmp windows.pstree.PsTree # Get processes tree (not hidden)
python3 vol.py -f file.dmp windows.pslist.PsList # Get process list (EPROCESS)
python3 vol.py -f file.dmp windows.psscan.PsScan # Get hidden process list(malware)

Dump proc

bash
./vol.py -f file.dmp windows.dumpfiles.DumpFiles --pid <pid> #Dump the .exe and dlls of the process in the current directory

Linha de comando

Algo suspeito foi executado?

bash
python3 vol.py -f file.dmp windows.cmdline.CmdLine #Display process command-line arguments

Os comandos executados no cmd.exe são gerenciados pelo conhost.exe (ou csrss.exe em sistemas anteriores ao Windows 7). Isso significa que, se cmd.exe for encerrado por um atacante antes que um dump de memória seja obtido, ainda é possível recuperar o histórico de comandos da sessão a partir da memória do conhost.exe. Para fazer isso, se uma atividade incomum for detectada dentro dos módulos do console, a memória do processo associado conhost.exe deve ser despejada. Em seguida, ao procurar por strings dentro desse dump, linhas de comando usadas na sessão podem potencialmente ser extraídas.

Ambiente

Obtenha as variáveis de ambiente de cada processo em execução. Pode haver alguns valores interessantes.

bash
python3 vol.py -f file.dmp windows.envars.Envars [--pid <pid>] #Display process environment variables

Privilégios de token

Verifique os tokens de privilégios em serviços inesperados.
Pode ser interessante listar os processos que usam algum token privilegiado.

bash
#Get enabled privileges of some processes
python3 vol.py -f file.dmp windows.privileges.Privs [--pid <pid>]
#Get all processes with interesting privileges
python3 vol.py -f file.dmp windows.privileges.Privs | grep "SeImpersonatePrivilege\|SeAssignPrimaryPrivilege\|SeTcbPrivilege\|SeBackupPrivilege\|SeRestorePrivilege\|SeCreateTokenPrivilege\|SeLoadDriverPrivilege\|SeTakeOwnershipPrivilege\|SeDebugPrivilege"

SIDs

Verifique cada SSID pertencente a um processo.
Pode ser interessante listar os processos que utilizam um SID de privilégios (e os processos que utilizam algum SID de serviço).

bash
./vol.py -f file.dmp windows.getsids.GetSIDs [--pid <pid>] #Get SIDs of processes
./vol.py -f file.dmp windows.getservicesids.GetServiceSIDs #Get the SID of services

Handles

Útil saber a quais outros arquivos, chaves, threads, processos... um processo tem um handle (abriu)

bash
vol.py -f file.dmp windows.handles.Handles [--pid <pid>]

DLLs

bash
./vol.py -f file.dmp windows.dlllist.DllList [--pid <pid>] #List dlls used by each
./vol.py -f file.dmp windows.dumpfiles.DumpFiles --pid <pid> #Dump the .exe and dlls of the process in the current directory process

Strings por processos

Volatility nos permite verificar a qual processo uma string pertence.

bash
strings file.dmp > /tmp/strings.txt
./vol.py -f /tmp/file.dmp windows.strings.Strings --strings-file /tmp/strings.txt

Ele também permite buscar por strings dentro de um processo usando o módulo yarascan:

bash
./vol.py -f file.dmp windows.vadyarascan.VadYaraScan --yara-rules "https://" --pid 3692 3840 3976 3312 3084 2784
./vol.py -f file.dmp yarascan.YaraScan --yara-rules "https://"

UserAssist

Windows mantém um registro dos programas que você executa usando um recurso no registro chamado UserAssist keys. Essas chaves registram quantas vezes cada programa é executado e quando foi executado pela última vez.

bash
./vol.py -f file.dmp windows.registry.userassist.UserAssist

Serviços

bash
./vol.py -f file.dmp windows.svcscan.SvcScan #List services
./vol.py -f file.dmp windows.getservicesids.GetServiceSIDs #Get the SID of services

Rede

bash
./vol.py -f file.dmp windows.netscan.NetScan
#For network info of linux use volatility2

Registro hive

Imprimir hives disponíveis

bash
./vol.py -f file.dmp windows.registry.hivelist.HiveList #List roots
./vol.py -f file.dmp windows.registry.printkey.PrintKey #List roots and get initial subkeys

Obter um valor

bash
./vol.py -f file.dmp windows.registry.printkey.PrintKey --key "Software\Microsoft\Windows NT\CurrentVersion"

Dump

bash
#Dump a hive
volatility --profile=Win7SP1x86_23418 hivedump -o 0x9aad6148 -f file.dmp #Offset extracted by hivelist
#Dump all hives
volatility --profile=Win7SP1x86_23418 hivedump -f file.dmp

Sistema de Arquivos

Montar

bash
#See vol2

Escanear/dump

bash
./vol.py -f file.dmp windows.filescan.FileScan #Scan for files inside the dump
./vol.py -f file.dmp windows.dumpfiles.DumpFiles --physaddr <0xAAAAA> #Offset from previous command

Tabela de Arquivos Mestre

bash
# I couldn't find any plugin to extract this information in volatility3

{{#endtab}}

{{#tab name="vol2"}}

bash
volatility --profile=Win7SP1x86_23418 mftparser -f file.dmp

{{#endtab}} {{#endtabs}}

O sistema de arquivos NTFS utiliza um componente crítico conhecido como a tabela de arquivos mestre (MFT). Esta tabela inclui pelo menos uma entrada para cada arquivo em um volume, cobrindo também a própria MFT. Detalhes vitais sobre cada arquivo, como tamanho, carimbos de data/hora, permissões e dados reais, estão encapsulados dentro das entradas da MFT ou em áreas externas à MFT, mas referenciadas por essas entradas. Mais detalhes podem ser encontrados na documentação oficial.

Chaves/Certificados SSL

bash
#vol3 allows to search for certificates inside the registry
./vol.py -f file.dmp windows.registry.certificates.Certificates

Malware

bash
./vol.py -f file.dmp windows.malfind.Malfind [--dump] #Find hidden and injected code, [dump each suspicious section]
#Malfind will search for suspicious structures related to malware
./vol.py -f file.dmp windows.driverirp.DriverIrp #Driver IRP hook detection
./vol.py -f file.dmp windows.ssdt.SSDT #Check system call address from unexpected addresses

./vol.py -f file.dmp linux.check_afinfo.Check_afinfo #Verifies the operation function pointers of network protocols
./vol.py -f file.dmp linux.check_creds.Check_creds #Checks if any processes are sharing credential structures
./vol.py -f file.dmp linux.check_idt.Check_idt #Checks if the IDT has been altered
./vol.py -f file.dmp linux.check_syscall.Check_syscall #Check system call table for hooks
./vol.py -f file.dmp linux.check_modules.Check_modules #Compares module list to sysfs info, if available
./vol.py -f file.dmp linux.tty_check.tty_check #Checks tty devices for hooks

{{#endtab}}

{{#tab name="vol2"}}

bash
volatility --profile=Win7SP1x86_23418 -f file.dmp malfind [-D /tmp] #Find hidden and injected code [dump each suspicious section]
volatility --profile=Win7SP1x86_23418 -f file.dmp apihooks #Detect API hooks in process and kernel memory
volatility --profile=Win7SP1x86_23418 -f file.dmp driverirp #Driver IRP hook detection
volatility --profile=Win7SP1x86_23418 -f file.dmp ssdt #Check system call address from unexpected addresses

volatility --profile=SomeLinux -f file.dmp linux_check_afinfo
volatility --profile=SomeLinux -f file.dmp linux_check_creds
volatility --profile=SomeLinux -f file.dmp linux_check_fop
volatility --profile=SomeLinux -f file.dmp linux_check_idt
volatility --profile=SomeLinux -f file.dmp linux_check_syscall
volatility --profile=SomeLinux -f file.dmp linux_check_modules
volatility --profile=SomeLinux -f file.dmp linux_check_tty
volatility --profile=SomeLinux -f file.dmp linux_keyboard_notifiers #Keyloggers

{{#endtab}} {{#endtabs}}

Escaneando com yara

Use este script para baixar e mesclar todas as regras de malware yara do github: https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9
Crie o diretório rules e execute-o. Isso criará um arquivo chamado malware_rules.yar que contém todas as regras yara para malware.

bash
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
mkdir rules
python malware_yara_rules.py
#Only Windows
./vol.py -f file.dmp windows.vadyarascan.VadYaraScan --yara-file /tmp/malware_rules.yar
#All
./vol.py -f file.dmp yarascan.YaraScan --yara-file /tmp/malware_rules.yar

MISC

Plugins externos

Se você quiser usar plugins externos, certifique-se de que as pastas relacionadas aos plugins sejam o primeiro parâmetro utilizado.

bash
./vol.py --plugin-dirs "/tmp/plugins/" [...]

Autoruns

Baixe em https://github.com/tomchop/volatility-autoruns

volatility --plugins=volatility-autoruns/ --profile=WinXPSP2x86 -f file.dmp autoruns

Mutexes

./vol.py -f file.dmp windows.mutantscan.MutantScan
bash
./vol.py -f file.dmp windows.symlinkscan.SymlinkScan

{{#endtab}}

{{#tab name="vol2"}}

bash
volatility --profile=Win7SP1x86_23418 -f file.dmp symlinkscan

{{#endtab}} {{#endtabs}}

Bash

É possível ler a partir da memória o histórico do bash. Você também poderia despejar o arquivo .bash_history, mas ele foi desativado, você ficará feliz em saber que pode usar este módulo de volatilidade.

./vol.py -f file.dmp linux.bash.Bash

Linha do Tempo

bash
./vol.py -f file.dmp timeLiner.TimeLiner

Drivers

./vol.py -f file.dmp windows.driverscan.DriverScan

Obter área de transferência

bash
#Just vol2
volatility --profile=Win7SP1x86_23418 clipboard -f file.dmp

Obter histórico do IE

bash
#Just vol2
volatility --profile=Win7SP1x86_23418 iehistory -f file.dmp

Obter texto do notepad

bash
#Just vol2
volatility --profile=Win7SP1x86_23418 notepad -f file.dmp

Captura de Tela

bash
#Just vol2
volatility --profile=Win7SP1x86_23418 screenshot -f file.dmp

Master Boot Record (MBR)

bash
volatility --profile=Win7SP1x86_23418 mbrparser -f file.dmp

O Master Boot Record (MBR) desempenha um papel crucial na gestão das partições lógicas de um meio de armazenamento, que são estruturadas com diferentes file systems. Ele não apenas contém informações sobre o layout das partições, mas também inclui código executável que atua como um carregador de inicialização. Este carregador de inicialização inicia diretamente o processo de carregamento de segunda fase do SO (veja second-stage boot loader) ou trabalha em harmonia com o volume boot record (VBR) de cada partição. Para um conhecimento mais aprofundado, consulte a página do MBR na Wikipedia.

Referências

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks