解析メモ

マルウェア解析してみたり解析に役に立ちそうと思ったことをメモする場所。このサイトはGoogle Analyticsを利用しています。

VulnHub - Matrix: 1

 

はじめに

お久しぶりです。しばらく Hack the Box に集中していて VulnHub の VM に挑戦出来ていませんでした。Hack the Box では Foram 中心に情報収集するのですが、手持ちの知識が少ないので、基礎力をつけるためにも Writeup が充実している VulnHub に挑戦した格好です。ちなみに VulnHub の方が体感的には難易度は軽めです。今回挑戦したのは Matrix:1 です。boot2root の VMova ファイルで提供されています。

 

Matrix:1

・Type: boot2root
・Level: Intermidiate
・URL: https://www.vulnhub.com/entry/matrix-1,259/

 

詳細

最初に netdiscover による IP アドレスの特定を行います。まぁ、立ち上げている VM 数少ないのですぐに特定できますが。

f:id:k1z3:20181111220046p:plain

 

次いで nmap で開きポートを特定します。インターネット越しで nmap をかける場合は最初に sV や A オプションなどつけずにポートの特定だけ (nmap -n <IPaddr>) をした後に、詳細調査のオプションをつけるのがおすすめです。

f:id:k1z3:20181111220246p:plain

nmap オプションの意味:

-n (名前解決をしない。Closed だし。)

-sV (バージョンスキャン。)

-A (OS とそのバージョン。)

-Pn (Ping で疎通確認しない。)

 

80/tcp と 31337/tcp でWeb サービスをホストしているようです。みたところ同じ内容をホストしているのでしょうか。

f:id:k1z3:20181111220431p:plain

 

トップページのソースコードを確認すると、BASE64 の文字列を見つけることができます。これをデコードすることで意味ありげな文字列を取得することができます。また、ソースコード内では assets ディレクトリで js ファイルをホストしているようなので、assets ディレクトリを覗くとディレクトリリスティング可能なことが分かります。img ディレクトリ内には p0rt_31337.png という名前のファイルがあるので、31337/tcp ポートの方の Web サービスを攻略対象と考えます。

 

f:id:k1z3:20181111220738p:plain

(BASE64 デコード)

 

f:id:k1z3:20181111220847p:plain

f:id:k1z3:20181111220907p:plain

(ディレクトリリスティング)

 

先ほど BASE64 デコードした中の「Cypher.matrix」に着目し、この名前のファイルがないか確認したところ取得することができました。

 

f:id:k1z3:20181111221422p:plain

 

中身は ASCII データの様で、Brainf*ck のコードでした。Brainf*ck のコンパイル環境を用意するのは手間だったので、オンラインでできるサイトがないか探したところ、以下のサイトでできるようです。

 

Online Brainfuck Compiler

https://www.tutorialspoint.com/execute_brainfk_online.php

 

このサイトを使用し、Cypher.matrix から得られたデータをデコードするとアカウント名とパスワードにつながるヒントを取得することができました。

 

f:id:k1z3:20181111221441p:plain

f:id:k1z3:20181111221455p:plain

 

ただし、パスワードは全体の長さや特定のフレーズは分かりますが、2 文字が伏字です。hydra で総当たりすればすぐに解けそうな長さなので、ひとまず候補のリストを crunch を使って作成します。

 

f:id:k1z3:20181111221602p:plain

crunch オプションの意味:

crunch [MIN] [MAX] (options)

-t (テキストを指定して作成。%@のところが生成される。)

-o (出力ファイル)

 

作成したリストを使用し、Hydra で総当たりを試したところ、すぐに見つけることができました。

 

f:id:k1z3:20181111221840p:plain

 

このクレデンシャルを使用して SSH 接続することは可能でした。しかし、rbash による制限がかかっている SHELL で、ls すら打てません。ただ、echo は実行できるようなので、このコマンドを使用してディレクトリ構造を確認します。

 

f:id:k1z3:20181111222033p:plain

f:id:k1z3:20181111222051p:plain

f:id:k1z3:20181111222108p:plain

 

vi が prog ディレクトリにあるので、vi は使用させてくれるようです。vi を使用した rbash の bypass 方法を探したところ、SANS のページに有益な情報がありました。

 

pen-testing.sans.org

 

このページによると、以下のいずれかで bypass できる可能性があるとの事です。

  • :set shell=/bin/bash
  • :shell
  • :! /bin/bash

 どれもうまくいかなかったのですが、一番最後のコマンドでスペースを除いたところ、bash のシェルを得ることができました。

f:id:k1z3:20181111222552p:plain

f:id:k1z3:20181111222611p:plain

2018.11.12 追記

ssh 接続時に -t "bash --noprofile" をつけて接続してデフォルトプロファイルを読み込ませることでも rbash による制限を回避できました。

 

 

パスワードは取得済みなので、sudo の範囲を確認したいと思いましたが、パスが通っていないようです。

 

f:id:k1z3:20181111222819p:plain

 

適当にいくつか実行ファイルがありそうなパスを追加して実行してみます。

 

f:id:k1z3:20181111222940p:plain

sudo オプションの意味 :

-l (sudo 可能なコマンドやパスを確認する。)

 

ログインしている guest アカウントに (ALL) ALL がついています。sudo コマンドで何でも実行できる、ということを意味します。su も sudo で実行することができてしまうので、これを利用すれば root を取得することができます。

 

f:id:k1z3:20181111223117p:plain

 

と、いうことでフラグも取れました。

 

f:id:k1z3:20181111223134p:plain

sudo オプションの意味 :

-l (sudo 可能なコマンドやパスを確認する。)

 

 

まとめ

ワークフロー

[偵察]

  1. nmap (サービスの調査)
  2. ソースコード確認
  3. BASE64 デコード
  4. Crypt.matrix ファイル取得
  5. Brainf*ck コンパイル実行

[侵入]

  1. crunch (パスワードリストファイル作成)
  2. hydra (SSH 辞書攻撃)

[内部探索]

  1. echo (rbash 制限回避ファイル探索)
  2. vi (rbash バイパス)
  3. パスの追加

[権限昇格]

  1. sudo -l (sudo 可能なコマンドの確認)
  2. sudo su (root になる)

 

攻撃のポイント

 

防御のポイント

(もし、この VM を守るなら。パッチ適用以外で。)

  • ソース内のコメントや不要ファイルの Web 配置
  • rbash を過信しない
  • SSH のパスワード認証の無効化
  • sudo 権限範囲の見直し