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

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

PsExec による Windows 環境での Lateral Movement

組織のネットワークに所属する端末に攻撃者が侵入してしまった後に、攻撃者がネットワーク内を移動する行為を「Lateral Movement」と言います。今回の投稿では、Windows 環境での Lateral Movement に用いられる PsExec についてまとめました。PsExec を用いる以外にもいくつか手法がありますが、その他の手法についてはまた別の記事で取り上げる予定です。

PsExec とは

PsExec は、Microsoft 社が無償で提供している Sysinternals Suite と呼ばれるツール群に含まれているソフトウェアです。PsExec は遠隔の端末を操作し管理するためのツールですが、その便利さ故に、攻撃者が侵入に成功した Windows ネットワークで Lateral Movement を行うために悪用されています。遠隔の端末を管理するという用途であるため、管理者権限を持つアカウントで NTLM 認証を行っていない場合は、遠隔の端末を操作することはできません。PsExec を用いて遠隔の端末に侵入する場合、攻撃者は何かしらの手法で管理者権限を持つユーザ名と NTLM ハッシュ値を取得し、Pass-the-Hash の手法により侵入対象の端末への認証を行った上で、PsExec により対象の端末へ管理者権限で侵入します。(Pass-the-Hash の手法については本投稿では触れません)

管理共有について

PsExec を利用するためには、「管理共有」という機能が対象の端末で有効になっている必要があります。管理共有はその名の通り、ネットワークの管理者が、管理しているネットワークに所属する端末を管理するために用いるものです。Windows 端末で管理共有が有効である場合、端末で管理者権限を持つユーザ (ビルドイン Administrator や Backup Operators など) は、端末の C ドライブなどに直接アクセスすることが可能です。PsExec を用いることで、管理共有の機能を用いて、操作したい端末に管理者権限で任意のコードを実行させることができます。地震の端末で管理共有が有効であるかを確認したい場合は、cmd.exe を起動し以下のコマンドを実行します。

C:\Windows\system32>net share

実行した結果、以下のように共有名の欄に「C$」や「ADMIN$」が表示される場合は、管理共有が有効です。

C:\Windows\system32>net share

共有名       リソース                            注釈

-------------------------------------------------------------------------------
C$           C:\                             Default share
IPC$                                         Remote IPC
ADMIN$       C:\Windows                      Remote Admin
コマンドは正常に終了しました。


C:\Windows\system32>

管理共有が利用できるアカウント

管理者権限を持つアカウント、すなわち Administrators グループに所属している全てのアカウントが管理共有を利用できるというわけではありません。UAC が設定されている場合は、ビルドイン Administrator アカウントにのみ管理共有の機能を利用することができます。UAC が設定されている場合は、ビルドイン Administrator を除く Administrators グループのアカウントは、管理者権限を行使するために権限昇格する必要があるからです。UAC が設定されていない場合は、Administrators グループに所属するアカウントの認証情報を用いて管理共有の機能を利用できます。

PsExec の使い方

PsExec は以下の書式で実行します。

C:\Windows\system32>PsExec.exe [\\<対象ホスト名>] [-u <ユーザ名>] [-p <パスワード>] [<オプション>] <対象ホストに実行させたいコマンド>

角括弧で括っている項目に関しては、用途に応じて省略可能です。対象ホスト名が省略された場合は、PsExec の実行端末自身が実行対象となります。対象ホストのプロンプトを立ち上げたい場合は、対象ホストに実行させたいコマンドに cmd を指定します。実際に攻撃者が侵入する場合、Pass-the-Hash などの手法により予め対象端末との NTLM 認証を通した状態で PsExec を使用するため、以下のようにユーザ名とパスワードを省略して実行し、対象端末に侵入します。

C:\Windows\system32>PsExec.exe \\<対象ホスト名> cmd

また、以下のようにコマンドの実行結果をリダイレクトすることも可能です。

C:\Windows\system32>PsExec.exe \\172.16.214.132 -u Administrator -p weak_password whoami /user > test.txt

PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

Starting whoami on 172.16.214.132...2.16.214.132...
whoami exited on 172.16.214.132 with error code 0.

C:\Windows\system32>type test.txt

USER INFORMATION
----------------

ユーザー名            SID
===================== ============================================
test-pc\administrator S-1-5-21-4277999076-337875558-3304608076-500

C:\Windows\system32>

PsExec.exe のオプションとして代表的なものは以下の通りです。

-i オプション

PsExec を実行しているコンソールとは別に、PsExec 用のコンソールが起動します。

-s オプション

SYSTEM 権限で命令を実行します。-s オプションを使わない場合、認証を通しているユーザとして端末に命令を実行することになります。以下の例では対象端末の IP アドレスを 172.16.214.132、ホスト名を test-pc としています。また、PsExec の実行元端末のホスト名を pentest、実行ユーザを testuser としています。

C:\Windows\system32>whoami /user

USER INFORMATION
----------------

ユーザー名       SID
================ ==============================================
pentest\testuser S-1-5-21-2843010864-2894322442-3301163422-1001

C:\Windows\system32>PsExec.exe \\172.16.214.132 -u Administrator -p weak_password whoami /user

PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com



USER INFORMATION
----------------

ユーザー名            SID
===================== ============================================
test-pc\administrator S-1-5-21-4277999076-337875558-3304608076-500
whoami exited on 172.16.214.132 with error code 0.

C:\Windows\system32>

オプションに -s を指定すると、以下のよう SYSTEM 権限で命令が実行されていることがわかります。

C:\Windows\system32>whoami /user

USER INFORMATION
----------------

ユーザー名       SID
================ ==============================================
pentest\testuser S-1-5-21-2843010864-2894322442-3301163422-1001

C:\Windows\system32>PsExec.exe \\172.16.214.132 -u Administrator -p weak_password whoami /user

PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com



USER INFORMATION
----------------

ユーザー名          SID
=================== ========
nt authority\system S-1-5-18
whoami exited on 172.16.214.132 with error code 0.

C:\Windows\system32>

余談ですが、このオプションを以下のように利用すると、自分が使っている端末で SYSTEM 権限を用いてプログラムを起動させることができます。

C:\Windows\system32>PsExec.exe -i -s <実行したいプログラム>

用途ですが、SYSTEM 権限でしか操作できないレジストリ値を操作する際に、以下のコマンドを用いて SYSTEM 権限で regedit.exe を起動するという場合が多いようです。

C:\Windows\system32>PsExec.exe -i -s regedit.exe
@ オプション

対象ホスト名の代わりに、テキストファイルに記載された対象ホストのリストを一行ずつ読み込み、命令を実行するためのオプションです。複数端末に同じ命令を実行するために用います。ただし、実行対象となる端末の認証情報が共通でない場合は、当然アクセスできないので全ての端末で命令を実行させることはできません。例として以下のように利用します。

C:\Windows\system32>type test.txt
172.16.214.137
172.16.214.139

C:\Windows\system32>PsExec.exe @test.txt -u Administrator -p weak_password hostname

PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

\\172.16.214.137:

test-pc01
hostname exited on 172.16.214.137 with error code 0.
\\172.16.214.139:

test-pc02
hostname exited on 172.16.214.139 with error code 0.

C:\Windows\system32>

PsExec が用いている TCP ポート

PsExec を実行した際の通信をキャプチャするとわかりますが、対象ホストで特に通信制限をしていない場合、PsExec では対象ホストの TCP 445 番ポートを用いています。 TCP 139 番ポートは用いていません。以下に示すように、対象ホストで 139 番ポートを制限しても、PsExec により遠隔から命令を実行可能です。

C:\Windows\system32>nmap -sS -Pn 172.16.214.132 -p 139,445

Starting Nmap 7.40 ( https://nmap.org ) at 2016-12-31 23:11 ???? (?W???)
Nmap scan report for 172.16.214.132
Host is up (0.00s latency).
PORT    STATE    SERVICE
139/tcp filtered netbios-ssn
445/tcp open     microsoft-ds
MAC Address: 00:0C:29:27:B3:52 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 1.59 seconds

C:\Windows\system32>PsExec.exe \\172.16.214.132 -u Administrator -p weak_password whoami /user

PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com



USER INFORMATION
----------------

ユーザー名            SID
===================== ============================================
test-pc\administrator S-1-5-21-4277999076-337875558-3304608076-500
whoami exited on 172.16.214.132 with error code 0.

C:\Windows\system32>

TCP 445 番ポートのみを使用する」ならば、TCP 445 番ポートのみの通信を制限すれば PsExec により遠隔から命令を実行できないように思えますがそんなことはなく、以下に示すように実行できます。

C:\Windows\system32>nmap -sS -Pn 172.16.214.132 -p 139,445

Starting Nmap 7.40 ( https://nmap.org ) at 2016-12-31 23:15 ???? (?W???)
Nmap scan report for 172.16.214.132
Host is up (0.00s latency).
PORT    STATE    SERVICE
139/tcp open     netbios-ssn
445/tcp filtered microsoft-ds
MAC Address: 00:0C:29:27:B3:52 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 1.59 seconds

C:\Windows\system32>PsExec.exe \\172.16.214.132 -u Administrator -p weak_password whoami /user

PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com



USER INFORMATION
----------------

ユーザー名            SID
===================== ============================================
test-pc\administrator S-1-5-21-4277999076-337875558-3304608076-500
whoami exited on 172.16.214.132 with error code 0.

C:\Windows\system32>

これは PsExec が、TCP 445 番ポートが利用できない場合は、TCP 139 番ポートに切り替えて命令を実行させるからです。すなわち、以下のように TCP 139 番ポートと TCP 445 番ポートの通信を両方とも制限すれば、PsExec により遠隔から命令を実行することができなくなります。

C:\Windows\system32>nmap -sS -Pn 172.16.214.132 -p 139,445

Starting Nmap 7.40 ( https://nmap.org ) at 2016-12-31 23:18 ???? (?W???)
Nmap scan report for 172.16.214.132
Host is up (0.00s latency).
PORT    STATE    SERVICE
139/tcp filtered netbios-ssn
445/tcp filtered microsoft-ds
MAC Address: 00:0C:29:27:B3:52 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 1.59 seconds

C:\Windows\system32>psexec \\172.16.214.132 -u Administrator -p weak_password whoami /user

PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

Couldn't access 172.16.214.132:
ネットワーク パスが見つかりません。

Make sure that the default admin$ share is enabled on 172.16.214.132.

C:\Windows\system32>

PsExec の痕跡

PsExec を使うと、いくつかログが残ります。攻撃者に侵入されてしまった可能性がある場合、対象端末の以下の点に着目することで PsExec で遠隔コード実行されてしまったか否かを推測することができます。

(1) Event Viewer の Windows Logs

PsExec により命令の実行を強制された場合は、Windows Logs に幾つかログが残ります。Security にはイベント ID 4624 番「特殊なログオン」がログとして残ります。System にはイベント ID 7045 番が以下の説明とともにログとして残ります。

サービスがシステムにインストールされました。

サービス名:  PSEXESVC
サービス ファイル名:  %SystemRoot%\PSEXESVC.exe
サービスの種類:  ユーザー モード サービス
サービス開始の種類:  要求による開始
サービス アカウント:  LocalSystem

攻撃者によりログが消されてしまっている場合もありますが、ログとして最も明確に残る箇所であると考えられます。

(2) %SystemRoot%\PSEXESCV.exe

PSEXESCV.exe は PsExec を実行して侵入するときに用いる実行ファイルです。PsExec により端末に侵入している場合は、侵入先端末の %SystemRoot% 配下に作成されます。PsExec による侵入を正常に終えた場合は PSEXESCV.exe は削除されるのですが、ネットワークの疎通が一時的に中断されてしまったなどの理由で PsExec による侵入が異常終了した場合、PSEXESCV.exe は %SystemRoot% 配下に残ったままとなります。

PsExec による遠隔コード実行を防ぐには

最後に PsExec を用いた遠隔コード実行への対策として、有用であると考えられる対策について紹介します。

(1) 管理共有機能を無効化する

PsExec は管理共有機能を介して端末を操作するツールであるため、管理共有機能が無効である場合は遠隔コード実行される可能性はありません。組織のネットワークの管理者は、可能であれば管理共有機能を無効にする設定を、ネットワーク上の端末に強制することで、PsExec による Lateral Movement を制限することができます。

(2) 管理対象の端末間ではファイル共有サービスの通信を許可しない

組織のネットワークに所属している端末を管理する上で、管理共有を用いないという選択をすることは難しい場合が多いと考えられます。その場合は、ドメインの管理サーバやファイルサーバなど必要な端末間でのみファイル共有サービスの利用を許可し、その他のクライアント端末間では Windows ファイアウォールなどによるアクセス制限によりファイル共有サービスの利用を禁止する設定を強制することで、PsExec による Lateral Movement を制限することが可能です。

(3) UAC を設定し各端末でビルドイン Administrator アカウントを無効化する

PsExec は、端末に存在するアカウントであっても、そのアカウントが無効である場合は命令を実行させることはできません。Pass-the-Hash の手法を用いた場合も同様です。無効であるユーザに PsExec を試行すると以下のような結果になります。

C:\Windows\system32>psexec \\172.16.214.132 -u Administrator -p weak_password whoami /user

PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

Couldn't access 172.16.214.132:
このアカウントは現在無効に設定されているため、このユーザーはサインインできません

C:\Windows\system32>

ビルドイン Administrator アカウントは権限昇格を必要とせずに管理者権限を行使可能であるため、日頃ビルドイン Administrator アカウントを利用することがない場合は、無効に設定することが望ましいです。ビルドイン Administrator アカウント以外でも、高い権限を持つアカウントの数を最小限に留めることが、セキュリティ対策上重要です。

(4) UAC を設定し各端末のビルドイン Administrator アカウントのパスワードを分離する

PsExec に限った話ではありませんが、同じパスワードが設定されているビルドイン Administrator アカウントが各端末で存在する場合は、該当するアカウント名が推測されてしまうと侵入されてしまいます。端末毎にビルドイン Administrator アカウントのパスワードを分離することにより、端末に侵入されてしまう可能性を低減することができます。