
カーネルモード 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 ログオンを使用してスレッドの偽装を実行します。高またはシステムの整合性レベルは取得しません。 |
Warning
一部の環境では、デバッグビルドが動作しません。 リリースビルドを使用することをお勧めします。
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.