Admin Protection Bypasses via UIAccess
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Przegląd
- Windows AppInfo udostępnia
RAiLaunchAdminProcessdo uruchamiania procesów UIAccess (przeznaczone dla accessibility). UIAccess omija większość filtrowania komunikatów User Interface Privilege Isolation (UIPI), dzięki czemu oprogramowanie dostępności może sterować UI o wyższym IL. - Włączenie UIAccess bezpośrednio wymaga
NtSetInformationToken(TokenUIAccess)z SeTcbPrivilege, więc wywołujący o niskich uprawnieniach polegają na serwisie. Serwis wykonuje trzy sprawdzenia docelowego binarium przed ustawieniem UIAccess: - Osadzony manifest zawiera
uiAccess="true". - Podpisany przez dowolny certyfikat zaufany przez Local Machine root store (bez wymogu EKU/Microsoft).
- Znajduje się w ścieżce dostępnej tylko dla administratorów na dysku systemowym (np.
C:\Windows,C:\Windows\System32,C:\Program Files, z wyłączeniem konkretnych zapisywalnych podścieżek). RAiLaunchAdminProcessnie wyświetla monitów zgody dla uruchomień UIAccess (w przeciwnym razie narzędzia dostępności nie mogłyby obsłużyć monitu).
Token shaping and integrity levels
- Jeśli sprawdzenia zakończą się powodzeniem, AppInfo kopiuje token wywołującego, włącza UIAccess i zwiększa Integrity Level (IL):
- Limited admin user (user is in Administrators but running filtered) ➜ High IL.
- Non-admin user ➜ IL zwiększane o +16 poziomów aż do limitu High (System IL nigdy nie jest przypisywany).
- Jeśli token wywołującego już posiada UIAccess, IL pozostaje bez zmian.
- Sztuczka „Ratchet”: proces UIAccess może wyłączyć UIAccess dla siebie, ponownie uruchomić się przez
RAiLaunchAdminProcessi uzyskać kolejny przyrost o +16 IL. Medium➜High wymaga 255 ponownych uruchomień (głośne, ale działa).
Dlaczego UIAccess umożliwia obejście Admin Protection
- UIAccess pozwala procesowi o niższym IL wysyłać komunikaty okien do okien o wyższym IL (omijając filtry UIPI). Przy równym IL klasyczne mechanizmy UI, takie jak
SetWindowsHookEx, pozwalają na wstrzykiwanie kodu/ładowanie DLL do dowolnego procesu posiadającego okno (włączając w to message-only windows używane przez COM). - Admin Protection uruchamia proces UIAccess pod tożsamością ograniczonego użytkownika, ale na High IL, cicho. Gdy dowolny kod zostanie wykonany w takim procesie High-IL UIAccess, atakujący może wstrzykiwać do innych procesów High-IL na pulpicie (nawet należących do innych użytkowników), łamiąc zamierzoną separację.
HWND-to-process handle primitive (GetProcessHandleFromHwnd / NtUserGetWindowProcessHandle)
- Na Windows 10 1803+ API zostało przeniesione do Win32k (
NtUserGetWindowProcessHandle) i może otworzyć handle procesu używającDesiredAccessdostarczonego przez wywołującego. Ścieżka jądra używaObOpenObjectByPointer(..., KernelMode, ...), co omija normalne sprawdzenia dostępu w trybie użytkownika. - Warunki w praktyce: docelowe okno musi być na tym samym pulpicie, a sprawdzenia UIPI muszą przejść. Historycznie wywołujący z UIAccess mógł ominąć błąd UIPI i mimo to uzyskać handle w trybie jądra (naprawione jako CVE-2023-41772).
- Skutki: uchwyt okna staje się capability do uzyskania potężnego handle procesu (zwykle
PROCESS_DUP_HANDLE,PROCESS_VM_READ,PROCESS_VM_WRITE,PROCESS_VM_OPERATION), którego wywołujący normalnie nie mógłby otworzyć. Umożliwia to dostęp między sandboxami i może złamać granice Protected Process / PPL jeśli cel udostępnia jakiekolwiek okno (włączając message-only windows). - Praktyczny schemat nadużycia: enumeruj lub zlokalizuj HWND (np.
EnumWindows/FindWindowEx), rozwiąż PID właściciela (GetWindowThreadProcessId), wywołajGetProcessHandleFromHwnd, a następnie użyj zwróconego handle do odczytu/zapisu pamięci lub prymitywów przejęcia kodu. - Po poprawce: UIAccess nie daje już otwarć w trybie jądra przy porażce UIPI, a dozwolone prawa dostępu ograniczono do zestawu legacy hook; Windows 11 24H2 dodaje sprawdzenia ochrony procesu i bezpieczniejsze ścieżki w feature-flagach. Wyłączenie UIPI globalnie (
EnforceUIPI=0) osłabia te zabezpieczenia.
Secure-directory validation weaknesses (AppInfo AiCheckSecureApplicationDirectory)
AppInfo rozwiązuje podaną ścieżkę przez GetFinalPathNameByHandle, a następnie stosuje porównania łańcuchowe allow/deny względem zakodowanych korzeni/wykluczeń. Wiele klas obejść wynika z tej uproszczonej walidacji:
- Directory named streams: Wykluczone zapisywalne katalogi (np.
C:\Windows\tracing) można obejść używając strumienia nazwanego na samym katalogu, np.C:\Windows\tracing:file.exe. Sprawdzenia łańcuchowe widząC:\Windows\i pomijają wykluczoną podścieżkę. - Writable file/directory inside an allowed root:
CreateProcessAsUsernie wymaga rozszerzenia.exe. Nadpisanie dowolnego zapisywalnego pliku w dozwolonym korzeniu z payloadem wykonywalnym działa, lub skopiowanie podpisanego EXE zuiAccess="true"do dowolnego zapisywalnego podkatalogu (np. pozostałości po aktualizacji takie jakTasks_Migrated, gdy istnieją) pozwala mu przejść check secure-path. - MSIX into
C:\Program Files\WindowsApps(fixed): Non-admins mogli instalować podpisane pakiety MSIX, które trafiały doWindowsApps, który nie był wykluczony. Zapakowanie binarki UIAccess w MSIX i uruchomienie jej przezRAiLaunchAdminProcessdawało cichy proces UIAccess z High-IL. Microsoft złagodził problem przez wyłączenie tej ścieżki; ograniczona capabilityuiAccessdla MSIX i tak wymagała instalacji przez admina.
Attack workflow (High IL without a prompt)
- Uzyskaj/zbuduj signed UIAccess binary (manifest
uiAccess="true"). - Umieść go tam, gdzie lista dozwolonych AppInfo go akceptuje (lub wykorzystaj edge case walidacji ścieżki/zapisywalny artefakt jak wyżej).
- Wywołaj
RAiLaunchAdminProcess, by uruchomić go cicho z UIAccess + podwyższonym IL. - Z tego High-IL punktu zaczepienia zaatakuj inny proces High-IL na pulpicie używając window hooks/DLL injection lub innych prymitywów tego samego IL, aby w pełni przejąć kontekst administratora.
Enumerating candidate writable paths
Uruchom pomocnika PowerShell, aby odkryć zapisywalne/nadpisywalne obiekty wewnątrz nominalnie bezpiecznych korzeni z perspektywy wybranego tokena:
$paths = "C:\\Windows","C:\\Program Files","C:\\Program Files (x86)"
Get-AccessibleFile -Win32Path $paths -Access Execute,WriteData `
-DirectoryAccess AddFile -Recurse -ProcessId <PID>
- Uruchom jako Administrator dla szerszej widoczności; ustaw
-ProcessIdna low-priv process, aby odwzorować dostęp tego tokena. - Filtruj ręcznie, aby wykluczyć znane niedozwolone podkatalogi przed użyciem kandydatów z
RAiLaunchAdminProcess.
References
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


