ksnctf Q.13


ksnctf Q.13 Proverb

問題には ssh 先のアドレスとパスワードが載っている。

「pwn かな」となんとなく思いながらサーバーにアクセスする。

サーバーに入り、とりあえず ls -la。 readme.txt と、他に flag.txt proverb.txt proverb の 4 つファイルがあった。

ls

調べる

ここで、これらのファイル全て、write 権限が無いことに気づく。

ディレクトリにも書き込み権限はない。

さらに read 権限も厳しくついているため、gdb  や hexdump で proverb を見れない。

さっぱりわからず、とりあえず proverb を実行しまくる。

しかし、ランダムに proverb.txt に書き込まれた名言を標準出力に表示するだけで、 他に何もわからない。

「なんじゃこれ…」

30 分くらいたち、万策尽きて全然わからんので、write up  でヒントをもらいに行く。

恐る恐る write up をスクロールすると、なにやら /tmp/proverb.txt が存在し、

その中身には 「Please make your own subdirectory.」と書いてあるらしい。

自分でも確認してみたが、/tmp/proverb.txt はあったが中身は ~/proverb.txt と同じものであった。

少々がっくりしながら、/tmp 以下にディレクトリを作成してみる。

作成したディレクトリの中では、ファイルを作成できる。(tmp でも同じだが)

ここで flag.txt や proverb.txt を mv したり cp したりして、ここでまた行き詰まる。

もう少し write up をスクロールしてみると、 何やら ~ 以外で ~/proverb を実行するとエラーが出るという。

(これは…?)

と思いながら実行してみる。

すると同様にエラーが。

ここで、権限上 flag.txt を mv や cp できないことは確認ずみで、proverb 自体も何も引数も取らないため、このディレクトリに proverb.txt を用意しなければならない。

ここで、シンボリックファイルの存在を思い出す。

ここに proverb.txt というファイル名で~/flag.txt にリンクすれば良いのでは無いか..?

これが大当たりで、無事 flag.txt の中身が表示された。

感想

この脆弱性は、ファイルの読み取りを相対パスではなく、絶対パスで設定すれば防げたのかもしれない。

作ったシンボリックファイルを cat してみたところ、権限がありませんと表示され、読めなかった。

どういう条件が揃うと、こういったことが可能になるのか微妙にわからない。

proverb は setuid が設定されていたが、これが関係しているのだろうか。

あ、多分そうだ。

setuid は実行したユーザーの権限ではなく、ファイルの所有者の権限で実行されるんだった。

proverb と flag.txt の所有者はどちらも q13a というユーザーだ。

cat で表示されないのは、実行ユーザーが q13 だからなんだ。

解決した。setuid 危険っすね