[ksnctf] Sherlock Holmes

ksnctfにチャレンジ
第26問目です。

※ksnctfは常駐型のCTFサイトです。
※問題のページはコチラです。

Sherlock Holmes

開いてURLを見た瞬間に大体察しが付きます。

8946 Take20

と同じです。
perlの open 関数は | 付きの文字列をOSのコマンドと認識するので
今回のように URLで指定されたテキストファイルをそのまま
perlの open で処理していると思われる場合有効です。

まず ls すると

flag.txt があるのでこれで終わりかと思うと

ハズレでした おそらく
/~q26/index.pl/flag.txt
というパスを直接予想してしまった人対策だと思い、
素直に

/|cat index.pl
を実行してソースをみると、
 h@cl3d! とかかれたファイルが存在すれば FLAG_n6… を表示する
とあります あれ…もうフラグ見えてません?

どうやら
作問者の意図としては
URLからURL末尾のファイル名がそのまま読み込まれていると考え
ディレクトリトラバーサル的に
/~q26/index.pl/flag.txt
/~q26/index.pl/index.pl
を経由するのが正規ルートぽいです。
この表示を見てから、ディレクトリにファイルを生成することが
必要だとわかり、そのための方法として
OSコマンドインジェクションにたどり着く という想定っぽいです。
初手でコマンドインジェクションだと気づいてしまうと
しれっとフラグが見えてしまうので粋じゃない(意味不明)です

ということで一応正規ルートに乗れば
OSコマンドインジェクションで h@ck3d! と書かれた
crack.txt というファイルを生成すれば良いので

/~q26/index.pl/|echo 'h@ck3d!' > cracked.txt
一度実行してから
/~q26/index.pl/
にアクセスすると

"ちゃんと" FLAGがとれます。

コメントする