セキュリティ識別子の構造を理解する方法 - TechRepublic

セキュリティ識別子の構造を理解する方法 - TechRepublic

Windows ネットワークの管理者であれば、セキュリティ識別子 (SID) についてよくご存知でしょう。セキュリティを適用できるオブジェクトはすべて、固有の SID を持ちます。SID を見たことがある人なら、それが一見、巨大なランダムな数字のように見えることをご存知でしょう。しかし、この複雑な仕組みには理由があり、SID を調べることでオブジェクトについて多くのことを知ることができます。場合によっては、オブジェクトの SID を操作することで、そのオブジェクトに適用されるセキュリティを操作できることもあります。

SIDの構成要素
SIDは、オブジェクトを一意に識別する単なる番号です。Windowsは、SIDに直接権限を割り当てるのではなく、セキュリティ記述子(SD)に権限を割り当てます。SDには、特定のSIDに関連する権限または拒否のセットが含まれています。SIDは、UNIX環境で使用されるUID(ユニークID)と本質的に似ています。しかし、SIDとUIDの違いは、SIDはネットワーク全体にわたっても一意であるということです。

例えば、2つのドメインで構成されるネットワークがあるとします。各ドメインにはAdministratorというユーザーがいます。Administratorのパスワード、説明、その他の設定が同一であっても、SIDが異なるため、Windowsの観点からはそれぞれ異なるアカウントとして扱われます。同様に、SIDが異なるため、Windowsはドメイン管理者アカウントをローカル管理者アカウントとは異なるものとして扱います。ドメイン内のワークステーション上のローカル管理者アカウントであっても、Windowsの観点からはそれぞれ異なるアカウントとして扱われます。

Windowsがネットワーク上の異なるマシン間でもSIDを区別できるのは、SIDの構造によるものです。ドメイン環境では、ドメイン内のすべてのオブジェクトは、ドメインを識別するルートSIDに基づいたSIDを持ちます。SIDの詳細な構造については後ほど説明しますが、ここでは簡単な例を挙げます。TESTというドメインがあり、次のSIDを使用しているとします。S
-1-5-21-186985262-1144665072-74031268

そのドメイン内のユーザーには、そのドメインを反映したSIDが割り当てられます。例えば、個々のユーザーのSIDは
S-1-5-21-186985262-1144665072-74031268-1309のようになります。

ご覧のとおり、ドメインSIDの末尾に1309という数字が追加され、ドメイン内のユーザーオブジェクトを一意に識別しています。SIDの最後の部分(この場合は1309)は、相対識別子(RID)と呼ばれます。管理者アカウントなど、複数のマシンに同じ名前のオブジェクトがある場合、そのオブジェクトは複数のマシン間で同一のRIDを持つ可能性があります。しかし、RIDとSIDを組み合わせることで、SIDは一意になり、ネットワーク全体でオブジェクトを一意に識別できるようになります。

SID番号は何を意味するのでしょうか?
SIDはダッシュで区切られた数字で構成されていることにお気づきかもしれません。これらの数字は完全にランダムなものではなく、特定の意味を持っています。SIDの最初の数字は常に「S」です。「S」は、その番号がSIDであることを示します。これにより、SIDがセキュリティ記述子、グローバル一意識別子(GUID)、その他と間違えられるのを防ぎます。

次の数字はバージョン番号です。現在存在するすべてのWindowsバージョンでは、バージョン番号として1が使用されています。次の数字は、最上位レベルの権限の識別子です。ほとんどの場合、この数字は5ですが、0から4までの数字も使用されます。これは、5つの異なるセキュリティ権限があるためです。

  • SECURITY_NULL_SID_AUTHORITY:このSIDは、メンバーがいないグループ、つまり実質的にはNULLグループを指します。この権限は0で指定されます。主にユニバーサルSID番号に使用されます。つまり、私のマシンとあなたのマシンで同じSIDを持つことになります。
  • SECURITY_WORLD_SID_AUTHORITY:このSIDは1で表されます。この権限はEveryoneグループを担当します。EveryoneグループはSIDプレフィックスS-1-1-0で指定されます。
  • SECURITY_LOCAL_SID_AUTHORITY:この SID 権限はローカル ユーザーを管理し、番号 2 で指定されます。ローカル ログオン権限を持つユーザーは、SID プレフィックスが S-1-2-0 のグループのメンバーになります。
  • SECURITY_CREATOR_SID_AUTHORITY:番号 3 で指定されるこの SID は、作成者所有者 ID (S-1-3-0) および作成者グループ (S-1-3-1) に関連付けられています。
  • SECURITY_NT_AUTHORITY: 5番で示されるこのSIDは、最も頻繁に使用されるSID機関です。すべてのユーザーアカウント、グローバルグループ、およびローカルグループ(例:S-1-5-21)のSIDの生成を担当します。

(数字 4 は、一意ではない SID の作成を許可します。ただし、この記事では SECURITY_NON_UNIQUE_AUTHORITY の使用については説明しません。)

次の一連の数字はそれぞれ意味が異なりますが、グループを表すためによく使用されます。例えば、EveryoneグループはS-1-1-0というSIDプレフィックスで指定されます。ドメイン環境では、他によく使用されるSIDプレフィックスを以下に示します。

  • 皆さん—S-1-1-0
  • 作成者/所有者—S-1-3-0
  • バッチプロセス—S-1-5-3
  • 認証済みユーザー—S-1-5-11
  • システム—S-1-5-18

SIDプレフィックスはローカルシステムでは少し異なる動作をします。SIDプレフィックスがS-1-5-32の場合、オブジェクトはローカルでのみ解釈されます。一般的なローカルSIDプレフィックスには以下のようなものがあります。

  • 管理者—S-1-5-32-544
  • ユーザー—S-1-5-32-545
  • ゲスト—S-1-5-32-546

よく知られている SID のより詳細なリストは、Microsoft のサポート Web サイトで参照できます。

SIDの様々な構成要素について説明したので、先ほど使用したSIDの例をもう一度見てみましょう。ご存知のとおり、SIDの例はS-1-5-21-186985262-1144665072-74031268-1309でした。このSIDの例において、各数字は以下の機能を持っています。

  • S —番号をSIDとして識別します
  • 1 —バージョン番号
  • 5 — SECURITY_NT_AUTHORITY SID 権限を指定します。
  • 21-186985262-1144665072-74031268 —ドメイン識別子
  • 1309 —オブジェクトの相対識別子

SIDの操作
SID番号の読み方がわかったところで、SIDを使って何ができるのか疑問に思われるかもしれません。管理者の観点から見ると、SIDの意味を理解できれば、多くのレジストリエントリの機能を特定するのに役立ちます。ただし、より悪質な点として、SIDの操作はシステムのハッキングにも利用される可能性があります。以下のセクションでは、SID関連のハッキング手法をいくつか紹介します。

権限昇格攻撃
SIDベースのハッキングで最もよく使われる手法の一つに、権限昇格攻撃があります。ハッカーがローカルドメインのSIDを変更するだけで、ドメインへの管理者権限を取得することは困難です。これには2つの理由があります。1つ目は、SIDの変更は単純なプロセスではないことです。2つ目は、そのプロセスには管理者権限が必要であることです。この手法は時折使用されているようですが、より一般的な手法は、Windowsがドメイン間の信頼関係を実装する方法を悪用することです。

Windows 2000では、推移的な信頼関係が使用されます。つまり、ドメインAがドメインBを信頼し、ドメインBがドメインCを信頼している場合、推移的な信頼関係の性質上、ドメインAはドメインCを信頼することになります。ハッカーはこの関係を利用して、信頼されるドメインから信頼する側のドメインへのアクセスを取得することができます。

通常、信頼されたドメインから信頼するドメインにリクエストが渡される際、そのリクエストはリクエストを送信したユーザーのSIDとともにドメインに渡されます。リクエストは信頼されたドメインから送信されているため、SIDは信頼されたドメインのルートSIDに基づきます。

さて、ハッカーが信頼するドメインへの管理者権限を取得しようとしたとします。ハッカーは、リクエストに渡されるSIDを、管理グループへの所属を反映するように改変することができます。これは、S-1-5- domain SID -500(ドメイン管理者アカウント)またはS-1-5- domain SID -512(Domain Adminsグループ)という番号のSIDになります。

しかし、この種の攻撃を成功させる真の秘訣は、ハッカーが偽のドメインSIDを使用する必要があることです。信頼関係が使用される場合、信頼する側のドメインは受信リクエストに関連付けられたSIDの正当性を検証しますが、信頼される側のドメインがすべての受信SIDに対して権限を持っているかどうかは検証しません。したがって、SIDのドメイン部分が不明または許可されていないドメインを指している場合、信頼する側のドメインは、リクエストが推移的な信頼関係に関連していると想定し、したがって、そのリクエストは信頼される側のドメインによって信頼されている不明なドメインに属しているものと想定します。その後、リクエストが検証され、ハッカーは管理者権限で信頼する側のドメインに侵入します。

では、このような攻撃をどのように防ぐことができるでしょうか?このような攻撃を阻止するには、SIDフィルタリングを使用する必要があります。SIDフィルタリングは、Windows 2000が受信要求の正当性を検証する技術です。基本的に、SIDフィルタリングは推移的な信頼関係を無効にするため、推移的な信頼関係を正当に利用している組織では使用すべきではありません。

SIDフィルタリングを実装する場合は、各ドメインコントローラでWindows 2000 Service Pack 2以降が動作していることを確認してください。その後、NETDOMユーティリティを使用してSIDフィルタリングを実装できます。Service Pack 2のサポートツールフォルダに含まれているバージョンのNETDOMを使用する必要があります。このバージョンのNETDOMには、/FILTERSIDSスイッチが含まれています。ドメイン内のすべてのドメインコントローラに対して、/FILTERSIDSスイッチおよびその他の適切なスイッチをすべて指定してNETDOMを実行する必要があります。

ユーザーリストへのアクセス
SIDを悪用するもう一つの方法は、SIDを利用してユーザーリストにアクセスすることです。ドメイン内のユーザー名が分かれば、対応するパスワードを簡単に解読できます。ユーザーリストの取得がいかに容易であるかは、実に恐ろしいことです。

まず、ハッキング対象のマシンのIPC$共有を悪用してヌルセッションを確立します。これはNET USEコマンドを使って実行できます。例えば、今回のデモではDR-EVILというマシンをハッキングします。そのため、以下のコマンドを入力します:
NET USE \\dr-evil\ipc$

セッションが確立されたら、USER2SIDというユーティリティを使用する必要があります。これは、様々なハッカーウェブサイトで入手可能です。USER2SIDユーティリティを使用すると、特定のユーザーまたはグループのSIDを調べることができます。例えば、DR-EVILのDomain AdminsグループのSIDを調べたい場合は、次のコマンドを入力します:
USER2SID \\dr-evil "Domain Admins"

テストマシンでユーティリティを実行すると、次の情報が返されました:
S-1-5-21-746137067-764733703-83952215-512
サブオーソリティの数は 5
ドメインは TEST
メモリ内の SID の長さは 28 バイト
SID のタイプは SidTypeGroup

次のステップでは、SIDの仕組みについて少し理解する必要があります。先ほど、ドメイン内のユーザーオブジェクトとグループオブジェクトは、ドメインのSIDとそれに付加されたRIDを使用することを説明しました。RIDの値が1000未満の場合は、組み込みのユーザーまたはグループに関連し、1000以上の場合は非デフォルトオブジェクトに関連します。つまり、ドメインSIDにRID値1000を加算し、そこからカウントアップしていくことで、ユーザーとグループのSIDを計算できるということです。

攻撃の次の段階は、USER2SIDのコンパニオンツールであるSID2USERの使用です。このツールはUSER2SIDに付属しており、SID番号をユーザー名に変換します。それでは、逆順にユーザー名を探してみましょう。

先ほど、Domain Admin グループの SID が S-1-5-21-746137067-764733703-83952215-512 であることを確認しました。つまり、SID S-1-5-21-746137067-764733703-83952215-1000 から始めて、S-1-5-21-746137067-764733703-83952215-1001、S-1-5-21-746137067-764733703-83952215-1002 というように、ドメインのユーザー名を特定できるということです。各 SID を自動的に確認するスクリプトを作成することもできます。

ここで、次のコマンドを入力してユーザー名を取得します:
SID2USER \\machine_name SID

たとえば、DR-EVILのユーザーを検索する場合は、次のコマンドを使用します:
SID2USER \\DR-EVIL 5 21 746137067 764733703 83952215 1000

上記のコマンドでは、ダッシュがスペースに置き換えられていることにご注意ください。また、SIDの先頭の「S」と「1」が省略され、SIDがSID権限番号(この場合は5)で始まっていることにもご注意ください。このコマンドを実行すると、出力は次のようになります。
名前はUser1 、
ドメインはTest、
SIDタイプはSidTypeAliasです。

このタイプのハッキングの実際のスクリーン キャプチャを以下の図 Aで確認できます。

図A
以下は SID ベースのハックのサンプルです。

今回は、Domain Admins グループに属するユーザーをターゲットにしました。ただし、SID を参照する別のグループを指定するだけで、他のグループも簡単にターゲットにできます。

では、このようなハッキングからどのように身を守るのでしょうか?内部的には、簡単に推測されたり解読されたりしない強力なパスワードを使用することが唯一の対策です。外部的には、TCPポート139をブロックすることで、この種の攻撃をブロックできます。

トラブルシューティングツール
SIDの仕組みを理解しようとすると途方に暮れてしまうかもしれませんが、その構造を理解すれば、実に役立つツールとなります。ハッキングユーティリティと併用することで、Windows 2000 Serverの問題解決に役立つ強力なツールとなります。

Tagged: