はじめに
今回挑戦したのは Bulldog:1 です。boot2root の VM ですが、所々に誘導的な設定やプログラムがあるのでリアリティは低めでした。これも ova ファイルで提供されています。
Bulldog:1
・Type: boot2root
・Level: Beginner
・URL: https://www.vulnhub.com/entry/bulldog-1,211/
詳細
最初にいつも通りなら netdiscover による IP アドレスの特定を行うところですが、この VM はログイン画面で IP アドレスを教えてくれる親切仕様なので必要ありません。nmap による開いているポート (提供されているサービス) やバージョン情報の取得を行います。
nmap オプションの意味:
-p- (ポート範囲。- を指定している場合は 1~65535。)
-n (名前解決をしない。Closed だし。)
-sV (バージョンスキャン。)
-A (OS とそのバージョン。)
Web サービスをホストしているようなのでアクセスしてみますが、特段有益な情報は見当たりません。そのため、dirb コマンドを利用して他にアクセスできるページがないかを確認します。
いくつか気になるパスが見つかっているのが分かります。/dev/shell/ は Web シェルに使えそうなものが置いてあるのかと思い、アクセスしてみたところログインが必要なようです。また、/admin にアクセスしたところ、Django によるログイン画面が表示されます。/admin からログインしたら Web シェル?が使えるようになるのでしょうか。。。
dev にアクセスしてみると、開発中という設定なのかいくつかのメールアドレスと、コメントによるパスワードのハッシュと思われるものが見つかります。
ひとまずこのハッシュ値をクラックするところからスタートでしょうか。john でクラックしてみることにします。rockyou.txt はブルートフォース用のリストです。Kali のデフォルトでは gz 形式で圧縮されているので、事前に解凍しておく必要があります。
(作成したリスト : hashes.txt)
2 つのユーザのハッシュがクラックできました。早速このクレデンシャルを使用して /admin からログインしたところ、無事にログインすることはできました。ただし、どちらのアカウントも何も権限を持っていないユーザのようです。
ただし、先ほど目をつけていた Web シェルはどうでしょうか?
いくつかのコマンドが使用できる Web シェルの画面が表示されました。書かれていないコマンドは使用することができず、; で最初のコマンドを終了させ、次のコマンドを実行する OS コマンドインジェクションを試しましたが、しっかりとガードされているようです。
(指定コマンド以外実行不可)
(; でつなげない。)
しかし、& でつないで実行した場合はどんなコマンドでも実行することができました。これを使えば、wget も chmod もファイル実行もできそうだったので、meterpreter のセッションを作ることにしました。Metasploit 側では web_delivery を使用しています。
(& でつなぐことが可能。)
(wget させるファイル backdoor.sh。web_delivery で指定されたコマンドを記載。)
SimpleHTTPServer でサーバを立ち上げ、、、
これにより Meterpreter セッションを作ることができました。
動きやすいように Shell を起動して後の操作を行います。(実際は shell 起動後に公開鍵認証で SSH 接続用のバックドアを作成してこちら経由で作業しましたが、操作内容は同じなので割愛します。)
有益なファイルを探していたところ、bulldogadmin ユーザのホームディレクトリにアクセスできることを発見しました。また、隠しディレクトリが存在し、これもアクセス可能だったので中身を確認します。
あからさまな名前のプログラムがあります。実行権限はありませんが読み取り権限があるので、いったんコピーした後に実行権限を付与し、実行してみたらどうなるのでしょうか?ファイル名どおり特別な権限がもらえるのでしょうか?
note には Django ユーザアカウントでのみ使用できる旨が書かれています。試しに実行したところパスワードが要求されますが、パスワードを使用してアクセスしていないためパスワードが分かりません。特定のアカウントでのみ実行可能ということは、パスワードがハードコーディングされている可能性が考えられます。このため、プログラム内部の文字列を確認してみたいと思います。
上記選択部分をよく見ると、「H」が末尾なのは共通していますが、それを抜かすと文字列がつながりそうなことが分かります。これがパスワードだとすると、なにか sudo できるやもしれません。
(つなげた文字列)
sudo オプションの意味 :
-l (sudo 可能なコマンドやパスを確認する。)
幸運なことに(?)つなげた文字列がパスワードとして有効なことが判明しました。また、sudo はすべてのコマンドで利用できる事も分かります。こうなれば su を sudo することにより root になれるので、root に権限昇格可能です。次いで、root のホームディレクトリにメッセージが書かれていたので、これを表示させてミッションはクリアです。
まとめ
ワークフロー
[偵察]
- nmap (サービスの調査)
- dirb (Web サービスのディレクトリやファイル調査)
- john (パスワードのクラック)
[侵入]
- OS コマンドインジェクション (& でつなぐ)
- Metasploit (web_delivery)
- meterpreter (reverse_tcp)
[内部探索]
- ユーザが作成したバイナリファイル (strings でハードコーディングされた値)
- 同ファイルの読み取り属性 (読み取り可能=コピー可能)
[権限昇格]
- sudo -l (sudo 可能なコマンドの確認)
- sudo su (root になる)
攻撃のポイント
- dirb によるページの発見
- john によるパスワードのクラック
- & でつないで実行制限をバイパス (OS コマンドインジェクション)
- strings (バイナリファイル内の文字列抽出)
- sudo -l で sudo 可能なファイルを確認
- sudo su で root に昇格
防御のポイント
(もし、この VM を守るなら。パッチ適用以外で。)