
プロセス特権を昇格させるためのカーネルモードドライバ
EPROCESS内のプロセストークンをシステムトークンに置き換えることで、プロセスの権限を実質的に昇格させます。このドライバーは、ユーザーモードアプリケーションがIOCTLを介してプロセスIDをドライバーに送信するために使用されるように設計されています。プロセスが作成されると、作成したユーザーのトークンを継承します。このトークンは、システムがプロセスが実行できるアクションを決定するために使用されます。トークンには、ユーザーのセキュリティ識別子(SID)、グループメンバーシップ、および特権に関する情報が含まれています。

Tokenメンバーは、プロセスオブジェクトを表すデータ構造である_EPROCESS構造体内のオフセット0x4b8に位置します。Tokenメンバーは_EX_FAST_REF構造体で定義されており、これはポインタのサイズに応じて、カーネルオブジェクトへのポインタまたは参照カウントのいずれかを格納できる共用体型です。_EPROCESS内の_EX_FAST_REF構造体のオフセットは、使用されているWindowsの特定のバージョンに依存しますが、最近のWindowsバージョンでは通常オフセット0x4b8にあります。
Windowsビルド番号におけるx64およびx86アーキテクチャのトークンオフセット
Windowsの_EX_FAST_REF構造体には、Object、RefCount、Valueの3つのメンバーが含まれています。

_EX_FAST_REF内のプロセストークンを表示するには、トークンを含む_EX_FAST_REF構造体のアドレスを渡します。この構造体は、通常、_EPROCESS構造体内のオフセット0x4b8にあります。

特権プロセスを起動するか、既存のプロセスIDを昇格させることができます。

この説明では、2番目のオプションに焦点を当て、例としてCMDを使用します。

継承されたトークン

IOCTLを介してプロセスIDをドライバーに送信します

ユーザーモードアプリケーションからPIDを受け取った後、ドライバーはそれを使用してターゲットプロセスの_EPROCESS構造体へのポインタを取得します。次に、ドライバーは_EPROCESS構造体のTokenメンバーにアクセスしてプロセストークンへのポインタを取得し、それをシステムトークンに置き換えることで、プロセスのセキュリティコンテキストをシステムのものに実質的に変更します。ただし、ドライバーが_EPROCESS構造体内のTokenメンバーを正しく特定できない場合、またはTokenのオフセットが0x4b8以外である場合、ドライバーはシステムまたはターゲットプロセスをクラッシュさせる可能性があります。この問題は今後のアップデートで修正される予定です。

cmdトークン後

プロセスの特権、グループ、権限

| x64 オフセット | x86 オフセット |
|---|
| 0x0160 (5.2後期) | 0x0150 (3.10) |
| 0x0168 (6.0) | 0x0108 (3.50から4.0) |
| 0x0208 (6.1) | 0x012C (5.0) |
| 0x0348 (6.2から6.3) | 0xC8 (5.1から5.2初期) |
| 0x0358 (10.0から1809) | 0xD8 (5.2後期) |
| 0x0360 (1903) | 0xE0 (6.0) |
| 0x04B8 | 0xF8 (6.1) |
| 0xEC (6.2から6.3) | |
| 0xF4 (10.0から1607) | |
| 0xFC (1703から1903) | |
| 0x012C |
