Tercera vulnerabilidad del cliente de Windows Steam, pero no 0 días

En series anteriores


No hace mucho tiempo, hablé sobre dos vulnerabilidades de Steam: CVE-2019-14743 y CVE-2019-15316 . Hubo una historia completa sobre cómo intenté registrarlos, no tuve éxito, me prohibieron, y solo después de la divulgación pública y la ayuda de la comunidad logré lograr resultados. Valve fingió disculparse y desanimarme en HackerOne, así que decidí transferir la siguiente vulnerabilidad a través de este servicio. La tercera vez ( debería haber una broma obvia sobre Half-Life 3 ), todo fue más o menos exitoso.



Descripción de la vulnerabilidad


La vulnerabilidad le permite crear archivos con contenido parcialmente controlado (o agregar contenido parcialmente controlado a los archivos existentes). La versión del servicio vulnerable es 5.31.28.21 (datos del archivo SteamService.exe). Primero, describiré cómo explotar la vulnerabilidad, y luego describiré las posibles consecuencias.

Paso 1. Medio ambiente


Debe completar la aplicación Steam y detener el servicio de cliente Steam si se están ejecutando. Con mayor frecuencia, los usuarios sin derechos de administrador no pueden iniciar ni detener ningún servicio. Pero específicamente para este servicio, Valve establece derechos que permiten a todos los usuarios detenerlo e iniciarlo.

Cree una carpeta en cualquier lugar accesible para el usuario (por ejemplo, "C: \ test"). En esta carpeta, debe copiar los archivos Steam.exe y steamclient.dll de la carpeta fuente de Steam (de forma predeterminada, esto es "C: \ Archivos de programa (x86) \ Steam"). Cree una subcarpeta de registros vacía ("C: \ test \ logs").

Ahora arreglemos el registro: en la rama "HKLM \ Software \ wow6432node \ valve \ steam", cambie el valor del parámetro "InstallPath" a "C: \ test \ 1 \ ..". Por lo general, para usuarios no administradores, las ramas de registro dentro de HKLM no se pueden escribir, pero no en este caso. Al instalar Valve, establecen tales derechos para su sucursal dentro de HKLM que en él todas las acciones están disponibles para todos los usuarios ("Control total" para el grupo "Usuarios").

Paso 2. Hagamos una pequeña prueba


Inicie el servicio de cliente de Steam. Después de que se detenga (esto sucederá automáticamente después de unos segundos), verifique el contenido de la carpeta "C: \ test \ logs"; allí encontramos el archivo "service_log.txt". El contenido del registro será algo como esto:

08/27/19 13:45:01 : ERROR: SteamService: Invalid file signature C:\test\1\..\bin\SteamService.dll 

Tenga en cuenta que la ruta "C: \ test \ 1 \ .." es equivalente a la ruta "C: \ test", por lo que Windows utilizó la segunda para trabajar y la primera entró en el mensaje. Elimine el archivo "service_log.txt" y continúe.

Paso 3. Agrega más texto.


Un hecho interesante: cuando Windows trabaja con rutas que contienen "\ ..", simplifica automáticamente dichas rutas. No hacer verificaciones para las carpetas de preparación.

Por ejemplo, la ruta “C: \ 1 \ <test> \ ..” se convertirá a “C: \ 1” a pesar de que los corchetes angulares no pueden usarse en el nombre de la carpeta.

En el primer paso, registramos la ruta en el registro, ahora le agregaremos saltos de línea. Esto se puede hacer escribiendo un código simple, pero también se puede hacer desde la interfaz regedit. Simplemente abra la rama del registro "HKLM \ Software \ wow6432node \ valve \ steam" y seleccione "Modificar datos binarios .." en el menú contextual del parámetro "InstallPath". Aparecerá algo así como un editor hexadecimal donde puede realizar las ediciones necesarias.



Realizaremos otro lanzamiento de prueba del servicio y verificaremos el resultado de nuestras acciones.



Después de la prueba, debe eliminar nuevamente el archivo "service_log.txt".

Paso 4. Redirige el archivo creado


Los usuarios sin derechos de administrador no pueden crear enlaces simbólicos de un archivo a otro. Pero hay un enfoque: puede combinar otros tipos de enlaces que están disponibles para los usuarios sin derechos de administrador para obtener un efecto cercano a un enlace simbólico de un archivo a otro.

Primero, cree un punto de análisis NTFS (otro nombre para el punto de montaje NTFS) de la carpeta "C: \ test \ logs" a "\ RPC Control \". "\ RPC Control \" no es una carpeta normal en el sentido habitual, no se puede ver, por ejemplo, en el explorador. Este es un directorio de objetos del sistema, dentro del cual se encuentran, por ejemplo, mutexes con nombre, eventos y otros objetos similares. Por qué la redirección a través del punto de análisis NTFS funciona para ella no está claro, lo más probable es que el punto sea usar las mismas abstracciones para las carpetas en el sistema de archivos y directorios de objetos. Desde el directorio de objetos, puede crear un enlace simbólico a un archivo sin derechos de administrador. Cree un enlace simbólico del formulario "\ RPC Control \ service_log.txt" <-> "C: \ Path \ to \ file".

Como resultado, cualquier llamada a "C: \ test \ logs \ service_log.txt" se redirigirá al archivo "C: \ Path \ to \ file". Para crear dicha redirección hay dos requisitos básicos: la carpeta desde la que se crea el punto de análisis NTFS debe estar vacía y también debe poder escribirse para el usuario. Para cumplir con la primera condición, después de cada prueba eliminamos el archivo "service_logs.txt", la segunda condición está garantizada por el hecho de que creamos la carpeta de origen en un lugar controlado por el usuario.

Existe una utilidad especial que crea estos pares de enlaces simbólicos: CreateSymlink y está disponible para descargar en GitHub . Uso de utilidad:

 CreateSymlink.exe <> <> 

En nuestro caso, será:

 CreateSymlink.exe "C:\test\logs\service_log.txt" "C:\\\" 

Al unirlo todo, obtenemos que cuando se inicia el Servicio de cliente de Steam, se creará un archivo a lo largo de la ruta que se especificó al crear el enlace simbólico, y este archivo contendrá contenido que podemos controlar (bueno, excepto la primera y última línea). Si especificamos la ruta a un archivo existente, los contenidos se agregarán al final del archivo. Todo esto se hará en nombre del Servicio de cliente de Steam con privilegios NT AUTHORITY \ SYSTEM.

Impacto


Ahora enumeraré los posibles efectos de los menos importantes y ascendentes.

  1. Dos

    Si el objetivo del enlace simbólico es establecer "C: \ Windows \ System32 \ config \ SAM" o "C: \ Windows \ System32 \ config \ SECURITY", entonces es poco probable que el sistema operativo pueda arrancar después de un reinicio.
  2. Redireccionamiento de usuarios en Internet

    Establezca el objetivo del enlace simbólico "C: \ Windows \ system32 \ drivers \ etc \ hosts" y agregue una línea como "127.0.0.1 google.com" allí.

    Resultado:

  3. EoP horizontal
    Un aumento horizontal en los privilegios es un cambio en los derechos en los que no accedemos a derechos más altos, sino a derechos del mismo nivel, pero relativos a otros objetos, por ejemplo, a los derechos de otros usuarios.

    Establezca el objetivo del enlace simbólico "C: \ ProgramData \ Microsoft \ Windows \ Start Menu \ Programs \ StartUp \ run.bat" y agregue una línea como "start C: \ test \ 1.exe" allí.
    Todos los archivos de la carpeta C: \ ProgramData \ Microsoft \ Windows \ Start Menu \ Programs \ StartUp son ejecutados por los usuarios cuando inician sesión. Por lo tanto, un usuario puede obligar a otro usuario a ejecutar código. Desde el archivo bat, todas las líneas se ejecutarán a su vez. El primero y el último simplemente no harán nada, pero el comando implementado "start C: \ test \ 1.exe" funcionará.

    Con la introducción de dicho comando, hay una sutileza: los caracteres "\" se tendrán en cuenta durante la normalización de la ruta, por lo que para un funcionamiento correcto será necesario agregar algunos "\ .." más a la ruta en el registro.
  4. EoP vertical
    La escalada vertical de privilegios es una escalada habitual, por ejemplo, de un usuario sin derechos de administrador a NT AUTHORITY \ SYSTEM.

    Muy a menudo puede encontrar software que ejecuta scripts de texto con altos derechos. Podemos agregar comandos a dichos scripts y ejecutar nuestro código con permisos elevados. No encontré tales scripts en un sistema operativo limpio, por lo que no puede demostrar tal vulnerabilidad. Pero como ejemplo, puedo especificar archivos bat creados por NVIDIA y VmWare o scripts de inicio de sesión para el sistema operativo en el dominio.

Además, para mejorar, puede verificar la capacidad de crear archivos xml, archivos ini con un formato roto. Desafortunadamente, hay demasiadas opciones: crear tareas para TaskSheduler, trabajar con .manifest y otras descargas de bibliotecas, y muchas otras. Me parece que los resultados descritos anteriormente ya son suficientes para comprender los resultados de la vulnerabilidad.

Cronograma


Para completar la imagen, daré una línea de tiempo aburrida sobre esta vulnerabilidad.
26/08 - Se encontró una vulnerabilidad.
27 de agosto - unban en h1, publicó un informe.
12.09: se ha publicado una corrección .

Conclusiones


Aquí es donde termino las publicaciones de investigación de Steam: 3 vulnerabilidades que se encontraron con un análisis bastante superficial, esto no es suficiente. Para profundizar necesitas más tiempo y ganas. Desafortunadamente, la actitud de Valve y la incompetencia de los empleados de HackerOne son barreras muy fuertes.

Quiero agradecer una vez más a todos los lectores que ayudaron a que Steam sea más seguro. Agradezco a Valve por corregir las vulnerabilidades y refutar mis teorías de conspiración. Agradezco a HackerOne por proporcionar la plataforma, a pesar de que básicamente me impidieron comunicar las vulnerabilidades a Valve.

Este artículo en inglés.

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


All Articles