
Systemaufruf-Fuzzing von OpenBSD amd64 mit TriforceAFL (d.h. AFL und QEMU)
Dies ist eine Sammlung von Dateien, die zum Fuzzing von Systemaufrufen von OpenBSD amd64 mit TriforceAFL (d.h. AFL und QEMU) verwendet werden. Dazu benötigen Sie TriforceAFL (https://github.com/nccgroup/TriforceAFL), die FlashRD-2.0-Distribution (http://www.nmedia.net/flashrd/), eine OpenBSD-Maschine, um den Treiber und ein Festplatten-Image zu bauen, sowie eine Linux-Maschine als Host, um den Fuzzer auszuführen (andere Fuzzer-Hosts können ebenfalls funktionieren; wir haben TriforceAFL nur von einem Linux-Host aus ausgeführt, konkret Debian/Ubuntu).
Wir werden auf der OpenBSD-Maschine alles als root erledigen, da diese Maschine nur zum Aufsetzen unserer Umgebung dient. Wenn Sie bereits eine OpenBSD-Maschine haben, können Sie getrost weniger davon als root erledigen. Wenn Sie ein erfahrener OpenBSD-Benutzer sind, wird vieles davon übertrieben ausführlich erscheinen. Wie auch immer, weiter!
Auf der OpenBSD-Maschine:
export PKG_PATH=http://mirrors.sonic.net/pub/OpenBSD/$(uname -r)/packages/$(uname -m)/
pkg_add git
pkg_add python # pick python 2.7
Als Nächstes müssen Sie die OpenBSD-Quellen und die Kernel-Quellen herunterladen und dann entpacken:
cd ~
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/src.tar.gz
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/sys.tar.gz
cd /usr/src; tar -xzpf $HOME/src.tar.gz; tar -xzpf $HOME/sys.tar.gz;
Wenn Sie bereits eine Installations-CD haben, müssen Sie die folgenden Dateien nicht herunterladen (da sie sich in $CDMOUNT/5.9/amd64/*.tgz befinden). Sie müssen nur $DISTDIR entsprechend setzen. Andernfalls ...
cd ~
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/amd64/base59.tgz
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/amd64/man59.tgz
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/amd64/comp59.tgz
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/amd64/game59.tgz
export DISTDIR=~
Wir haben nun die notwendigen Abhängigkeiten installiert und können mit dem Bauen beginnen.
Gehen Sie in das Verzeichnis TriforceOpenBSDFuzzer. Es gibt separate Verzeichnisse, die die OpenBSD-Dateien (targ) und die Dateien für den Fuzzer-Host (fuzzHost) enthalten.
Führen Sie auf einem OpenBSD-Host make im Verzeichnis targ aus. Sie sollten auch die Eingabedateien aus diesem Verzeichnis erstellen.
mkdir inputs
./gen.py # build simple tests
./genTempl.py templ.txt # build most syscall tests
./gen2.py # build complex syscall tests
tar -czf ../inputs.tgz inputs
Als Nächstes müssen Sie mit der FlashRD-Distribution (http://www.nmedia.net/flashrd/) ein Festplatten-Image mit dem Treiber erstellen. Auf einem OpenBSD-Host (mit den Quellen in /usr/src und den Kernel-Quellen in /usr/src/sys aus dem obigen Abschnitt) werden wir nun mehrere Dinge tun:
cd ~ #make sure this is on your /home parition, you will need significant disk space for this
ftp http://www.nmedia.net/flashrd/flashrd-2.0.tar.gz
tar xzf flashrd-2.0.tar.gz
cd flashrd-2.0
patch -p1 < $FUZZER/image-diff.txt #set $FUZZER to where you cloned TriforceOpenBSDFuzzer
mkdir obsd
cd obsd
tar xzpf $DISTDIR/base59.tgz
tar xzpf $DISTDIR/man59.tgz
tar xzpf $DISTDIR/comp59.tgz
tar xzpf $DISTDIR/game59.tgz
tar xzpf /var/sysmerge/etc.tgz
cp $FUZZER/image-etc-rc etc/rc
cp $FUZZER/targ/inputs/ex1 root/ex1
cd ..
Sie können nun ein Image mit den folgenden Befehlen erstellen:
cp $FUZZER/targ/driver obsd/bin/driver
./flashrd obsd
mv flashimg* $FUZZER/flashimg.bin
mv bsd.gdb $FUZZER/bsd.gdb
Speichern Sie eine Kopie von flashimg.bin und bsd.gdb. Sie werden sie auf dem Fuzzer-Host benötigen.
Sie möchten möglicherweise ein zweites Image zum Debuggen erstellen, das das Ausführen einer interaktiven Shell ermöglicht. Bearbeiten Sie obsd/etc/rc, ersetzen Sie /bin/driver -v durch /bin/sh -i und erstellen Sie ein zweites Image. Anschließend speichern wir eine Kopie von flashimg-sh.bin und bsd-sh.gdb für später.
./flashrd obsd
mv flashimg* $FUZZER/flashimg-sh.bin
mv bsd.gdb $FUZZER/bsd-sh.gdb
Wir können nun die OpenBSD-Maschine verlassen und zu unserem Fuzz-Host zurückkehren (stellen Sie sicher, dass Sie $FUZZER kopieren, damit wir es auf dem Fuzz-Host verwenden können).
Wir führen den Fuzzer auf einem Linux-Host aus (er sollte auf jedem Host funktionieren, auf dem TriforceAFL gebaut und ausgeführt werden kann, aber Ihre Ergebnisse können abweichen, insbesondere auf einem Nicht-Linux-Host). Installieren Sie auf dem Fuzzer-Host TriforceAFL nach ../TriforceAFL. Kopieren Sie flashimg*.bin und bsd*.gdb in das Verzeichnis fuzzhost und entpacken Sie die Eingaben in das fuzzHost-Verzeichnis:
cd TriforceOpenBSDFuzzer # this should now have the files we made on the BSD host in it
cp flashimg* fuzzHost/
cp bsd* fuzzHost/
cd fuzzhost
tar xzf ../inputs.tgz
Jetzt sind wir bereit zu fuzzen! Wechseln Sie in das Verzeichnis fuzzHost und starten Sie den Fuzzer mit ./runFuzz -M M0.
Beachten Sie, dass das Skript runFuzz einen Master- oder Slave-Namen erwartet, da es immer im Master/Slave-Modus läuft. Weitere Verwendungsinformationen finden Sie im Skript runFuzz.
Um Testfälle (z. B. Abstürze) zu reproduzieren, führen Sie auf dem Fuzzer-Host Folgendes aus:
./runTest inputs/ex1
./runTest outputs/crashes/id*
Sie können den Treiber auch außerhalb der emulierten Umgebung mit der Option -t ausführen, mit ausführlicher Protokollierung mit -vv und ohne die Systemaufrufe tatsächlich auszuführen mit -x. Führen Sie zum Beispiel auf dem OpenBSD-Host Folgendes aus:
./driver -tvvx < inputs/ex1
ktrace ./driver -t < inputs/ex1
Es ist manchmal nützlich, den Kernel zu booten und Tests interaktiv auszuführen. Sie können ./runSh ausführen, um in eine interaktive Shell zu booten.
Sie möchten wahrscheinlich zusätzliche Dateien (z. B. Testfälle) zur Datei flashimg-sh.bin für Tests hinzufügen. Kopieren Sie dazu auf dem OpenBSD-Host die zusätzlichen Dateien nach flashrd-2.0/obsd/root und erstellen Sie das Flash-Image neu. Übertragen Sie die Dateien zurück auf Ihren Fuzzer-Host und führen Sie runSh erneut aus. Die zusätzlichen Dateien finden Sie im Verzeichnis /root. Sie können dem Flash-Image auch nach der Erstellung als root auf dem OpenBSD-Host Dateien hinzufügen:
vnconfig vnd0 ./flashimg.bin
mount /dev/vnd0a /mnt
cp file /mnt
umount /mnt
vnconfig -u vnd0
Hier hinzugefügte Dateien erscheinen beim Booten des Images in /flash.
Die zuvor auf die FlashRD-Distribution angewendeten Patches aktivieren beim Erstellen des Kernels das Debugging und deaktivieren die Optimierung. Dadurch wird das Debuggen erheblich erleichtert.
Um den Kernel vom fuzzHost aus zu debuggen, erstellen Sie eine Kopie von /usr/src/sys von Ihrem OpenBSD-Host und kopieren Sie bsd-sh.gdb nach sys/x/x/x/x. Führen Sie in einem Fenster ./runSh aus und führen Sie nach dem Booten des Systems Folgendes aus:
cd sys
mkdir -p x/x/x/x
cd x/x/x/x
cp $FUZZER/bsd-sh.gdb .
gdb -ex "target remote :1234" ./bsd-sh.gdb