Diamo un'occhiata a msf-egghunter
Lo scorso febbraio, su The Armored Code ho scritto un post che parlava di msf-egghunter, lo strumento distribuito insieme a Metasploit per scrivere un egg hunter.
Lo scorso anno, per la certificazione SLAE, mi ero già imbattuto in questa tecnica che ho trovato immediatamente affascinante.
Stiamo parlando di sviluppo di un exploit. Avete, in qualche modo, forzato la modifica del flusso di esecuzione del vostro programma vulnerabile (attraverso la sovrascrittura dell’EIP o attraverso la Structure Exception Handler, nel caso il target sia Windows) e siete nel punto dove dovete piazzare il vostro shellcode. A questo punto sorge un problema, il buffer nel quale siete è troppo piccolo per contenere una bind shell, una reverse shell o qualsiasi cosa utile a darvi un prompt.
Che fare? Semplice; andate a studiare il paper di Matt Miller, “Safetly Searching Process Virtual Address Space” e poi tornate qui.
Fatto? Molto bene. L’idea alla base di questa tecnica è quella di piazzare il nostro shellcode in un punto qualsiasi della memoria del processo da attaccare. Lo shellcode avrà in testa una sequenza di 4 byte, ripetuta 2 volte per evitare falsi positivi, che sarà interpretata come un indicatore di inizio per il nostro payload. Il codice dell’egg-hunter, che andremo a piazzare nel piccolo buffer di cui parlavamo prima, avrà il compito di cercare nella memoria del processo vittima, i 4 byte di inizio payload e, una volta trovati, far saltare l’esecuzione a quel punto in memoria.
Per la SLAE scrissi un semplice codice assembler che realizzava un egg-hunter. Oggi vediamo uno strumento messo a disposizione dal framework Metasploit: msf-egghunter.
Semplice utilizzo del tool
L’utilizzo base di msf-egghunter è quello di scegliere la piattaforma (windows o linux) e l’architettura (a 32 o 64 bit). Unico parametro mandatorio sarà l’EGG da utilizzare per marcare l’inizio del nostro payload; useremo la stringa ‘BEEF’ allo scopo.
Evitare i bad characters
Quando stiamo scrivendo un exploit, siamo nella condizione di non poter utilizzare alcuni caratteri nel nostro payload. Magari a causa di una routine di filtro, alcuni codici ascii utilizzati nel nostro payload potrebbero non essere gestiti correttamente dal programma vittima e non copiati nelle proprie zone di memoria.
Vanno quindi rimossi e sembra che il parametro ‘-b’ sia lì proprio per quello peccato che, almeno nella versione di Metasploit 5.0.6-dev, non funzioni. Supponiamo io debba creare uno shellcode per Linux, architettura a 32 bit e voglia usare sempre ‘BEEF’ come egg.
Come si può vedere, il nostro carattere ‘\x66’ è ancora lì al suo posto. Quindi? Quindi chiedo aiuto a msfvenom, strumento principe per la generazione dei payload e che è in grado di fare delle trasformazioni ad un shellcode arbitrario passato attraverso lo standard input.
Ed ecco qui, il carattere ‘\x66’ è sparito. Quello che vi consiglio è di usare msfvenom per tutto quello che riguarda l’encoding e la trasformazione del vostro egg-hunter in pipe ad msf-egghunter.
Il cuore
Il cuore del codice di msf-egghunter è nella libreria rex-exploit sviluppata da Rapid7, il cui codice è disponibile qui su GitHub.
Dal codice possiamo leggere nei commenti i miglioramenti fatti rispetto al lavoro di Miller. Interessante il codice per [disabilitare il DEP]((https://www.corelan.be/index.php/2010/06/16/exploit-writing-tutorial-part-10-chaining-dep-with-rop-the-rubikstm-cube/) scritto da corelandc0d3r.
Off by one
Per avere un esempio pratico, vi do il link di questo exploit che ho scritto per Base64 Decoder 1.1.2 mostra msf-egghunter in azione. A me questa tecnica piace un sacco, è divertente pensare al processo vittima che cerca in memoria il codice per bucarsi, lo esegue e ti restituisce una shell.
Enjoy it!
Vuoi aiutarmi a portare avanti il progetto Codice Insicuro con una donazione? Fantastico, allora non ti basta che premere il pulsante qui sotto.
Supporta il progetto