Y otro Steam Windows Client Local Privilege Escalation 0day

En la serie anterior


No hace mucho tiempo publiqué una descripción de la vulnerabilidad para Steam. Recibí muchos comentarios de los lectores. Valve no dijo una palabra, y HackerOne envió una gran carta de lágrimas y, básicamente, guardó silencio. Como resultado, Valve me prohibió el acceso a H1. No puedo participar en su programa para rechazar vulnerabilidades (el resto de H1 está disponible para mí).



Puede obtener más información sobre la historia en una publicación anterior, aquí diré algunas palabras sobre el estado actual.

Pero es simple y triste: la válvula todavía falla. La última actualización, que fue diseñada para solucionar el problema, se pasa por alto fácilmente y la vulnerabilidad sigue siendo relevante. Sí, lo revisé, funciona muy bien.

Pero este artículo no trata sobre el hecho de que la vulnerabilidad anterior todavía está presente, sino sobre la nueva. Dado que Valve una vez más expresó su deseo de leer un informe público, en lugar de uno privado, no los privaremos de este placer.

Breve descripción de la vulnerabilidad


Una descripción general de la explotación de una vulnerabilidad es bastante sencilla y consta de tres pasos:

  1. Preparamos el entorno para la operación (hasta dos formas de elegir, utilizando diferentes fallas de seguridad).
  2. Haz que Steam copie y ejecute nuestro dll.
  3. Dll debe cumplir pequeños requisitos.

Todas estas acciones pueden ser realizadas por cualquier usuario del sistema operativo, o más precisamente, cualquier programa en la computadora. Como resultado, puede ejecutar cualquier código con privilegios máximos , esta clase de vulnerabilidades se denomina escalada de privilegios (eop) o escalada de privilegios locales (lpe). A pesar del hecho de que cualquier aplicación en sí misma puede causar algún daño, obtener los máximos derechos tendrá consecuencias mucho más significativas. Desactivar el antivirus y el firewall, instalar un rootkit, ocultar el proceso minero, robar los datos personales de todos los usuarios de PC es solo una pequeña parte de lo que puede pensar.

Mínimo teórico


Fue muy divertido ver los comentarios sobre el artículo anterior, donde la gente escribió "El usuario no puede escribir claves de registro en HKLM" o "Se necesitan derechos de administrador para crear un enlace simbólico". Curiosamente, verificar estas acusaciones apenas tomará más tiempo que escribir un comentario. Y sí, por si acaso: ambas afirmaciones son falsas. Por lo tanto, en este artículo decidí hacer una pequeña sección donde describí varios momentos difíciles de la operación.

"No puede escribir en la clave de registro HKLM"


No existe tal regla general. Existen reglas de seguridad específicas para claves de registro específicas. Valve estableció derechos de acceso total para todos los usuarios a la rama HKLM \ SOFTWARE \ Wow6432Node \ Valve \ steam , y por lo tanto, cualquier usuario puede hacer lo que quiera en esta rama.

"No puede iniciar o detener un servicio sin derechos de administrador"


No existe tal regla general. Existen reglas de seguridad específicas para servicios específicos. Valve establece los derechos para que cualquier usuario pueda iniciar y detener el servicio Steam Client.

"Para crear un enlace simbólico, necesita derechos de administrador"


Esta es una pregunta divertida en sí misma, dado que de los 5 tipos principales de enlaces en Windows, solo uno y medio requieren estos derechos. Entonces, conozca: enlace simbólico del archivo, enlace simbólico del directorio de objetos, enlace duro, punto de análisis NTFS y reg_link. Los derechos de administrador solo son necesarios para crear un enlace simbólico de archivo y para un enlace simbólico de directorio de objetos permanente (el temporal vive exactamente mientras la sesión en la que se crea vive, en el sentido general, antes de reiniciar, y no requiere derechos especiales).

Simlink de carpeta a carpeta


Esto se llama punto de análisis NTFS o punto de montaje NTFS. El nombre no es particularmente importante, el hecho es que esto le permite usar una carpeta como puntero a otra. Puede ser creado por un usuario ordinario desde una carpeta vacía si tiene derechos de escritura. Para la creación, utilizaremos la utilidad CreateMountPoint.exe de un conjunto de utilidades para probar el trabajo con enlaces .

Dejando cerradura


El bloqueo saliente ( OpLock u Opportunistic Lock ) es un mecanismo especial en el que una aplicación puede bloquear temporalmente el acceso de todos a un determinado recurso de archivo. Aquí puede escribir muchos detalles de todo tipo, características de trabajar con carpetas y diferentes accesos. La conclusión es: el programa puede "capturar" el evento de acceder a un determinado archivo y mantenerlo por un tiempo. Puede instalar oplocks utilizando la utilidad SetOpLock.exe del mismo conjunto de pruebas para trabajar con enlaces . La ejecución de la utilidad instala el desbloqueo requerido; cuando se produce el acceso, la utilidad escribe un mensaje; Al presionar enter se elimina el desbloqueo.

Baitandndswitch


Este es el nombre de la técnica, que combina la creación de enlaces y la instalación de oplos para ganar TOCTOU (tiempo de verificación \ hora de uso). La esencia es más fácil de explicar con un ejemplo.

Imagine que hay algún programa que hace algo como esto en una fila:

ReadContentFromFile(“C:\test\myfile.txt”); ReadContentFromFile(“C:\test\myfile.txt”); 

Simplemente está leyendo el mismo archivo dos veces seguidas. ¿Siempre se leerá lo mismo? No, no necesariamente

Primero, cree dos carpetas con los archivos C: \ test1 \ myfile.txt y C: \ test2 \ myfile.txt. Y, en general, borraremos la carpeta C: \ test y crearemos un punto de análisis en C: \ test1. Ponemos el desbloqueo en el archivo desde el primer directorio y ejecutamos el programa. Tan pronto como abra el archivo, el desbloqueo funcionará. Cambiaremos el punto de análisis y C: \ test apuntará a C: \ test2. Ahora, después de eliminar el desbloqueo, el programa leerá el archivo por segunda vez desde otro archivo.

¿Por qué se necesita esto? Muy simple: una situación bastante típica en la que el archivo se comprueba primero (primera lectura) y luego se inicia (segunda lectura). Así es como enviamos un archivo para su verificación y otro para su ejecución.

Ahora todo está listo para funcionar.

Operación 1. Preparando el medio ambiente


Es necesario preparar un poco el ambiente de trabajo. Para empezar, debe tomar los archivos ejecutables CreateMountPoint.exe y SetOpLock.exe.

Ahora necesitamos hacer pequeños cambios en la estructura de archivos de Steam. Nuestra tarea es obtener una carpeta con dos archivos Steam.exe y steamclient.dll y la ausencia obligatoria de la carpeta bin. Hay dos formas de hacer esto.

Método 1


Renombrar \ eliminar la carpeta bin de la carpeta principal de Steam. Eso es todo, eres genial (Steam durante la instalación le da a cualquier usuario los derechos sobre todo en su carpeta).

Método 2


En la clave de registro HKLM \ SOFTWARE \ Wow6432Node \ Valve \ steam cambie el parámetro InstallPath a alguna de nuestra carpeta. En esta carpeta, suelte Steam.exe y steamclient.dll de la carpeta principal de Steam.

Supongamos que mediante cualquiera de los métodos hemos preparado la carpeta C: \ Steam (la ruta puede ser cualquiera, pero en los ejemplos usaré esto). Ahora cree otras carpetas b1, b2, b3 y b4 en él. En los primeros tres, cargaremos el archivo steamservice.dll (del kit Steam, en el original estaba en la carpeta bin), y en la carpeta b4 soltaremos la biblioteca especialmente formada con el mismo nombre: steamservice.dll. Los detalles sobre la preparación de la biblioteca se encontrarán en el párrafo 3.

Abrimos dos ventanas de la consola. Esto completa la preparación del medio ambiente.

Operación 2. Sustitución del archivo


Creo que de los preparativos ya ha quedado claro que habrá algo como el BaitAndSwitch descrito anteriormente.

Captura de pantalla de ProcMon:



Esto es parte del lanzamiento típico del servicio de cliente Steam. Tenga en cuenta la parte donde el dll se copia primero a C: \ Archivos de programa (x86) \ Archivos comunes \ Steam, y luego se carga. Nos aseguraremos de que nuestra biblioteca se copie de C: \ Steam \ b4. Desafortunadamente, las verificaciones se realizan primero, incluida la firma de la biblioteca, para que no pueda ser reemplazada (oh, ironía).

Entonces, firmaré los pasos. Los pasos se combinan en grupos de las mismas acciones. Para cada paso, se indicará dónde iniciar y qué sucede (llamé a las diferentes ventanas de consola cmd1 y cmd2).

  1. Cree la carpeta C: \ Steam \ bin y en cmd1 ejecute:
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b1
  2. En cmd1 ponemos el oplock:
    SetOpLock.exe C: \ Steam \ b1 \ steamservice.dll
  3. Iniciamos el servicio de cliente de Steam, vemos en cmd1 que obtuvimos acceso al archivo.

    ***
  4. Elimine C: \ Steam \ bin, cree la carpeta C: \ Steam \ bin en su lugar y en cmd2 ejecute:
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b2
  5. En cmd2 ponemos el oplock:
    SetOpLock.exe C: \ Steam \ b2 \ steamservice.dll
  6. En cmd1 lanzamos el desbloqueo, vemos que cmd2 ha capturado el acceso al archivo.

    ***
  7. Elimine C: \ Steam \ bin, cree la carpeta C: \ Steam \ bin en su lugar y ejecute cmd1:
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b3
  8. En cmd1 ponemos el oplock:
    SetOpLock.exe C: \ Steam \ b3 \ steamservice.dll
  9. En cmd2 lanzamos el desbloqueo, vemos que cmd1 ha capturado el acceso al archivo.

    ***
  10. Elimine C: \ Steam \ bin, cree la carpeta C: \ Steam \ bin en su lugar y ejecute cmd2:
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b2
  11. En cmd2 ponemos el oplock:
    SetOpLock.exe C: \ Steam \ b2 \ steamservice.dll
  12. En cmd1 lanzamos el desbloqueo, vemos que cmd2 ha capturado el acceso al archivo.

    ***
  13. Elimine C: \ Steam \ bin, cree la carpeta C: \ Steam \ bin en su lugar y ejecute cmd1:
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b3
  14. En cmd1 ponemos el oplock:
    SetOpLock.exe C: \ Steam \ b3 \ steamservice.dll
  15. En cmd2 lanzamos el desbloqueo, vemos que cmd1 ha capturado el acceso al archivo.

    ***
  16. Elimine C: \ Steam \ bin, cree la carpeta C: \ Steam \ bin en su lugar y ejecute cmd2:
    CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b4
  17. En cmd1 lanzamos el desbloqueo

Aunque parece complicado, de hecho, la idea es simple: de 6 accesos al archivo C: \ Steam \ bin \ steamservice.dll las primeras 5 veces que se proporcionaron los archivos originales de diferentes carpetas (en el orden de acceso: b1, b2, b3, b2, b3), y por sexta vez se entregó un archivo con una carga útil para copiar.

Esquemáticamente, lo describí así:


A la izquierda está el comportamiento normal, a la derecha está el comportamiento de explotación.

Operación 3. Biblioteca implementada


Para la carga útil, utilicé por primera vez mi dll más típico, que en DllEntry crea una consola interactiva. Dado que el código de la dll se ejecutará en el contexto del Servicio de cliente de Steam, se ejecutará con los mismos derechos que el servicio en sí mismo: NT AUTHORITY \ SYSTEM. Pero como resultado de la operación, la consola no apareció.

Después de la descarga, el servicio de Steam aún comprende que se deslizaron un tilo y termina el trabajo, por lo que la carga de mi dll no logró ejecutarse.

Tuve que dar la vuelta un poco, y resultó que el servicio después de cargar el dll verifica la existencia de funciones

 int WINAPI SteamService_RunMainLoop() void WINAPI SteamService_Stop() 

en la biblioteca Además, el servicio llama a la primera función, donde decidí poner la carga útil (lanzar una consola interactiva con los derechos del servicio - NT AUTHORITY \ SYSTEM). Ahora eso es todo: repetimos todos los pasos y obtenemos una consola con los permisos máximos.

Conclusión


Puede envolver todo esto en un archivo exe, pero, francamente, realmente no quiero molestarme. Creo que un video con una demostración será suficiente ( opción con el registro , opción con el sistema de archivos ).
No copiaré aquí la sección "Especulación" de un artículo anterior. Solo los hechos: la vulnerabilidad anterior es actual, usted acaba de leer sobre la nueva, Valve todavía no quiere escuchar sobre los problemas.

Actualización (22/08/2019)


Por el momento, hay dos novedades:

  1. El cliente Beta recibió la corrección del parche . Veré cuando la actualización llegue al cliente principal.
  2. Valve ha cambiado la política de LPE . Y esta es una gran noticia!


Actualización (27/08/2019)


Buenas noticias

  1. El cliente principal recibió la actualización del parche .
  2. Fui prohibido en H1 y pagué una recompensa


Este artículo en inglés.

Source: https://habr.com/ru/post/464367/


All Articles