Environment 【M】

Environment はデバッグモードのLaravelサイトに対し、URL経由のCVEを悪用して環境を「preprod」に設定。デバッグクラッシュによる認証バイパスを利用して内部サイトにアクセス。さらに別のCVEでLaravelファイルマネージャーの制限を回避しWebシェルを設置。GPG鍵を取得してユーザー昇格後、BASH_ENVを保持できるsudo権限を悪用しルートへ昇格。

偵察(Recon)

Nmap

sudo nmap -sV -sC -oA environment 10.10.11.67

# Nmap 7.95 scan initiated Sun Sep  7 21:39:59 2025 as: /usr/lib/nmap/nmap -sV -sC -vv -oA nmap/environment 10.10.11.67
Nmap scan report for environment.htb (10.10.11.67)
Host is up, received reset ttl 63 (0.18s latency).
Scanned at 2025-09-07 21:40:00 JST for 14s
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE REASON         VERSION
22/tcp open  ssh     syn-ack ttl 63 OpenSSH 9.2p1 Debian 2+deb12u5 (protocol 2.0)
| ssh-hostkey: 
|   256 5c:02:33:95:ef:44:e2:80:cd:3a:96:02:23:f1:92:64 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGrihP7aP61ww7KrHUutuC/GKOyHifRmeM070LMF7b6vguneFJ3dokS/UwZxcp+H82U2LL+patf3wEpLZz1oZdQ=
|   256 1f:3d:c2:19:55:28:a1:77:59:51:48:10:c4:4b:74:ab (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ7xeTjQWBwI6WERkd6C7qIKOCnXxGGtesEDTnFtL2f2
80/tcp open  http    syn-ack ttl 63 nginx 1.22.1
| http-methods: 
|_  Supported Methods: GET HEAD
|_http-favicon: Unknown favicon MD5: D41D8CD98F00B204E9800998ECF8427E
|_http-title: Save the Environment | environment.htb
|_http-server-header: nginx/1.22.1
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Read data files from: /usr/share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sun Sep  7 21:40:14 2025 -- 1 IP address (1 host up) scanned in 15.07 seconds

OpenSSHnginxのバージョンから判断すると、ホストはDebian12 Bookwormを実行していると思われます。Webサーバーはenvironment.htbにリダイレクトしています。ffufで簡単なスキャンを実行し、異なる応答を返すサブドメインがないか確認してみましたが、見つかりません。

初めに/etc/hostsファイルに以下を追加します。

10.10.11.67 environment.htb

Website - TCP 80

ページにはリンクがありませんでした。下部にはメーリングリストにメールアドレスを追加するフォームがあります。メールアドレスを入力すると、追加が成功した旨が表示されます:

そして、ページフッターには、サイトのバージョンが「Production v1.1」と記載されています:

Nuclei

次に、Nucleiスキャンを実行しました。Nucleiは、バージョン情報やHTTPレスポンスヘッダー、およびその2つのクッキーに関する詳細情報を列挙するのに役立ちます。このクッキーの情報から、それがLaravelであることがほぼ判明します。これらのクッキーはLaravelのクッキーです。2つ目のlaravel_sessionは、アプリケーションによって<何か別の名前>_sessionに改名される可能性がありますが、Laravelは常にXSRF-TOKENクッキーと_sessionクッキーの両方を設定します。

Laravelは私が何度もハッキング(調査・解析)した経験があるPHPフレームワークです。この404ページは、デフォルトのLaravelの404ページです。

どうやって判断しましたかといいますと0xdfさんのウェブでおきる404エラーページのチートシートがあります。

ディレクトリブルートフォース

  1. -b = ネガティブステータスコード(設定されている場合、status-codesを上書きします)。 403&404のエラーよく出てたため...

/login はログインフォームを表示します:

/mailing は、ユーザーがメールアドレスを送信した際の POST リクエストを受け取ります。

/up はステータスページを表示します:

/storage は 403 を返します。ここにはさらに多くのものが存在する可能性があります。これはファイルストレージなどに使用される Laravel の標準ディレクトリです。/build と /vendor も 403 を返し、Laravel にとってあまり重要ではないディレクトリです。

/upload は Laravel のデバッグページを返します:

こちらでは、Laravel 11.30.0 というバージョン番号以外に、あまり多くの情報を漏らしていません。

www-data ユーザーとしてシェルを実行

アクセス管理ダッシュボード

CVE-2024-52301 背景

このような場合、最も手っ取り早い方法は、対象ソフトウェアのバージョンのリリース日を確認することです。もし古いバージョンであれば、それに関連するCVE(共通脆弱性識別子)やPoC(概念実証コード)を調べるとよいでしょう。

CVE-2024-52301 は、このバージョンの Laravel に存在する脆弱性です:

PHP の register_argc_argv ディレクティブが有効に設定されている場合、ユーザーが特別に細工されたクエリ文字列を含む任意の URL を呼び出すと、リクエスト処理時にフレームワークが使用する環境を変更することが可能になります。

これは少し曖昧です。このページでより詳細に説明されています。php.iniファイルでregister_argc_argvが有効になっている場合、ユーザーは--env=devのようなGETパラメータを注入して、フレームワークが使用する環境を変更できます。

http://environment.htb/?--env=local にアクセスすると、ページフッターのバージョンが変更されます:

実際、任意の文字列(akuma)に変更可能です:

もう少しPHPスクリプト(<?php echo "Hello World" ?>)とかで遊んでみると:

私個人の間違えでもありますがスクリプト書き間違ったら(<?php echo="Hello World" ?>)スペースを=に:

クロスサイトスクリプティングもできなかった。ですが、これがどのように役立つかはまだ明らかではありません。

ログインページのエラー

明らかにLaravelのデバッグモードが動作しているようだ。Burp RepeaterにログインPOSTリクエストを送信し、少し試してみる。再送信するとリダイレクトが返ってくる:

空のメールやパスワードを送信しても、同じリダイレクトが送られるだけです。しかし、メールパラメータを完全に削除すると、クラッシュします:

デバッグモードであるため、多くの情報を含むようにレンダリングされます:

$keep_loggedinif / elseif で True または False に設定されています。75行目見ると、送信された値が「False」でも「True」でもない場合、75行目でクラッシュします。

メールパラメータを再追加し、rememberを「hello」に設定します:

79行目から83行目までアプリの環境変数が「preprod」に設定されている場合、認証検証をバイパスし、ID 1のユーザーとしてログインできることを示しています!

ログインバイパス

ログインページに戻り、Burp Proxyのインターセプトを有効にします。クライアントサイドの検証を満たす任意の認証情報でログインします。インターセプトされたリクエストでは、パスに ?--env=preprod を追加してみると:

ログインバイパスできいて、ブラウザが管理ダッシュボードを読み込んでくれました:

Shell経由のLaravelファイルマネージャー

ダッシュボード列挙

メインダッシュボードページはかなりシンプルです。操作できる要素は何もありません。「プロフィール」リンクから、現在のユーザーのプロフィール写真を更新できます:

現在、http://environment.htb/management/dashboard にアクセス可能ですが、先ほどバイパスログインに使用した ?--env=preprod のパラメータも、このhttp://environment.htb/management/dashboard?--env=preprodで利用できます。何か隠されたページが存在しないかを確認するため、このパラメータを付けてアクセスしてみました。その結果、phpinfo のページが表示されました。

同様にこの方法(http://environment.htb/management/info?--env=preprod)で info ファイルにもアクセスでき、中身を確認したところ、特に有用な情報やパスワードなどは含まれていませんでした。

Last updated