
# Projeto do Laboratório II de Cibersegurança CMPT733: Plugin GDB para exploração de heap inspirado no CVE-2021-3156

Projeto do Laboratório II de Cibersegurança CMPT733
.
├── README.md
├── heaplens.png
├── heaplens.py
├── logs
│ ├── sudoedit-#.txt
│ └── ...
└── tests
├── Makefile
├── env-in-heap
└── ...
README.md: é aqui!heaplens.py: o script principallogs/: contém alguns logs de exemplo que capturamos durante o desenvolvimento e os testestests/: contém alguns binários (e seus códigos-fonte) para testesAqui está uma lista de itens (e versões) que usamos para testar o exploit. Eles já devem estar instalados na VM. Caso algo esteja faltando, siga as instruções abaixo.
python 3.8.10glibc 2.34gdb 9.2gef 2022.01
gef não estiver habilitado como root, dê uma olhada em /root/.gdbinit~/.gdbinitsudo (para executar o heaplens no sudo)É necessário um binário do sudo com depuração habilitada. Um binário pré-compilado com símbolos de depuração foi instalado na 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 é vulnerável
Isso já foi feito na VM. Caso a configuração esteja incorreta, você pode seguir as instruções aqui para carregar o Heaplens.
Inicie o gef e edite a configuração:
gef➤ gef config gef.extra_plugins_dir <caminho para>/heaplens
gef➤ gef save
gef➤ q
Isso deve atualizar o arquivo ~/.gef.rc ou /root/.gef.rc (como root).
Adicione esta linha em ~/.gdbinit ou /root/.gdbinit:
source <caminho para>/heaplens/heaplens.py
É recomendado executar o gdb como root ao depurar programas privilegiados:
$ sudo su
# gdb
Mensagens de ajuda são fornecidas para todos os comandos. Você pode acessá-las via <comando> -h no GDB.
heaplensColeta informações do heap a partir das funções de alocação e desalocação de memória, incluindo malloc, realloc, calloc e free.
A ideia de alto nível é que, ao interceptar essas funções, podemos automatizar o processo de verificação e atualização da pilha de chamadas, bem como o endereço de retorno da alocação de memória. Ao inspecionar os rastreamentos, podemos ver qual chunk é alocado por foo() em alguns arquivos C, e podemos investigar mais a fundo, por exemplo, verificando os chunks adjacentes, para encontrar alvos adequados para exploração do heap.
Ele também suporta a adição de breakpoints personalizados no meio, caso o usuário esteja interessado em um layout intermediário do heap.
O comando em si não é muito detalhado, e você precisará usar o heaplens-dump para imprimir os resultados.
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)
Exemplo de saída:
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-dumpDespeja os logs do Heaplens. Fornecemos opções para gravar os resultados em um arquivo, gerar a saída no formato JSON e ordenar os chunks por seus endereços. No despejo, cada chunk terá seu endereço, tamanho, backtrace e a função de alocação de memória relacionada registrados de forma mais legível.
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)
Exemplo de saída:
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-chunksGera uma versão ligeiramente modificada do heap chunks do gef.
Isso estende o heap chunks do GEF (que mostra endereços, flags, tamanhos e metadados dos chunks) integrando informações sobre chunks livres do heap bins (que lista chunks anteriormente alocados e liberados dos bins do glibc). O GEF fornece recursos que ajudam na inspeção do heap, como os dois mencionados, mas é tedioso combiná-los. Em alto nível, este comando coleta endereços de chunks livres do último e os rotula no resultado do primeiro.
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
Exemplo de saída:
gef➤ heaplens-chunks
Showing current heap info with freed chunks:
...