はじめに
お久しぶりです。しばらく Hack the Box に集中していて VulnHub の VM に挑戦出来ていませんでした。Hack the Box では Foram 中心に情報収集するのですが、手持ちの知識が少ないので、基礎力をつけるためにも Writeup が充実している VulnHub に挑戦した格好です。ちなみに VulnHub の方が体感的には難易度は軽めです。今回挑戦したのは Matrix:1 です。boot2root の VM で ova ファイルで提供されています。
Matrix:1
・Type: boot2root
・Level: Intermidiate
・URL: https://www.vulnhub.com/entry/matrix-1,259/
詳細
最初に netdiscover による IP アドレスの特定を行います。まぁ、立ち上げている VM 数少ないのですぐに特定できますが。
次いで nmap で開きポートを特定します。インターネット越しで nmap をかける場合は最初に sV や A オプションなどつけずにポートの特定だけ (nmap -n <IPaddr>) をした後に、詳細調査のオプションをつけるのがおすすめです。
nmap オプションの意味:
-n (名前解決をしない。Closed だし。)
-sV (バージョンスキャン。)
-A (OS とそのバージョン。)
-Pn (Ping で疎通確認しない。)
80/tcp と 31337/tcp でWeb サービスをホストしているようです。みたところ同じ内容をホストしているのでしょうか。
トップページのソースコードを確認すると、BASE64 の文字列を見つけることができます。これをデコードすることで意味ありげな文字列を取得することができます。また、ソースコード内では assets ディレクトリで js ファイルをホストしているようなので、assets ディレクトリを覗くとディレクトリリスティング可能なことが分かります。img ディレクトリ内には p0rt_31337.png という名前のファイルがあるので、31337/tcp ポートの方の Web サービスを攻略対象と考えます。
(BASE64 デコード)
先ほど BASE64 デコードした中の「Cypher.matrix」に着目し、この名前のファイルがないか確認したところ取得することができました。
中身は ASCII データの様で、Brainf*ck のコードでした。Brainf*ck のコンパイル環境を用意するのは手間だったので、オンラインでできるサイトがないか探したところ、以下のサイトでできるようです。
Online Brainfuck Compiler
https://www.tutorialspoint.com/execute_brainfk_online.php
このサイトを使用し、Cypher.matrix から得られたデータをデコードするとアカウント名とパスワードにつながるヒントを取得することができました。
ただし、パスワードは全体の長さや特定のフレーズは分かりますが、2 文字が伏字です。hydra で総当たりすればすぐに解けそうな長さなので、ひとまず候補のリストを crunch を使って作成します。
crunch オプションの意味:
crunch [MIN] [MAX] (options)
-t (テキストを指定して作成。%@のところが生成される。)
-o (出力ファイル)
作成したリストを使用し、Hydra で総当たりを試したところ、すぐに見つけることができました。
このクレデンシャルを使用して SSH 接続することは可能でした。しかし、rbash による制限がかかっている SHELL で、ls すら打てません。ただ、echo は実行できるようなので、このコマンドを使用してディレクトリ構造を確認します。
vi が prog ディレクトリにあるので、vi は使用させてくれるようです。vi を使用した rbash の bypass 方法を探したところ、SANS のページに有益な情報がありました。
このページによると、以下のいずれかで bypass できる可能性があるとの事です。
どれもうまくいかなかったのですが、一番最後のコマンドでスペースを除いたところ、bash のシェルを得ることができました。
2018.11.12 追記
ssh 接続時に -t "bash --noprofile" をつけて接続してデフォルトプロファイルを読み込ませることでも rbash による制限を回避できました。
パスワードは取得済みなので、sudo の範囲を確認したいと思いましたが、パスが通っていないようです。
適当にいくつか実行ファイルがありそうなパスを追加して実行してみます。
sudo オプションの意味 :
-l (sudo 可能なコマンドやパスを確認する。)
ログインしている guest アカウントに (ALL) ALL がついています。sudo コマンドで何でも実行できる、ということを意味します。su も sudo で実行することができてしまうので、これを利用すれば root を取得することができます。
と、いうことでフラグも取れました。
sudo オプションの意味 :
-l (sudo 可能なコマンドやパスを確認する。)
まとめ
ワークフロー
[偵察]
[侵入]
[内部探索]
- echo (rbash 制限回避ファイル探索)
- vi (rbash バイパス)
- パスの追加
[権限昇格]
- sudo -l (sudo 可能なコマンドの確認)
- sudo su (root になる)
攻撃のポイント
- ソースコード内の BASE64 文字列の発見
- そこからのファイル取得と Brainf*ck コンパイル
- crunch & hydra による SSH 辞書攻撃
- echo/vi による rbash バイパス
- sudo の権限範囲
防御のポイント
(もし、この VM を守るなら。パッチ適用以外で。)
- ソース内のコメントや不要ファイルの Web 配置
- rbash を過信しない
- SSH のパスワード認証の無効化
- sudo 権限範囲の見直し