ChogeLog

主にセキュリティ関係の記録やWrite-up。たまーに日記も。

#13 Proverb (write-up)

問題

ksnctf.sweetduet.info

sshで指定されたサーバに接続する。
「Proverb」は日本語で「ことわざ」という意味らしい。

解法

早速サーバにアクセスし、ホームディレクトリを確認すると以下のようなファイルが用意されている。

flag.txtが用意されているが、直接アクセスはできない。
proverb.txtは読み取り権限があり、確認してみると中身は以下のようになっていた。

どうやら英語のことわざが記述されているっぽい。

残りのproverbは実行権限があるため、とりあえず実行してみると以下のような結果になった。

中身のコードを読むことはできないが、どうやらproverb.txtからランダムで1行取得して出力しているっぽい。

ここからどう解いていけばいいか分からなくなると思うが、ここで注目するポイントはproverbパーミッションs(SUID)が設定されていることである。

SUID(Set User ID)が設定されていると、そのファイルの所有者の権限で実行されるらしい。つまり、proverbを実行する際はその所有者(q13a)として実行される。
ということで、proverbファイル経由だとflag.txtに所有者(q13a)の権限としてアクセスすることができるため、フラグを取得することができそう。

proverbproverb.txtの内容を読み出しているため、flag.txtのファイル名を「proverb.txt」に変更することでフラグを取得できる。
ただし、cpやmvコマンドなど、普通の方法ではファイル名を変更することができない(権限がないため)。
そこで、ここからはシンボリックリンクの悪用(シンボリックリンク攻撃)を試みる。

まず、ホームディレクトリでシンボリックリンクを設定しようとしても権限がないため、以下のようなエラーが出力される。

そのため自由に作業ができそうな権限のゆるいディレクトリを探す必要がある。
ルートディレクトリから探してみると、/tmpディレクトリの権限がゆるいことが分かるため、ここで作業を行うことにする。

ただし、/tmp直下だとシンボリックリンクの設定はできるが、なぜかファイルを実行する際に失敗してしまう(Linuxの仕様?)ため、/tmpに任意のサブディレクトリを作成し、そこで作業を行う。

/tmp直下だと失敗する

ここでは/tmp/q13というディレクトリを作成後、そのディレクトリ上でlnコマンドを使用してシンボリックリンクを作成した。この際、flag.txtのリンク名はproverb.txtに設定する。
proverbシンボリックリンクも作成後、そのディレクトリ上でproverbを実行することでフラグが出力された。

フラグ取得までの流れ

所感

proverb経由でflag.txtを出力させる必要がある。というところまでは分かったが、その方法までは思いつかなかった…。(ほかの人のwrite-upを少しだけ見て、シンボリックリンクを利用する方法を知る)
今回はシンボリックリンク攻撃というものを初めて知れたので、とても良い勉強になった。