見出し画像

Writeup: Vulnhub EvilBox:One 攻略

Vulnhub EvilBox:One の攻略メモ

0.ダウンロード

この仮想マシンは下記のリンクからダウンロードできる。

ダウンロード後、Virtual Box にインポートし、インターフェースを「ホストオンリーアダプタ」に変更した後、起動する。

ターゲット起動画面

1.攻略

1) ポートスキャン

何はともあれ、まずは nmap でスキャン。
開いているポートは 80/tcp  と 22/tcp  のみ。

nmap スキャン結果

2)脆弱性探し

80/tcp が開いているので、とりあえずブラウザでアクセスしてみる。 Apacheのテストページだった。ソースを見たが特に怪しい記述は無い。

トップページ

ディレクトリをスキャンしてみる。 /secret というわざとらしい名前のディレクトリが見つかった。

ディレクトリスキャン(その1)

とりあえず /secret にアクセスしてみる。。真っ白だ。

/secret

ついでに robots.txt も見てみよう。挨拶が書いてあるだけだった。

robots.txt

気を取り直して、/secret  以下を更にスキャンしてみると、evil.php という怪しげなファイルが見つかった。

/secret/evil.php

再度、/secret/evil.php にブラウザでアクセスしてみる。
あらら・・・今度もまた真っ白だ。

/secret/evil.php

evil.php はきっと何か引数を取るに違いない。バックドアだったら何かコマンドを実行できるかも。。。こんな時はファジングしてみるに限る。

「ファジング」とは様々なデータを投げてみてシステムの挙動を探る手法である。どんなデータを投げるかであるが、これには SecLists というとても便利な辞書があるので、これを使うことにする。以下のリンクからダウンロード可能だ。

ファジングに使うツールは ffuf が使いやすい。Kali Linux に標準で入っているし、コマンドラインも gobuster とよく似ている。

今回の evil.php の引数を探るには、以下のようなコマンドになる。
-u は ターゲットのURL。FUZZ と書いた部分を -w 以下の辞書で置き換えてひたすらリクエストを投げてくれる。 

ffuf -u http://192.168.56.111/secret/evil.php?FUZZ=id -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt -fs 0

オプションの -fs 0 は レスポンスが0バイトなら表示しない、という意味である。Web API関連の辞書は burp-parameter-names.txt なのでこれを使う。

実行結果は、、何も出なかった。ありゃ~空振りだ。

ファジング結果(その1)

evil.php  引数で指定されたコマンドを実行するのではなく、ファイルを表示するタイプのものかもしれない。気を取り直して、id コマンドを適当なファイル名(/etc/passwd )に変更して再実行してみる。

ffuf -u http://192.168.56.111/secret/evil.php?FUZZ=/etc/passwd -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt -fs 0

ビンゴ! 引数の名前は "command" のようだ。

ファジング結果(その2)

試しに実行してみよう。。想定通り、/etc/passwd が表示された。

evil.php で /etc/passwd を表示

evil.php のソースコードを見てみよう。

Internal Server Error

やはりエラーになった。
php をそのまま Webサーバが読み込んでしまうと、画面には「phpの処理結果」しか返されないので、内容を見ることができない。

php にはラッパーという、ファイルを読み込む際の前処理を指定できる機能があるのでこれを使って base64にエンコードすればうまくいくはず。

方法は簡単。php://filter/convert.base64-encode/resource= というおまじないをファイル名の前に付加する。パイプでつなげてデコードされた形で表示されるようにしてみよう。コマンドは以下の通り。

curl -s  http://192.168.56.111/secret/evil.php?command=php://filter/convert.base64-encode/resource=./evil.php | base64 -d

command で指定されたファイルを include() しているだけのようだ。

evil.php のソースを表示

特に権限が設定されていないファイルは evil.php を使用してなんでも読めるわけだ。/etc/passwd を読めば、どんなユーザーが登録されているか判る。

やってみると、mowree というユーザーが登録されていることが判った。

登録ユーザーを調べる

ユーザー名が判ったので、mowwree のssh秘密鍵が読めないか試してみる。

通常、秘密鍵は他のユーザーから読めるようにはしないが、CTF ではワザと甘いパーミッションになっていることがあるので、試してみる価値がある。ssh の秘密鍵はユーザーの  /home/ユーザー名/.ssh/id_rsa  だ。

ssh の秘密鍵を取得

これをファイルに保存して、ssh でアクセスできるか試してみる。
やはり、秘密鍵のパスフレーズが必要だったようだ。当たり前か。。

秘密鍵のパスフレーズが必要!

ところで、Kali Linux には "John The Ripper" というパスワードクラッカーが入っている。秘密鍵のパスフレーズもこれを使って解析ができる。

まず、ssh2john を使って Johnが読める形式に変換する。

John が読める形にファイル変換

あとは、John にお任せ。辞書には定番の rockyou.txt を使う。
rockyou.txt は Kali Linux で標準に入っていて、解凍すると 50MB もある巨大なパスワード辞書である。

john を起動して待つこと数分。パスフレーズが判明した。

秘密鍵のパスフレーズをJohn でクラック

3) 侵入

これで、堂々と ssh でログインできる。
先ほどクラックしたパスフレーズを使って mowree でログインする。
侵入成功である。

侵入成功

4) root 権限奪取

お次は権限昇格である。
まずは脆弱性を探すため、linpeas.sh をアップロードする。

アップロードの方法は簡単。
最初に攻撃用のマシンで python を使って簡易Webサーバを立てる。

Python で簡易Webサーバ

この状態で、ターゲット側から wget などのコマンドでファイルをダウンロードすれば良い。

攻撃マシンから Linpeas.sh をダウンロード

linpeas.sh を実行して待つこと1~2分。/etc/passwd が書き込み可能なことが検出された。

Linpeas 検出結果

パスワードファイル(/etc/passwd )に書き込みができることが判ったので、このファイルに root 権限のユーザーを追加すれば良い。

まず、適当なパスワードをハッシュ化する。

パスワード abcd をハッシュ化

このパスワードを /etc/passwdに書き込む。vi で直接編集してしまえば良い。loot という エントリを追加し、先ほどのパスワードを書き込む。

パスワードファイルを編集

最後に loot ユーザーに su すれば権限昇格が完了である。

root権限奪取

今日はここまで。めでたし、めでたし。


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