
ターゲット内C#製のMicrosoft SQL Server(MS SQL / MSSQL)用ポストエクスプロイテーションツールで、任意の深さのリンクサーバーチェーンをたどり、各ホップでカスケードログイン権限借用を行います。
ターゲットのMicrosoft SQL Server (MS SQL) DBMSに、ビジネスクラスのフライトでシャンパングラスを手に到着するかのように、優雅に着地しましょう。🥂

MSSQLandは、レッドチームオペレーター向けに構築されたC#製のMicrosoft SQL Server (MSSQL / MS SQL) ポストエクスプロイテーションツールです。ビーコン(例:Cobalt StrikeやHavocでのexecute-assembly、任意のdotnetコマンド)を介してターゲット環境内で直接実行するように設計されており、リンクサーバーチェーンを辿り、途中で遭遇した任意のログインを偽装し、最後のホップから任意のアクションを実行できます。すべて最小限のOPSECフットプリントで、外部依存関係はありません。
OPENQUERY / EXEC ATラッピングEXECUTE AS LOGINを使用し、カスケード型マルチユーザー偽装cm-*アクション[!TIP] MSSQLandは
.NET Framework 4.8で構築されており、現在のコンテキストを使用したアセンブリ実行を想定しています。NT/LMハッシュやKerberosチケットを使用して接続する必要がある場合は、パス・ザ・ハッシュを参照してください。
[!NOTE] 基本を忘れないでください。セキュリティ評価中は、SQL Server Management Studio (SSMS)を使用する方が簡単な場合があります。
MSSQLand.exe [options] <host> [options] <action> [action-options]
MSSQLand.exe <host> --probe
グローバルフラグ(-c、-l、--debugなど)は任意の位置(アクション名の後を含む)で受け付けられます。アクションの後で認識されなかったトークンは、そのままアクションに渡されます。
[!NOTE]
<action>を省略すると、接続テストのみが実行されます。認証してクエリを実行せずに終了します。最小限のOPSECフットプリントで資格情報を検証するのに最適です。
[!TIP] すべての**RPC Out** または**OPENQUERY** 呼び出しを手動で入力するのは避けてください。
-l引数を使用してリンクサーバーチェーンをツールに任せ、全体像に集中できるようにしましょう。
形式: server:port/user@database または任意の組み合わせ server/user@database:port
server(必須)- SQL Serverのホスト名またはIP:port(オプション)- ポート番号(デフォルト:1433、その他よく使われるもの:1434、14333、2433)/user(オプション)- このサーバーで偽装するユーザー("execute as login")
/user1/user2/user3 は EXECUTE AS LOGIN = 'user1'; EXECUTE AS LOGIN = 'user2'; EXECUTE AS LOGIN = 'user3'; を実行/userはセキュリティスタックに新しい偽装コンテキストをプッシュ@database(オプション)- データベースコンテキスト# 接続プローブ:認証せずにサーバーが稼働しているか確認
MSSQLand.exe localhost --probe
# 接続テストのみ(アクションを実行せず、認証して終了)
MSSQLand.exe localhost -c token
# 特定のアクションを実行
MSSQLand.exe localhost -c token info
MSSQLand.exe localhost:1434@db03 -c token info
MSSQLand.exe LAB-SQL01@AdventureWorks -c token tables -n Customer
-lフラグを使用して、セミコロン(;)を区切り文字として複数のSQLサーバーを連鎖させます:
-l SQL01;SQL02/user;SQL03@database
構文:
;) - チェーン内のサーバーを区切る/) - 偽装するユーザーを指定("execute as login")
/user1/user2 は連続した偽装を実行@) - データベースコンテキストを指定[...]) - サーバー名をデリミタで分割されるのを防ぐために使用例:
# 単純なチェーン
-l SQL01;SQL02;SQL03
# 偽装とデータベース付き
-l SQL01/admin;SQL02;SQL03/manager@clients
# カスケード型偽装(SQL01でuser1を偽装し、次にuser2を偽装)
-l SQL01/user1/user2;SQL02;SQL03
# 混合カスケード(SQL01: user1→user2, SQL03: user3→user4→user5)
-l SQL01/user1/user2;SQL02;SQL03/user3/user4/user5@database
# サーバー名にはハイフン、ドットを含めることができます(ブラケットは不要)
-l SQL-01;SERVER.001;HOST.DOMAIN.COM
# サーバー名にデリミタ文字が含まれる場合のみブラケットが必要
-l [SERVER;PROD];SQL02;[SQL03@clients]@clientdb
[!NOTE] ポート指定(
:port)は最初のホスト接続にのみ適用されます。リンクサーバーチェーン(-l)は、hostname:portの組み合わせではなく、sys.serversで構成されたリンクサーバー名を使用します。
これらのモードは認証を必要とせず、資格情報を入手する前に動作します。
SQL Server Browserサービス はUDP 1434でリッスンし、ホスト上で実行されているSQL Serverインスタンスのリスト(名前、バージョン、TCPポートを含む)を発見要求に応答して返します。これは、ターゲットが動的ポートで名前付きインスタンスを実行している場合に便利で、推測やスキャンは不要です。
# 特定のホストのSQL Browserサービスにクエリ(UDP 1434)
MSSQLand.exe LAB-SQL03 --browse
Active Directoryは、コンピュータアカウントとサービスアカウントに保存されたサービスプリンシパル名 (SPN)を通じてSQL Serverの登録情報を公開します。MSSQLandはLDAP経由でADをクエリし、MSSQLSvc/* SPNを探してドメイン全体のSQL Serverインスタンスを列挙します。また、グローバルカタログ経由でフォレスト全体も検索できます。
# Active Directory内のSQL ServerをLDAP経由で検索(現在のドメイン)
MSSQLand.exe --findsql
# 特定のドメインを対象とする
MSSQLand.exe --findsql pgd.lab
# グローバルカタログ経由のフォレスト全体の検索(ポート3268)
MSSQLand.exe --findsql pgd.lab --gc
発見は多層的です。詳細についてはFindSqlServers.csを参照してください。
SQL Server BrowserはUDPブロードキャストパケット(UDP 1434)にも応答し、ローカルサブネット上で自身をアドバタイズしているすべてのSQL Serverインスタンスを発見できます。
# ローカルネットワーク上のブロードキャスト発見(UDP 1434)
MSSQLand.exe --broadcast
MSSQLand.exe --broadcast --timeout 5
[!TIP] これは、SQL Serverがドメインに参加していないマシン上で実行されており、LDAPやSPNクエリに表示されない場合に特に便利です。スタンドアロンサーバー、開発者マシン、内部VLAN上にスピンアップされた不正なインスタンスなどを考えてみてください。
TDSプロトコル ハンドシェイク(単なるTCP SYNではありません)を使用して、稼働中のSQL Serverインスタンスに対して開いているポートを検証します。ポートは、TDSプリログインパケットに応答した場合にのみ報告されます。
MSSQLand.exe LAB-SQL03 --portscan
MSSQLand.exe LAB-SQL03 --portscan --all # すべてのインスタンスを検索(エフェメラルポート全範囲)
MSSQLand.exe LAB-SQL03 --portscan 65184 # 単一ポート
MSSQLand.exe LAB-SQL03 --portscan 65180-65190 # ポート範囲
MSSQLand.exe LAB-SQL03 --portscan 1433,5000,65184 # カンマ区切りリスト
MSSQLandはビーコン内の.NETアセンブリとして実行され、常に現在の実行コンテキスト(-c token)を使用して認証します。ハッシュを入手した場合の正しいアプローチは、まずビーコンレベルでトークンを偽造し、その後MSSQLandを通常通り実行することです。System.Data.SqlClientはそのトークンを透過的に継承するため、カスタムTDS実装は必要ありません。
MSSQLand内でNTLMv2をスクラッチから実装するということは、以下を意味します:
System.Data.SqlClientを手書きのTDS 7.xスタックに置き換える(膨大なソケット、TLS、NTLMコード)。KerberosチケットやNT/LMハッシュを使用して外部から認証する必要がある場合は、mssqlclient-ngが適切なツールです。これはUnix側からのアクセス用に構築されたPython 3クライアントであり、ビーコンから確立されたSOCKS5プロキシと簡単に組み合わせて使用できます。
WindowsホストでMSSQLandを実行しているが、Linux環境(Hyper-V VM、VMware、WSL)を介してSQL Serverターゲットにアクセスする必要がある場合は、socatを使用して簡単に接続を転送できます:
sudo socat TCP4-LISTEN:1433,fork,reuseaddr TCP:10.10.11.90:1433
このコマンドは、Linuxマシンのポート1433でリッスンし、すべてのトラフィックをターゲットSQL Server(10.10.11.90:1433)に転送します。その後、WindowsホストからMSSQLandをLinux VMのIPに接続できます。
-h または --help - 利用可能なすべてのアクションを表示-h search_term - アクションをフィルタリング(例:-h adsi はADSI関連のアクションをすべて表示)localhost -c token createuser -h - 特定のアクションの詳細ヘルプを表示MSSQLandは、Microsoft Configuration Manager(旧称SCCM / MECM)の悪用と偵察に対する包括的なサポートを含んでいます。ConfigMgrデータベースサーバーにアクセスできる場合、デバイスインテリジェンス(例:cm-devices)やインフラストラクチャマッピングのための特殊なアクションを活用できます。
すべてのConfigMgrアクションは、Microsoftの公式PowerShellコマンドレットの命名規則(Get-CM*、Set-CM*など)に合わせてcm-プレフィックス(例:cm-scripts、cm-package)を使用します。
タイムスタンプと貴重なコンテキスト情報が豊富なツールの出力は、視覚的に魅力的でプロフェッショナルな結果を生成するように設計されており、あらゆるレポート(例:顧客向け成果物、内部レポート、レッドチーム評価)の高品質なスクリーンショットをキャプチャするのに最適です。
すべての出力テーブルはMarkdown対応であり、フォーマットの手間をかけずにそのままメモにコピー&ペーストできます。
[!TIP]
--format csvオプションを使用して、.csv互換の出力を取得することもできます:MSSQLand.exe localhost -c token --format csv --silent procedures > procedures.csv
貢献は大歓迎です!バグの修正、新機能の追加、ドキュメントの改善、フィードバックの共有など、あなたの努力は価値があり、違いを生み出します。 オープンソースはコラボレーションと認知によって成長します。大小を問わず、貢献はツールとそのコミュニティの改善に役立ちます。あなたの時間と労力は本当に評価されます。
ここでは、誰もGit履歴から消去されることはありません。恐れる必要はありません。誰も、オープンソースの協力的な精神に従わずにあなたのコードをコピーペーストすることはありません。
開始方法の詳細なガイドラインについては、CONTRIBUTING.mdを参照してください。
なぜこれが存在し、他のSQL Serverプロジェクトへの貢献ではないのか疑問に思うなら、ORIGIN.mdを参照してください。
このツールは、防御的なセキュリティ研究、教育、および許可されたペネトレーションテスト専用に提供されています。 自分が所有していないシステムに対してこのソフトウェアを実行する前に、明示的な書面による許可を得ている必要があります。
このツールは教育目的のみで設計されており、許可されたエンゲージメントにおいてSQL Server環境のセキュリティを理解しテストするセキュリティ専門家を支援することを目的としています。
許容される環境は次のとおりです:
このプロジェクトの誤用は法的措置につながる可能性があります。
このツールを実際の環境で、またはシステム所有者から明示的な許可なしにシステムに対して不正に使用することは固く禁じられており、法的および倫理的基準に違反する可能性があります。このツールの作成者および貢献者は、誤用または引き起こされた損害について一切の責任を負いません。
責任を持って倫理的に使用してください。常に法律を尊重し、適切な許可を取得してください。