Visualizzazione post con etichetta capstone. Mostra tutti i post
Visualizzazione post con etichetta capstone. Mostra tutti i post

giovedì 7 marzo 2019

Kali Linux: Utilizzare Sandsifter per il fuzzing dei processori x86

Il fuzzing è una tecnica automatica per testare i software. La tecnica consiste nel fornire dati causali, non validi o imprevisti come input di un programma per computer e analizzarne il suo comportamento al fine di individuare errori o falle di sicurezza. 
Sandsifter applica tale tecnica nella verifica dei processori x86 generando sistematicamente codice macchina attingendo dal set di istruzioni del processore e monitorando l'esecuzione di tale codice alla ricerca di istruzioni nascoste e bug hardware. Grazie a Sandsifter sono state scoperte istruzioni segrete sui processori dei principali produttori inoltre è stato possibile scoprire bug software negli assemblatori/disassemblatori, emulatori, negli hypervisor e persino bug hardware in alcuni modelli di processori x86.

In questo articolo verranno illustrati i passaggi per installare ed eseguire Sandsifter sul proprio sistema utilizzando Kali Linux. Prima di proseguire con l'installazione ed esecuzione di Sandsifter è opportuno aggiornare i pacchetti installati e la propria distribuzione di Kali Linux eseguendo da terminale il seguente comando

apt-get update && apt-get upgrade

Aggiornamento Kali Linux
FIG 1 - Aggiornamento Kali Linux



Installazione Sandsifter

Per poter installare e utilizzare Sandsifter è necessario prima installare Capstone, un Framework necessario per disassemblare. Da terminale digitare i seguenti comandi
apt-get install libcapstone3 libcapstone-dev
pip install capstone
Eseguire il download di Sandsifter con il comando
git clone https://github.com/xoreaxeaxeax/sandsifter.git
Download di sandsifter
FIG 2 - Download di sandsifter

Accedere alla cartella di sandsifter
cd sandsifter
Prima di poter compilare è necessario andare a modificare il file Makefile. Digitare il comando
leafpad Makefile
Bisogna aggiungere la stringa -no-pie in modo che il contenuto del file diventi
all: injector

injector: injector.o
 $(CC) $(CFLAGS) $< -O3 -Wall -no-pie -l:libcapstone.a -o $@ -pthread

%.o: %.c
 $(CC) $(CFLAGS) -c $< -o $@ -Wall

clean:
rm *.o injector
Sandsifter makefile
FIG 3 - Sandsifter makefile

Salvare il file quindi compilare il codice eseguendo il comando
make


Esecuzione di Sandsifter

Per eseguire una verifica di base del proprio processore lanciare il comando
./sifter.py --unk --dis --len --sync --tick -- -P1 -t
Sandsifter
FIG 4 - Sandsifter

La schermata della verifica presenta 2 sezioni: in quella superiore viene mostrata l'istruzione che Sandsifter sta verificando mentre in quella inferiore vengono riportati gli errori/bug trovati. La scansione può richiedere da poche ore a più giorni per essere portata a termine a seconda della velocità e della complessità del processore che si sta analizzando è può trovare milioni di istruzioni non documentate.

Quando la scansione è completa sarà possibile riassumere i risultati tramite il comando
./summarize.py data/log

il comando provvede anche ad assegnare una categoria e un livello di importanza al problema trovato. Le categorie principali sono 3:
  • Bug Software
  • Bug Hardware
  • Istruzioni non documentate

Premendo 'Q' si esce dall'applicazione e viene prodotto un resoconto in formato testo della scansione del sistema.
Premendo 'M' durante l'esecuzione di Sandsifter viene modificata la modalità di ricerca (brute force, randomized fuzzing e tunneled fuzzing) mentre premendo il tasto 'P' è possibile mettere in pausa (o riprendere dalla pausa) il processo di ricerca.



Flag utilizzabili in Sandsifter


--len
Cerca le differenze di lunghezza in tutte le istruzioni. Ricerca istruzioni che si comportano in maniera diversa da quanto si aspetta il disassembler o che non esistono.

--dis
Come per il flag --len ma la ricerca viene eseguita solo per le istruzioni valide.

--unk
Ricerca le istruzioni sconosciute, istruzioni che anche se non riconosciute dal disassembler vengono eseguite con successo.

--ill
E' l'opposto del flag --unk. Ricerca istruzioni che non vengono eseguite correttamente ma riconosciute dal disassembler

--tick
Scrive periodicamente l'istruzione corrente sul disco.

--save
Salva i progressi della ricerca in uscita.

--resume
Riprende la ricerca dall'ultimo stato salvato.

--sync
Scrive i risultati della ricerca sul disco man mano che vengono trovati.

--low-mem
Non memorizza i risultati in memoria.




Injector utilizzabili in Sandsifter


-b
Mode: brute force. In tale modalità la ricerca prova le istruzioni in modo incrementale, fino a una lunghezza specificata dall'utente. Generalmente è più lenta ricerca casuale.

-r
Mode: randomized fuzzing.

-t
Mode: tunneled fuzzing.

-d
Mode: externally directed fuzzing.

-R
Raw output mode.

-T
Text output mode.

-x
Scrive periodicamente i progressi su stderr.

-0
Consente dereferenza nulla.

-D
Consente prefissi duplicati.

-N
Non consente nx bit.

-s seed
Nella ricerca random, il valore del seed.

-B brute_depth
Nella modalità brute force specifica la massima profondità della ricerca.

-P max_prefix
Numero massimo di prefissi da ricercare.

-i instruction
Istruzione da cui partire per la ricerca (inclusiva).

-e instruction
Istruzione a cui terminare la ricerca.

-c core
Core su cui eseguire la ricerca.

-X blacklist
Mette in blacklist l'istruzione specificata.

-j jobs
Numero simultaneo di job eseguiti contemporaneamente.

-l range_bytes
Numero di byte di istruzione di base in ogni sottogruppo.