見出し画像

Writeup: Vulnhub Lord of the root 攻略

Vulnhub の Lord of the root 攻略メモ。
このVMはパズルを解いている感じで楽しかった。

1.仮想マシンのダウンロード

下記のリンクからダウンロード。サイズは 1.6GB。

ダウンロードしたファイルをVirtual Box へインポートして起動する。
メモリは 1GB、ネットワークインターフェースは「ホストオンリーアダプタ」を使用。

映画「ロード・オブ・ザ・リング」をモジったようで、ホスト名は「スメアゴル」。なんだか面白そう・・・。

起動画面(lord of the root)

2.攻略

1)ポートスキャン

いつも通り、ping スキャンを行ってターゲットの IPアドレスを調べてみる。

pingスキャン

あらら、、何も見つからなかった。どうやら ping には応答しないようだ。
ならば、 ARPスキャン。アドレスは 192.168.56.137 であることが判った。
( 末尾 ".100" はVirtual Box  、 ".1" は Virual BoxのDHCPサーバ)

ARPスキャン

ポートスキャンしてみる。 22/tcp しか開いていない。
いつもと勝手がちがうようだ・・・。

ポートスキャン(TCP)

「もしかしてUDP?」と思って、UDPでもポートスキャンしてみたが何も出てこなかった。

22/tcp しか開いていないことが判ったので、ここから始めるしか無さそう。
とりあえず SSH でアクセスしてみると、画面左下に "Easy as 1,2,3 " と何やら意味ありげな表示を見つけた。

SSH

"1, 2, 3" はこの順番にポートノッキングをしろ、という意味かもしれない。
「ポートノッキング」とは、予め設定されたポートに決まった順番で接続を試みた場合に特定のサービスを起動するもので、下記のリンクに判り易い記事がある。

やってみよう。
ポートのノックは SYNフラグが付いたパケットを送信できれば良いので、
nmap で ポート番号 1, 2, 3 の順にSYNスキャンする。(-r をつけないとランダムな順番になってしまうので注意。)

なんだか、「開けゴマ!」と云っているような気分・・・。

ポートノッキング(1,2,3)

再度、ポートスキャンを行うと 1337番ポートが開いていた。
Apache が稼働している。

ポートスキャン(再)

2)脆弱性探し

1337/tcp で稼働している Webサーバをブラウザで眺めてみる。
「モルドールにリングを持っていくぜ!」ということで、ゲームはこれから、というところか・・・。なんだか遊び心溢れているなぁ。。

とりあえず、何か手がかりは無いだろうか?
こういうふざけたVMは大抵、robots.txtにヒントが書いてあるはず。
チェックしてみると、映画の3作目で主人公がモルドールの入り口に到着したシーンが貼られていた。

robots.txt

ソースをチェックすると、何やら意味ありげなコメントが書かれている。

robots.txt(ソース)

上記のコメントを解読してみよう。
CyberChefは文字列をエンコード、デコードができるオンラインツールで様々な方式に対応している。これを使ってデコードすれば簡単。

Base64で2回デコードした結果、URLが隠されていることが判った。

CyberChef

このURLにアクセスしてみる。
どうやらこれが「モルドールの入り口」ということらしい。。

モルドールの入り口

「SQLインジェクション攻撃」をやってください、と言わんばかりの画面なので試してみよう。

sqlmap は「SQLインジェクション攻撃」を全自動でやってくれるツールで、
Kali Linux に標準で入っている。

使い方も簡単。
まず、ブラウザの開発者ツール(CTRL + Shift + [ I ] で起動)を使って、Webサイトに送信する文字列を抽出し、req.txt としてファイルに保存する。

ログイン画面に送信するリクエスト文字列(req.txt)

あとは、このファイルを sqlmap に渡して実行するだけ。
-p オプションでチェックしたいパラメータを指定する。

sqlmap 

sqlmap を実行した結果、"username" に SQL挿入可能であること、DBの種類は MySQL であることが判った。

sqlmap 実行結果

データベースの種類が判ると、それを手がかりに再度スキャンすることで、カレントDBの名前が判る。次にテーブル名、項目名と順番にたどっていくことで DBの全データが判ってしまう。「SQLインジェクション」は恐ろしい。

何度かスキャンを繰り返し、全てのユーザー名、パスワードを入手した。

データベースのダンプ

ユーザー名とパスワードが判ったので、Webサイトにログインしてみる。
楽しそうな写真が幾つか貼ってあった。

ログイン画面

試してみると、どのユーザーでログインしても同じページが表示される。
しばらく Webサイトの挙動をチェックしてみたが、これ以上の手がかりは無さそうだった。

php や Apache のバージョンから脆弱性をチェックしてみたが、侵入の手がかりになりそうなものは無さそうだ。

3)侵入

さて、最初のポートスキャンの結果を思い出そう。
22/tcp (SSH)が開いていた。

SQLインジェクションで判明したユーザー/パスワードを使ってSSHでログインできないだろうか?

試してみよう。ユーザー、パスワードをそれぞれ別のファイルに保存し hydra を使ってチェックしてみる。

hydora

smeagol でログインできることが判ったので、sshで堂々とログインした。

smealog でssh ログイン

4)root権限奪取

root権限で実行できるファイルが無いか探してみる。
/SECRET/ という意味ありげなディレクトリが見つかった。
また、pkexecもあるので、pwnkit が使えそうだ。

root権限で実行できるファイルの探索

まず、/SECRET/ ディレクトリを調べてみる。
このディレクトリ配下にある3つのファイルをチェックしてみると、1つだけサイズが違うことに気がついた。

/SECRET 配下のファイル

しかも、時間がたつとサイズの違うファイルの場所が入れ替わっている。

/SECRET 配下のファイル

この 5150バイトのファイルに何かありそうだ。
場所がコロコロ変わるようなので、一旦  /tmp にコピーして調べてみる。

何か引数をつけて実行するもののようだが、何も起きなかった。

怪しげなファイル

デバッガで調べてみよう。
逆アセンブルしてみると、最後に strcpy ()を呼んでいる。
起動時の引数をそのままバッファにコピーしているとしたら、バッファオーバーフローの脆弱性がありそうだ。

上から4行目でスタックのサイズが 0xb0 (176) に設定されているので、200バイト程度の文字列を引数に与えれば、オーバーフローが起きそうだ。 

デバッガ上で "A"を200個、引数に与えて実行してみると、0x41414141番地へジャンプしようとしてプログラムが停止した。

"A" は 0x41 だから想定通り、引数に与えた文字列でオーバーフローが起き、スタックが破壊されたことを示している。

バッファオーバーフロー

例えば、シェルコードを環境変数に設定しておいて、この環境変数のアドレスを引数に仕込んでおけば、シェルが起動できそうだ。

おっと、その前に実行時のアドレスがランダム化されていないかチェックしなければ。。。

残念。ASLR が有効になっていることが判った(randomize_va_space =2 )
ldd で調べてみると、アドレスが毎回違っているのが判る。

ASLR

逆アセンブルをよく見てみると、プログラム中で printf() が呼ばれているので、下記 1 ~ 4 のステップを踏めば攻略ができそうだ。

  1.    バッファオーバーフローを利用して printf()を呼び出し、libc のsystem() のアドレスをリークさせる。

  2.    リークしたアドレスを使って、オーバーフローでsystem() にジャンプするための文字列を作成する。

  3.   再度、strcpy()を呼び出して上記の文字列を渡し、バッファオーバフローを使って system() にジャンプする。

  4. system() を使用してシェルを起動する。


う~ん、できないことはなさそうだが、なかなか面倒だ。
とりあえず、pwnkit を使って手っ取り早くroot権限を獲ることにしよう。

pwnkit ( CVE-2021-4034 ) はpolkit の脆弱性を利用して権限昇格を図るもので、PoCが沢山公開されている。

下記のリンクで公開されているものを使用した。

まず攻撃用のマシンで Webサーバを立てて

次にターゲット側のマシンでダウンロードする。

ダウンロードしたファイルをコンパイルし、実行。
無事、root のシェルが起動した。

pwnkit

さて、フラグを見てみよう。
ガンダルフ(「白の魔法使い」だっけ?)のカッコよいセリフが書いてあった。

flag

これで攻略完了。めでたし、めでたし。


この記事が気に入ったらサポートをしてみませんか?