Computação forense – Aquisição de dados (continuação)

Neste artigo darei continuidade ao assunto no artigo anterior que se trata de aquisição de dados, agora vou mostrar ferramentas para a aquisição de memória volátil, ou seja, memória RAM.

A aquisição de memória RAM é muito importante em muitos casos, um exemplo pode ser um processo que apresente um comportamento estranho ou fora do comum, um malware disfarçando-se de um processo comum no sistema, o analista de malware pode querer fazer uma análise profunda ao malware para saber o tipo de tráfego que o mesmo enviou pela rede, ou ainda para onde o mesmo enviou tais informações. Este tipo de analise é mais difícil de se fazer, então nestes casos toda a informação que possa ser analisada é útil.

Nota: O facto de se fazer a recolha do estado de memória implica na execução de programas, isto é algo que se deve ter em atenção pelo facto de a execução de um programa implicar em alterações na mesma memória que se deseja capturar.

Algumas ferramentas permitem que se faça a aquisição da memória RAM, no entanto neste artigo vou recomendar duas que eu tive a oportunidade de testar e comprovar que executam de forma esperada.

Dump It

O Dump It é uma ferramenta para o sistema operativo Windows que permite que se capture o estado actual da memória de um sistema para analise posterior.

É uma ferramenta simples e que pode ser executada para capturar o estado actual da memória e salvar o mesmo em uma memória externa como por exemplo uma pen drive ou dispositivo de armazenamento secundário.

Abaixo é possível ver a ferramenta em execução e o arquivo criado pelo mesmo.

LiME

O LiME é uma ferramenta desenvolvida para sistemas operativos da família Linux. O LiME é um módulo do kernel que deve ser carregado no sistema operativo que se deseja capturar o estado actual. O código fonte pode ser obtido neste link.

Após o download deve-se descomprimir o arquivo, após descomprimir o arquivo acesse o directório criado e dentro do mesmo acesse o directório “src” que contém o código fonte do modulo do kernel, de seguida devemos compilar o código e por último carregamos o módulo no kernel em funcionamento e capturamos a memória.

# Download o código fonte
rickinho@:~$ wget https://github.com/504ensicsLabs/LiME/archive/master.zip
--2017-11-05 04:58:21-- https://github.com/504ensicsLabs/LiME/archive/master.zip
Resolving github.com (github.com)... 192.30.253.113, 192.30.253.112
Connecting to github.com (github.com)|192.30.253.113|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/504ensicsLabs/LiME/zip/master [following]
--2017-11-05 04:58:21-- https://codeload.github.com/504ensicsLabs/LiME/zip/master
Resolving codeload.github.com (codeload.github.com)... 192.30.253.121, 192.30.253.120
Connecting to codeload.github.com (codeload.github.com)|192.30.253.121|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/zip]
Saving to: ‘master.zip’

master.zip [ <=> ] 21.10K --.-KB/s in 0.08s

2017-11-05 04:58:22 (254 KB/s) - ‘master.zip’ saved [21603]

# Descomprimir o arquivo
rickinho@:~$ unzip master.zip 
Archive: master.zip
c86e833e55d5a1eed272ae44e660fc8895defce1
 creating: LiME-master/
 inflating: LiME-master/.gitignore 
 inflating: LiME-master/LICENSE 
 inflating: LiME-master/README.md 
 creating: LiME-master/doc/
 inflating: LiME-master/doc/README.md 
 creating: LiME-master/src/
 inflating: LiME-master/src/Makefile 
 inflating: LiME-master/src/Makefile.sample 
 inflating: LiME-master/src/disk.c 
 inflating: LiME-master/src/lime.h 
 inflating: LiME-master/src/main.c 
 inflating: LiME-master/src/tcp.c

# Acessar o directorio com o código fonte
rickinho@:~$ cd LiME-master/src/

# Compilar o código fonte
rickinho@:~/LiME-master/src$ make
make -C /lib/modules/4.4.0-98-generic/build M="/home/rickinho/LiME-master/src" modules
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-98-generic'
 CC [M] /home/rickinho/LiME-master/src/tcp.o
 CC [M] /home/rickinho/LiME-master/src/disk.o
 CC [M] /home/rickinho/LiME-master/src/main.o
 LD [M] /home/rickinho/LiME-master/src/lime.o
 Building modules, stage 2.
 MODPOST 1 modules
 CC /home/rickinho/LiME-master/src/lime.mod.o
 LD [M] /home/rickinho/LiME-master/src/lime.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-98-generic'
strip --strip-unneeded lime.ko
mv lime.ko lime-4.4.0-98-generic.ko

# Carregar o modulo no kernel e escolher o ficheiro de output e o formato da imagem
rickinho@:~/LiME-master/src$ sudo insmod lime-4.4.0-98-generic.ko "path=memory.lime format=lime"

# Confirmação da existencia do arquivo desejado
rickinho@:~/LiME-master/src$ ls
disk.c lime.mod.c main.o modules.order
disk.o lime.mod.o Makefile Module.symvers
lime-4.4.0-98-generic.ko lime.o Makefile.sample tcp.c
lime.h main.c memory.lime tcp.o

Linpmem

Linpmem é uma ferramenta que se encontra dentro do framework Rekall que pode ser utilizado para analise de dump de memória. O Rekall foi criado como um fork do Volatility, um outro framework para analise de dumpe de memória muito utilizado por profissionais da área. O Rekall tenta resolver alguns dos problemas e limitações do Volatility. Dentro do Rekall podemos encontrar o utilitário “linpmem” que permite fazer um dump de memória para posterior analise com o Rekall.

Para utilizar o Linpmem primeiro devemos fazer download do executável, de seguida mudar as permissões do executável para poder executar o mesmo e por ultimo podemos executar o mesmo e indicar com a opção “-o” o nome do ficheiro de destino do dump da memória.

# Download do executável
rickinho@vitima:~$ wget https://github.com/google/rekall/releases/download/v1.5.1/linpmem-2.1.post4
--2017-11-05 05:25:03-- https://github.com/google/rekall/releases/download/v1.5.1/linpmem-2.1.post4
Resolving github.com (github.com)... 192.30.253.113, 192.30.253.112
Connecting to github.com (github.com)|192.30.253.113|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://github-production-release-asset-2e65be.s3.amazonaws.com/19864741/061a2f04-210d-11e6-9598-b9f50db37ef5?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20171105%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20171105T042403Z&X-Amz-Expires=300&X-Amz-Signature=d9b24a44992492d4366b01af12b8cb781c48a80e391f9afa4c5b82eecc605e85&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dlinpmem-2.1.post4&response-content-type=application%2Foctet-stream [following]
--2017-11-05 05:25:04-- https://github-production-release-asset-2e65be.s3.amazonaws.com/19864741/061a2f04-210d-11e6-9598-b9f50db37ef5?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20171105%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20171105T042403Z&X-Amz-Expires=300&X-Amz-Signature=d9b24a44992492d4366b01af12b8cb781c48a80e391f9afa4c5b82eecc605e85&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dlinpmem-2.1.post4&response-content-type=application%2Foctet-stream
Resolving github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)... 52.216.19.56
Connecting to github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)|52.216.19.56|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7272696 (6.9M) [application/octet-stream]
Saving to: ‘linpmem-2.1.post4.1’

linpmem-2.1.post4.1 100%[===================>] 6.94M 3.51MB/s in 2.0s

2017-11-05 05:25:06 (3.51 MB/s) - ‘linpmem-2.1.post4.1’ saved [7272696/7272696]

# Atibuição da permisão de execução
rickinho@vitima:~$ chmod +x linpmem-2.1.post4

# Execução da ferramenta com a opção a especificar o ficheiro de destino
rickinho@vitima:~$ sudo ./linpmem-2.1.post4 -o memory.aff4r 
Imaging memory
Creating output AFF4 ZipFile.
 Reading 0x8000 0MiB / 511MiB 0MiB/s
 Reading 0xa18000 10MiB / 511MiB 40MiB/s
 Reading 0x12a0000 18MiB / 511MiB 33MiB/s
 Reading 0x1798000 23MiB / 511MiB 19MiB/s
 <...>
 Reading 0x1f760000 503MiB / 511MiB 33MiB/s
 Reading 0x1fda8000 509MiB / 511MiB 24MiB/s
Adding /boot/System.map-4.4.0-59-generic as file:///boot/System.map-4.4.0-59-generic
 <...>
Adding /boot/System.map-4.4.0-98-generic as file:///boot/System.map-4.4.0-98-generic
Adding /boot/abi-4.4.0-59-generic as file:///boot/abi-4.4.0-59-generic
 <...>
Adding /boot/abi-4.4.0-98-generic as file:///boot/abi-4.4.0-98-generic
Adding /boot/config-4.4.0-59-generic as file:///boot/config-4.4.0-59-generic
 <...>
Adding /boot/config-4.4.0-98-generic as file:///boot/config-4.4.0-98-generic
Adding /boot/grub/ as file:///boot/grub/
E1105 05:28:12.230192 2730 aff4_directory.cc:105] Unable to find storage for AFF4Directory file:///boot/grub/
E1105 05:28:12.230980 2730 aff4_imager_utils.cc:259] Unable to find file:///boot/grub/
Adding /boot/initrd.img-4.4.0-59-generic as file:///boot/initrd.img-4.4.0-59-generic
 Reading 0x8000 0MiB / 36MiB 0MiB/s
 Reading 0x470000 4MiB / 36MiB 17MiB/s
 Reading 0x8d0000 8MiB / 36MiB 17MiB/s
 <...>
 Reading 0x2298000 34MiB / 36MiB 6MiB/s
Adding /boot/initrd.img-4.4.0-70-generic as file:///boot/initrd.img-4.4.0-70-generic
 Reading 0x8000 0MiB / 36MiB 0MiB/s
 Reading 0x4a8000 4MiB / 36MiB 18MiB/s
 <...>
 Reading 0x2308000 35MiB / 36MiB 7MiB/s
Adding /boot/initrd.img-4.4.0-83-generic as file:///boot/initrd.img-4.4.0-83-generic
 Reading 0x8000 0MiB / 36MiB 0MiB/s
 Reading 0x498000 4MiB / 36MiB 18MiB/s
 <...>
 Reading 0x22d8000 34MiB / 36MiB 7MiB/s
Adding /boot/initrd.img-4.4.0-87-generic as file:///boot/initrd.img-4.4.0-87-generic
 Reading 0x8000 0MiB / 36MiB 0MiB/s
 Reading 0x478000 4MiB / 36MiB 17MiB/s
 <...>
 Reading 0x20c8000 32MiB / 36MiB 18MiB/s
Adding /boot/initrd.img-4.4.0-92-generic as file:///boot/initrd.img-4.4.0-92-generic
 Reading 0x8000 0MiB / 36MiB 0MiB/s
 <...>
 Reading 0x21a0000 33MiB / 36MiB 14MiB/s
Adding /boot/initrd.img-4.4.0-93-generic as file:///boot/initrd.img-4.4.0-93-generic
 Reading 0x8000 0MiB / 36MiB 0MiB/s
 <...>
 Reading 0x2008000 32MiB / 36MiB 13MiB/s
Adding /boot/initrd.img-4.4.0-97-generic as file:///boot/initrd.img-4.4.0-97-generic
 Reading 0x8000 0MiB / 36MiB 0MiB/s
 <...>
 Reading 0x2308000 35MiB / 36MiB 14MiB/s
Adding /boot/initrd.img-4.4.0-98-generic as file:///boot/initrd.img-4.4.0-98-generic
 Reading 0x8000 0MiB / 36MiB 0MiB/s
 <...>
 Reading 0x2138000 33MiB / 36MiB 3MiB/s
Adding /boot/vmlinuz-4.4.0-59-generic as file:///boot/vmlinuz-4.4.0-59-generic
<...>
Adding /boot/vmlinuz-4.4.0-98-generic as file:///boot/vmlinuz-4.4.0-98-generic

# COnfirmação da criação do ficheiro com o dump de memória
rickinho@vitima:~$ ls
memory.aff4r volatility-2.6.zip
LiME rekall-master volatility-master
linpmem-2.1.post4 rekall-master.zip

Após a recolha do dump de memória podemos proceder com a análise do mesmo, neste artigo irei apresentar um simples exemplo utilizando do framework Rekall.

Rekall

Conforme mencionado acima, o Rekall é um framework para analise de dump de memória e que é desenvolvido e mantido pela Google. O Rekall utiliza o conceito de perfis para analisar cada dump de memória porque cada sistema operativo implementa esta função de forma diferente. Felizmente existem diversos perfis criados e mantidos pela equipa que desenvolve o Rekall para os sistemas operativos da família windows, desde que a máquina tenha uma conexão activa a internet o Rekall vai tentar seleccionar automaticamente o perfil correcto para o dump. No Linux no entanto isso não acontece, devido ao rapido ciclo de desenvolvimento do kernel e da grande variedade de distibuições Linux existentes no mercado esta tarefa torna-se muito dificil, felizmente um perfil personalidado pode facilmente ser criado na máquina a ser analisada, isso garante compactibilidade na hora de analisar o dump tendo assim a grantia de que o ficheiro vai ser interpretado de forma correcta.

Para criar um perfil devemos, ainda na maquina a ser analisada, fazer o download do pacote Rekall, extrair o conteudo do arquivo, acessar o directório “tools/Linux” e compilar o novo perfil.

# Download do pacote
rickinho@:vitima~$ wget https://github.com/google/rekall/archive/master.zip
--2017-11-05 05:52:24-- https://github.com/google/rekall/archive/master.zip
Resolving github.com (github.com)... 192.30.253.113, 192.30.253.112
Connecting to github.com (github.com)|192.30.253.113|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/google/rekall/zip/master [following]
--2017-11-05 05:52:24-- https://codeload.github.com/google/rekall/zip/master
Resolving codeload.github.com (codeload.github.com)... 192.30.253.121, 192.30.253.120
Connecting to codeload.github.com (codeload.github.com)|192.30.253.121|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 6626494 (6.3M) [application/zip]
Saving to: ‘master.zip.1’

master.zip.1 100%[===================>] 6.32M 3.26MB/s in 1.9s

2017-11-05 05:52:26 (3.26 MB/s) - ‘master.zip.1’ saved [6626494/6626494]

# Descomprimir o arquivo
rickinho@:vitima~$ unzip master.zip 
Archive: master.zip
c2068a91c1f381a2e2c31c3b5a2e3325be6370bf
 creating: rekall-master/
 extracting: rekall-master/.gitattributes 
 inflating: rekall-master/.gitignore 
 inflating: rekall-master/.gitmodules 
 <...>
 inflating: rekall-master/version.py 
 inflating: rekall-master/version.yaml

# Acessar a pasta tools/linux
rickinho@:vitima~$ cd rekall-master/tools/linux/

# Listagem de conteudo da pasta antes de compilar o perfil
rickinho@:vitima~/rekall-master/tools/linux$ ls
ko_patcher.py lmap Makefile module.c pmem.c README vmcs_layout

# Compilar o perfil
rickinho@:vitima~/rekall-master/tools/linux$ sudo make profile
make -C /usr/src/linux-headers-4.4.0-98-generic CONFIG_DEBUG_INFO=y M=`pwd` modules
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-98-generic'
 CC [M] /home/rickinho/rekall-master/tools/linux/module.o
 CC [M] /home/rickinho/rekall-master/tools/linux/pmem.o
 Building modules, stage 2.
 MODPOST 2 modules
 CC /home/rickinho/rekall-master/tools/linux/module.mod.o
 LD [M] /home/rickinho/rekall-master/tools/linux/module.ko
 CC /home/rickinho/rekall-master/tools/linux/pmem.mod.o
 LD [M] /home/rickinho/rekall-master/tools/linux/pmem.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-98-generic'
cp module.ko module_dwarf.ko
make -C /usr/src/linux-headers-4.4.0-98-generic M=`pwd` modules
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-98-generic'
 CC [M] /home/rickinho/rekall-master/tools/linux/module.o
 CC [M] /home/rickinho/rekall-master/tools/linux/pmem.o
 Building modules, stage 2.
 MODPOST 2 modules
 CC /home/rickinho/rekall-master/tools/linux/module.mod.o
 LD [M] /home/rickinho/rekall-master/tools/linux/module.ko
 CC /home/rickinho/rekall-master/tools/linux/pmem.mod.o
 LD [M] /home/rickinho/rekall-master/tools/linux/pmem.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-98-generic'
cp pmem.ko "pmem-4.4.0-98-generic.ko"
zip "4.4.0-98-generic.zip" module_dwarf.ko /boot/System.map-4.4.0-98-generic /boot/config-4.4.0-98-generic "pmem-4.4.0-98-generic.ko"
 adding: module_dwarf.ko (deflated 65%)
 adding: boot/System.map-4.4.0-98-generic (deflated 79%)
 adding: boot/config-4.4.0-98-generic (deflated 75%)
 adding: pmem-4.4.0-98-generic.ko (deflated 73%)

# Listagem do conteudo da pasata depois de compilar o perfil
rickinho@:vitima~/rekall-master/tools/linux$ ls
4.4.0-98-generic.zip module_dwarf.ko modules.order pmem.mod.c
ko_patcher.py module.ko Module.symvers pmem.mod.o
lmap module.mod.c pmem-4.4.0-98-generic.ko pmem.o
Makefile module.mod.o pmem.c README
module.c module.o pmem.ko vmcs_layout

Após feito este processo podemos transferir ambos arquivos (dump de memória e perfil) para a máquina em que iremos fazer a análise. Nesta maquina iremos converter o perfil de “ZIP” para o formato “JSON” que é interpretado pelo Rekall e de seguida iremos fazer a analise do dump de memória indicando o perfil recem criado.

# Converter o perfil de ZIP pada JSON
rickinho@debian-lenovo:~/MemoryAnalisys$ rekall convert_profile 4.4.0-98-generic.zip 4.4.0-98-generic.json

# Iniciar o rekall indicando o perfil criado na maquina da ser analisada e o dump de memória capturado
rickinho@debian-lenovo:~/MemoryAnalisys$ rekall --profile 4.4.0-98-generic.json -f memory.aff4r

----------------------------------------------------------------------------
The Rekall Digital Forensic/Incident Response framework 1.6.0 (Gotthard).

"We can remember it for you wholesale!"

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License.

See http://www.rekall-forensic.com/docs/Manual/tutorial.html to get started.
----------------------------------------------------------------------------
[1] memory.aff4r 05:06:19> pslist # Usar a funcção pslist para listar todos os processos em execução na máquina naquele momento
-------------------------> pslist()
 obj_offset name pid ppid uid gid dtb start_time binary
-------------- -------------------- ------ ------ ------ ------ -------------- ------------------------ ------
2017-11-05 05:06:21,409:WARNING:rekall.1:mnt_devname has no offset in object vfsmount. Check that vtypes has a concrete definition for it.
0x88001c630000 systemd 1 0 [__unn [__unn 0x1e8d4000 1970-01-01 00:03:27+0000 /lib/systemd/systemd
 amed_1 amed_1 
 1390 1422 
 uid] @ gid] @ 
 0x8800 0x8800 
 1ED4E2 1ED4E2 
 44 48 
0x88001c630e00 kthreadd 2 0 [__unn [__unn 1970-01-01 00:03:27+0000 - 
 amed_1 amed_1 
 1390 1422 
 uid] @ gid] @ 
 0x8800 0x8800 
 1C56CA 1C56CA 
 84 88 
0x88001c631c00 ksoftirqd/0 3 2 [__unn [__unn 1970-01-01 00:03:27+0000 - 
 amed_1 amed_1 
 1390 1422 
 uid] @ gid] @ 
 0x8800 0x8800 
 1C56CB 1C56CB 
 44 48 
0x88001c632a00 kworker/0:0 4 2 [__unn [__unn 1970-01-01 00:03:27+0000 - 
 amed_1 amed_1 
 1390 1422 
 uid] @ gid] @ 
 0x8800 0x8800 
 1C56CC 1C56CC 
 C4 C8 
0x88001c633800 kworker/0:0H 5 2 [__unn [__unn 1970-01-01 00:03:27+0000 - 
 amed_1 amed_1 
 1390 1422 
 uid] @ gid] @ 
 0x8800 0x8800 
 1C56CE 1C56CE 
 44 48 
 <...>
0x88001bb92a00 bash 1575 1114 [__unn [__unn 0x1bae3000 1970-01-01 00:06:22+0000 /bin/bash
 amed_1 amed_1 
 1390 1422 
 uid] @ gid] @ 
 0x8800 0x8800 
 1B9A28 1B9A28 
 44 48 
0x88001635c600 sudo 1599 1575 [__unn [__unn 0x1bb3e000 1970-01-01 00:06:49+0000 /usr/bin/sudo
 amed_1 amed_1 
 1390 1422 
 uid] @ gid] @ 
 0x8800 0x8800 
 1B9FB9 1B9FB9 
 C4 C8 
0x88001635d400 linpmem-2.1.pos 1600 1599 [__unn [__unn 0x1baa5000 1970-01-01 00:06:52+0000 /home/rickinho/linpmem-2.1.post4
 amed_1 amed_1 
 1390 1422 
 uid] @ gid] @ 
 0x8800 0x8800 
 15C260 15C260 
 04 08 
Out<05:06:23> Plugin: pslist (LinuxPsList)
[1] memory.aff4r 05:06:23>

Este foi um pequeno exemplo de cptura e  analise de memória com o Rekall, espero que tenha sido útil. Não se esqueça de ler o artigo anterior, caso ainda não tenha feito.

Nota: Os exemplos apresentado foram feitos em sistemas Linux da familia Debian, para instalar o Rekall nestes sistemas utilize o gestor de pacotes do sistema operativo.

$ sudo apt-get install python-rekall-core rekall-core

Obrigado e até ao proximo artigo.

Compartilhe... :)

Um comentário em “Computação forense – Aquisição de dados (continuação)”

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *