
# Projet CMPT733 Cybersecurity Lab II : Plugin GDB pour exploits de tas inspiré par CVE-2021-3156

Projet du laboratoire II de cybersécurité CMPT733
.
├── README.md
├── heaplens.png
├── heaplens.py
├── logs
│ ├── sudoedit-#.txt
│ └── ...
└── tests
├── Makefile
├── env-in-heap
└── ...
README.md : c'est ici !heaplens.py : le script principallogs/ : contient quelques journaux d'exemple que nous avons capturés pendant le développement et les teststests/ : contient quelques binaires (et leurs codes sources) pour les testsVoici une liste des éléments (et versions) que nous avons utilisés pour tester l'exploit. Ils devraient déjà être installés dans la VM. Si quelque chose manque, suivez les instructions ci-dessous.
python 3.8.10glibc 2.34gdb 9.2gef 2022.01
gef n'est pas activé sous root, jetez un œil à /root/.gdbinit~/.gdbinitsudo (pour exécuter heaplens sur sudo)Un binaire de sudo avec le débogage activé est requis. Un binaire pré-compilé avec les symboles de débogage a été installé dans la VM.
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 est vulnérable
Cela a déjà été fait dans la VM. Si la configuration est erronée, vous pouvez suivre les instructions ci-dessous pour charger Heaplens.
Démarrez gef et modifiez la configuration :
gef➤ gef config gef.extra_plugins_dir <chemin vers>/heaplens
gef➤ gef save
gef➤ q
Cela devrait mettre à jour le fichier ~/.gef.rc ou /root/.gef.rc (sous root).
Ajoutez cette ligne dans ~/.gdbinit ou /root/.gdbinit :
source <chemin vers>/heaplens/heaplens.py
Il est recommandé d'exécuter gdb sous root lors du débogage de programmes privilégiés :
$ sudo su
# gdb
Des messages d'aide sont fournis pour toutes les commandes. Vous pouvez y accéder via <commande> -h dans GDB.
heaplensCollecte les informations du tas à partir des fonctions d'allocation et de désallocation mémoire, notamment malloc, realloc, calloc et free.
L'idée de haut niveau est qu'en accrochant ces fonctions, nous pouvons automatiser le processus de vérification et de mise à jour de la pile d'appels ainsi que de l'adresse de retour de l'allocation mémoire. En inspectant les traces, nous pouvons voir quel bloc est alloué par foo() dans certains fichiers C, et nous pouvons approfondir l'investigation, par exemple en vérifiant les blocs adjacents, pour trouver des cibles appropriées pour l'exploitation du tas.
Il prend également en charge l'ajout de points d'arrêt personnalisés entre les deux si l'utilisateur est intéressé par une disposition intermédiaire du tas.
La commande elle-même n'est pas très verbeuse et vous devrez utiliser heaplens-dump pour imprimer les résultats.
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)
Exemple de sortie :
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-dumpDécharge les journaux de Heaplens. Nous fournissons des options pour écrire les résultats dans un fichier, produire une sortie au format JSON et trier les blocs par leurs adresses. Dans le dump, chaque bloc aura son adresse, sa taille, sa trace d'appel et la fonction d'allocation mémoire associée, enregistrés de manière plus lisible.
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)
Exemple de sortie :
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-chunksProduit une version légèrement modifiée de heap chunks de gef.
Cette commande étend heap chunks de GEF (qui affiche les adresses, les drapeaux, les tailles et les métadonnées des blocs) en intégrant les informations sur les blocs libres de heap bins (qui liste les blocs précédemment alloués et libérés des bins de glibc). GEF fournit des fonctionnalités qui aident à l'inspection du tas comme les deux mentionnées, mais il est fastidieux de les combiner. À un niveau élevé, cette commande collecte les adresses des blocs libres de la seconde et les étiquette dans le résultat de la première.
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
Exemple de sortie :
gef➤ heaplens-chunks
Showing current heap info with freed chunks:
...