8.1 KiB
House of Roman
{% hint style="success" %}
Impara e pratica l'Hacking su AWS: HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking su GCP: HackTricks Training GCP Red Team Expert (GRTE)
Sostieni HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR a HackTricks e HackTricks Cloud github repos.
Informazioni di Base
Questa è stata una tecnica molto interessante che ha permesso l'esecuzione di codice remoto senza perdite tramite fake fastbins, l'attacco unsorted_bin e sovrascritture relative. Tuttavia è stata corretta.
Codice
- Puoi trovare un esempio in https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c
Obiettivo
- Esecuzione di codice remoto sfruttando puntatori relativi
Requisiti
- Modifica dei puntatori fastbin e unsorted bin
- Devono essere forzati 12 bit di casualità (0,02% di probabilità) per funzionare
Passaggi dell'Attacco
Parte 1: Il Chunk Fastbin punta a __malloc_hook
Creare diversi chunk:
fastbin_victim
(0x60, offset 0): Chunk UAF successivamente da modificare per far puntare il puntatore dell'heap al valore di LibC.chunk2
(0x80, offset 0x70): Per un buon allineamentomain_arena_use
(0x80, offset 0x100)relative_offset_heap
(0x60, offset 0x190): offset relativo sul chunk 'main_arena_use'
Poi free(main_arena_use)
che metterà questo chunk nella lista non ordinata e otterrà un puntatore a main_arena + 0x68
sia nei puntatori fd
che bk
.
Ora viene allocato un nuovo chunk fake_libc_chunk(0x60)
perché conterrà i puntatori a main_arena + 0x68
nei puntatori fd
e bk
.
Poi vengono liberati relative_offset_heap
e fastbin_victim
.
/*
Current heap layout:
0x0: fastbin_victim - size 0x70
0x70: alignment_filler - size 0x90
0x100: fake_libc_chunk - size 0x70 (contains a fd ptr to main_arena + 0x68)
0x170: leftover_main - size 0x20
0x190: relative_offset_heap - size 0x70
bin layout:
fastbin: fastbin_victim -> relative_offset_heap
unsorted: leftover_main
*/
-
fastbin_victim
ha unfd
che punta arelative_offset_heap
-
relative_offset_heap
è un offset di distanza dafake_libc_chunk
, che contiene un puntatore amain_arena + 0x68
- Cambiando l'ultimo byte di
fastbin_victim.fd
è possibile far sì chefastbin_victim punti
amain_arena + 0x68
Per le azioni precedenti, l'attaccante deve essere in grado di modificare il puntatore fd di fastbin_victim
.
Quindi, main_arena + 0x68
non è così interessante, quindi modifichiamolo in modo che il puntatore punti a __malloc_hook
.
Nota che __memalign_hook
di solito inizia con 0x7f
e zeri prima di esso, quindi è possibile falsificarlo come un valore nel fast bin 0x70
. Poiché gli ultimi 4 bit dell'indirizzo sono casuali ci sono 2^4=16
possibilità affinché il valore finisca puntando dove siamo interessati. Quindi qui viene eseguito un attacco BF in modo che il chunk finisca come: 0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)
.
(Per ulteriori informazioni sugli altri byte, controlla la spiegazione nell'esempio how2heap). Se il BF non funziona, il programma crasha (quindi riprova finché non funziona).
Quindi, vengono eseguiti 2 malloc per rimuovere i 2 chunk iniziali del fast bin e viene allocato un terzo per ottenere un chunk nel __malloc_hook:
malloc(0x60);
malloc(0x60);
uint8_t* malloc_hook_chunk = malloc(0x60);
Parte 2: Attacco unsorted_bin
Per ulteriori informazioni puoi controllare:
{% content-ref url="unsorted-bin-attack.md" %} unsorted-bin-attack.md {% endcontent-ref %}
Ma fondamentalmente consente di scrivere main_arena + 0x68
in qualsiasi posizione specificata in chunk->bk
. E per l'attacco scegliamo __malloc_hook
. Quindi, dopo averlo sovrascritto, utilizzeremo una sovrascrittura relativa per puntare a un one_gadget
.
Per questo iniziamo ottenendo un chunk e mettendolo nell'unsorted bin:
uint8_t* unsorted_bin_ptr = malloc(0x80);
malloc(0x30); // Don't want to consolidate
puts("Put chunk into unsorted_bin\n");
// Free the chunk to create the UAF
free(unsorted_bin_ptr);
Usa un UAF in questo chunk per puntare unsorted_bin_ptr->bk
all'indirizzo di __malloc_hook
(abbiamo già forzato questo in precedenza).
{% hint style="danger" %} Nota che questo attacco corrompe il bin non ordinato (quindi anche small e large). Quindi possiamo utilizzare solo allocazioni dal fast bin ora (un programma più complesso potrebbe fare altre allocazioni e bloccarsi), e per attivare questo dobbiamo allocare la stessa dimensione o il programma si bloccherà. {% endhint %}
Quindi, per attivare la scrittura di main_arena + 0x68
in __malloc_hook
eseguiamo dopo aver impostato __malloc_hook
in unsorted_bin_ptr->bk
dobbiamo semplicemente fare: malloc(0x80)
Passo 3: Imposta __malloc_hook su system
Nel primo passo abbiamo finito per controllare un chunk contenente __malloc_hook
(nella variabile malloc_hook_chunk
) e nel secondo passo siamo riusciti a scrivere main_arena + 0x68
qui.
Ora, sfruttiamo una sovrascrittura parziale in malloc_hook_chunk
per utilizzare l'indirizzo libc che abbiamo scritto lì (main_arena + 0x68
) per puntare a un indirizzo one_gadget
.
Qui è necessario forzare 12 bit di casualità (ulteriori informazioni nell'how2heap esempio).
Infine, una volta sovrascritto l'indirizzo corretto, chiama malloc
e attiva il one_gadget
.
Riferimenti
- https://github.com/shellphish/how2heap
- https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_roman/
{% hint style="success" %}
Impara e pratica l'Hacking su AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking su GCP: HackTricks Training GCP Red Team Expert (GRTE)
Sostieni HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di Github.