MS SQL Serverに保存されたパスワードの復号化

昔、遠い銀河では、SQL Serverの前の管理者がリンクサーバーをセットアップし、作成されたアカウントとこの目的のために生成されたパスワードを特別に使用していました。 次に、このリンクを使用して何かを行う必要があります。たとえば、それを別のSQL Serverに転送します。 そのアカウントのパスワードを誰も知らないため、できません。 おなじみの状況?



MSSQLはアカウントのパスワードを保存せず、ハッシュのみを保存しますが、リンクサーバーでは機能しません。外部サーバーの前で認証を成功させるには、クリア形式のパスワードが必要です。 リンクmaster.sys.syslnklgns



パスワードは、 master.sys.syslnklgns



テーブルに暗号化された形式で保存されます。







しかし、それほど単純ではありません。 まず、このテーブルは通常のSQL接続からはアクセスできませんが、 専用管理接続からのみ使用できます。 DACには大きな制限が課されています。sysadmin特権を持つユーザーのみがDACを開くことができ、一度に1つのサーバーに対して開くことができるDACは1つだけです。 サーバーのローカル管理者権限を持っているが、sysadmin権限でMSSQLにログインできない場合、 回避策があります。アカウントからではなく、MSSQLサービスアカウントから、またはLocalSystemからもログインすることです。



第二に、暗号化されたパスワードを持つフィールドはpwdhash



と呼ばれるという事実にもかかわらず、これはハッシュではなく、暗号化されたデータです。 復号化キーはmaster.sys.key_encryptions



システムテーブルに保存されます。







このキーは2つのコピーに保存されます。1つ目( thumbprint=0x01



)はMSSQLサービスアカウントでのみ使用でき、2つ目( thumbprint=0x0300000001



)-サーバー上の任意のアカウントで使用できます。 保存されたキーはいずれもサーバー外部のパスワードの「オフライン復号化」に適していないため、攻撃者がこれらのシステムテーブルの両方からデータを盗もうとしても、何も得られないことに注意してください。



第三に、復号化キー自体は暗号化され、「キーのキー」はHKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$InstanceName\Security\Entropy



のレジストリに保存されますHKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$InstanceName\Security\Entropy











この値をレジストリから読み取るには、サーバーのローカル管理者権限が再度必要です。



3つすべてのコンポーネントを取得し、保存されたパスワードを復号化するために、作成者は便利なPowerShellスクリプトを作成しました。



サーバーのローカル管理者アカウントで実行すると、次のようなものが表示されます。







実稼働サーバーの誰かが理解できないほどスクリプトを実行したくない場合、最初にSQL Studioとregeditを使用して3つのコンポーネントを引き出し、スクリプトに明示的に挿入すると、管理者権限なしで復号化自体を実行できます。 最初の復号化ステップ( $ServiceKey = [System.Security.Cryptography.ProtectedData]::Unprotect($SmkBytes, $Entropy, 'LocalMachine')



)はサーバーで実行する必要がありますが、2番目( $Decrypt = $Decryptor.​CreateDecryptor($ServiceKey,​$Logins.iv)



および$Decrypt = $Decryptor.​CreateDecryptor($ServiceKey,​$Logins.iv)



での後続の作業)はオフラインで実行できます。



MSSQLサービスよりも権限の低いアカウントに代わってコマンド( xp_cmdshell



など)を実行するためにデータベースに保存された資格情報同様の方法で復号化されます。



一方で、これらはすべて、あいまいさによるセキュリティの露骨な例のように見えます。リンクサーバーに接続するためのパスワード復号化がMSSQLで既に実装されている場合、忘れた管理者にこれらのパスワードを表示できないのはなぜですか? 一方、セキュリティの観点から見ると、すべてが非常に優れています。パスワードを解読するには、ローカル管理者権限でサーバーにアクセスする必要があります。攻撃者がそのようなアクセスを取得した場合、彼は既にサーバーで何でもできます。 望ましくない特権の昇格は、あるリンクサーバーからのパスワードが、たとえば同じサーバーの管理者パスワードとして重要なものに使用されている場合にのみ可能です:^)



All Articles