問題
リンクにアクセスすると以下のような画面が表示される。httpとhttpsで特に違いはなさそう。
さらに各リンクにアクセスすると、シャーロックホームズの『A SCANDAL IN BOHEMIA』(ボヘミアの醜聞)の文章が書かれているっぽい。
解法
ディレクトリトラバーサルかな?と思いつつURLを探索し、https://ctfq.u1tramarine.blue/q26/
にアクセスすると以下のようにディレクトリ内の一覧が表示された。
とりあえずflag.txt
にアクセスしてみたが、予想通りフラグはなかった。
ただしヒントが書かれてあり、ソースコードを見ればいいらしい。
ということでソースコードを探してみる。
https://ctfq.u1tramarine.blue/
にアクセスすると以下のような画面が表示されたので、/usr/share/nginx/html
とかにソースコードが置かれているのかなー…と思ってファイルを探してみたが見つからなかった。
その後色々と試した結果、https://ctfq.u1tramarine.blue/q26/index.pl/index.pl
にアクセスするとソースコードを確認することができた。
どうやらindex.plは、index.plの次のパスに指定したファイルの中身を出力するらしい。
最初のシャーロックホームズの小説がヒントとなっており、https://ctfq.u1tramarine.blue/q26/index.pl/a_scandal_in_bohemia_1.txt
にアクセスするとa_scandal_in_bohemia_1.txt
の中身を出力してくれる。
よって、index.pl/index.pl
にアクセスすることで、index.plのソースコードを表示することができた。
ソースコードを見てみると怪しげな記述があった。
上部のコードによると、cracked.txt
の中身にh@ck3d!
という文字列が記載されている場合だけFLAGを表示するらしい。
ちなみにcracked.txt
はflag.txt
と同じディレクトリに存在し、中身は空だった。
ここからどうやってcracked.txt
に文字を書き込むか悩んだが、どうやらPerlのopen関数の引数の末尾にパイプ|
が含まれているとOSコマンドインジェクションが発生するらしい。
このコードではhttps://ctfq.u1tramarine.blue/q26/index.pl
の次のパスの値をそのまま引数として利用している。
open(F,substr($ENV{'PATH_INFO'},1));
そのため、たとえばhttps://ctfq.u1tramarine.blue/q26/index.pl/|ls
にアクセスするとlsコマンドが実行される。
この脆弱性を利用し、https://ctfq.u1tramarine.blue/q26/index.pl/|echo h@ck3d! >> cracked.txt
にリクエストを投げることでcracked.txt
に任意の文字を書き込むことができる。
その後、https://ctfq.u1tramarine.blue/q26/index.pl
にアクセスするとフラグを取得できた。
所感
Perlの知識が全くないので、そこで躓いてしまった。。(コードを解読するのに時間かかる…)
Perl知ってる人だと簡単に解ける問題だと思われる。