Come campionare la memoria in ambinete Linux

Linux

In ambiente Linux in passato la campionatura della memoria era un processo relativamente semplice in quanto essa era accessibile come una normale periferica all’interno del filesystem /dev e nello specifico nei file /dev/mem e /dev/kmem. Il primo device dava accesso in lettura e scrittura da root allo spazio di memoria delle applicazioni. Il secondo device dava accesso in lettura e scrittura alla memoria del kernel. Naturalmente questo accesso diretto allo spazio di memoria veniva sfruttato dagli attaccanti per iniettare codice malevole ovunque, anche nel kernel stesso. Naturalmente però questo rendeva anche molto facile l’acquisizione della memoria. Dalla versione 2.6 del kernel questi due device sono stati eliminati ed attualmente l’unico modo per accedere alla ram via software è quello di modulo o di un driver da caricare nel kernel che potesse effettuare la copia dell’intera ram.

Preparazione

Ambiente di test. Come già detto il modulo del kernel deve essere compilato in un ambiente di test. Per esempio è possibile creare una macchina virtuale tecnicamente identica alla macchina infetta in modo da avere un modulo perfettamente compatibile. Dove salvare il di acquisizione. Bisogna avere a disposizione una penna usb o una microsd o qualunque altro storage dove salvare l’acquisizione della ram. È sempre meglio effettuare il dump direttamente sullo storage separato e non sul disco della macchina infetta.

LiMe

LiME è il primo tool che prenderemo in considerazione ed è infatti un modulo per il kernel. Ovviamente si tratta di un software opensource ed è possibile trovarlo su github. Si possono scaricare i sorgenti e compilarlo ma spesso ogni distribuzione ha le sue peculiarità per questo è preferibile, se disponibile, scaricare ed installare il relativo pacchetto. In ambiente ubuntu/debian ciò è possibile con il seguente comando:

$ sudo apt install -y lime-forensics-dkms

A questo punto bisogno individuare il path di installazione del modulo e copiarlo su una memory card o sul device su cui poi fare l’acquisizione del campione. Il modulo di solito ha il nome lime-$versione_kernel.ko ed i sorgenti si trovano sotto /usr/src/lime-forensics. Ecco come è possibile effettuare il caricamento del modulo LiME ed effettuare la scrittura della ram su file oppure su rete.

A questo punto passiamo sulla macchina infetta per effettuare il dump mediante il caricamento del driver. Ipotizziamo che il modulo si trovi su una sd card montata su /media/data/ e sui effettueremo anche la scrittura del campione di memoria.

Scrittura campione su file

Ecco di seguito il comando di caricamento del driver con gli argomenti per l’acquisizione su file:

$ cd /media/data/
$ sudo -i 
# insmod ./lime-6.2.5-2-generic.ko "path=./memory_sample-6.2.5_FILE.lime format=lime digest=sha512"
  • insmod è naturalmente il comando per il caricamento del modulo
  • lime-6.2.5-2-generic.ko è il vero e proprio modulo
  • path=./memory_sample-6.2.5_FILE.lime questo è il primo argomento e comprende la direttiva del percorso dove salvare il campione di ram e il nome del file stesso.
  • format=lime questo è il formato del file di campione, si può anche optare per raw
  • digest=sha512 questo è l’hash, del file del campione
Invio campione su rete

Mentre di seguito effettueremo il campionamento della ram ma anziché scriverlo su file lo invieremo su rete. Quindi avremo la macchina infetta-inviante e una macchina pulita-ricevente.

infetta-inviante $ cd /media/data
infetta-inviante $ sudo -i 
infetta-inviante # insemod ./lime-6.2.5-2-generic.ko "path=tcp:8888 format=lime"

mentre sulla macchina pulita-ricevente lanceremo l’utility netcat in questo modo:

pulita-ricevente $ nc 192.168.1.2 8888 > memory_sample-6.2.5_TCP.lime

AVML

AVML (Acquire Volatile Memory for Linux) è un altro tool di acquisizione opensource prodotto da Microsoft. AVML è un software che gira in userland che offre alcuni vantaggi rispetto a LiME:

  • è stato scritto in Rust, un linguaggio di programmazione particolarmente robusto e sicuro. Questo offre una minore superficie d’attacco nel caso ci si trovi di fronte ad una tecnologia infettiva particolarmente aggressiva e strutturata.
  • Girando in userland e compilato staticamente è molto più flessibile e non è necessario tenere in considerazione la distribuzione o la versione del kernel. Le distribuzioni testate sono Ubuntu, Centos, Debian, RedHat, Oracle Linux, CBL-Mariner (una distribuzione linux opensource prodatta da Microsoft).
  • Il formato utilizzato è lo stesso di LiME per cui non ci sono problemi per l’analisi mediante volatility3 oppure qualsiasi altro framework per l’analisi della ram compatibile con LiME.
  • Supporta compressione di tipo Snappy sviluppata da google.
Sorgenti di acquisizione

AVML supporta tre sorgenti di acquisizione della RAM che sono:

  • /dev/crash
  • /dev/kcore
  • /dev/mem
Sintassi per l’acquisizione

Di seguito alcuni esempi che illustrano l’uso della linea di comando con AVML. Acquisizione semplice su FILE:

$ sudo ./avml /media/data/memory_sample-6.2.5_FILE_AVML.lime 

Aggiungiamo la compressione snappy:

$ sudo ./avml --compress /media/data/memory_sample-6.2.5_FILE_AVML.lime.snappy 

[]:

Tags: