問題
sshで指定されたサーバに接続する。
「Proverb」は日本語で「ことわざ」という意味らしい。
解法
早速サーバにアクセスし、ホームディレクトリを確認すると以下のようなファイルが用意されている。
flag.txt
が用意されているが、直接アクセスはできない。
proverb.txt
は読み取り権限があり、確認してみると中身は以下のようになっていた。
どうやら英語のことわざが記述されているっぽい。
残りのproverb
は実行権限があるため、とりあえず実行してみると以下のような結果になった。
中身のコードを読むことはできないが、どうやらproverb.txt
からランダムで1行取得して出力しているっぽい。
ここからどう解いていけばいいか分からなくなると思うが、ここで注目するポイントはproverb
のパーミッションにs
(SUID)が設定されていることである。
SUID(Set User ID)が設定されていると、そのファイルの所有者の権限で実行されるらしい。つまり、proverb
を実行する際はその所有者(q13a)として実行される。
ということで、proverb
ファイル経由だとflag.txt
に所有者(q13a)の権限としてアクセスすることができるため、フラグを取得することができそう。
proverb
はproverb.txt
の内容を読み出しているため、flag.txt
のファイル名を「proverb.txt」に変更することでフラグを取得できる。
ただし、cpやmvコマンドなど、普通の方法ではファイル名を変更することができない(権限がないため)。
そこで、ここからはシンボリックリンクの悪用(シンボリックリンク攻撃)を試みる。
まず、ホームディレクトリでシンボリックリンクを設定しようとしても権限がないため、以下のようなエラーが出力される。
そのため自由に作業ができそうな権限のゆるいディレクトリを探す必要がある。
ルートディレクトリから探してみると、/tmp
ディレクトリの権限がゆるいことが分かるため、ここで作業を行うことにする。
ただし、/tmp
直下だとシンボリックリンクの設定はできるが、なぜかファイルを実行する際に失敗してしまう(Linuxの仕様?)ため、/tmp
に任意のサブディレクトリを作成し、そこで作業を行う。
ここでは/tmp/q13
というディレクトリを作成後、そのディレクトリ上でlnコマンドを使用してシンボリックリンクを作成した。この際、flag.txt
のリンク名はproverb.txt
に設定する。
proverb
のシンボリックリンクも作成後、そのディレクトリ上でproverb
を実行することでフラグが出力された。
所感
proverb経由でflag.txtを出力させる必要がある。というところまでは分かったが、その方法までは思いつかなかった…。(ほかの人のwrite-upを少しだけ見て、シンボリックリンクを利用する方法を知る)
今回はシンボリックリンク攻撃というものを初めて知れたので、とても良い勉強になった。