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.
One comment