
# CMPT733 Cybersecurity Lab II Projekt: GDB-Plugin für Heap-Exploits, inspiriert von CVE-2021-3156

CMPT733 Cybersecurity Lab II Projekt
.
├── README.md
├── heaplens.png
├── heaplens.py
├── logs
│ ├── sudoedit-#.txt
│ └── ...
└── tests
├── Makefile
├── env-in-heap
└── ...
README.md: genau hier!heaplens.py: das Hauptskriptlogs/: enthält einige Beispiellogs, die wir während der Entwicklung und des Testens erfasst habentests/: enthält einige Binärdateien (und deren Quellcodes) zum TestenHier ist eine Liste der Dinge (und Versionen), die wir zum Testen des Exploits verwendet haben. Sie sollten bereits in der VM installiert sein. Falls etwas fehlt, befolge die Anweisungen unten.
python 3.8.10glibc 2.34gdb 9.2gef 2022.01
gef unter root nicht aktiviert ist, wirf einen Blick auf /root/.gdbinit~/.gdbinit hastsudo-Abhängigkeiten (zum Ausführen von heaplens auf sudo)Eine Binärdatei von sudo mit aktiviertem Debugging ist erforderlich. Eine vorgefertigte Binärdatei mit Debug-Symbolen wurde in der VM installiert.
cyberlab@ubuntu:~$ which sudo
/usr/local/bin/sudo
cyberlab@ubuntu:~$ sudo --version
Sudo version 1.8.31
Sudoers policy plugin version 1.8.31
Sudoers file grammar version 46
Sudoers I/O plugin version 1.8.31
cyberlab@ubuntu:~$ sudoedit -s /
sudoedit: /: not a regular file # sudo ist verwundbar
Dies wurde bereits in der VM durchgeführt. Falls die Konfiguration fehlerhaft ist, kannst du den Anweisungen hier folgen, um Heaplens zu laden.
Starte gef und bearbeite die Konfiguration:
gef➤ gef config gef.extra_plugins_dir <Pfad zu>/heaplens
gef➤ gef save
gef➤ q
Dies sollte die Datei ~/.gef.rc oder /root/.gef.rc (unter root) aktualisieren.
Füge diese Zeile in ~/.gdbinit oder /root/.gdbinit hinzu:
source <Pfad zu>/heaplens/heaplens.py
Es wird empfohlen, gdb unter root auszuführen, wenn privilegierte Programme debuggt werden:
$ sudo su
# gdb
Für alle Befehle werden Hilfemeldungen bereitgestellt. Du kannst sie über <Befehl> -h in GDB aufrufen.
heaplensSammelt Heap-Informationen von Speicherzuweisungs- und -freigabefunktionen, einschließlich malloc, realloc, calloc und free.
Die grundlegende Idee ist, dass wir durch das Hooking dieser Funktionen den Prozess des Prüfens und Aktualisierens des Aufrufstapels sowie der Rücksprungadresse der Speicherzuweisung automatisieren können. Durch die Untersuchung der Ablaufverfolgungen können wir sehen, welcher Chunk von foo() in einigen C-Dateien zugewiesen wird, und wir können weiter untersuchen, beispielsweise durch Prüfen der benachbarten Chunks, um geeignete Ziele für die Heap-Ausnutzung zu finden.
Es unterstützt auch das Hinzufügen benutzerdefinierter Haltepunkte dazwischen, wenn der Benutzer an einem Zwischen-Heap-Layout interessiert ist.
Der Befehl selbst ist nicht sehr ausführlich, und du musst heaplens-dump verwenden, um die Ergebnisse auszugeben.
heaplens -h
usage: [-h] [-b BREAKPOINT] [-v]
Collect heap info from memory (de)allocation functions.
optional arguments:
-h, --help show this help message and exit
-b BREAKPOINT, --breakpoint BREAKPOINT
stop the executions here (execute br {breakpoint} in gdb) (default: None)
-v, --verbose increase output verbosity (default: False)
Beispielausgabe:
gef➤ file sudoedit
gef➤ heaplens -b set_cmnd -- -s '\\' $(python3 -c 'print("A"*65535)')
----------------------------
Initializing Heaplens
----------------------------
Temporary breakpoint 1 at 0x5840: file ../../src/src/sudo.c, line 136.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
usage: sudoedit [-AknS] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] file ...
[Inferior 1 (process 82934) exited with code 01]
Setting breakpoint at set_cmnd...
Function "set_cmnd" not defined.
Breakpoint 2 (set_cmnd) pending.
Hooking free function...
Breakpoint 3 at 0x7f25cc163700: free. (2 locations)
Hooking malloc function...
Breakpoint 4 at 0x7f25cc163110: malloc. (2 locations)
Hooking realloc function...
Breakpoint 5 at 0x7f25cc163eb0: realloc. (2 locations)
Hooking calloc function...
Breakpoint 6 at 0x7f25cc164b40: calloc. (2 locations)
Running -s '\' $(python3 -c 'print("A"*65535)')...
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 2, set_cmnd () at ../../../src/plugins/sudoers/sudoers.c:804
804 ../../../src/plugins/sudoers/sudoers.c: No such file or directory.
Removing breakpoints from mem_bkps...
heaplens-dumpGibt Heaplens-Logs aus. Wir bieten Optionen, um die Ergebnisse in eine Datei zu schreiben, im JSON-Format auszugeben und die Chunks nach ihren Adressen zu sortieren. Im Dump hat jeder Chunk seine Adresse, Größe, Backtrace und die zugehörige Speicherzuweisungsfunktion in einer besser lesbaren Form aufgezeichnet.
heaplens-dump -h
usage: [-h] [-o OUTPUT] [--json] [-s]
Dump Heaplens logs. Writes to stdout by default.
optional arguments:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
write to file at path {output} (default: None)
--json dump in json (default: False)
-s, --sort sort the chunks by their addresses (default: False)
Beispielausgabe:
gef➤ heaplens-dump
----------------------------
Dumping...
----------------------------
...
[malloc] Chunk 3 @ 0x55f3908ed2a0 | size 0xc
Trace:
#0 __GI___strdup (s=0x7fff6fb3b8dc "en_US.UTF-8") at strdup.c:44
#1 0x00007f285df363c5 in _nl_load_locale_from_archive (category=category@entry=0xc, namep=namep@entry=0x7fff6fb29f50) at loadarchive.c:464
#2 0x00007f285df351fe in _nl_find_locale (locale_path=0x0, locale_path_len=0x0, category=category@entry=0xc, name=name@entry=0x7fff6fb29f50) at findlocale.c:152
#3 0x00007f285df34925 in __GI_setlocale (locale=<optimized out>, category=<optimized out>) at setlocale.c:337
#4 __GI_setlocale (category=<optimized out>, locale=<optimized out>) at setlocale.c:217
#5 0x000055f3901d5965 in main (argc=0x4, argv=0x7fff6fb2a298, envp=0x7fff6fb2a2c0) at ../../src/src/sudo.c:1430
...
Dump complete.
heaplens-chunksGibt eine leicht modifizierte Version von heap chunks aus gef aus.
Dies erweitert GEFs heap chunks (das Adressen, Flags, Größen und Metadaten der Chunks anzeigt), indem Informationen über freie Chunks aus heap bins (das zuvor zugewiesene und freigegebene Chunks aus glibc-Bins auflistet) integriert werden. GEF bietet Funktionen, die die Heap-Inspektion unterstützen, wie die beiden genannten, aber es ist mühsam, die beiden zu kombinieren. Auf hoher Ebene sammelt dieser Befehl Adressen freier Chunks aus letzterem und kennzeichnet sie im Ergebnis des ersteren.
heaplens-chunks -h
usage: [-h] [--nocolor]
A modified `heap chunks` with info about free chunks.
optional arguments:
-h, --help show this help message and exit
--nocolor disable ANSI color codes
Beispielausgabe:
gef➤ heaplens-chunks
Showing current heap info with freed chunks:
...
Chunk(addr=0x55dd7f91ddb0, size=0xed0, flags=PREV_INUSE) ← free chunk
[0x000055dd7f91ddb0 e0 fb ba e1 f8 7f 00 00 e0 fb ba e1 f8 7f 00 00 ...............]
Chunk(addr=0x55dd7f91ec80, size=0x50, flags=! PREV_INUSE)
[0x000055dd7f91ec80 2f 75 73 72 2f 6c 6f 63 61 6c 2f 73 62 69 6e 3a /usr/local/sbin]
Chunk(addr=0x55dd7f91ecd0, size=0x4010, flags=PREV_INUSE) ← free chunk
[0x000055dd7f91ecd0 f0 02 bb e1 f8 7f 00 00 f0 02 bb e1 f8 7f 00 00 ...............]
Chunk(addr=0x55dd7f922ce0, size=0x50, flags=! PREV_INUSE)
[0x000055dd7f922ce0 90 02 91 7f dd 55 00 00 00 00 00 00 00 00 00 00 .....U.........]
Chunk(addr=0x55dd7f922d30, size=0x2da0, flags=PREV_INUSE) ← free chunk
[0x000055dd7f922d30 d0 02 bb e1 f8 7f 00 00 d0 02 bb e1 f8 7f 00 00 ...............]
Chunk(addr=0x55dd7f925ad0, size=0x110, flags=! PREV_INUSE) ← free chunk
[0x000055dd7f925ad0 00 00 00 00 00 00 00 00 10 f0 90 7f dd 55 00 00 .............U.]
Chunk(addr=0x55dd7f925be0, size=0x30, flags=PREV_INUSE)
[0x000055dd7f925be0 00 00 00 00 00 00 00 00 d2 78 b7 7e dd 55 00 00 .........x.~.U.]
Chunk(addr=0x55dd7f925c10, size=0x20, flags=PREV_INUSE)
[0x000055dd7f925c10 65 6e 5f 55 53 2e 55 54 46 2d 38 00 00 00 00 00 en_US.UTF-8....]
Chunk(addr=0x55dd7f925c30, size=0xa3e0, flags=PREV_INUSE) ← top chunk
heaplens-clearLöscht alle internen Logs / Daten, die von heaplens gesammelt und verwendet werden.
heaplens-clear -h
usage: [-h] [-v]
Clear Heaplens logs.
optional arguments:
-h, --help show this help message and exit
-v, --verbose increase output verbosity
heaplens-list-envListet Umgebungsvariablen auf, die im Heap gespeichert und freigegeben werden. Dies ist besonders nützlich, wenn du Heap-Grooming durchführen möchtest, da diese Variablen das Heap-Layout beeinflussen könnten.
heaplens-list-env -h
usage: [-h] [-v] [--prefix PREFIX] [--suffix SUFFIX] [-b BREAKPOINT] [-s SKIP]
List environment variables that might affect the heap layout.
optional arguments:
-h, --help show this help message and exit
-v, --verbose increase output verbosity
--prefix PREFIX environment variable value prefix
--suffix SUFFIX environment variable value suffix
-b BREAKPOINT, --breakpoint BREAKPOINT
stop the executions here (execute br {breakpoint} in gdb)
-s SKIP, --skip SKIP skip this environment variable
Beispielausgabe:
gef➤ file sudoedit
Reading symbols from sudoedit...
gef➤ heaplens-list-env -s LC_ALL -b set_cmnd --prefix C.UTF-8@ -- -s \\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
...
1st execution. Found following environment variable:
['LOCPATH', 'LC_ALL', 'LC_IDENTIFICATION', 'LANG', 'LC_MEASUREMENT', 'LC_TELEPHONE', 'LC_ADDRESS', 'LC_NAME', 'LC_PAPER', 'LC_MESSAGES', 'LC_MONETARY', 'LC_COLLATE', 'LC_TIME', 'LC_NUMERIC', 'LC_CTYPE', 'TZ', 'SHELL', 'LANGUAGE']
...
2nd execution. Possible environment variables for heap grooming:
['LC_IDENTIFICATION', 'LC_COLLATE', 'TZ', 'LC_TIME', 'LANGUAGE', 'LC_NAME', 'LOCPATH', 'LC_MESSAGES', 'LC_NUMERIC', 'LC_ADDRESS', 'LC_TELEPHONE', 'LC_MONETARY', 'LC_MEASUREMENT', 'LC_CTYPE', 'LC_PAPER']
Zum Erstellen der Testfall-Skripte (in der VM gebaut)
$ cd tests
$ make all
tests/heap-dump ausgebengef➤ file tests/heap-dump
gef➤ heaplens -b breakme
gef➤ heaplens-dump
sudoedit in output.txt ausgebengef➤ file sudoedit
gef➤ heaplens -b set_cmnd -- -s \\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
gef➤ heaplens-dump -o output.txt
tests/env-in-heap auflistengef➤ file tests/env-in-heap
gef➤ heaplens-list-env
...
----------------------------
2nd execution. Possible environment variables for heap grooming:
['ENV_IN_HEAP']
----------------------------
sudoedit auflistengef➤ file sudoedit
gef➤ heaplens-list-env -s LC_ALL -b set_cmnd --prefix C.UTF-8@ -- -s \\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
...
----------------------------
1st execution. Found following environment variable:
['LOCPATH', 'LC_ALL', 'LC_IDENTIFICATION', 'LANG', 'LC_MEASUREMENT', 'LC_TELEPHONE', 'LC_ADDRESS', 'LC_NAME', 'LC_PAPER', 'LC_MESSAGES', 'LC_MONETARY', 'LC_COLLATE', 'LC_TIME', 'LC_NUMERIC', 'LC_CTYPE', 'TZ', 'SHELL', 'LANGUAGE']
----------------------------
...
----------------------------
2nd execution. Possible environment variables for heap grooming:
['LC_CTYPE', 'LC_PAPER', 'LC_MONETARY', 'TZ', 'LC_ADDRESS', 'LC_MEASUREMENT', 'LC_IDENTIFICATION', 'LC_COLLATE', 'LC_NUMERIC', 'LC_MESSAGES', 'LC_TIME', 'LANGUAGE', 'LC_NAME', 'LOCPATH', 'LC_TELEPHONE']
----------------------------
Weitere Details findest du auf der Issues-Seite.