
攻撃的な偵察とポストエクスプロイトのために設計されたC# MS SQLツールキット
SQLReconは、攻撃的な偵察とポストエクスプロイテーション用に設計されたMicrosoft SQL Serverツールキットです。各テクニックの使用方法の詳細については、wikiを参照してください。
SQLReconのコピーはreleasesページからダウンロードできます。あるいは、自分でソリューションをコンパイルしても構いません。リポジトリをクローンし、ソリューションファイルをダブルクリックしてビルドするだけなので、簡単です。
予防、検出、軽減のガイダンスも防御側の皆様のために提供されています。
私のブログ記事をIBM Security Intelligenceウェブサイトでチェックしてください。動画がお好みなら、Black Hatでのプレゼンテーションをご覧ください。
列挙モジュールは、認証プロバイダーを指定する必要がありません。これらのモジュールは列挙モジュールフラグ(/e:, /enum:)に渡す必要があります。wikiには列挙モジュールの使用方法の詳細があります。```
Info - Show information about the SQL server.
/h:, /host -> SQL server hostname or IP. Multiple hosts supported.
/port: -> (OPTIONAL) Defaults to 1434 (UDP).
/t:, timeout: -> (OPTIONAL) Defaults to 3s.
SqlSpns - Use the current user token to enumerate the AD domain for MSSQL SPNs. /d:, /domain: -> (OPTIONAL) NETBIOS name or FQDN of domain.
# 認証プロバイダー
SQLReconは多様な認証プロバイダー(`/a:, /auth:`)をサポートしており、Microsoft SQL Serverとの対話を可能にします。```
WinToken - Use the current users token to authenticate against the SQL database
/h:, /host: -> SQL server hostname or IP
WinDomain - Use AD credentials to authenticate against the SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/d:, /domain: -> NETBIOS name or FQDN of domain.
/u:, /username: -> Username for domain user.
/p:, /password: -> Password for domain user.
Local - Use local SQL credentials to authenticate against the SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/u:, /username: -> Username for local SQL user.
/p:, /password: -> Password for local SQL user.
EntraID - Use Azure EntraID credentials to authenticate against the Azure SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/d:, /domain: -> FQDN of domain (DOMAIN.COM).
/u:, /username: -> Username for domain user.
/p:, /password: -> Password for domain user.
AzureLocal - Use local SQL credentials to authenticate against the Azure SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/u:, /username: -> Username for local SQL user.
/p:, /password: -> Password for local SQL user.
Pth - Authenticate using an NT hash (pass-the-hash) over raw TDS/NTLM. Elevated privileges or SeImpersonate is not required.
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/d:, /domain: -> NETBIOS domain name.
/u:, /username: -> Domain username.
/hash: -> NT hash (32 hex chars, 8846f7eaee8fb117ad06bdd830b7586c) or LM:NT format.
/h:, host:)は必須であり、1つ以上のSQLサーバーを指定できます。複数のSQLサーバーに対してモジュールを実行する場合は、ホストをカンマで区切ります(例:/h:SQL01,10.10.10.2,SQL03)。masterデータベースに接続しますが、データベース(/database:)フラグでカスタムデータベース名を指定することでオプションで変更できます。/debugフラグはオプションであり、リモートホストで実際に実行せずに、モジュールによって実行されるすべてのSQLクエリを表示します。この例はwikiにあります。1433を介してデータベースに接続しますが、これは/port:フラグを使用してオプションで変更できます。3秒ですが、この値はタイムアウト値(/t:, /timeout:)を指定することでオプションで変更できます。これは接続試行を終了するまでの秒数に対応します。/v, /verboseフラグはオプションであり、リモートホストでクエリを実行する前に、モジュールによって実行されるすべてのSQLクエリを表示します。この例はwikiにあります。EntraID認証プロバイダーを使用するには、Azure Active Directory Authentication Library (ADAL) または Microsoft Authentication Library (MSAL) がSQLReconを実行するシステムに存在する必要があることに注意してください。これはAzure EntraIDの認証および許可機能のためのものです。
SQLモジュールは、1つ以上のMicrosoft SQL Serverのインスタンスに対して実行されます。これらのモジュールは、モジュールフラグ(/m:, /module:)に渡す必要があります。
ホストフラグ(/h:, host:)は必須であり、1つ以上のSQLサーバーを指定できます。複数のSQLサーバーに対してモジュールを実行する場合は、ホストをカンマで区切ります(例:/h:SQL01,10.10.10.2,SQL03)。
各モジュールの使用方法の詳細は、SQL Serverの1つ以上のインスタンスでの実行をサポートするwikiに記載されています。
偽装モジュールは、偽装されたSQLユーザーのコンテキストで、1つ以上のMicrosoft SQL Serverのインスタンスに対して実行されます。すべての偽装モジュールには以下の最小要件があります。
/i:, /iuser:)。/m:, /module:)。各モジュールの使用方法の詳細は、偽装を使用した実行をサポートするwikiに記載されています。
リンクモジュールは、1つ以上のリンクされたMicrosoft SQL Serverのインスタンスに対して実行されます。すべてのリンクモジュールには以下の最小要件があります。
/l:, /link:)。リンクフラグは1つ以上のリンクされたSQLサーバーを許可します。たとえば、SQL01がSQL02へのリンクを持ち、SQL01がDB04へのリンクを持っている場合、リンクされたホストをカンマで区切ると、各リンクされたSQLサーバーでモジュールが実行されます(例:/l:SQL02,DB04)。/m:, /module:)。各モジュールの使用方法の詳細は、リンクされたSQL Serverの1つ以上のインスタンスでの実行をサポートするwikiに記載されています。
リンクチェーンモジュールは、リンクされたサーバーチェーン内の最後のMicrosoft SQL Serverに対して実行されます。すべてのリンクチェーンモジュールには以下の最小要件があります。
/l:, /link:フラグでリンクされたSQLサーバーチェーンを指定する必要があります。SQL01がSQL02へのリンクを持ち、SQL02がPAYMENTS01へのリンクを持ち、PAYMENTS01でモジュールを実行したい場合、引数は/l:SQL02,PAYMENTS01となります。/chainフラグを含める必要があります。/m:, /module:)。各モジュールの使用方法の詳細は、リンクされたSQL Serverチェーンの最後のSQLサーバーでの実行をサポートするwikiに記載されています。
SQLReconには、Microsoft System Center Configuration Manager (SCCM) および Microsoft Endpoint Configuration Manager (ECM) の列挙と攻撃を支援するいくつかのモジュールがあります。SCCMまたはECMサーバーは、ローカルまたはリモートでMicrosoft SQLデータベースを公開している必要があります。
SCCMモジュールは、SCCMモジュールフラグ(/s:, /sccm:)に渡す必要があります。
ほとんどのSCCMモジュールは、偽装されたSQLユーザー(/i:, /iuser:)のコンテキストで実行できます。
各モジュールの使用方法の詳細は、SCCM/ECMデータベースに対するwikiに記載されています。
Usersモジュールは、RBAC_Adminsテーブル内のすべてのユーザーを一覧表示します。これらは、SCCMへの何らかのレベルのアクセス権を持つように設定されたすべてのユーザーです。Sitesモジュールは、SCCMデータベースのDPInfoテーブルにデータが保存されている他のすべてのサイトを一覧表示します。これにより、異なるサイトが異なる(安全でない)方法で構成される可能性があるため、追加の攻撃経路を提供できます。Logonsモジュールは、Computer_System_DATAテーブルをクエリして、関連するすべてのSCCMクライアントと、それらに最後にログインしたユーザーを取得します。注: これはデフォルトで週に1回しか更新されず、100%最新ではありません。/option:をオプションの(必須ではない)引数として使用して、SCCMクライアントをフィルタリングします。TaskListモジュールは、SCCMデータベースに保存されているすべてのタスクシーケンスのリストを提供しますが、実際のタスクデータの内容にはアクセスしません。TaskDataモジュールは、SCCMデータベースに保存されているすべてのタスクシーケンスを回復し、平文に復号化します。タスクシーケンスには、システムをドメインに参加させるための資格情報、共有のマッピング、コマンドの実行などが含まれる可能性があります。Credentialsモジュールは、さまざまな機能で使用するためにSCCMによって保管された資格情報を一覧表示します。これらの資格情報は、キーがSCCMサーバーに保存されているため、リモートで復号化できません。ただし、このモジュールは、キーの取得を試みる価値があるかどうかに関する情報を提供します。DecryptCredentialsモジュールは、回復されたSCCM資格情報ブロブの復号化を試みます。このモジュールは、SCCMサーバー上で高整合性またはSYSTEMプロセスで実行する必要があります。SQLReconの拡張に興味がある場合は、wikiの寄稿と拡張のセクションを参照してください。
提案やアイデアがある場合は、issueを開くことをお勧めします。
目標は、SQLReconを継続的に改善することです。以下に、計画されているいくつかの研究分野を示します。
以下の人々が、SQLReconのさまざまな側面に直接的または間接的に貢献しています。
/auth:pth)を追加。PTHTdsConnection、NtlmHelper、PthStateを介した生のTDS/NTLM認証を実装し、すべてのモジュールが平文の資格情報や昇格された権限なしで動作するように。主な修正点は、ログイン後のANSIセッションオプション、マルチパケットTDS分割、同時CLR接続のTCPフローデッドロック処理、OPENQUERYブラケット記法の互換性。_linkedChainRpcQueryのバグ修正。System.Byte[]が適切に変換されずコンソールに出力される長年の問題を修正。credentialobjectssおよびproxiesモジュールを追加 (jakxx)。agentcmdにプロキシサポートを追加 (jakxx)。role列挙が正しく機能しない問題を修正 (passthehashbrowns)。impersonateモジュールが正しく機能しない問題を修正 (passthehashbrowns)。EnableRpc/DisableRpcが利用できない問題を修正 (passthehashbrowns)。XpCmdモジュールが機能しない問題を修正。出力もサポートするようになりました (passthehashbrowns)。EXEC ATクエリでブラケットで囲まれない限り問題が発生する問題を修正。これにより、リンクサーバー名がIPアドレスまたはFQDNの場合に問題が発生していました (passthehashbrowns)。.First関数が"0"を返すなど、リンクチェーンを反復処理する必要があるモジュールを開発する際に直感的でない動作を引き起こしていました。LinkedChainQuery関数が先頭に"0"を付けた新しい配列を作成し、別の関数(現在はLinkedChainQueryRecurseと呼ばれます)で既存のロジックを呼び出すように更新しました (passthehashbrowns)。impersonateモジュールの問題を修正 (n3rada)。scriptdataおよびcidataを実装 (G0ldenGunSec)。auditstatusモジュールを作成 (chryzsh)。whoamiモジュールにユーザーがアクセス権を持つデータベースを追加 (JBalanza)。adsiモジュールで、LDAPサーバーをmsdbデータベースに追加する必要がない問題を修正。また、作成された関数が適切に削除されるようになりました。/host または /h フラグで指定された複数のSQLサーバーに対する実行が、カンマ区切り値を使用してサポートされるようになりました。/link または /l フラグで指定された複数のリンクSQLサーバーに対する実行が、カンマ区切り値を使用してサポートされるようになりました。/lhost を /link に変更。s' モジュールを削除し、SCCMモジュール用の /s, /sccm スイッチを作成。DecryptCredentials を除くすべてのSCCMモジュールに偽装サポートを追加。info という新しい列挙 (/enum) モジュールを追加。UDPプロトコルを使用して、認証なしのコンテキストからSQLサーバー情報(インスタンス名やTCPポートを含む)を取得できます。ModuleHandler.cs 内の個々のメソッドに移動。Queries.cs に移動。adsi 実行がLDAPサーバーを削除していなかったバグを修正。adsi でのエージェントジョブ実行を削除し、openquery/rpcを優先。adsi モジュールの /lhost を /adsi に変更。smb モジュールの /rhost を /unc に変更。CaptureHash.cs を削除し、ロジックを簡略化。SetEnumerationType.cs を削除し、ロジックを簡略化。Impersonation.cs を Impersonate.cs に名称変更。OleCmdExec.cs を OleAutomation.cs に名称変更。smb モジュールに偽装サポートを追加。info モジュールに偽装サポートを追加。info モジュールにリンクサポートを追加。rows, iRows, lRows モジュールを作成。sLogons にオプションのフィルターを追加するよう更新。xp_cmdshell モジュールがコマンド出力をコンソールに出力していなかったバグを修正。SetEnumerationType.cs を作成。domain を SqlSpns に変更。SetAuthenticationType.cs のコンストラクタを EvaluateAuthenticationType という新しいメソッドに変更。SetAuthenticationType.cs に CreateSqlConnectionObject を作成。これにより、SQLReconが複数の同時SQL接続オブジェクトをサポートするように拡張されました。ADSI.cs を作成。こちらで説明されているADSIクレデンシャル攻撃を組み込みました。adsi, iAdsi, lAdsi モジュールを作成。lLinks と iLinks モジュールを作成。ExecuteImpersonationQuery と ExecuteImpersonationCustomQuery を作成。Impersonate.cs を削除。checkRpc モジュールを追加。iCheckRpc モジュールを追加。lCheckRpc モジュールを追加。EnableDisable.cs を ConfigureOptions.cs に名称変更。ExecuteLinkedCustomQueryRpcExec が呼び出される場所にRPCエラーチェックを実装。PrintUtils.cs を作成。標準化された出力のためのprintクラスを実装。TablePrinter を Help.cs から PrintUtils.cs に移動。PrintUtils クラスを使用して、すべてのコンソール出力のprintフォーマットを標準化。querysearchtableslColumnslQuerylSearchlTablesiColumnsiQueryAzure 認証を AzureAD に変更。AzureLocal 認証を作成。disableRpc モジュールを追加。enableRpc モジュールを追加。iEnableRpc モジュールを追加。iDisableRpc モジュールを追加。lEnableRpc モジュールを削除。lDisableRpc モジュールを削除。lAgentCmd のバグ修正。SqlCommand.ExecuteNonQuery を使用することで、clr, iClr, lClr の安定性を修正。lClr の、作成されたアセンブリやストアドプロシージャを削除していなかったバグを修正。columns モジュールを追加。iColumns モジュールを追加。iDatabases モジュールを追加。iSearch モジュールを追加。iTables モジュールを追加。lColumns モジュールを追加。lSearch モジュールを追加。ExecuteLinkedCustomQueryRpcExec によって提供される出力を改善。x に変更。Random.cs を utilities ディレクトリに移動。Windows 認証を WinToken に変更。WinDomain 認証を作成。偽装を介した認証にADドメインのユーザー名とパスワードを使用します。Impersonation.cs を参照してください。ArgumentLogic.cs, SQLAuthentication.cs, ModuleHandler.cs 全体の引数解析と処理を再設計。ModuleHandler.cs はモジュール実行に巨大な if/else if/else ステートメントを使用しなくなりました。代わりに、リフレクションがコマンドモジュール名に一致するメソッドを呼び出すために使用されるようになりました。commands ディレクトリを追加。プログラム全体で使用されるグローバル変数があります。SQLAuthentication.cs に統合。Program.cs から ArgumentLogic.cs に移動。authentication ディレクトリを削除。sccm コマンドを使用して実行できるSCCMモジュールを追加。roles, iRoles, lRoles モジュールでクエリされるロールを拡張。users, iUsers, lUsers モジュールを作成。clr および iClr モジュールの sp_drop_trusted_assembly からハッシュが削除されていなかった問題を修正。lAgentCmd モジュールを作成。lClr モジュールを作成。info モジュールを追加。Local および Azure 認証での必須引数の問題を解決。-e domain)。Windows および Local 認証モードに -r フラグを追加。これにより、標準的でないTCPポートを指定できます。TestAuthentication.cs から Environment.Exit を削除。AgentJobs.cs を作成。agentStatus を作成。iAgentStatus を作成。lAgentStatus を作成。agentCmd を作成。iAgentCmd を作成。clr を作成。iEnableClr を作成。iDisableClr を作成。iClr を作成。iWhoami を作成。iMapped を作成。iRoles を作成。lEnableRpc を作成。lDisableRpc を作成。lWhoami を作成。lEnableXp を作成。lDisableXp を作成。lEnableOle を作成。lDisableOle を作成。lSmb モジュールを作成。lWhoami モジュールを作成。lRoles モジュールを作成。oldCmd モジュールを修正。iOleCmd モジュールを修正。lDatabases モジュールを修正。lTables モジュールを修正。| モジュール名 | 説明 | 偽装 | リンク実行 | リンクチェーン実行 | 特権コンテキストが必要 |
|---|
AuditStatus | SQL監査が有効かどうかを確認します。 | ✅ | ✅ | ✅ | ❎ |
CheckRpc | リンクサーバーの一覧とそのRPCステータスを取得します。 | ✅ | ✅ | ✅ | ❎ |
Databases | すべてのデータベースを表示します。 | ✅ | ✅ | ✅ | ❎ |
Impersonate | 偽装可能なユーザーアカウントを列挙します。 | ✅ | ✅ | ✅ | ❎ |
Info | SQLサーバーに関する情報を表示します。 | ✅ | ✅ | ✅ | ❎ |
Links | リンクされたSQLサーバーを列挙します。 | ✅ | ✅ | ✅ | ❎ |
Users | データベースに対して認証できるユーザーアカウントとグループを表示します。 | ✅ | ✅ | ✅ | ❎ |
Whoami | 自分の権限を表示します。 | ✅ | ✅ | ✅ | ❎ |
Query /c:QUERY | SQLクエリを実行します。 | ✅ | ✅ | ✅ | ❎ |
Smb /unc:UNC_PATH | NetNTLMv2ハッシュをキャプチャします。 | ✅ | ✅ | ✅ | ❎ |
Columns /db:DATABASE /table:TABLE | 指定されたデータベースとテーブルのすべての列を表示します。 | ✅ | ✅ | ✅ | ❎ |
Rows /db:DATABASE /table:TABLE | 指定されたデータベーステーブルの行数を表示します。 | ✅ | ✅ | ✅ | ❎ |
Search /keyword:KEYWORD | 接続しているデータベースの指定されたテーブル内の列名を検索します。 | ✅ | ✅ | ✅ | ❎ |
Tables /db:DATABASE | 指定されたデータベース内のすべてのテーブルを表示します。 | ✅ | ✅ | ✅ | ❎ |
EnableRpc /rhost:LINKED_HOST | リンクサーバーでRPCとRPC outを有効にします。 | ✅ | ❌ | ❌ | ✔️ |
EnableClr | CLR統合を有効にします。 | ✅ | ✅ | ✅ | ✔️ |
EnableOle | OLE自動化プロシージャを有効にします。 | ✅ | ✅ | ✅ | ✔️ |
EnableXp | xp_cmdshellを有効にします。 | ✅ | ✅ | ✅ | ✔️ |
DisableRpc /rhost:LINKED_HOST | リンクサーバーでRPCとRPC outを無効にします。 | ✅ | ❌ | ❌ | ✔️ |
DisableClr | CLR統合を無効にします。 | ✅ | ✅ | ✅ | ✔️ |
DisableOle | OLE自動化プロシージャを無効にします。 | ✅ | ✅ | ✅ | ✔️ |
DisableXp | xp_cmdshellを無効にします。 | ✅ | ✅ | ✅ | ✔️ |
AgentStatus | SQLエージェントが実行中かどうかを表示し、エージェントジョブを取得します。 | ✅ | ✅ | ✅ | ✔️ |
AgentCmd /c:COMMAND /subsystem:(OPTIONAL) /proxy:(OPTIONAL) | エージェントジョブを使用してシステムコマンドを実行します。オプションで/subsystem:でサブシステムを指定します(デフォルトは'PowerShell')。オプションで/proxy:でSQLエージェントプロキシアカウントを指定します。 | ✅ | ✅ | ✅ | ✔️ |
Adsi /adsi:SERVER_NAME /lport:LOCAL_PORT | リンクされたADSIサーバーから平文のADSI資格情報を取得します。 | ✅ | ✅ | ✅ | ✔️ |
Clr /dll:DLL /function:FUNCTION | カスタムストアドプロシージャに.NETアセンブリをロードして実行します。 | ✅ | ✅ | ✅ | ✔️ |
CredentialObjects | sys.credentialsから資格情報オブジェクトを取得します。 | ✅ | ✅ | ✅ | ✔️ |
OleCmd /c:COMMAND /subsystem:(OPTIONAL) | OLE自動化プロシージャを使用してシステムコマンドを実行します。 | ✅ | ✅ | ✅ | ✔️ |
Proxies | SQLエージェントプロキシ情報を取得します。 | ✅ | ✅ | ✅ | ✔️ |
XpCmd /c:COMMAND | xp_cmdshellを使用してシステムコマンドを実行します。 | ✅ | ✅ | ✅ | ✔️ |
| モジュール名 | 説明 | 偽装 | 特権コンテキストが必要 |
|---|
Users | すべてのSCCMユーザーを表示します。 | ✅ | ❎ |
Sites | データが保存されている他のすべてのサイトを表示します。 | ✅ | ❎ |
Logons | 関連するすべてのSCCMクライアントと最後にログインしたユーザーを表示します。 | ✅ | ❎ |
Credentials | SCCMによって保管された暗号化された資格情報を表示します。 | ✅ | ❎ |
TaskList | すべてのタスクシーケンスを表示しますが、タスクデータの内容にはアクセスしません。 | ✅ | ❎ |
TaskData | すべてのタスクシーケンスを復号化して平文にします。 | ✅ | ❎ |
DecryptCredentials | SCCM資格情報ブロブを復号化します。SCCMサーバー上で高整合性またはSYSTEMプロセスで実行する必要があります。 | ❌ | ✔️ |
AddAdmin /user:DOMAIN\USERNAME /sid:SID | 指定されたアカウントをSCCMの'完全な管理者'に昇格させます。 | ✅ | ✔️ |
RemoveAdmin /user:ADMIN_ID /remove:STRING | ユーザーの権限を削除するか、SCCMデータベースからユーザーを完全に削除します。 | ✅ | ✔️ |
ScriptData | SCCMで実行するように設定されたすべてのスクリプトを返します。 | ✅ | ✔️ |
CIData | SCCMでスクリプトを実行するように設定されたすべてのCIを返します。 | ✅ | ✔️ |
AddAdminモジュールは、指定されたアカウントをSCCM内の'完全な管理者'に昇格させます。対象ユーザーがすでにSCCMユーザーである場合、このモジュールは代わりに必要な権限を追加して昇格させます。2つの引数を指定します。SQLReconプロセスを現在実行しているユーザーをSCCMの'完全な管理者'として追加する場合は/user:current /sid:currentと指定します。別のユーザーをSCCMの'完全な管理者'として追加する場合は、ドメインユーザー名と完全なSIDを/user:DOMAIN\USERNAME /sid:S-1-5-...のように指定します。このモジュールには、SCCMデータベーステーブルへの書き込みが必要なため、sysadminまたは類似の権限が必要です。RemoveAdminモジュールは、新しく追加されたユーザーをSCCMデータベースから完全に削除することで、ユーザーの権限を削除します。ユーザーがすでに何らかの形で存在していた場合、このモジュールは、権限テーブルへの書き込みを介してアカウントに追加された3つのロールを削除するだけです。このコマンドを実行するには、sAddAdminコマンドの出力で提供される引数を使用します。このモジュールには、SCCMデータベーステーブルへの書き込みが必要なため、sysadminまたは類似の権限が必要です。EnumerationModules.cs を作成。FormatQuery.cs を作成。SccmModules.cs を作成。ModuleHandler.cs を SqlModules.cs に名称変更。PrintUtils.cs を Print.cs に名称変更。SQLServerInfo.cs を Info.cs に名称変更。iSearchHelp.cs をメソッドからコンストラクタに変更。CaptureHash.cs をメソッドからコンストラクタに変更。Impersonate.cs をメソッドからコンストラクタに変更。lEnableClr を作成。lDisableClr を作成。lXpCmd を作成。lXpOle を作成。Random.cs を作成。EnableDisable.cs を作成。clr にランダムに生成されたアセンブリ名を実装。ole にランダムに生成された変数名とメソッド名を実装。mapped および roles モジュールを whoami に統合。lMapped および lRoles モジュールを lWhoami に統合。iMapped および iRoles モジュールを iWhoami に統合。