8

LogonUserの代わりに、ネットワークリソースにアクセスするために特定のアカウントを偽装する方法はありますか?私は、外部ドメインのマシン(または同じ問題のワークグループマシン)に接続できるようにするなりすましの方法を探しています。

私が持っている初期データの場合:マシン名、ユーザー名(またはドメイン\ユーザー名)、クリアテキストのパスワード。

WNetAddConnectionを使用して\\machinename\ ipc $への接続を確立する方法があることを知っています。ほとんどのネットワーク関数はそのアカウントのコンテキストで実行されますが、win2008は別の工夫を加え、一部の関数は引き続きアカウントを使用し、そのスレッドは。

また、SSPIを使用して偽装トークンを取得する方法があることも認識しています。誰かがそれらのトークンを試したことがありますか?それらは共有、SCM、リモートレジストリなどにアクセスするのに適していますか?WNetAddConnectionが使用しているものは何ですか?

編集:明確にするために、LogonUserを使用できない理由は、信頼されていないドメインまたはワークグループのユーザーになりすます必要があるためです。

EDIT2:別の説明:私が実装しようとしている項目はpsexecに似ています。例:

  • プログラムは、ホストまたはActive Directoryの構成を変更しないでください(例:一時的なローカルユーザーの作成など)。さらに、DCで実行されているかどうかを想定することはできません。
  • どのソフトウェアがリモートホストにプリインストールされているかを想定することはできません。与えられた条件は、Windowsファイル共有がターゲットで有効になっていることだけです。
  • アカウント/パスワードはターゲットで機能していることがわかっていますが、ターゲットマシンはローカルドメイン、外部ドメインにある可能性があり、ドメインにまったく存在しない可能性があります。

EDIT3: SSPI InitializeSecurityContext/AcquireCredentialsHandleオプションについてもっと知りたいです。このAPIを幅広く使用している人はいますか?偽装で返されたトークンを使用して、スレッドがネットワーク共有にアクセスしたり、ファイルをコピーしたりできるようにすることは可能ですか?誰かが実用的なコードスニペットを投稿できますか?

EDIT4:マーシュレイのおかげで、問題は解決されました。誰かが概念実証コードを見たいと思っているなら、それはここにあります

4

4 に答える 4

9

フォレストの外部で「ネットワークリソースにアクセス」する場合は、前述のようにWNetAddConnection2 / 3を使用するか、RPC_ C__ AUTHN__GSS__NEGOTIATEおよび明示的な資格情報構造で標準のRPCAPIを使用します。

通常、「なりすまし」はサーバー側で発生するものです。サーバー側は、接続しているアカウントとして接続を偽装することができます。

ただし、重要なのはこれです。偽装は、サーバーがローカルのSAM/ドメイン/フォレストディレクトリでアクセスできるアカウントを偽装する場合にのみ意味があります。クライアントとサーバーが異なるフォレストにある場合、偽装トークンのアカウントのSIDについて明確に合意できません(主にこの種のことを混乱させるのに役立つAdministratorのような有名なSIDの場合を除く)。 DACLなどをチェックするために必要と思われます。

おそらくあなたが望むのは、LOGON32__LOGON__NEW__CREDENTIALSフラグを使用してLogonUserExを呼び出すことです。これは成功するはずです(別のフォレストでも、指定した資格情報は実際には認証されません)。指定したユーザー名/パスワードのトークンが提供されます。これを偽装トークンに変換するには、DuplicateTokenを使用する必要がある場合があります。次に、SetThreadTokenを使用して、スレッドのトークンを置き換えることができます。

私見これは実際には「なりすまし」ではなく、クレデンシャルを完全に使用しているだけですが、指定した任意のユーザー名/パスワードとして透過的にネットワークリソースにアクセスできます。

編集:そうそう、このタイプの接続には中間者に対する保護がないことに注意してください。クライアントは特にサーバーを強力に認証できないため(IPSECのようなヒロイックを除く)、理論的にはサーバーからの指示を信頼することはできません。

于 2009-07-28T22:57:35.450 に答える
4

理論では、 InitializeSecurityContextで使用されるハンドルを作成するAcquireCredentialsHandle関数に、クレデンシャルをSEC_WINNT_AUTH_IDENTITY構造として渡します。私はこれを外国のドメインで試したことはありませんが、それが機能するかどうかはわかりません。

于 2009-07-20T20:07:51.103 に答える
0

Windows APIを介してこれを直接かつ確実に行うことはほぼ不可能に思えます。さらに、Windowsは、ネットワークアクセスを「正常に機能させる」ために、舞台裏で多くの作業を行います。さらに、偽装の側面は、APIを呼び出した単一のスレッドに対してのみ機能します。

ただし、サービスを実行する場合など、プログラム全体を別のユーザーで実行できます。

したがって、メインプログラムのレジストリを編集して、さまざまなセキュリティトークンでさまざまなサービスを実行し、IPC/ソケットを使用してメインアプリケーションからそれらのプロセスと通信することができます。すなわち。メインアプリが悪用するさまざまなユーザーの下で実行されているヘルパープロセスの全体(または同じプロセスの再起動と再構成)。

これはハックだと思いますが、実行可能のようです;)

于 2009-07-23T15:27:16.897 に答える
0

コマンドラインを開き、プレーンテキストのユーザー名とパスワードを使用してドライブをマップできます。次に、ドライブを切断します。

net use m: \\machinename\share password /user:username
... do stuff ...
net use m: /delete

http://technet.microsoft.com/en-us/library/cc756153(WS.10).aspx

于 2009-07-25T18:36:55.433 に答える