Writeup: Vulnhub Lord of the root 攻略
Vulnhub の Lord of the root 攻略メモ。
このVMはパズルを解いている感じで楽しかった。
1.仮想マシンのダウンロード
下記のリンクからダウンロード。サイズは 1.6GB。
ダウンロードしたファイルをVirtual Box へインポートして起動する。
メモリは 1GB、ネットワークインターフェースは「ホストオンリーアダプタ」を使用。
映画「ロード・オブ・ザ・リング」をモジったようで、ホスト名は「スメアゴル」。なんだか面白そう・・・。
2.攻略
1)ポートスキャン
いつも通り、ping スキャンを行ってターゲットの IPアドレスを調べてみる。
あらら、、何も見つからなかった。どうやら ping には応答しないようだ。
ならば、 ARPスキャン。アドレスは 192.168.56.137 であることが判った。
( 末尾 ".100" はVirtual Box 、 ".1" は Virual BoxのDHCPサーバ)
ポートスキャンしてみる。 22/tcp しか開いていない。
いつもと勝手がちがうようだ・・・。
「もしかしてUDP?」と思って、UDPでもポートスキャンしてみたが何も出てこなかった。
22/tcp しか開いていないことが判ったので、ここから始めるしか無さそう。
とりあえず SSH でアクセスしてみると、画面左下に "Easy as 1,2,3 " と何やら意味ありげな表示を見つけた。
"1, 2, 3" はこの順番にポートノッキングをしろ、という意味かもしれない。
「ポートノッキング」とは、予め設定されたポートに決まった順番で接続を試みた場合に特定のサービスを起動するもので、下記のリンクに判り易い記事がある。
やってみよう。
ポートのノックは SYNフラグが付いたパケットを送信できれば良いので、
nmap で ポート番号 1, 2, 3 の順にSYNスキャンする。(-r をつけないとランダムな順番になってしまうので注意。)
なんだか、「開けゴマ!」と云っているような気分・・・。
再度、ポートスキャンを行うと 1337番ポートが開いていた。
Apache が稼働している。
2)脆弱性探し
1337/tcp で稼働している Webサーバをブラウザで眺めてみる。
「モルドールにリングを持っていくぜ!」ということで、ゲームはこれから、というところか・・・。なんだか遊び心溢れているなぁ。。
とりあえず、何か手がかりは無いだろうか?
こういうふざけたVMは大抵、robots.txtにヒントが書いてあるはず。
チェックしてみると、映画の3作目で主人公がモルドールの入り口に到着したシーンが貼られていた。
ソースをチェックすると、何やら意味ありげなコメントが書かれている。
上記のコメントを解読してみよう。
CyberChefは文字列をエンコード、デコードができるオンラインツールで様々な方式に対応している。これを使ってデコードすれば簡単。
Base64で2回デコードした結果、URLが隠されていることが判った。
このURLにアクセスしてみる。
どうやらこれが「モルドールの入り口」ということらしい。。
「SQLインジェクション攻撃」をやってください、と言わんばかりの画面なので試してみよう。
sqlmap は「SQLインジェクション攻撃」を全自動でやってくれるツールで、
Kali Linux に標準で入っている。
使い方も簡単。
まず、ブラウザの開発者ツール(CTRL + Shift + [ I ] で起動)を使って、Webサイトに送信する文字列を抽出し、req.txt としてファイルに保存する。
あとは、このファイルを sqlmap に渡して実行するだけ。
-p オプションでチェックしたいパラメータを指定する。
sqlmap を実行した結果、"username" に SQL挿入可能であること、DBの種類は MySQL であることが判った。
データベースの種類が判ると、それを手がかりに再度スキャンすることで、カレントDBの名前が判る。次にテーブル名、項目名と順番にたどっていくことで DBの全データが判ってしまう。「SQLインジェクション」は恐ろしい。
何度かスキャンを繰り返し、全てのユーザー名、パスワードを入手した。
ユーザー名とパスワードが判ったので、Webサイトにログインしてみる。
楽しそうな写真が幾つか貼ってあった。
試してみると、どのユーザーでログインしても同じページが表示される。
しばらく Webサイトの挙動をチェックしてみたが、これ以上の手がかりは無さそうだった。
php や Apache のバージョンから脆弱性をチェックしてみたが、侵入の手がかりになりそうなものは無さそうだ。
3)侵入
さて、最初のポートスキャンの結果を思い出そう。
22/tcp (SSH)が開いていた。
SQLインジェクションで判明したユーザー/パスワードを使ってSSHでログインできないだろうか?
試してみよう。ユーザー、パスワードをそれぞれ別のファイルに保存し hydra を使ってチェックしてみる。
smeagol でログインできることが判ったので、sshで堂々とログインした。
4)root権限奪取
root権限で実行できるファイルが無いか探してみる。
/SECRET/ という意味ありげなディレクトリが見つかった。
また、pkexecもあるので、pwnkit が使えそうだ。
まず、/SECRET/ ディレクトリを調べてみる。
このディレクトリ配下にある3つのファイルをチェックしてみると、1つだけサイズが違うことに気がついた。
しかも、時間がたつとサイズの違うファイルの場所が入れ替わっている。
この 5150バイトのファイルに何かありそうだ。
場所がコロコロ変わるようなので、一旦 /tmp にコピーして調べてみる。
何か引数をつけて実行するもののようだが、何も起きなかった。
デバッガで調べてみよう。
逆アセンブルしてみると、最後に strcpy ()を呼んでいる。
起動時の引数をそのままバッファにコピーしているとしたら、バッファオーバーフローの脆弱性がありそうだ。
上から4行目でスタックのサイズが 0xb0 (176) に設定されているので、200バイト程度の文字列を引数に与えれば、オーバーフローが起きそうだ。
デバッガ上で "A"を200個、引数に与えて実行してみると、0x41414141番地へジャンプしようとしてプログラムが停止した。
"A" は 0x41 だから想定通り、引数に与えた文字列でオーバーフローが起き、スタックが破壊されたことを示している。
例えば、シェルコードを環境変数に設定しておいて、この環境変数のアドレスを引数に仕込んでおけば、シェルが起動できそうだ。
おっと、その前に実行時のアドレスがランダム化されていないかチェックしなければ。。。
残念。ASLR が有効になっていることが判った(randomize_va_space =2 )
ldd で調べてみると、アドレスが毎回違っているのが判る。
逆アセンブルをよく見てみると、プログラム中で printf() が呼ばれているので、下記 1 ~ 4 のステップを踏めば攻略ができそうだ。
バッファオーバーフローを利用して printf()を呼び出し、libc のsystem() のアドレスをリークさせる。
リークしたアドレスを使って、オーバーフローでsystem() にジャンプするための文字列を作成する。
再度、strcpy()を呼び出して上記の文字列を渡し、バッファオーバフローを使って system() にジャンプする。
system() を使用してシェルを起動する。
う~ん、できないことはなさそうだが、なかなか面倒だ。
とりあえず、pwnkit を使って手っ取り早くroot権限を獲ることにしよう。
pwnkit ( CVE-2021-4034 ) はpolkit の脆弱性を利用して権限昇格を図るもので、PoCが沢山公開されている。
下記のリンクで公開されているものを使用した。
まず攻撃用のマシンで Webサーバを立てて
次にターゲット側のマシンでダウンロードする。
ダウンロードしたファイルをコンパイルし、実行。
無事、root のシェルが起動した。
さて、フラグを見てみよう。
ガンダルフ(「白の魔法使い」だっけ?)のカッコよいセリフが書いてあった。
これで攻略完了。めでたし、めでたし。
この記事が気に入ったらサポートをしてみませんか?