解析メモ

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

Vulnhub - Lampião: 1 Walkthrough

  

はじめに

最近は Vulnhub で追加された VM を利用してペンテストの練習を行っています。週末に取り組んだのは以下の VM です。この VM に対して外部のマシン (Kali) からスキャンや攻撃を行い侵入して、最終的に Flag を取れれば OK です。
※ IP address は DHCP が期待されているので、前回投稿の「VirtualBox の「内部ネットワーク」で DHCP サーバを使う」を使って IP address を割り当てています。

Lampião: 1
・Type: CTF Challenge
・Level: Easy
・URL: https://www.vulnhub.com/entry/lampiao-1,249/

 

詳細

まずは立ち上げた VM の IP アドレスを特定しない事には始まりません。Kali に入っている netdiscover コマンドでは、特定レンジで生きている IP address をサクッと検索することができます。arp-scan で見れる結果とほぼ一緒ですが、この Vulunhub 界隈では netdiscover がよく使われているのでこれを使っています。

f:id:k1z3:20180809010636p:plain
オプションの意味:
-r (IP address レンジの指定。指定しないと 192.168.0.0/16 になる。)

 

IP address が特定できました。ちなみに .254 は内部ネットワークの DHCP サーバですね。特定した IP address でどんなサービスポートが開いているか nmap で確認します。nmap はポート範囲を指定しないと 1~1024 と nmap-services に記述されたポートしかチェックしないので、念のため全ポートをチェックするようにしています。

f:id:k1z3:20180809010711p:plain
オプションの意味:
-sV (バージョンスキャン。)
-p- (ポート範囲。- を指定している場合は 1~65535。)
-A (細かいバージョンも確認する。)
-n (名前解決をしない。Closed だし。)

 

SSH (22), HTTP (80), Drupal (1898) が開いているのが分かりました。ブラウザで 80 ポートにアクセスしても有意な画面は表示されないので Drupal の方をターゲットにしたいと思います。こちらはブラウザでアクセスするとブログが表示されました。クエリの値を変化させると違う記事が表示されたり、そこに書いてあるファイルにアクセスできたりしますがあまり有益な情報は得られませんでした。リンクされていないフォルダやファイルがあることを考慮して dirb で確認します。

f:id:k1z3:20180809010930p:plain

 

いくつかのフォルダが見つかりました。これらはディレクトリリスティングが可能な様ですね。また、robots.txt がある事も分かったので、中身を見てみます。

f:id:k1z3:20180809011003p:plain

 

CHANGELOG.txt がある事が分かるので、この中身を見てみると Drupal のバージョンが書かれていました。

 f:id:k1z3:20180809011135p:plain

 

今年 4 月に話題になった Drupal の RCE 脆弱性 (CVE-2018-7600, いわゆる Drupalgeddon2) は v7.58 未満が対象なので、この脆弱性が利用できそうです。多分 Kali の Metasploit の DB を更新すれば Exploit が追加されてそうですが、手っ取り早くやりたかったので PoC を探しました。

 

GitHub - FireFart/CVE-2018-7600: CVE-2018-7600 - Drupal 7.x RCE

 

HOST の値を設定後、name[#markup] の値が実行される値っぽいのでこれを変えてみて内部を探索します。が、いちいちファイルを書き換えて実行するのはちょっと手間なので、Meterpreter につないで shell から実行させたいと思いました。PHP が使えるサーバナノは確定しているので exploit/multi/script/web_delivery を TARGET=1 (PHP) で実行し、接続待機します。相手側に実行させるコマンドも表示されるので親切ですね。

PoC のコマンド部分 (name[#markup] の値) を上述のコマンドに変更して実行。Meterpreter セッションが確立します。実行ユーザは www-data です。shell で内部を探索したいところですが bash が効いていないので python を使って起動させます。

f:id:k1z3:20180809011255p:plain
(msfconsole による web_delivery )

f:id:k1z3:20180809011321p:plain

(Exploit コード修正)

f:id:k1z3:20180809011347p:plain

(meterpreter 確立)

f:id:k1z3:20180809011416p:plain

(shell で bash 起動、ちなみに " と ' を逆に記述すると動きません。)

 

/etc/passwd や /home を見ると tiago ユーザが見つかります。今は www-data なので、このユーザか root に権限昇格したい。そのために SUID が不適切に設定されたファイルがないか探してみます。が、有意なファイルは見当たりません。

f:id:k1z3:20180809011450p:plain

 

実行している OS やカーネルのバージョンはどうでしょうか?Meterpreter に戻って sysinfo を実行すると Ubuntu 14.04 ということが分かります。このバージョンの Ubuntuカーネルは v3.13 なので、Dirty COW (CVE-2016-5195) が刺されば root が取れそうです。

 

[参考] Ubuntu のバージョンと Kernel のバージョン対応表 

Ubuntu version history - Wikipedia

 

Exploit-DB で PoC を探してみていくつか試してみて、次の PoC がうまいこと刺さりました。

 

Linux Kernel 2.6.22 < 3.9 - 'Dirty COW /proc/self/mem' Race Condition Privilege Escalation (/etc/passwd Method)

 

 shell から PoC の C++ コードを DL させ、コンパイルし実行してみます。コンパイルのためのコマンドは PoC の説明文に書いてありました。親切ですね。(コンパイル済みのものを送り込んでもうまく動きました。)

f:id:k1z3:20180809012811p:plain

 

DirtyCOW が刺さり、root のパスワードを変更できたようです。su して /root を確認したところ flag.txt の内容を無事確認することができました。

f:id:k1z3:20180809012024p:plain

 

まとめ

ワークフロー

[偵察]

  1. netdiscover (IP アドレスの調査)
  2. nmap (サービスの調査)
  3. dirb (Web サービスのディレクトリやファイル調査)

[侵入]

  1. Drupal の Exploit PoC (CVE-2018-7600)
  2. msfconsole (exploit/multi/script/web_delivery)

[内部探索]

  1. python -c "import pty; pty.spawn('/bin/bash')" (shell で bash 使う)
  2. find / -user root -perm -4000 -print 2>/dev/null (SUID が使えそうなファイル調査)
  3. meterpreter (sysinfo, バージョン確認)

[権限昇格]

  1. Dirty COW の PoC (CVE-2016-5195)

 

攻撃のポイント

  • 1898 ポート = Drupal
  • robots.txt
  • CVE-2018-7600 (Drupal < v7.58, v8.x < v8.3.9 8, v8.4.x < v8.4.6, v8.5.x < v8.5.1)
  • CVE-2016-5195 (Linux Kernel 2.6.22 < 3.9)

 

防御するなら

(バージョンアップやパッチ以外の現実的な方法)

  • CVE-2018-7600 に対する WAF 定義
  • 不要なファイルを web に置かない
  • robots.txt 記載内容の整理