
lighttpd 1.4.85 - High - Remote - Path - native Win32 GET /..%20/ がドキュメントルート外を読み取る
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · lighttpd-win32-dotdot-space
クラス: ファイル読み取り 到達性: リモート
lighttpd 1.4.85 (4852959) - lighttpd
ネイティブ _WIN32 の staticfile は、buffer_path_simplify の後に document-root と rel_path を結合する。Simplify は3バイト目が / の場合にのみ ../ を畳み込む。http_response_prepare_physical はパス全体のみから末尾のスペースとドットを除去する。したがって GET /..%20/windows/win.ini は /.. /windows/win.ini のまま残る。\\?\ プレフィックスなしの _wstati64 / _wopen は、Win32 にコンポーネントごとにスペースを除去させ、そのセグメントを .. として扱わせる。
ネイティブ Windows 上の lighttpd に対する未認証の GET/HEAD は、ワーカーアカウントが開ける document-root 外の通常ファイルを読み取る。 Unix/Linux はこの残存脆弱性には該当しない。ファイル読み取りであり、RCE ではない。
このラボは、それらのピン留めされた関数のガジェットである。実際のネイティブ Win32 ワーカーではない。最終行は how=gadget を使用する。
| ID | CVE 未割当 |
| クラス | ファイル読み取り (パストラバーサル、ネイティブ Win32 ..%20/) |
| 到達性 | リモート (未認証 GET/HEAD) |
| CWE | CWE-22 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| 製品 | lighttpd1.4 |
| 影響を受けるバージョン | 1.4.85 (4852959e67ef51ea68084984400d3264b854c97d) ネイティブ _WIN32 |
| 認証 | なし。デフォルトの mod_staticfile |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ、how=gadget |
ネイティブ Windows の lighttpd が静的ファイルを配信している必要がある。ワーカーアカウントが対象の通常ファイルを開ける必要がある。
| 権限 | メソッド / シンク | ラボで実証済みか推測か |
|---|---|---|
document-root 外のファイルを読み取る | 未認証 GET /..%20/<name> | ラボで実証済み (ガジェット)。HTTP 200 のボディが親ディレクトリのシークレット |
非最終 .. コンポーネント上の他の末尾 ASCII スペース/ドットに対する同クラス | url-decode 後に simplify が .. を保持 | %20 についてはラボで実証済み。他の末尾スペース/ドットについては推測 |
| 同じパスへの HEAD | staticfile HEAD | 推測。ラボでは GET を使用 |
ネガティブ: 実際の /../ | buffer_path_simplify が ../ を畳み込む | ラボで実証済み。404、簡略化された /windows/win.ini、witness なし |
| ネガティブ: 簡略化されていない物理文字列に対する Unix POSIX open | open("/srv/htdocs/.. /windows/win.ini") | ラボで実証済み。ENOENT |
この残存脆弱性でクローズ済み: Unix/Linux staticfile、Cygwin (同じ strip、POSIX open)、1.4.85 %5C parseopt、CVE-2018-19052 alias、CVE-2014-2324 Host。RCE ではない。書き込みでもない。
タグ lighttpd-1.4.85 をピン留めした。20回の探索。デフォルトの Unix/Linux staticfile、FastCGI、proxy、TLS、auth、HTTP/2、alias/rewrite: この基準ではいずれも該当なし。1.4.81-1.4.85 のパーサーウェーブはすでに trailers、CGI ヘッダー競合、不正なバックエンド Content-Length をクローズしていた。
buffer_path_simplify は walk[2] == '/' の場合にのみ ../ を畳み込む。http_response_prepare_physical (src/response.c 334-360) の WIN32 strip はパス全体の末尾に対する処理である。_wstati64 / _wopen (src/fs_win32.c 24-77) は \\?\ なしで UTF-16 を渡すため、Win32 はコンポーネントごとに末尾スペースを除去し、.. が .. になる。物理的な結合は doc_root + rel_path であり、stat 後のベースディレクトリチェックはない。
すでに記録済みの誤った方向: Unix の ENOENT を「バグではない」と扱うこと (これはネガティブコントロールである)、Cygwin をネイティブ Win32 と呼ぶこと、1.4.85 %5C がこの残存脆弱性だと主張すること、ファイル読み取りを RCE に誇張すること。茶番: リバースシェル。オラクルは document-root の親からの 200 ボディである。
python3 lighttpd-win32-dotdot-space-Abraxas-Labs.py
または
cd lab
./run.sh
このラボは、buffer_urldecode_path、buffer_path_simplify (Win32 '\\' マップ)、response.c の末尾 strip、および \\?\ なしの _wstati64 を忠実に再現したガジェットである。Unix POSIX open はネガティブコントロールである。Win32 の解決は、同じコンポーネントごとの末尾スペース strip、次に . / ..、次に解決されたパスに対する POSIX open として実装されている。ループバック HTTP 127.0.0.1:19400。
/index.html -> 200 public-index、witness なし。/../windows/win.ini -> 404、簡略化された /windows/win.ini。/..%20/windows/win.ini -> デコードされた /.. /windows/win.ini、simplify がスペースを保持、Unix ENOENT、Win32 が /srv/windows/win.ini に解決、200 witness。SUCCESS lighttpd-win32-dotdot-space how=gadget win32-get=200 unix-open=enoent simplify-kept-dotdot-space=yes LIGHTTPD-WIN32-DOTDOT-SPACE-WITNESS
simplify の前にパスコンポーネントごとに末尾のスペースとドットを除去するか、Win32 の open に \\?\ を付け、document-root 配下に留まらない物理パスを拒否する。
4852959e67ef51ea68084984400d3264b854c97d)src/buffer.c · src/response.c · src/fs_win32.c%5C parseopt · CVE-2018-19052 alias · CVE-2014-2324 HostGNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。