UAC 우회 (UAC Bypass)¶
요약
로컬 Administrators 그룹 구성원이 로그온하면(Vista 이후) Windows는 필터링된 중간 무결성(medium-integrity) 토큰을 줍니다; 무언가를 "관리자로" 실행하려면 UAC 프롬프트를 거쳐 높은 무결성(high-integrity) 토큰으로 바꿔야 합니다. 일부 서명된 Windows 바이너리는 auto-elevate로 표시돼 있어 기본 UAC 수준에서 프롬프트 없이 높은 토큰을 받습니다. UAC 우회는 이런 자동 상승 바이너리가 공격자의 명령을 실행하게 만드는 것으로, 보통 그 바이너리가 읽는 사용자별(HKCU) 레지스트리 키에 값을 심는 방식입니다. 결과: 프롬프트가 안 뜨는, 이미 관리자인 사용자에게서 관리자 수준 코드 실행. Microsoft는 UAC를 보안 경계로 보지 않기 때문에, 많은 우회 기법이 몇 년씩 패치되지 않고 남아 있습니다.
공격 원리¶
sequenceDiagram
participant M as Malware (medium integrity, user is local admin)
participant R as HKCU registry
participant F as fodhelper.exe (auto-elevate)
participant C as cmd.exe
M->>R: write HKCU\Software\Classes\ms-settings\shell\open\command<br/>(Default)=payload, DelegateExecute=""
M->>F: start fodhelper.exe
F->>F: elevates silently (high integrity)
F->>R: looks up ms-settings handler — HKCU wins over HKLM
F->>C: launches payload as HIGH integrity
M->>R: delete the key (cleanup)
주요 계열: 레지스트리 핸들러 하이재킹(fodhelper, computerdefaults, mscfile을 통한 eventvwr, sdclt), 환경 변수 / 경로 하이재킹(SilentCleanup 같은 예약 작업의 %windir% 리디렉션), 자동 상승 바이너리의 DLL 하이재킹, 상승된 COM 인터페이스(ICMLuaUtil). 오픈 소스 UACME 프로젝트가 70개 이상의 방법과 각각이 동작하는 Windows 빌드를 정리해 두었습니다.
공격 도구 / 명령¶
# fodhelper (Windows 10/11) — what the registry write looks like
reg add HKCU\Software\Classes\ms-settings\shell\open\command /d "C:\Users\Public\p.exe" /f
reg add HKCU\Software\Classes\ms-settings\shell\open\command /v DelegateExecute /f
fodhelper.exe
# eventvwr (Windows 7 – early 10)
reg add HKCU\Software\Classes\mscfile\shell\open\command /d "cmd.exe" /f
eventvwr.exe
# Frameworks
UACME (Akagi64.exe <method#>) · Metasploit bypassuac_* · Cobalt Strike elevate uac-token-duplication
영향받는 Windows 버전¶
| 버전 | UAC 여부 | 메모 |
|---|---|---|
| XP / 2003 | UAC 없음 | 사용자가 보통 완전한 관리자로 실행 — 우회가 필요 없음; 권한 상승은 커널/서비스 익스플로잇을 사용 |
| Vista / 2008 | 있음 — 하지만 모든 것에 프롬프트, 자동 상승 바이너리가 적음 | 우회가 덜 흔함 |
| 7 / 2008 R2 | 있음 — 자동 상승과 슬라이더 도입(기본값 "앱이 변경하려고 할 때만 알림") | eventvwr, sdclt, DLL 하이재킹 우회가 널리 쓰임 |
| 8.1 / 10 | 있음 | fodhelper (10+), computerdefaults, SilentCleanup 환경 변수 하이재킹; eventvwr는 10 1703에서 수정 |
| 11 | 있음 | 대부분의 레지스트리 하이재킹 방법이 기본 수준에서 여전히 동작. Administrator protection(Windows Hello 뒤의 just-in-time 관리자 토큰, 최근 11 빌드에 배포 중)이 켜진 곳에서는 자동 상승 모델이 깨짐 |
| Server | 있음, 하지만 기본 제공 Administrator(RID 500)는 기본적으로 예외 (FilterAdministratorToken=0) |
서버에서는 공격자가 이미 전체 토큰을 가진 경우가 많음 |
남는 흔적¶
| 위치 | 아티팩트 | 찾을 것 |
|---|---|---|
| Sysmon | HKCU\Software\Classes\<ms-settings, mscfile, exefile, Folder>\shell\open\command 또는 HKCU\Environment\windir 아래 12/13 (레지스트리 키 생성 / 값 설정) |
하이재킹 그 자체 — 정상인 경우가 거의 없음 |
| Sysmon / 4688 | 1 — ParentImage가 fodhelper.exe, computerdefaults.exe, eventvwr.exe, sdclt.exe, wsreset.exe, slui.exe, changepk.exe이고 자식이 셸/LOLBin/서명 없는 exe |
자동 상승 부모 아래에서 시작한 페이로드 |
| Sysmon 1 / 4688 | 부모 체인이 Medium에서 시작했는데 중간에 consent.exe 없이 IntegrityLevel=High인 프로세스 |
프롬프트 없는 상승 |
| 레지스트리 (오프라인) | NTUSER.DAT Software\Classes\...\shell\open\command — 값이 지워졌어도 키 LastWrite 시간 |
타임라인 증거 |
| Security 로그 | 페이로드의 4688 Token_Elevation_Type = %%1937 (TokenElevationTypeFull) |
Type 2 = 전체 토큰 |
탐지¶
index=botsv3 sourcetype="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventID IN (12,13)
| where match(TargetObject,"(?i)\\\\Software\\\\Classes\\\\(ms-settings|mscfile|exefile|folder|launcher\.systemsettings)\\\\shell\\\\open\\\\command|\\\\Environment\\\\windir")
| table _time, host, User, Image, EventType, TargetObject, Details
Sysmon 12 = 레지스트리 키 생성/삭제; 13 = 레지스트리 값 설정. TargetObject는 전체 키 경로, Details는 쓰인 값입니다. 정규식은 흔한 우회 기법들이 쓰는 핸들러 키와 windir 환경 변수 하이재킹을 다룹니다.
index=botsv3 sourcetype="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventID=1
| eval parent=lower(replace(ParentImage,".*\\\\",""))
| where parent IN ("fodhelper.exe","computerdefaults.exe","eventvwr.exe","sdclt.exe","wsreset.exe","slui.exe","changepk.exe")
| where NOT like(lower(Image),"%\\mmc.exe")
| table _time, host, User, parent, Image, CommandLine, IntegrityLevel
replace(ParentImage,".*\\\\","")는 폴더를 떼고 파일 이름만 남깁니다. eventvwr.exe는 원래 mmc.exe를 실행하므로 제외합니다; 이 바이너리들이 띄운 그 밖의 것은 모두 의심스럽습니다.
대응¶
UAC 우회가 있었다는 것은 사용자 계정이 이미 로컬 관리자이고 공격자가 이제 높은 무결성을 가졌다는 뜻입니다 — 호스트를 완전히 침해된 것으로 보고 범위를 잡으세요(보통 자격 증명 덤프가 뒤따릅니다). 레지스트리 키를 지우고, 페이로드를 수집하고, 같은 사용자가 다른 컴퓨터에서도 관리자인지 확인합니다.
Windows 버전별 대응책¶
| 대응책 | 막는 것 | 적용 가능 버전 |
|---|---|---|
| 사용자는 로컬 관리자가 아님; 관리자 계정 분리 | 모든 UAC 우회의 전제 조건 제거 | 모든 버전 (XP: 유일한 실질적 통제) |
UAC 수준 항상 알림 (ConsentPromptBehaviorAdmin=2) |
조용한 자동 상승을 끔 — 대부분의 레지스트리 하이재킹 우회 차단 | Vista+ (7+에 슬라이더) |
보안 데스크톱에서 자격 증명 요구 (ConsentPromptBehaviorAdmin=1) |
관리자가 비밀번호를 입력해야 함 — 더 강함 | Vista+ |
FilterAdministratorToken=1 (RID 500용 관리자 승인 모드) |
기본 제공 Administrator도 필터링된 토큰을 받음 | Vista+ (서버에서 중요) |
| Administrator protection | 격리된 just-in-time 관리자 토큰 | 켜져 있는 최근 Windows 11 빌드 |
| 사용자 쓰기 가능 경로에 WDAC / AppLocker | %TEMP% / Public의 페이로드는 상승돼도 실행 불가 |
AppLocker 7 Ent+; WDAC 10+ |
| 위 키에 대한 Sysmon 레지스트리 모니터링 규칙 | 탐지 | 10 / 2012 R2+의 Sysmon (7은 이전 빌드) |