Windowsはアクセストークンを使用して、実行中のプロセスの所有権を判断します。ユーザーはアクセストークンを操作して、実行中のプロセスを、プロセスを開始したユーザー以外のユーザーに属しているように見せることができます。これが発生すると、プロセスは新しいトークンに関連付けられたセキュリティコンテキストも引き継ぎます。たとえば、Microsoftはセキュリティのベストプラクティスとしてアクセストークンの使用を推奨しています。管理者は標準ユーザーとしてログインする必要がありますが、組み込みのアクセストークン操作コマンドrunas
を使用することで管理者権限でツールを実行することができます。[1]
攻撃者は、アクセストークンを使用して、異なるユーザーまたはシステムのセキュリティコンテキストで動作し、アクションを実行して検出を回避する可能性があります。攻撃者は、組み込みのWindows API関数を使用して、既存のプロセスからアクセストークンをコピーできます。これはトークンスティーリングとして知られています。トークンを盗むには、攻撃者がすでに特権ユーザーコンテキスト(管理者)である必要があります。ただし、攻撃者は通常、トークンスティーリングを使用して、セキュリティコンテキストを管理者レベルからシステムレベルに引き上げます。アカウントにリモートシステムに対する適切な権限がある場合、リモートシステムに対してそのトークンのアカウントとして認証するために、攻撃者はトークンを使用します。[2]
アクセストークンは、次の3つの方法で攻撃者に利用されます。:[3]
トークンのなりすまし/盗難 -
攻撃者は、DuplicateToken(Ex)
を使用して既存のトークンを複製した新しいアクセストークンを作成します。次に、そのトークンをImpersonateLoggedOnUser
と共に使用して、呼び出し側のスレッドがログオンしたユーザーのセキュリティコンテキストを偽装できるようにするか、SetThreadToken
を使用して偽装されたトークンをスレッドに割り当てることができます。これは、ターゲットユーザーがシステムにネットワーク以外のログオンセッションを持っている場合に役立ちます。
トークンを使用したプロセス作成 -
攻撃者は、DuplicateToken(Ex)
で新しいアクセストークンを作成し、偽装されたユーザーのセキュリティコンテキストで実行される新しいプロセスを作成するために、CreateProcessWithTokenW
します。これは、別のユーザーのセキュリティコンテキストで新しいプロセスを作成する場合に役立ちます。
トークンの作成と偽装 -
攻撃者はユーザー名とパスワードを持っていますが、ユーザーはシステムにログオンしていません。攻撃者は、LogonUser
関数を使用して、ユーザーのログオンセッションを作成できます。関数は新しいセッションのアクセストークンのコピーを返し、攻撃者はSetThreadToken
を使用してトークンをスレッドに割り当てることができます。
すべての標準ユーザーは、runas
コマンドとWindows API関数を使用して、偽装トークンを作成できます。管理者アカウントへのアクセスは必要ありません。
MetasploitのMeterpreterペイロードは、任意のトークン操作を可能にし、トークンの偽装を使用して特権を昇格させます。[4]Cobalt Strikeのビーコンペイロードは、任意のトークンの偽装を許可し、トークンを作成することもできます。[5]
Name | Description |
---|---|
APT28 |
APT28 は、CVE-2015-1701を使用してSYSTEMトークンにアクセスし、それを権限昇格の一部として現在のプロセスにコピーします。[24] |
Azorult |
Azorult は、ローカルシステム権限で新しいプロセスを開始するために、WTSQueryUserTokenおよびCreateProcessAsUserを呼び出すことができます。[19] |
Bankshot |
Bankshot は、WTSQueryUserTokenを使用してユーザートークンを取得し、ログオンしたユーザーを偽装してプロセスを作成します。[17] |
Cobalt Strike |
Cobalt Strike は、既存のプロセスからアクセストークンを盗み、既知の資格情報からトークンを作成できます。[9] |
Duqu |
Duquは、特定のシステム権限を持つトークンの実行中のシステムプロセスを検査します。 見つかった場合は、トークンをコピーし、後で使用できるように保存します。最終的には、保存したトークンがアタッチされた状態で新しいプロセスを開始します。また、トークンを盗んで管理者権限を取得することもできます。[14] |
Empire |
Empire は、アクセストークンを操作するためにPowerSploitの |
FinFisher |
FinFisher は、UACバイパスの一部としてNtFilterTokenを用いてトークン操作を行います。[15][16] |
Hydraq | |
Lazarus Group |
Lazarus Group
が使用するキーロガーKiloAlfaはそのユーザーのコンテキストで、 |
PoshC2 |
PoshC2 は、 トークン操作のために |
PowerSploit |
PowerSploitの |
Pupy | |
SslMM | |
Turla | |
ZxShell |
ZxShell には、別のユーザーまたはプロセスコンテキストとして新しいプロセスを作成するRunAsというコマンドがあります。[21] |
Mitigation | Description |
---|---|
Privileged Account Management 特権アカウントの管理 |
ユーザーとユーザーグループがトークンを作成できないように、アクセス許可を制限します。この設定は、ローカルシステムアカウントに対してのみ定義する必要があります。GPO(グループポリシーオブジェクト): コンピューター構成 > [Policies] > Windows Settings > Security Settings > Local Policies > User Rights Assignment: Create a token object. また、GPOを介してローカルサービスとネットワークサービスのみにプロセスレベルトークンを作成できるユーザーを定義します。: コンピューター構成 > [Policies] > Windows Settings > Security Settings > Local Policies > User Rights Assignment: Replace a process level token.[6][7] |
User Account Management ユーザアカウント管理 |
このテクニックを最大限に活用するには、攻撃者がローカルシステムで管理者レベルのアクセス権を持っている必要があります。ユーザーとアカウントを必要最小限の権限に制限するようにしてください。 |
攻撃者が標準のコマンドラインシェルを使用している場合、アナリストはコマンドラインアクティビティを監査することでトークンの操作を検出できます。具体的には、アナリストはrunas
コマンドの使用を探す必要があります。 Windowsでは、詳細なコマンドラインログはデフォルトでは有効になっていません。
攻撃者がトークンに関するWindowsAPIを直接呼び出すペイロードを使用している場合、アナリストは、ユーザーネットワークアクティビティの慎重な分析、実行中のプロセスの調査、および他のエンドポイントとネットワークの動作との相関関係を通してのみ、トークンの操作を検出できます。
ペイロードがアクセストークンを操作するために利用できる多くのWindows API呼び出しがあります。 (例えば, LogonUser
[27], DuplicateTokenEx
[28], ImpersonateLoggedOnUser
[29]). 詳細については、関連するWindows APIページを参照してください。
プロセスとスレッドトークン情報についてシステムにクエリを実行し、ユーザーが所有するプロセスがローカルのSYSTEMアカウントを偽装している、と言った不整合を探します。[3]