
토큰 권한 조사를 위한 커널 모드 WinDbg 확장 및 PoCs.
커널 모드 WinDbg 확장 및 토큰 권한 작동 방식을 테스트하기 위한 PoCs.
토큰 권한 남용에 관한 주목할 만한 저장소와 문서가 있습니다. 예: Grzegorz Tworek의 Priv2Admin. 이 저장소의 코드는 토큰 권한이 어떻게 작동하는지 조사하는 데 도움을 주기 위해 작성되었습니다.
이 프로젝트는 높은 무결성 수준 셸에서 시스템 권한을 얻는 방법을 다룹니다. 자세한 내용은 README.md를 참조하세요.
이 프로젝트의 목적은 공격자가 임의의 커널 쓰기 취약점을 어떻게 남용하는지 조사하는 것입니다. 모든 PoC는 HackSys Extreme Vulnerable Driver를 위해 작성되었습니다. 대부분의 PoC는 임의의 커널 쓰기 취약점과 토큰 권한을 남용하여 SYSTEM 무결성 수준을 얻습니다. Windows 10 버전 1809/1903에서 테스트되었지만, 이론적으로 대부분의 Windows 10에서 작동해야 합니다:
| PoC 이름 | 설명 |
|---|---|
| CreateAssignTokenVariant | 이 PoC는 SeCreateTokenPrivilege 및 SeAssignPrimaryTokenPrivilege를 사용하여 EoP를 수행합니다. |
| CreateImpersonateTokenVariant | 이 PoC는 SeCreateTokenPrivilege 및 SeImpersonatePrivilege를 사용하여 EoP를 수행합니다. |
| CreateTokenVariant | 이 PoC는 SeCreateTokenPrivilege를 사용하여 EoP를 수행합니다. |
| DebugInjectionVariant | 이 PoC는 SeDebugPrivilege를 사용하여 EoP를 수행합니다. 최종 단계에서 winlogon.exe에 코드 인젝션을 사용합니다. |
| DebugUpdateProcVariant | 이 PoC는 SeDebugPrivilege를 사용하여 EoP를 수행합니다. 최종 단계에서 UpdateProcThreadAttribute API로 winlogon.exe로부터 SYSTEM 프로세스를 생성합니다. |
| RestoreServiceModificationVariant | 이 PoC는 SeRestorePrivilege를 사용하여 EoP를 수행합니다. 이 PoC와 함께 HijackShellLib을 사용합니다. |
| SecondaryLogonVariant | 이 PoC는 SeCreateTokenPrivilege 및 SeImpersonatePrivilege를 사용하여 EoP를 수행합니다. 최종 단계에서 보조 로그온 서비스를 사용합니다. |
| TakeOwnershipServiceModificationVariant | 이 PoC는 SeTakeOwnershipPrivilege를 사용하여 EoP를 수행합니다. 이 PoC와 함께 HijackShellLib을 사용합니다. |
| TcbS4uAssignTokenVariant | 이 PoC는 SeTcbPrivilege를 사용하여 EoP를 수행합니다. 중간 필수 수준에서 시스템 필수 수준 셸을 얻습니다. |
| TcbS4uImpersonationVariant | 이 PoC는 SeTcbPrivilege를 사용하여 EoP를 수행합니다. S4U 로그온으로 스레드 가장을 수행합니다. 높은 또는 시스템 무결성 수준을 얻지 못합니다. |
경고
일부 환경에서는 Debug 빌드가 작동하지 않습니다. Release 빌드를 권장합니다.
PrivEditor는 특정 프로세스의 토큰 권한을 조작하는 커널 모드 WinDbg 확장입니다. 이 확장을 사용하면 조사하려는 토큰 권한을 쉽게 구성할 수 있습니다:``` 0: kd> .load C:\dev\PrivEditor\x64\Release\PrivEditor.dll
PrivEditor - Kernel Mode WinDbg extension for token privilege edit.
Commands : + !getps : List processes in target system. + !getpriv : List privileges of a process. + !addpriv : Add privilege(s) to a process. + !rmpriv : Remove privilege(s) from a process. + !enablepriv : Enable privilege(s) of a process. + !disablepriv : Disable privilege(s) of a process. + !enableall : Enable all privileges available to a process. + !disableall : Disable all privileges available to a process.
[*] To see command help, execute "! help" or "! /?".
### getps 명령어
이 명령어는 대상 시스템에서 프로세스를 나열하는 명령입니다:```
0: kd> !getps /?
!getps - List processes in target system.
Usage : !getps [Process Name]
Process Name : (OPTIONAL) Specifies filter string for process name.
이 명령어를 인수 없이 실행하면, 이 명령어는 대상 시스템의 모든 프로세스를 다음과 같이 나열합니다:``` 0: kd> !getps
PID nt!_EPROCESS nt!_SEP_TOKEN_PRIVILEGES Process Name
======== =================== ======================== ============
0 0xfffff80581233630 0x0000000000000000 Idle
4 0xffffd60fec068380 0xffffaf00cec07a40 System
68 0xffffd60ff1780480 0xffffaf00d3b290a0 svchost.exe
88 0xffffd60fec0db080 0xffffaf00cec0d080 Registry
324 0xffffd60fef342040 0xffffaf00d0416080 smss.exe
348 0xffffd60ff052f100 0xffffaf00d25d30a0 dwm.exe
408 0xffffd60feca8e140 0xffffaf00d21bd930 csrss.exe
480 0xffffd60ff05a8340 0xffffaf00d2568670 svchost.exe
484 0xffffd60fefcd60c0 0xffffaf00d06430e0 wininit.exe
500 0xffffd60fefd130c0 0xffffaf00d23100a0 csrss.exe
580 0xffffd60fefdc0080 0xffffaf00d2266630 winlogon.exe
--snip--
특정 프로세스를 알고 싶다면 문자열 필터를 다음과 같이 설정하세요. 필터는 전방 일치와 대소문자를 구분하지 않고 작동합니다:```
0: kd> !getps micro
PID nt!_EPROCESS nt!_SEP_TOKEN_PRIVILEGES Process Name
======== =================== ======================== ============
4568 0xffffd60f`f14ed080 0xffffaf00`d3db60a0 MicrosoftEdge.exe
4884 0xffffd60f`f1647080 0xffffaf00`d3fc17b0 MicrosoftEdgeCP.exe
4892 0xffffd60f`f1685080 0xffffaf00`d3fc07b0 MicrosoftEdgeSH.exe
이 명령어는 특정 프로세스의 토큰 권한을 나열하는 데 사용됩니다:``` 0: kd> !getpriv /?
!getpriv - List privileges of a process.
Usage : !getpriv
PID : Specifies target process ID.
이 명령어를 사용하려면 대상 프로세스 ID를 10진수 형식으로 설정해야 합니다:```
0: kd> !getpriv 5704
Privilege Name State
========================================== ========
SeShutdownPrivilege Disabled
SeChangeNotifyPrivilege Enabled
SeUndockPrivilege Disabled
SeIncreaseWorkingSetPrivilege Disabled
SeTimeZonePrivilege Disabled
[*] PID : 5704
[*] Process Name : cmd.exe
[*] nt!_EPROCESS : 0xffffd60f`f141e4c0
[*] nt!_SEP_TOKEN_PRIVILEGES : 0xffffaf00`d4a0c0a0
이 명령은 특정 프로세스에 토큰 권한(들)을 추가하는 명령입니다:``` 0: kd> !addpriv /?
!addpriv - Add privilege(s) to a process.
Usage : !addpriv
PID : Specifies target process ID.
Privilege : Specifies privilege to enable (case insensitive). Available privileges are following.