
Automatisiere wiederkehrende Aufgaben für das Fuzzing
Ich schreibe dies gerade komplett neu. Der Schwerpunkt liegt zunächst auf interaktiven Linux-Apps, die nur Eingaben von stdin akzeptieren. Es wird versucht, die Driller- und Fuzzer-Funktionalität von Shellphish zu nutzen.
autoPwn in seinem aktuellen Zustand wird dies in begrenztem Umfang tun. Führen Sie einfach autoPwn ./binary aus und wählen Sie dann die Option Start.
Angesichts all der Abhängigkeitsprobleme hier ist der einfachste Weg, autoPwn zum Laufen zu bringen, die Verwendung des Docker-Builds. Beachten Sie, dass Sie die Optionen --security-opt und --cap-add entfernen können, aber einige Fuzzing-Aspekte könnten dann nicht funktionieren.
$ sudo docker pull bannsec/autoPwn
$ sudo docker run -it -v $PWD:/mount --security-opt="apparmor=unconfined" --cap-add=SYS_PTRACE -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix/ bannsec/autopwn
Im Docker-Build sollte alles einsatzbereit sein. Sie können das Tool einfach starten mit:
$ autoPwn ./file
autoPwn versucht, das Kompilieren von Quellcode für das Fuzzing eines Projekts zu erleichtern. Zu diesem Zweck wurde autoPwnCompile erstellt. Geben Sie einfach Ihren Quellcode an und geben Sie Optionen an, und es wird eine ausführbare Datei ausgegeben, die zum Fuzzing bereit ist.
usage: autoPwnCompile [-h] [--file FILE] [--ASAN | --MSAN] [--UBSAN]
[--fuzzer FUZZER]
Compile source to binaries for use in autoPwn.
optional arguments:
-h, --help show this help message and exit
--file FILE Single file to compile.
--ASAN Enable ASAN (default off)
--MSAN Enable MSAN (default off)
--UBSAN Enable UBSAN (default off)
--fuzzer FUZZER (optional) What fuzzer to compile for. Options are:
['AFL']. Default is AFL.
Das Folgende stammt aus der ALTEN Version von autoPwn..
autoPwn ist ein hochtrabender Name für ein einfaches Skript. Bei der Arbeit mit Fuzzing und afl-fuzz ist mir aufgefallen, dass ich immer wieder die gleichen Aufgaben ausführe. Aus diesem Grund wollte ich ein Skript erstellen, das Folgendes erreicht:
Bisher ist das Skript in der Lage, die ersten 5 Punkte zu erfüllen. Punkt 6 ist spekulativ und wird derzeit entwickelt. Es würde die symbolische Ausführungsengine angr nutzen, um mögliche Anfangspfade zu erstellen. An diesem Punkt könnte das Skript theoretisch einfache Fuzzing-Aufgaben vollständig automatisieren.
Werfen wir einen Blick auf eine kürzliche TUCTF-Challenge namens "WoO2". Obwohl sie nicht unbedingt den benötigten Exploit findet, zeigt sie, wie autoPwn verwendet werden kann, um die Pfadfindung zu vereinfachen.
Hier ist ein grundlegender Durchlauf des Programms:
$ ./e67eb287f23011a40ef5bd5c2ad2f48ca97834cf
Welcome! I don't think we're in Kansas anymore.
We're about to head off on an adventure!
Select some animals you want to bring along.
Menu Options:
1: Bring a lion
2: Bring a tiger
3: Bring a bear
4: Delete Animal
5: Exit
Enter your choice:
1
Choose the type of lion you want:
1: Congo Lion
2: Barbary Lion
1
Enter name of lion:
Test
Menu Options:
1: Bring a lion
2: Bring a tiger
3: Bring a bear
4: Delete Animal
5: Exit
Enter your choice:
5
Lassen Sie uns einen einfachen Eingabetestfall erstellen:
$ cat in/1
1
1
Test
5
Jetzt können wir den Fuzzer einfach starten:
$ autoPwn
Setting up fuzz configuration
Target Binary (full or relative path): e67eb287f23011a40ef5bd5c2ad2f48ca97834cf
Command line args:
Number of cores (default: 8):
Test Case Dir (default: 'in/'):
Test Case Dir (default: 'out/'):
Max memory (default: 200): 4096
Starting fuzz
autoPwn> s
status check tool for afl-fuzz by <[email protected]>
Individual fuzzers
==================
>>> SESSION007 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION000 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION002 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION006 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION004 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION001 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION005 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION003 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
Summary stats
=============
Fuzzers alive : 8
Total run time : 0 days, 0 hours
Total execs : 0 million
Cumulative speed : 8 execs/sec
Pending paths : 8 faves, 8 total
Pending per fuzzer : 1 faves, 1 total (on average)
Crashes found : 0 locally unique
autoPwn> h
autoPwn
s == fuzzer (s)tatus
e == collect (e)xploits
a == collect (a)ll paths
m == (m)inimize corpus
q == (q)uit
Was hier also passiert ist, dass das Skript einige Standardwerte erstellt hat (einschließlich der Ermittlung der Anzahl der verfügbaren Kerne). Wir haben einen Standardwert geändert, da zusätzlicher Speicher benötigt wurde, um dies in QEMU auszuführen. autoPwn hat eine Konfigurationsdatei erstellt, die es dann an afl-utils (https://github.com/rc0r/afl-utils) übergeben hat. In der Konfigurationsdatei hat es auch CPU-Affinitäten eingerichtet, sodass das Fuzzing standardmäßig optimal ist.
An diesem Punkt arbeitet Ihr Computer am Fuzzing. Ein wichtiger Aspekt des Fuzzings ist jedoch die Minimierung des Korpus. Aus diesem Grund überwacht autoPwn die afl-fuzz-Instanz, um zu erkennen, wann eine Serie von Mutationen abgeschlossen ist. Wenn dies passiert, wird es das Fuzzing stoppen (nicht optimal, aber für den Moment in Ordnung), den Korpus minimieren und dann das Fuzzing neu starten. Dies geschieht ohne menschliches Eingreifen, sodass Sie es starten und vergessen können.
Irgendwann möchten Sie vielleicht einen Blick darauf werfen, welche Pfade afl gefunden hat. Durch Ausführen des Befehls "a" kopiert autoPwn alle bekannten Pfade, minimiert den Korpus und minimiert dann die Fälle selbst und stellt sie in einem Ausgabeverzeichnis bereit.