본 글에서는 UAC 우회 기법을 이해하기 위한 기본 선수 지식을 설명하고, 다양한 공격 기법을 소개합니다. 마이터에서 정의하고 있는 UAC 우회 및 권한 상승 기법은 T1088, T1183 이 있으며, 각 테크닉의 공격 분류(Tactic)와, 공격 데이터 확인 방법(Data Source)은 아래와 같습니다.
T1088 Bypass User Account Control (MITRE)
- Tactic: Defense Evasion, Privilege Escalation
- Data Sources: System calls, Process monitoring, Authentication logs, Process command-line parameters
T1183 Image File Execution Options Injection (MITRE)
-
Tactic: Privilege Escalation, Persistence, Defense Evasion
-
Data Sources: Process monitoring, Windows Registry, Windows event logs
본 글에서 소개하는 공격 기법은 주식회사 쏘마의 공격 시뮬레이터 ARES에 아래와 같이 적용되어 있습니다.
UAC 기본 이해
사용자 계정 컨트롤 UAC(User Account Control)는 비스타 이상의 윈도우에서 제공하는 보안 기능으로, 권한이 없는 프로그램이나 악성코드가 바로 실행되지 않도록 사용자에게 실행 여부를 묻는 것입니다. 사용자는 편의에 따라 UAC 알람 수준을 설정할 수 있습니다. 일반적으로 관리자 수준의 액세스 권한을 부여하지 않은 계정이라면, 일반 계정의 보안 컨텍스트에서 실행됩니다. 따라서 권한이 없는 프로그램의 자동 설치를 차단하고, 시스템 설정을 실수로 변경하지 않도록 방지해줍니다.
UAC 사용자 계정 컨트롤 작동 방식에 대한 자세한 이해는 마이크로소프트 공식 블로그 윈도우 서버, 윈도우 10를 참고합니다.
다음은 UAC 아키텍처에서 권한 상승 알람이 발생하는 과정을 간단히 요약한 것입니다.
- 사용자가 파일이나 레지스트리를 변경할 때,
- 권한 상승이 필요한 경우인지 확인합니다.
- 응용 프로그램 정보 서비스 (Application Information Service, AIS)를 통해 실행 파일의 권한 상승이 필요한지 여부를 판단합니다. (1. 실행 파일의 권한 상승 필요 여부 판단 참고)
- 권한 상승 알람 설정을 확인해 제일 낮은 수준인
UAC 프롬프트 사용 안함
이 아닌 경우에 다음 과정이 진행됩니다. - ShellExecute 함수를 통해 CreateProcess가 호출되면서 아래 항목을 확인합니다.
- AppCompat 데이터베이스에서 애플리케이션 호환성 수정 항목 확인
- Fusion 데이터베이스에서 애플리케이션 매니페스트의 실행 수준 확인
- 설치 관리자 검색에서 사용자 동의 없이 몰래 실행되는지 확인
- 최종적으로
실행 파일
과사용자 액세스 토큰 (Access Token)
에서권한 수준(IntegrityLevel, IL)
이 일치하는지 확인합니다. - 일치하지 않는다면 CreateProcess에서 ERROR_ELEVATION_REQURERD 오류 반환합니다.
실행 파일의 IntegrityLevel이 High인 경우와 레지스트리나 서비스의 RunLevel이 Highest로 설정되어 있으면 권한 상승 알람이 발생하지 않습니다.
위의 6번 과정에서 설명한 권한 상승 확인 과정은 실행 주체(Subject)보다 권한이 낮은 객체(Object)에만 접근을 허용하는 강제적 접근 제한 보안 모델 MAC(Mandatory Access Control)을 기반으로 합니다. 이 윈도우 보안 모델은 권한 수준(IntegrityLevel, IL)
과 권한 정책(IntegrityPolicy)
으로 구현됩니다. 사용자가 윈도우 시스템에 로그온하면 보안 관리자 프로세스 LSA에서 인증 과정을 거쳐, 커널에 있는 SRM(Security Reference Monitor)에서 NTCreateToken 함수를 통해 사용자의 프로파일 정보가 담긴 토큰을 생성합니다. 그리고 객체에 접근 할 때, SRM의 SeAccessCheck 함수를 통해 사용자의 토큰의 SID에서 계산된 IL과, 접근 하려는 객체의 보안 디스크립터에서 IL을 비교해 접근을 제어하는것입니다.
윈도우에서는 실행 주체(Subject), 객체(Object), 참조 모니터(Reference Monitor), 보안 정책(Security Policy)을 통해 접근을 제어할 수 있는 보안 모델(Discretionary Access Control, Mandatorry Access Control, Role Based Access Control)로 위협으로부터 시스템을 보호하고 있습니다.
그림 출처: 주식회사 쏘마 인텔리전스 팀
본격적으로 우회 기법을 살펴보기 앞서, 파일을 실행할 때 권한 상승이 필요한지 어떻게 판단하는지와, UAC 사용자 토큰이 무엇인지 좀 더 설명 하겠습니다.
1. 실행 파일의 권한 상승 필요 여부 판단
파일이 실행 될 때, 권한 상승이 필요한지 판단하는 조건은 아래와 같습니다.
- 실행 파일에서
<autoElevate>true</autoElevate>
속성이 존재하는지 확인합니다. - 전자서명이 유효한지 확인합니다.
- 신뢰할 수 있는 폴더(예, C:\Windows\System32)에서 실행 되었는지 확인합니다.
위 세 가지 조건이 만족되지 않는다면, UAC 알람 설정 수준에 따라 사용자에게 권한을 상승할지 알림을 발생합니다. 반대로 공격자가 어떤 방식으로든 이 조건을 우회 할 수 있다면, 사용자에게 권한 상승 여부를 물어보지 않고도 권한을 상승할 수 있는 것입니다.
로컬 시스템에서 autoElevate가 설정 되어 있는 실행 파일 찾는 방법은 아래와 같습니다.
findstr /C:"<autoElevate>true" "파일이름" sigcheck.exe -m "파일이름"
2. 사용자 액세스 토큰
사용자 액세스 토큰(Access Token)이란 사용자의 프로파일 정보를 포함하고 있는 것으로, 특정 윈도우 객체에 접근할 때 사용자가 알맞은 권한을 가지고 있는지 판별할 때 사용하는 것입니다다. 토큰에는 아래와 같은 프로파일 정보가 포함되어 있습니다.
- 사용자의 SID
- 사용자가 로그온 할 때 윈도우는 사용자의 IL을 계산해서 액세스 토큰에 할당합니다. 계정의 그룹은 영향을 주지 않으며 Privileges와 SID의 종류에 따라 System/High/Medium/Low/Untrusted IL이 결정됩니다.
- Group: 소속 그룹 SID 목록
- Privileges: 권한
- IL (Integrity Level): Integrety Level의 줄임말로 객체의 권한 수준을 의미
- 예) Medium (S-1-16-8192). 일반 사용자는 대게 IL이 Medium
- Integrity Policy: 권한 적용 수준
SID는 윈도우 운영체제의 보안 그룹이나 보안 사용자를 식별하는 데 사용되는 고유한 값입니다. IL 마다 고유한 SID 값이 매핑됩니다.
과거 XP에서는 사용자가 로그인하면 “Full Administrator Access Token”만 생성해 모든 프로그램이 최고 실행 권한으로 동작했다면, 비스타 이후 버전의 윈도우에서는 두 가지 종류의 토큰으로 나누어 실행 권한을 분리했습니다. 토큰의 종류는 아래와 같습니다.
- Standard User Access Token : 사용자에게 주어지는 기본 토큰
- Administrator Access Token과 같이 동일 사용자 별 정보를 포함하지만 SID와 윈도우 관리 권한은 포함하지 않음
- 관리자 권한이 필요한 작업을 수행하지 않는 앱을 시작하는 데 사용됨
- desktop (explorer.exe) 실행에 사용됨. “Explorer.exe”는 모든 다른 초기 프로세스의 부모 프로세스이므로, 관리자 권한이 필요한 윈도우 기본 프로그램도 이 권한으로 동작이 가능한 것
- Full Administrator Access Token : 관리자의 모든 권한을 부여하는 액세스 토큰
- UAC 경고창에서 “예”를 클릭하면 사용되는 토큰
- 기본 토큰으로 윈도우 기본 기능을 사용하는 것은 문제 없지만, 수정, 삭제 등의 관리가 필요한 경우 이 토큰으로 권한을 상승하고 작업해야 함
UAC 우회 기법
DLL 하이재킹 기법을 기반으로 파일 시스템이나 레지스트리 변조를 통해 UAC 우회 및 권한 상승이 가능합니다. 본 글에서는 설명하는 공격 기법은 아래와 같습니다.
- 1.파일 시스템 변조
- 1.1 autoElevate가 설정된 프로그램과 폴더 공백을 이용한 AIS 체크 우회
- 1.2 일반 사용자도 파일 생성이 가능한 폴더 악용
- 1.2.1 Windows Server 2019 srrstr.dll
- 1.2.2 Windows Server 2008R2-2019 NetMan
- 2.레지스트리 변조
- 2.1 UAC 알람이 발생하지 않는 정상 시스템 파일의 레지스트리 수정
- 2.2 작업 스케쥴을 이용한 우회
- 2.3 T1183 Image File Execution Options Injection
본 글에서는 2018년도 이후에 공개된 공격 기법을 위주로 설명하며, 사용자 액세스 토큰을 이용한 공격 기법 UAC Token Duplication과 MS16-032 취약점, 그리고 EditionUpgradeManager COM 인터페이스와 환경변수 스푸핑 이용한 권한 상승, WUSA/IFileOperation 을 이용해 권한이 필요한 디렉터리에 DLL파일을 복사하는 방식의 권한 상승 기법은 본 글에서 설명하지 않습니다. 주요 공격 기법을 살펴보기 전에, 공격의 기반이 되는 DLL 하이재킹 공격 기법을 먼저 살펴보겠습니다.
DLL 하이재킹 이해
DLL 하이재킹은 DLL planting, binary planting, preloading 이라고도 불립니다. 정상 DLL 파일을 조작된 DLL로 단순히 바꾸거나 프로그램에서 실행할 DLL의 경로를 정확히 지정하지 않은 경우 윈도우가 DLL을 찾는 위치를 악용해 조작된 DLL을 실행하는 방법입니다. DLL을 호출할 때 검색하는 디렉터리 순서 (Dynamic-Link Library Search Order) 는 아래와 같습니다. 이 검색 순서는 기본적으로 설정되는 SafeDllSearchMode에도 적용됩니다.
- 응용 프로그램이 로드되는 디렉터리
- 시스템 디렉터리, GetSystemDirectory 함수 사용
- 16비트 시스템 디렉터리
- Windows 디렉터리 GetWindowsDirectory 함수 사용
- 현재 작업 디렉터리
- PATH 환경 변수에 나열되는 디렉터리. 단, App Paths 레지스트리키는 DLL 검색 path에 포함되지 않음.
과거 LNK 취약점에서 rundll32.exe을 통해 조작된 dll을 로딩하고 권한이 상승되는 방식으로 많이 악용했습니다. 하지만 이런 방식은 쉽게 탐지되며, 응용 프로그램에서 LoadLibrary를 사용할 때 호출할 DLL의 경로를 정확히 지정해주거나, HKLM만 사용하도록 정책을 변경하면 어느 정도 공격을 차단할 수 있습니다. 그럼에도 불구하고 여전히 사용자 디렉터리, HKCU 레지스트리를 악용하는 공격 기법이 계속 나오고 있습니다. MS에서 알고 있어도 취약점으로 판단하지 않는 것도 있으며, 여전히 최신 권한 상승 기법에서 악용하고 있으므로 사용자의 주의가 더욱 필요합니다.
1. 파일 시스템 변조
1.1 autoElevate가 설정된 프로그램과 폴더 공백을 이용한 AIS 체크 우회
이 공격 기법은 자동 권한 상승 조건을 판단하는 과정에서 세 번째 ‘신뢰 디렉터리 조건’을 확인하는 과정을 우회하는 것입니다. 윈도우에서 파일이 실행될 때, 응용 프로그램 정보 서비스 (Application Information Service, AIS)를 통해 자동 권한 상승 조건을 확인합니다. 하지만 정상 시스템 폴더의 이름과 똑같이 하고 끝에 공백만 임의로 추가하면 이 조건을 우회되어 임의의 파일을 정상적으로 실행할 수 있는 취약점입니다.
일반적으로 윈도우에서 폴더를 생성할 때 공백을 사용할 수 있지만 이름의 앞 또는 뒤에 붙이는 경우 자동으로 제거됩니다. 하지만 윈도우 탐색기를 이용하는 경우에만 공백이 제거되는 것이며, CreateDirectory API나 명령 콘솔(cmd)에서 mkdir 명령어을 통해 이름 앞이나 뒤에 공백을 포함해 폴더를 생성할 수 있습니다. 예를 들어 “C:\test \” 라는 폴더를 생성하는 경우, 윈도우 탐색기에서는 만들 수 없지만 API나 명령어를 통해 생성할 수 있는 것입니다.
이 공격 기법은 이런 공백을 이용한 트릭으로 다음과 같은 방식으로 우회됩니다. 우선 공백이 포함된 “C:\Windows \System32\” 폴더를 생성합니다. AIS에서 조건을 판단할 때 세 번째 신뢰 디렉터리 조건은 GetLongPathNameW 함수를 통해 처리하는데, 이 함수에서 폴더 이름의 끝에 공백이 있으면 공백을 자동으로 제거하면서, 원래 정상 폴더인 “C:\Windows\System32\“에서 이 실행 파일이 정상인지 판단하게 됩니다. 따라서 System32에서 실행 된 것처럼 신뢰 디렉터리 조건은 통과하고 실행은 공백이 포함된 “C:\Windows \System32\“에 있는 조작된 dll이 실행되는 것입니다.
공격 기법에 대한 자세한 내용은 블로그를 참고하시면 도움이 될것같습니다.
공격 절차를 요약하면 아래와 같습니다.
- autoElevate가 True로 설정된 System32에 존재하는 정상 실행(.exe) 파일을 트릭 폴더(“C:\Windows \System32\“)로 복사
- 참조하는 dll의 이름과 함수명을 동일하게 작성한 dll을 트릭 폴더(“C:\Windows \System32\“)로 복사
- 트릭 폴더(“C:\Windows \System32\“)에서 복사한 실행 파일을 실행
이 공격 기법은 아래 파일들을 통해 악용 가능합니다.
실행 파일 이름 | DLL 파일 이름과 함수 | 실행 파일 설명 |
---|---|---|
fxsunatd.exe | fxsapi.dll FaxConnectFaxServerW() | 팩스 서비스 응용 프로그램 |
bthudtask.exe | devobj.dll DevObjGetClassDevs() | 블루투스 삭제 작업 관련 |
BitLockerWizardElev.exe | fvewiz.dll FveuipClearFveWizOnStartup() | 비트로커 드라이브 암호화 |
netplwiz.exe | netplwiz.dll UsersRunDllW() | 사용자 계정 제어판 |
computerdefaults.exe | propsys.dll | 컴퓨터 기본 제어판 |
fodhelper | propsys.dll | 언어 변경 |
sdclt.exe | propsys.dll | 백업 파일 생성 및 복구 |
taskmgr.exe | winsta.dll | 작업관리자 |
printui.exe | printui.dll dllmain() | 프린터 속성 변경 |
systemreset.exe | reagent.dll WinReGetConfig() | 시스템 초기화 |
winsat.exe | winmm.dll timeBeginPeriod, timeEndPeriod |
윈도우 시스템 평가 도구 |
SystemPropertiesRemote.exe | srrstr.dll | 시스템 원격 설정 |
1.2 일반 사용자도 파일 생성이 가능한 폴더 악용
다음은 일반 사용자도 파일 생성이 가능한 폴더를 악용하는 경우입니다. 대게 이런 공격 기법은 DLL 로딩 이벤트를 모니터링 하면서, Administrator나 SYSTEM 같이 높은 권한으로 실행되지만 파일을 찾을 수 없는 (NOT FOUND) 경우의 파일을 추적해 발견하는 것입니다. 일반적으로 윈도우 워크스테이션에서 기본적으로 제공하는 기능이지만 윈도우 서버 버전에서는 별도로 추가 구성 요소를 설치하지 않으면 제공하지 않는 파일을 악용합니다.
1.2.1 Windows Server 2019 srrstr.dll
Windows Server 2019 (17763) 에서는 기본적으로 윈도우 시스템 설정 보호 라이브러리 srrstr.dll 파일이 존재하지 않습니다. 따라서 C:\Windows\SysWOW64\SystemPropertiesAdvanced.exe 파일이 실행될 때 srrstr.dll을 로드하는데, 아래와 같은 경로에서 순차적으로 파일을 탐색합니다.
%SystemRoot%\syswow64
(시스템 환경변수 )%SystemRoot%\system
(시스템 환경변수)%SystemRoot%\syswow64\wbem
(시스템 환경변수)%SystemRoot%\syswow64\windowspowershell\v1.0
(시스템 환경변수)%AppData%\Local\Microsoft\WindowsApps
(사용자 환경변수)
순차적으로 탐색하다 해당 파일이 없으면 사용자 환경 변수에 정의되어 있는 %AppData%\Local\Microsoft\WindowsApps 폴더에서 srrstr.dll 파일을 로드하게 됩니다. 이 윈도우 앱 폴더는 사용자의 환경 변수’PATH’에 등록되어 있고, 일반 사용자도 특별한 권한 없이 파일을 생성하거나 수정하는것이 가능합니다. 따라서 이 위치에서 조작된 srrstr.dll 을 실행할 수 있습니다.
이런 방식으로 악용 가능한 파일은 아래와 같습니다.
실행 파일 이름 | 설명 |
---|---|
SystemPropertiesAdvanced.exe | 윈도우 기본 유틸리티 (시스템 속성 - 고급) |
SystemPropertiesComputerName.exe | 컴퓨터 설정 파일 변경 |
SystemPropertiesHardware.exe | 하드웨어 설정 |
SystemPropertiesProtection.exe | 시스템 보호 설정 |
SystemPropertiesRemote.exe | 시스템 원격 설정 |
1.2.2 Windows Server 2008R2-2019 NetMan
다음은 Windows Server 2008 R2에서 2019에 Netman 에서 호출하는 wlanhelp.dll, wlanapi.dll가 해당 폴더에 존재하지 않아 발생하는 문제입니다. 네트워크 연결 관련 조회를 하면서 dll 파일을 NT AUTHORITY\SYSTEM 권한으로 실행합니다. WLAN API는 Workstation 버전에서만 사용되며 서버 버전에서 사용하려면 추가 구성 요소를 설치해야 합니다. 그리고 이 dll 파일이 없는 경우 system32에서 안전한 로딩이 이루어지도록 해야하는데, %PATH% 에 등록된 폴더에서 해당 dll을 찾고 있어, 일반 권한 사용자가 악용할 수 있는 것입니다다. 예를 들어 아래와 같이 시스템 환경 변수에 등록되어 있지만 사용자가 임의의 파일을 복사해 실행 할 수 있는 경로를 이용할 수 있습니다. (상세 내용은 블로그 참고 합니다.)
C:\Windows\System32\WindowsPowerShell\v1.0\wlanhelp.dll
결과적으로 윈도우 버전에 따라 해당하는 아래 dll 파일을 %PATH% 중 사용자가 조작 가능한 폴더에 복사해 임의의 DLL를 실행할 수 있습니다.
- Windows 2008 R2 wlanhelp.dll
- Windows 6.3 (8.1 / 2012 R2) wlanapi.dll
2. 레지스트리 변조
레지스트리의 HKCU(HKEY_CURRENT_USER)와 HKCR(HKEY_CLASSES_ROOT)은 서로 링크되어 있어 HKCU 값을 변경하면 HKCR 값도 변경됩니다. HKCR은 관리자 권한이 필요 하지만 HKCU는 일반 사용자 권한으로 수정이 가능한 레지스트리 영역입니다. 따라서 높은 권한으로 실행되는 HKCU 값을 조작해 권한이 상승된 임의의 명령어를 실행할 수 있는 것입니다. 하지만 레지스트리는 수정내용이 적용되려면 로그오프나 재부팅이 필요합니다. 그리고 일부 공격 기법은 관리자 권한이 있어야 레지스트리 변경이 가능한 것도 있습니다. 따라서 레지스트리를 이용한 UAC 우회 공격 기법은 지속성(Persistence) 공격 단계에서 활용하는 것이 좋습니다. 레지스트리 등록이나 변경 이후 지속적으로 상승된 권한으로 파일을 실행하거나 임의의 명령을 실행할 수 있습니다.
일부 레지스트리를 수정 및 등록할 때 윈도우 디펜더에서 Win32/UACBypass 진단명으로 이상 행위를 탐지합니다. 하지만 등록된 이후는 탐지되지 않습니다.
2.1 권한이 높은 정상 시스템 파일의 레지스트리 수정
eventvwr.exe(이벤트 뷰어), fodhelper.exe(팩스 서비스 응용 프로그램), computerDefaults.exe (컴퓨터 기본 제어판)은 아래 레지스트리를 변경하면 임의의 명령어나 파일 실행이 가능합니다.
HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command
(기본값) 키에 실행 명령어 (예, cmd.exe) 등록HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command DelegateExecute
키에 공백으로 등록
WSReset.exe는 Windows Store 설정을 초기화는 실행파일입니다. 10.0.17134 N/A 빌드 17134 이상에서만 가능하며, 아래 레지스트리를 변경해 임의의 명령어나 파일 실행이 가능합니다.
HKCU\Software\Classes\AppX82a6gwre4fdg3bt635tn5ctqjf8msdd2\Shell\open\command
(기본값) 키에 실행 명령어 (예, cmd.exe) 등록HKCU\Software\Classes\AppX82a6gwre4fdg3bt635tn5ctqjf8msdd2\Shell\open\command
DelegateExecute 키에 공백으로 등록
2.2 작업 스케쥴을 이용한 우회
윈도우에 기본적으로 내장되어 있는 스케쥴러인 디스크 정리를 위한 “SilentCleanup”를 이용한 우회 기법입니다. 해당 스케쥴의 실행 수준(RunLevel)이 Highest로 되어 있어, 자동으로 권한이 상승되어 실행됩니다. 파워쉘을 통해 silentCleanup 의 실행 수준 확인과 스케쥴이 실행 될 때 실행되는 파일을 아래와 같이 확인할 수 있습니다.
그림 출처: 주식회사 쏘마 인텔리전스 팀
위 그림에서 보이는바와 같이 기본적으로 silentCleanup의 실행 인자에는 cleanmgr.exe를 호출 하는 경로에서 windir 환경 변수를 참조합니다. 따라서 아래와 같이 windir을 환경 변수를 HKCU 레지스트리에 등록해 작업 스케쥴을 실행하면 등록한 명령어가 실행됩니다.
reg add hkcu\Environment /v windir /d "cmd /K reg delete hkcu\Environment /v windir /f && REM "
schtasks /Run /TN \Microsoft\Windows\DiskCleanup\SilentCleanup /I
단, 설정된 환경변수는 윈도우 재시작 이후 반영되며, windir 조작하면 이후 정상 프로세스에 영향주므로 사용에 주의해야 합니다.
UAC 우회 공격을 수행하는 방법
일반적으로 윈도우 기본 유틸리티 cmd, reg, powershell을 이용해 공격을 수행할 수도 있지만, T1191 CMSTP 기법에서 설명하는 바와 같이 CMSTP.exe를 이용해 UAC 우회 및 권한상승 공격을 수행할 수도 있습니다. CMSTP.exe는 윈도우에서 제공하는 연결 관리자 프로파일 설치파일 (Connection Manager Profile Installer) 입니다. 설치시 INF (installation information file) 파일을 파라미터로 받아 실행하는데, 공격자는 이 INF 파일을 조작해 임의의 명령어를 실행하거나, DLL을 로딩하고 실행하거나, COM 스크립트(SCT)를 원격지 서버로 부터 받아 실행할 수 있습니다.
참고
[2016/08/15] FILELESS UAC BYPASS USING EVENTVWR.EXE AND REGISTRY HIJACKING
[2017/5/15] Exploiting Environment Variables in Scheduled Tasks for UAC Bypass
[2017/5/25] Reading Your Way Around UAC
[2017/07/16] UAC Token Duplication
[2018/11/09] UAC Bypass by Mocking Trusted Directories
[2019/1/24] UAC Bypass via SystemPropertiesAdvanced.exe and DLL Hijacking
[2019/3/14] Fileless UAC Bypass in Windows Store Binary
[2020/4/10] Windows Server 2008R2-2019 NetMan DLL Hijacking
60개 UAC 권한 상승 기법 (Dll Hijack, Elevated COM interface, Environment variables expansion)