LocalPotato-CVE-2023-21746

Hoy estaremos entendiendo el CVE-2023-21746 LocalPotato. La vuln fué descubierta el 9 de septiembre de 2022 por Andrea Pierini( @decoder_it ) y Antonio Cocomazzi ( @splinter_code )

Esta vulnerabilidad permitía una escalada de privilegios local. La vulnerabilidad permitiría a un atacante con una cuenta de privilegios bajos en un host leer/escribir archivos arbitrarios con privilegios de SYSTEM.

Microsoft sacó el parche en enero de 2023. Un poco más tarde salió una PoC el 10 de febrero de 2023.

La vulnerabilidad como tal no permite ejecutar comandos en el sistema, pero se puede conccatenar con otros vectores para que sea posible.

Autenticación NTLM a través de la red

Para entender todo lo primero será entender la autenticación NTLM, podemos ver una autenticación NTLM cuando nos intentamos conectar a un host remoto. En ese proceso viajan 3 paquetes.

  • Mensaje de negociación: El cliente envia un paquete para negociar la autenticación. El paquete puede llevar el nombre de la máquina cliente y su dominio. El servidor recibe el paquete y lo verifica.

  • Mensaje “Challenge”: El servidor responde con un “desafio”. El desafio es un numero aleatorio que se utiliza para autenticar al cliente sin necisidad de credenciales.

  • Mensjae de autententicación: El cliente recibe el desafío del servidor y utiliza la contraseña del usuario para cifrar una respuesta al desafío. Esta respuesta se envía de vuelta al servidor para su verificación. Si el servidor verifica con éxito la respuesta, el cliente se considera autenticado y se concede acceso a los recursos de la red.

La autenticación NTLM utiliza la criptografía de cifrado de bloque para proteger la seguridad de la comunicación de red. Los datos se cifran antes de ser enviados y se descifran cuando se reciben.

Autenticación NTLM de forma LOCAL

Este tipo de autenticación se usa cuando queremos acceder a un servicio que está en la misma máquina, como estamos en la misma máquina no hace falta el proceso de desafio-respuesta como antes. Se sigue el siguiente proceso.

Los tres mensajes son como los anteriores, pero cambian de la siguiente forma:

  • Mensaje de negociación: El cliente envia un paquete para negociar la autenticación. El paquete tiene que llevar el nombre de la máquina cliente y su dominio. El servidor recibe el paquete y verifica que estan en la misma máquina.

  • Mensaje “Challenge”: El servidor crea un contexto de seguridad y devuelve un ID al cliente. El cliente posteriormente puede usar el ID de contexto de seguridad para asociarse a la conexión.

  • Mensjae de autententicación: Si el cliente se asocia correctamente, se envía un mensaje vacío al servidor para indicar que todo se realizó correctamente.

LocalPotato.

LocalPotato se aprovecha de la 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. El resultado es tener privilegios sobre recursos ccomo C$ y ADMIN$

El proceso será el siguiente:

  • El atacante activará un proceso privilegiado para conectarse a un servidor falso bajo su control. Esto funciona de manera similar a los exploits previos de Potato, donde un usuario sin privilegios puede obligar al sistema operativo a crear conexiones que usan un usuario privilegiado (generalmente SYSTEM).

  • El servidor no autorizado instanciará un Contexto de seguridad A para la conexión privilegiada, pero no lo devolverá inmediatamente. En su lugar, el atacante lanzará un cliente no autorizado que simultáneamente inicia una conexión contra el servidor SMB local (uso compartido de archivos de Windows) con sus credenciales actuales sin privilegios. El cliente enviará el mensaje Tipo 1 para iniciar la conexión y el servidor responderá enviando un mensaje Tipo 2 con la ID para un nuevo Contexto de seguridad B .

  • El atacante intercambiará los ID de contexto de ambas conexiones para que el proceso privilegiado reciba el contexto de la conexión del servidor SMB en lugar del suyo propio. Como resultado, el cliente Privilegiado asociará su usuario (SISTEMA) con el Contexto de Seguridad B de la conexión SMB creada por el atacante. Como resultado, el cliente del atacante ahora puede acceder a cualquier red compartida con privilegios de SISTEMA.

Poniendo a prueba la PoC.

La PoC se encuentra en el siguiente repositorio https://github.com/decoder-it/LocalPotato En este caso estaremos secuestrando una DLL para ejecutar comandos a nivel de sistema con privilegios de SYSTEM. Esto tiene un problema y es que necesitamos guardar el DLL en PATH del sistema. LocalPotato nos permitirá escribir y el problema se resolverá.

Vamos a secuestrar StorSvc

Un atacante puede enviar una llamada RPC al SvcRebootToFlashingMode método provisto por el StorSvc servicio, lo que a su vez terminará provocando un intento de cargar una DLL faltante llamadaSprintCSP.dll

RPCE es una especie de API que expone funciones para usarse de forma remota. En este caso se expone SvcRebootToFlashingMode.

Dado que StorSvc se ejecuta con privilegios de SISTEMA, la creación de SprintCSP.dll en algún lugar de la RUTA lo cargará cada vez que  SvcRebootToFlashingMode se realice una llamada.

Necesitamos compilar el exploit.

  • SprintCSP.dll : Esta es la DLL faltante que vamos a secuestrar. El código predeterminado provisto con el exploit ejecutará el comando. En este caso estamos metiendo al usuario en el grupo de administradores.

  • RpcClient.exe : este programa activará la llamada RPC a SvcRebootToFlashingMode. Dependiendo de la versión de Windows a la que se dirija, es posible que deba editar un poco el código del exploit, ya que las diferentes versiones de Windows usan diferentes identificadores de interfaz para exponer los archivos SvcRebootToFlashingMode.

Una vez tengas todo compilado vamos a probar mover el dll a system32, no deberiamos poder.

Si usamos LocalPotato podremos moverlo.

Ahora si llamamos a RpcClient.exe Se ejecutará nuestra DLL y el comando anterior también.

Podemos comprobar que estamos en el grupo de administradores.

Mitigación.

  • Mantener el sistema actualizado con los ultimos parches de seguridad.
  • Seguir el principio del minimo privilegio.
  • Utilizar herramientas para monitorizar las actividades sospechosas en la red. Como puedes ser un EDR un XDR etc…