Paolo Perego
Paolo Perego Specialista di sicurezza applicativa e certificato OSCP. Amo spaccare e ricostruire il codice in maniera più robusta, cintura nera di taekwon-do, marito e papà. Ranger Caotico buono, scrivo su @codiceinsicuro e @the_armoredcode.

Shellerate: un framework per generare shellcode

Shellerate: un framework per generare shellcode

L’anno scorso, in preparazione al corso Cracking the Perimeter, avevo seguito il corso x86 Assembly Language and Shellcoding on Linux. Questo mi permise di rinfrescare la programmazione in assembler per x86 e di imparare un po’ di python.

A distanza di qualche mese, il progetto shellerate acquista una sua importanza e maturità, almeno nella mia routine di coding.

Installare shellerate è abbstanza semplice e richiede di utilizzare pip, qui nell’esempio uso la versione 3 del comando.

$ pip3 install shellerate --user

Da questo momento è possibile utilizzare le API di shellerate in modo da creare i primi shellcode, anche se sto lavorando ad uno script che colleghi un po’ le varie possibilità.

Per generare lo shellcode per una bind shell in ambiente Linux x86, in ascolto sulla porta 4444, sono sufficienti 2 righe di codice.

from shellerate.bind_shellcode import *

b=BindShellcode(4444, 'x86', 'linux')
b.generate()
print("Shellcode: %s" % b.shellcode())

L’output, potrà poi essere utilizzato all’interno di un exploit che stiamo scrivendo. Se si ha poi la necessità di farne una versione offuscata, per ora solo attraverso la versione che scritti per la SLAE32, basta aggiungere una riga di codice.

from shellerate.bind_shellcode import *

b=BindShellcode(4444, 'x86', 'linux')
b.encode()
b.generate()
print("Shellcode: %s" % b.shellcode())

Come si può vedere, ho cercato di tenere l’API il più possibile pulita e minimal, in modo da rendere il codice di un exploit che usa shellerate, semplice da leggere.

Creare una versione dello stesso shellcode, con un egg hunter è semplice tanto quanto la versione offuscata:

b=BindShellcode(4444, 'x86', 'linux')
b.egg_hunter()
b.generate()
sc = b.shellcode()

print("Egg Hunter: %s" % sc["egg_hunter_code"])
print("Shellcode: %s" % sc["egg_hunter_shellcode"])

Sto lavorando in questi giorni ad un encoder custom che ho utilizzato per risolvere una delle quest di vulnserver.exe e che prevede, con una tecnica imparata nel corso della certificazione OSCE, di scrivere uno shellcode utilizzando delle istruzioni di sottrazione e di push.

Tutta farina del sacco di Mati Aharoni che ha presentato questa tecnica in questo talk a Defcon 16.

Io ho solo messo insieme qualche pezzo e scritto un codice, utilizzato anche nel mio ultimo tentativo di certificazione, per offuscare uno shellcode. Posso assicurare che ha funzionato.

Presto questo codice sarà nella nuova versione di shellerate che, probabilmente, potrà essere pronta per essere qualcosa di più che un esercizio di stile.

Enjoy it.

(Updated: )

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

comments powered by Disqus
Codice Insicuro, blog di Cyber Security, sviluppo sicuro, code review e altro.   Non perdere neanche un post, iscriviti ora alla newsletter