[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がとれます。