Elevación de privilegios local en el cliente Steam para Windows
El investigador de seguridad Vasily Kravets ha hecho público un nuevo «día cero» en la popular plataforma de juegos Steam, que permite escalar privilegios en sistemas Windows.
Kravets ya fue noticia el pasado 17 de agosto por el descubrimiento de otra vulnerabilidad que permitía escalar privilegios a través de Steam, la cual reportó a la compañía a través de su programa de «bug bounty». Sin embargo, Valve prohibió a Kravets el acceso a su sistema de recompensas.
Por este motivo, Vasily Kravets ha revelado públicamente esta otra vulnerabilidad a la cual se le ha asignado el identificador CVE-2019-15316.
A continuación se explican los detalles técnicos sobre la explotación. Ésta consta de tres fases:
Primera fase: preparación del entorno
El primer paso será adaptar la estructura de ficheros de Steam. Nuestro objetivo será tener el ejecutable «Steam.exe» y «steamclient.dll» en una misma carpeta, sin la carpeta «bin». Esto podemos conseguirlo de dos formas:
Método 1:
Renombrar/eliminar la carpeta «bin» de la raíz de Steam.
Método 2:
Cambiar el parámetro «InstallPath» en la clave de registro «HKLMSOFTWAREWow6432NodeValvesteam» y mover «Steam.exe» y «steamclient.dll» al nuevo path elegido.
Una vez tenemos la estructura de ficheros deseada, necesitamos crear las carpetas «b1», «b2», «b3», «b4» en ese mismo directorio. Copiaremos «steamservice.dll» en «b1», «b2» y «b3» y colocaremos nuestra versión manipulada de la DLL en «b4».
Segunda fase: intercambiar el fichero
En la captura de pantalla puede verse el registro del servicio «Steam Client» legítimo. En la parte señalada puede observarse cómo la DLL es leída y copiada a la carpeta «C:Program Files (x86)Common FilesSteam» para posteriormente ser leída. Este mecanismo será el que utilicemos para copiar la librería modificada.
A continuación se detallan los pasos necesarios para provocar la condición de carrera de tipo TOCTOU (TIME OF CHECK TO TIME OF UPDATE) necesaria para evadir a los mecanismos anti-secuestro implementados en el cliente Steam.
- Creamos la carpeta «bin» dentro de nuestra estructura de ficheros y ejecutamos el siguiente comando desde la consola: CreateMountPoint.exe С:{DIRECTORIO_PREPARADO}bin C:{DIRECTORIO_PREPARADO}b1
- En la primera terminal hacemos SetOpLock.exe C:{DIRECTORIO_PREPARADO}b1steamservice.dll
- Ejecutamos el servicio «Steam Client»
- Eliminamos la carpeta С:{DIRECTORIO_PREPARADO}bin, creamos la carpeta С:{DIRECTORIO_PREPARADO}bin (mismo nombre y lugar) y ejecutamos lo siguiente en una segunda terminal: CreateMountPoint.exe С:{DIRECTORIO_PREPARADO}bin C:{DIRECTORIO_PREPARADO}b2
- En la segunda terminal hacemos: SetOpLock.exe C:{DIRECTORIO_PREPARADO}b2steamservice.dll
- Liberamos el «oplock» de la primera terminal.
- Eliminamos la carpeta С:{DIRECTORIO_PREPARADO}bin, creamos la carpeta С:{DIRECTORIO_PREPARADO}bin (mismo nombre y lugar) y ejecutamos lo siguiente en la primera terminal: CreateMountPoint.exe С:{DIRECTORIO_PREPARADO}bin C:{DIRECTORIO_PREPARADO}b3
- En la primera terminal hacemos: SetOpLock.exe C:{DIRECTORIO_PREPARADO}b3steamservice.dll
- Liberamos el «oplock» de la segunda terminal.
- Eliminamos la carpeta С:{DIRECTORIO_PREPARADO}bin, creamos la carpeta С:{DIRECTORIO_PREPARADO}bin y ejecutamos lo siguiente en una segunda terminal: CreateMountPoint.exe С:{DIRECTORIO_PREPARADO}bin C:{DIRECTORIO_PREPARADO}b2
- En la segunda terminal ejecutamos: SetOpLock.exe C:{DIRECTORIO_PREPARADO}b2steamservice.dll
- Liberamos el «oplock» de la primera terminal.
- Eliminamos la carpeta С:{DIRECTORIO_PREPARADO}bin, creamos la carpeta С:{DIRECTORIO_PREPARADO}bin y ejecutamos lo siguiente en una segunda terminal: CreateMountPoint.exe С:{DIRECTORIO_PREPARADO}bin C:{DIRECTORIO_PREPARADO}b3
- En la primera terminal ejecutamos: SetOpLock.exe C:{DIRECTORIO_PREPARADO}b3steamservice.dll
- Liberamos el «oplock» de la segunda terminal.
- Eliminamos la carpeta С:{DIRECTORIO_PREPARADO}bin, creamos la carpeta С:{DIRECTORIO_PREPARADO}bin y ejecutamos lo siguiente en una segunda terminal: CreateMountPoint.exe С:{DIRECTORIO_PREPARADO}bin C:{DIRECTORIO_PREPARADO}b4
- Eliminamos el «oplock» de la primera terminal.
Lo que intentamos hacer es redirigir los primeros 5 accesos al archivo original y en el sexto dar el cambiazo hacia nuestra DLL manipulada.
En el siguiente esquema puede verse el flujo normal a la izquierda y a la derecha el comportamiento modificado para nuestra explotación.
Fase 3: modificar la librería inyectable
Tras realizar ingeniería inversa sobre el servicio «Steam Client», Kravets determinó el punto en el que colocar el «payload», este es, la función «int WINAPI SteamService_RunMainLoop()». Cuya existencia es requerida por el servicio para su funcionamiento.
Kravets también ha compartido dos pruebas de concepto en su página web que ilustran lo explicado anteriormente:
Más información:
One more Steam Windows Client Local Privilege Escalation 0day
https://amonitoring.ru/article/onemore_steam_eop_0day/
Powered by WPeMatico