-
디스크 정리를 이용해서 Windows10의 UAC Bypass 하기공부 2016. 7. 29. 01:37
원문(bypassing-uac-on-windows-10-using-disk-cleanup)은 다음과 같은 글 입니다.
내용이 재미있다고 판단되어 번역해봤습니다.
의역 오역이 있을 수도 있으니 너그럽게 봐주세요.위 글은 원 저자에게 허락을 받고 번역한 글입니다.
Thanks to @enigma0x3
Matter Graeber과 나는 최근 WIndows10을 파보면서 User Account Control을 bypass할 수 있는 재미있는 방법을 찾았습니다.(UAC에 대해 잘 모른다면 이 글을 읽어보시면 됩니다.)
요즘에는 UAC bypass 기술들이 여러가지 있는데, 대부분의 기술들은 DLL hijack을 하기 위해 IFileOperation COM object 또는 WUSA extraction을 이용하여 권한있는 파일(privileged file)을 복사하게 됩니다.
기존에 있던 bypass 기술에 관심이 있다면 이 글읽어보면 됩니다.(by @hfiref0x)
이 글에서 다룰 방법은 기존의 권한있는 파일 복사나 코드 인적션(code injection)을 사용하지 않고 다른 대안을 제시합니다.
윈도우에서 프로세스가 로드 될 때 어떻게 동작하나를 조사 하기위해 SysInternals Process Monitor이란 툴을 자주 사용합니다.
윈도우10에 존재하는 기본적으로 스케줄된 작업들과(default Scheduled Tasks) 그 작업들이 어떤 동작을 하는지에 대한 조사 후, “SilentCleanup”라는 작업이 권한 없는 유저도 실행시킬 수 있지만 높은 권한(elevated/high intergrity privileges)을 가진채로 실행 된다는 것을 찾았습니다.
이런 작업을 찾기 위해 ‘Users’와 같은 권한 없는 계정을 이용하여 각각 작업이 “Run with Highest Privileges”보안 옵션이 체크 되어있는지 조사했습니다.
procmon을 이용해서 좀 더 자세히 보게 되면, 스케줄된 작업에 의해 cleanmgr.exe이 실행되는데 “excute with highest privileges”가 작업 설정에 되어있어 높은 권한으로 실행되게 됩니다.
조금 더 자세히 보겠습니다. cleanmgr.exe가 실행 될 때, “C:\Users\<유저이름>\AppData\Local\Temp”에 GUID를 이름으로 하는 새 폴더를 만듭니다.
cleanmgr.exe가 임시폴더를 만든 이후 여러개의 DLL들과 “dismhost.exe”를 임시 폴더에 복사하게 됩니다.
임시폴더에 모두 복사 한 뒤 cleanmgr.exe는 “dismhost.exe”를 새 경로에서 높은 권한을 가지도록 실행 시킵니다.
dimhost.exe는 “C:\Users\
\AppData\Local\Temp\ “에서 시작되며 DLL들을 같은 폴더 안에서 다음과 같은 순서로 로드합니다.
현재 계정은 일반권한 계정으로(medium intergrity user) 유저의 %TEMP% 폴더에
쓰기 권한이 있기 때문에 dismhost.exe에서 로드 하는 DLL을 납치(hijack a DLL)하고
높은 권한 상태에서 코드 인젝션을 할 수 있습니다.
이게 우리가 일반적으로 알려져 있는 BypassUAC 공격입니다.이 경우 우리가 바꾸고자 하는 DLL을 dismhost.exe가 로드하기전에 바꿔야하는 레이스컨디션(race condition)상황입니다. dismhost.exe에 대한 더 자세한 조사를 통해 “LogProvider.dll”이 가장 마지막에 로드되기 때문에 납치하기에 가장 최적의 조건이란걸 알아냈습니다.
“LogProvider.dll”을 우리가 원하는 공격 DLL로 바꾸기 위해 “C:\Users\\AppData\Local\Temp\ ”가 생성되는 WMI event를 모니터링 하다가, 임시폴더가 생성되면 dismhost.exe가 “LogProvider.dll”를 로드하기전 공격 DLL로 바꾸는 WMI event를 실행시킵니다. 이렇게 “dismhost.exe”는 “LogProvider.dll”대신 공격 DLL을 로드하게 됩니다. dismhost가 DLL을 로드하게 되면 UAC를 bypass했을 뿐만 아니라 원하는 코드를 높은 권한에서 실행 시킬 수 있습니다.
일반 유저 계정으로 cleanmgr.exe를 실행 시킬 때 %TEMP%폴더에서 어떤 파일도 사용하지 않는다는걸 추가적인 테스트를 통해 발견했습니다.
또 일반 유저 계정으로 낮음 혹은 보통 권한으로 실행시키면, 디스크 정리 작업이 중간 권한으로 실행되고 권한상승 또한 일어나지 않습니다.
Matt Graeber(@mattifestation)가 위 기술을 테스트 할수있는 PoC PowerShell 스크립트를 작성해 두었습니다.
https://gist.github.com/mattifestation/b4072a066574caccfa07fcf723952d54이 스크립트를 실행시키기 위해서는 dllmain을 export시킨 DLL이 필요로 합니다.
테스트를 위해서 직접 DLL을 만들어도 되고 아래 만들어둔 간단한 MessageBox DLL을 사용하시면 됩니다.
https://github.com/enigma0x3/MessageBox이 기술은 다른 공개된 기술에 비해 좀 더 편리하게 만들어주는 이점이 있습니다.
프로세스 인젝션(process injection)을 하지 않기떄문에 보안 솔루션들에 의해 감지되거나 모니터링 되지 않습니다.
권한을 요구하는 파일복사가 없습니다. 대부분의 UAC bypass는 공격 DLL을 넣기위해 권한이 필요한 폴더(secure location)에 복사를 하게됩니다. 하지만 스케줄된 작업이 %TEMP%폴더에 있는 파일을 사용하기 때문에 공격 DLL을 권한 없이 복사를 할 수 있습니다.
공격 DLL을 로드한 작업이 끝날때 %TEMP%에 만들어둔 폴더를 삭제하기 때문에 흔적이 삭제됩니다.
스케줄된 작업이 가장 높은 권한으로 실행 될 때, UAC가 가장 높은단계(“Always Notify”)로 되어있더라도 잘 동작합니다.
가장 흔한 UAC bypass들은 권한이 필요한 복사를 할 때 IFileOperation COM object를 쓰게 됩니다.
IFileOperation은 “Always Notify” UAC일 때 경고창을 띄우기 떄문에, 파일 복사에 실패할 수 도 있습니다.
Microsoft Security Response Center(MSRC)에 이걸 2016/07/20일날 알렸습니다.예상대로 답변은 다음과 같이 공표되어 있기 때문에 UAC는 보안 분야에 포함되지 않아 보안 취약점으로 분류 할 수 없다고 했습니다.
비록 취약점은 아니지만, 공격자에게 있어 기존 방법과 다른 bypass와 권한 상승의 대안으로써 적용될 수 있고,
공격자의 행동을 확인해야 하는 위치와 체크포인트들을 알릴 수 있었습니다.이 기술은 디스크 정리 작업에 대해 높은 권한을 삭제하는 방식으로 패치 할 수 있습니다.
더 나아가서 이 공격을 감지하고 싶다면 새 폴더를 생성하기 위해 모니터링 하는 WMI event들의 시그니쳐를 찾는 방식으로 탐지 하면 됩니다.
어플리케이션/DLL 화이트리스트와 비정상적 모듈이 로드되는것(예를들어 System event ID 7)을 같이 사용한다면 이 기술을 더 잘 막을 수 있을 겁니다.
'공부' 카테고리의 다른 글
리눅스 커널 분석을 위한 vim, ctag, cscope, tagbar 세팅 (1) 2018.02.20 Computation Structures 1: Digital Circuits (0) 2016.01.29