
Exploit de prueba de concepto para escalada de privilegios local en Windows (CVE-2023-21746) que abusa de la autenticación local NTLM para obtener privilegios SYSTEM mediante acceso a recursos compartidos SMB y secuestro de DLL.
Una vulnerabilidad de escalada de privilegios local (LPE) en Windows fue reportada a Microsoft el 9 de septiembre de 2022 por Andrea Pierini (@decoder_it) y Antonio Cocomazzi (@splinter_code). La vulnerabilidad permitiría a un atacante con una cuenta de bajos privilegios en un host leer/escribir archivos arbitrarios con privilegios de SYSTEM.
Si bien la vulnerabilidad en sí misma no permitiría directamente ejecutar comandos como SYSTEM, podemos combinarla con varios vectores para lograr este resultado. Convenientemente, el 13 de febrero, BlackArrowSec publicó otro PoC de escalada de privilegios que abusa del servicio StorSvc, permitiendo a un atacante ejecutar código como SYSTEM siempre que pueda escribir un archivo DLL en cualquier directorio del PATH.
El PoC de LocalPotato aprovecha una falla en un caso especial de autenticación NTLM llamada autenticación local NTLM para engañar a un proceso privilegiado para que autentique una sesión que el atacante inicia contra el servidor SMB local. Como resultado, el atacante termina teniendo una conexión que le otorga acceso a cualquier recurso compartido con los privilegios del proceso engañado, incluidos recursos especiales como C$ o ADMIN$.
El proceso seguido por el exploit es el siguiente:
Al tener una conexión privilegiada a los recursos compartidos SMB, el atacante puede leer o escribir archivos en la máquina objetivo en cualquier ubicación. Si bien esto no nos permitirá ejecutar comandos directamente contra la máquina vulnerable, lo combinaremos con un vector de ataque diferente para lograr ese fin.
Tenga en cuenta que la vulnerabilidad está en el protocolo NTLM, no en el servidor SMB, por lo que este mismo vector de ataque podría usarse teóricamente contra cualquier servicio que utilice autenticación a través de NTLM. En la práctica, sin embargo, se deben abordar algunas limitaciones al seleccionar el protocolo a atacar. El PoC utiliza el servidor SMB para evitar algunas protecciones adicionales existentes para otros protocolos contra vectores de ataque similares e incluso implementa una derivación rápida para que el exploit funcione contra el servidor SMB. Publicación del autor original del exploit - (https://decoder.cloud/2023/02/13/localpotato-when-swapping-the-context-leads-you-to-system/)
Hasta ahora, hemos utilizado LocalPotato para escribir archivos arbitrarios en la máquina objetivo. Para obtener un shell privilegiado, todavía necesitamos descubrir cómo usar la escritura arbitraria para ejecutar un comando.
Recientemente, se encontró otro vector de escalada de privilegios, donde un atacante podría secuestrar una DLL faltante para ejecutar comandos arbitrarios con privilegios de SYSTEM. El único problema con este vector era que un atacante necesitaría escribir una DLL en el PATH del sistema para activarlo. De forma predeterminada, el PATH de Windows solo incluye directorios a los que solo las cuentas privilegiadas pueden escribir. Si bien podría ser posible encontrar máquinas donde la instalación de aplicaciones específicas haya alterado la variable PATH y hecho que la máquina sea vulnerable, el vector de ataque solo se aplica a escenarios particulares. Combinar este ataque con LocalPotato nos permite superar esta restricción y tener un exploit de escalada de privilegios completamente funcional.
StorSvc y secuestro de DLL Según lo descubierto por BlackArrowSec (https://github.com/blackarrowsec/redteam-research/tree/26e6fc0c0d30d364758fa11c2922064a9a7fd309/LPE via StorSvc), un atacante puede enviar una llamada RPC al método "SvcRebootToFlashingMode" proporcionado por el servicio "StorSvc", lo que a su vez terminará provocando un intento de cargar una DLL faltante llamada "SprintCSP.dll". Si no está familiarizado con RPC, piense en ello como una API que expone funciones para que puedan usarse de forma remota. En este caso, el servicio StorSvc expone el método SvcRebootToFlashingMode, al que cualquier persona con acceso a la máquina puede llamar. Dado que StorSvc se ejecuta con privilegios de SYSTEM, crear SprintCSP.dll en algún lugar del PATH hará que se cargue cada vez que se realice una llamada a SvcRebootToFlashingMode.
Compilación del exploit Enlace del exploit - (https://github.com/decoder-it/LocalPotato) Para usar este exploit, primero deberá compilar ambos archivos proporcionados:
Comencemos con "RpcClient.exe". Como se mencionó anteriormente, necesitaremos cambiar el exploit según la versión de Windows de la máquina objetivo. Para hacer esto, necesitaremos cambiar las primeras líneas de "LPE via StorSvc\RpcClient\RpcClient\storsvc_c.c" para que se seleccione el sistema operativo correcto. Esto configurará el exploit para usar el identificador de interfaz RPC correcto. Ahora que el código ha sido corregido, abramos un símbolo del sistema de desarrollador y compilemos el proyecto ejecutando el siguiente comando: Comandos: C:\LPE via StorSvc\RpcClient> msbuild RpcClient.sln C:\LPE via StorSvc\RpcClient> move x64\Debug\RpcClient.exe C:\Users\user\Desktop\ (El ejecutable compilado se encontrará en su escritorio.)
Ahora, para compilar "SprintCSP.dll", solo necesitamos modificar la función "DoStuff()" en "C:\LPE via StorSvc\SprintCSP\SprintCSP\main.c" para que ejecute un comando que nos otorgue acceso privilegiado a la máquina. Para simplificar, haremos que la DLL agregue nuestro usuario actual al grupo de Administradores. También podemos obtener una reverse shell desde ese objetivo a nuestra máquina. Ahora compilemos la DLL ejecutando el siguiente comando y movamos el resultado de vuelta a nuestro escritorio: Comandos: C:\LPE via StorSvc\SprintCSP> msbuild SprintCSP.sln C:\LPE via StorSvc\SprintCSP> move x64\Debug\SprintCSP.dll C:\Users\user\Desktop\
Ahora estamos listos para lanzar el exploit. Asegúrese de tener los archivos "LocalPotato.exe", "RpcClient.exe" y "SprintCSP.dll".
Detección y Mitigación
Detección Ahora que hemos entendido cómo funciona el exploit localpotato y cómo se puede encadenar con el servicio StorSrv para ejecutar código como SYSTEM, es momento de ver cómo se puede detectar esto dentro del sistema y cómo prevenir tales ataques.
Regla YARA: Como este ataque implica un ejecutable que se ejecuta en la terminal de línea de comandos con argumentos, dos formas comunes de detectar esta actividad serían mediante la herramienta de coincidencia de patrones YARA para detectar los patrones de archivos y examinando los eventos generados por la ejecución de esta herramienta de hackeo localpotato.exe. Como el ataque utiliza la herramienta de hackeo conocida como localpotato.exe, podemos crear una regla YARA para detectar la presencia de esta herramienta dentro del sistema usando YARA u otras herramientas de detección como THOR para escanear el host. (La regla YARA se adjunta en este repositorio; esta regla mínima busca patrones de cadenas comunes en el ejecutable localpotato).
Regla Sigma: SIGMA es un lenguaje de firma genérico que se utiliza para escribir reglas de detección basadas en los patrones encontrados en los Registros de Eventos. Para detectar localpotato en la red, se espera tener habilitada la monitorización centralizada de registros. La siguiente regla SIGMA está tomada del repositorio oficial de SIGMA (https://github.com/SigmaHQ/sigma/blob/master/rules/windows/process_creation/proc_creation_win_hktl_localpotato.yml).
Podemos usar estas reglas sigma para convertirlas en la herramienta de Detección/Monitoreo existente y buscar en los Registros de Eventos para cazar posibles ataques.
Mitigación