ChogeLog

主にセキュリティ関係の記録やWrite-up。たまーに日記も。

#26 Sherlock Holmes (write-up)

問題

ksnctf.sweetduet.info

リンクにアクセスすると以下のような画面が表示される。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.txtflag.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知ってる人だと簡単に解ける問題だと思われる。