
# 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:
...