Exploiting – Fuzzing parte 1

Le basi

Il “Fuzz Testing” è una tecnica di exploiting relativa all’invio di caratteri random come input alla richiesta di un applicativo.

Tale applicativo può ricevere i dati dall’utente ad inserimento di credenziali per ottenere accesso, nell’aprire un file o nell’inserire dati in ram; l’applicativo può essere tanto una web application scritta in perl, php, Javascript o una applicativa stand alone scritta in C, C++ e così via.

Un esempio di Fuzzing potrebbe essere una web form di un sito di e-commerce che in una POST invia al server valori predefiniti: 0 in caso di pagamento con Carta di Credito e 1 in caso di pagamento tramite PayPal. Volendo exploitare tale applicazione e’ possibile ricostruire la stringa inviata come POST ed al posto di 0 o 1 inserire un qualisasi altro intero, ad esempio 100. Qualora l’applicazione non sia stata scritta correttamente tale azione potrebbe bloccare o addirittura provocare l’uscita con errore dall’applicazione stessa.

Vediamo ora un semplice programma in C scritto in modo da permettere un exploit di tipo Fuzzing:

#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
bdcode(argv[1]);
return 0;
}
int bdcode(char *bdinput)
{
char stuff[200];
strcpy(stuff, bdinput);
printf(“Hai inserito i seguenti caratteri: %s\n”,stuff);
return 0;
}

Compiliamo a questo punto il programma con gcc aggiungendo come argomento –fno-stack-protector: questo perché i moderni sistemi operativi e compilatori hanno iniziato ad implementare soluzioni per evitare il buffer overflow che guarda caso è quanto stiamo tentando di ottenere.

Il comando da lanciare sarà quindi “gcc –o fuzzer –fno-stack-protector fuzzer.c

Osserviamo ora la seguente linea di codice: “char stuff[200];”: in questa riga allochiamo una dimensione predeterminata alla variabile stuff.

Proviamo ora a lanciare il programma appena compilato passando prima una stringa inferiore ai 200 caratteri e poi una stringa superiore ai 200 caratteri; quello che noteremo è che nel secondo caso il programma produrrà una eccezione di tipo “Segmentation Fault”, questo perché’ non abbiamo inserito in fase di programmazione una corretta gestione delle eccezioni.

Image

Vediamo ora come è possibile automatizzare con un semplice shell script un exploit di tipo Fuzzing; scriviamo il seguente bash script:

# !bin/bash
CONTATORE=1
STRINGA=A
INCREMENTO=A
echo “Quante lettere vuoi provare?”
read CONTATORE
while [ $CONTATORE -ge 1 ]; do
let CONTATORE=CONTATORE-1
STRINGA=”$STRINGA$INCREMENTO”
echo `./fuzzer $STRINGA`
done

Basta ora lanciare lo script, inserire un numero di caratteri superiore a 200 per vedere l’esito: lo script oltre i 207 caratteri smetterà di produrre alcun output.

Qui termina questa breve introduzione al Fuzzing; seguiranno a breve articoli specifici su tool di Fuzzing.

Leave a Reply

Your email address will not be published. Required fields are marked *