Modern Honey Network(MHN)を使って、Cowrieをインストールする

Modern Honey Network(MHN)というデプロイツールを使って、Cowrieをインストールするための手順です。(総関西サイバーセキュリティLT大会(第4回)LTで紹介したツールです。 )
手順通りにインストールしたけどサービスが起動しないとか、デプロイ用のスクリプトがメンテナンスされていないとか問題は多々あるのでオススメはしないですが、備忘録として残しておきます。

Modern Honey Networkとは


ハニーポットの構築やデータ収集を簡単に行うためのツールです。SplunkやELK(Elasticsearch,Logstash,Kibana)と連携が可能で、インストール用のスクリプトも用意されています(自分は試していませんが)。詳細はスライドやGitHub Pagesなどを参照。

インストール用のスクリプトが準備されているハニーポットは下記の通りです。対応しているOSは殆どがUbuntuですが、一部でRaspberry Piも対応しています。詳細は、mhn/scripts at master · threatstream/mhn · GitHubを参照。

  • Wordpot : A WordPress Honeypot
  • p0f : a passive TCP/IP stack fingerprinting tool
  • Shockpot : WebApp Honeypot for detecting Shell Shock exploit attempts
  • Cowrie : Cowrie SSH Honeypot (based on kippo)
  • Suricata : Open Source IDS / IPS / NSM engine
  • Dionaea : A Malware Capturing Honeypot
  • Kippo : Medium interaction SSH honeypot
  • Conpot : ICS/SCADA honeypot
  • Glastopf : Web Application Honeypot
  • ElasticHoney : A Simple Elasticsearch Honeypot
  • Amun : vulnerability emulation honeypot
  • Snort : Network Intrusion Detection & Prevention System

Modern Honey Networkの構成


Sensorsサーバ(ハニーポット)で収集した情報がMHNサーバーに集められ、ユーザーはWEBブラウザなどから収集したデータを確認することが出来ます。

architecture via https://threatstream.github.io/mhn/images/architecture.png

MHNはいくつかのOSSから構成されています。
- threatstream/hpfeeds: Honeynet Project generic authenticated datafeed protocol
- threatstream/mnemosyne: Normalizer for honeypot data.
- threatstream/honeymap: Real-time websocket stream of GPS events on a fancy SVG world map

Modern Honey Networkのシステム要件(ハードウェア)


MHN Server
- 4GB RAM
- dual core processor
- 40 GB drive.

Honeypots
- 512MB-1GB RAM - dual core CPU - 20GB drive. <-- could get away with less if you rolled logs aggressively.

via Hardware Recommendations · threatstream/mhn Wiki · GitHub

MHNサーバーにSplunkやELK(Elasticsearch,Logstash,Kibana)をインストールする場合は要件通り4GBのRAMを用意した方が良さそうですが、自分は512MBで動かしました(Splunk,ELKはインストールしていません)。

Modern Honey Networkのシステム要件(OS)


INSTALLING SERVER (tested Ubuntu 12.0.4.3 x86_64 and Centos 6.7) The MHN server is supported on Ubuntu 12, Ubuntu 14, and Centos 6.7. Ubuntu 16 is not supported at this time. Other flavors/versions of Linux may work, but are generally not tested or supported.

via threatstream/mhn: Modern Honey Network

Ubuntu 16はサポートしないと書いていますが、気にせずUbuntu 16を使います。

全体のシステム構成


2017082604-1

DigitalOceanに2台のサーバー(MHNサーバー、Sensorsサーバー)を作成します。

Modern Honey Networkのインストール


下記のREADMEやPDFを見れば簡単にインストール出来るのですが、冒頭に書いた通りトラブルシューティングが幾つか必要になります。
- mhn/README.md at master · threatstream/mhn · GitHub
- Exercise 1: Deploy and Configure Modern Honey Network

MHNサーバーとして、下記の要件でDropletを1台作成します。

Choose an image Choose a size Choose a datacenter region
Ubuntu 16.04.3 x64 $5/mo (512MB/1CPU, 20GB SSD disk, 1000GB transfer) New York 3

サーバーが作成出来たら、ログインして最新のパッケージに更新します。

# apt-get update && apt-get upgrade -y

タイムゾーンを日本に変更します。

# date
Sat Aug 26 04:22:40 UTC 2017
# cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# date
Sat Aug 26 13:22:59 JST 2017

MHNのパッケージをダウンロードします。

# cd /opt/
# git --version
git version 2.7.4
# git clone https://github.com/threatstream/mhn.git
Cloning into 'mhn'...
remote: Counting objects: 6357, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 6357 (delta 5), reused 11 (delta 5), pack-reused 6345
Receiving objects: 100% (6357/6357), 3.47 MiB | 0 bytes/s, done.
Resolving deltas: 100% (3277/3277), done.
Checking connectivity... done.
# cd /opt/mhn/
# ls
flags-LICENSE.txt  LICENSE    scripts  Vagrantfile
install.sh         README.md  server   Vagrantfile.multiple-platforms

インストール用のスクリプトを実行します。適宜、情報を入力します。

# ./install.sh
+++ readlink -f ./install.sh
++ dirname /opt/mhn/install.sh
+ MHN_HOME=/opt/mhn
+ WWW_OWNER=www-data
+ SCRIPTS=/opt/mhn/scripts/

(略)

+ python generateconfig.py
Do you wish to run in Debug mode?: y/n n
Superuser email: xxx@xxx.com
Superuser password:xxxxx
Superuser password: (again):xxxxx
Server base url ["http://104.236.55.125"]:<Enter>
Honeymap url [":3000"]:<Enter>
Mail server address ["localhost"]:<Enter>
Mail server port [25]:<Enter>
Use TLS for email?: y/n n
Use SSL for email?: y/n n
Mail server username [""]:<Enter>
Mail server password [""]:<Enter>
Mail default sender [""]:<Enter>
Path for log file ["/var/log/mhn/mhn.log"]:<Enter>

(略)

+ echo -n 'Would you like to install ELK? (y/n) '
Would you like to install ELK? (y/n) + read ELK
n
+ '[' n == y -o n == Y ']'
+ '[' n == n -o n == N ']'
+ echo 'Skipping ELK installation'
Skipping ELK installation
+ echo 'The ELK installationg can be completed at a later time by running this:'
The ELK installationg can be completed at a later time by running this:
+ echo '    cd /opt/mhn/scripts/'
    cd /opt/mhn/scripts/
+ echo '    sudo ./install_elk.sh'
    sudo ./install_elk.sh
+ break
+ chown www-data /var/log/mhn/mhn.log
+ supervisorctl restart mhn-celery-worker
mhn-celery-worker: ERROR (not running)
mhn-celery-worker: started
++ date
+ echo '[Sat Aug 26 13:52:43 JST 2017] Completed Installation of all MHN packages'
[Sat Aug 26 13:52:43 JST 2017] Completed Installation of all MHN packages

各サービスの起動状態を確認します。

# systemctl status nginx
 nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2017-08-26 13:48:25 JST; 5min ago
  Process: 1335 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (c
  Process: 1346 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 1343 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0 Main PID: 1351 (nginx)
    Tasks: 2
   Memory: 3.7M
      CPU: 38ms
   CGroup: /system.slice/nginx.service
           ├─1351 nginx: master process /usr/sbin/nginx -g daemon on; master_process on
           └─1359 nginx: worker process

Aug 26 13:48:25 ubuntu-512mb-nyc3-01 systemd[1]: Starting A high performance web server and a reverse prox
Aug 26 13:48:25 ubuntu-512mb-nyc3-01 systemd[1]: nginx.service: Failed to read PID from file /run/nginx.p
iAug 26 13:48:25 ubuntu-512mb-nyc3-01 systemd[1]: Started A high performance web server and a reverse proxy

hpfeeds-brokerが起動に失敗していることがわかります。

# supervisorctl status
geoloc                           RUNNING   pid 31768, uptime 0:17:10
honeymap                         RUNNING   pid 31769, uptime 0:17:10
hpfeeds-broker                   FATAL     Exited too quickly (process log may have details)
mhn-celery-beat                  RUNNING   pid 1315, uptime 0:06:13
mhn-celery-worker                RUNNING   pid 1416, uptime 0:02:04
mhn-collector                    RUNNING   pid 1318, uptime 0:06:13
mhn-uwsgi                        RUNNING   pid 1325, uptime 0:06:12
mnemosyne                        RUNNING   pid 30592, uptime 0:17:43

hpfeeds-brokerを起動してみます(失敗します)。

# supervisorctl start hpfeeds-broker
hpfeeds-broker: ERROR (spawn error)

hpfeeds-brokerのエラーログを確認します。

# tail /var/log/mhn/hpfeeds-broker.err
Traceback (most recent call last):
  File "/opt/hpfeeds/broker/feedbroker.py", line 13, in <module>
    from evnet import loop, unloop, listenplain, EventGen
  File "/opt/hpfeeds/env/src/evnet/evnet/__init__.py", line 11, in <module>
    from OpenSSL import SSL
  File "/opt/hpfeeds/env/local/lib/python2.7/site-packages/OpenSSL/__init__.py", line 8, in <module>
    from OpenSSL import rand, crypto, SSL
  File "/opt/hpfeeds/env/local/lib/python2.7/site-packages/OpenSSL/SSL.py", line 105, in <module>
    SSL_ST_INIT = _lib.SSL_ST_INIT
AttributeError: 'module' object has no attribute 'SSL_ST_INIT'

対応手順はinstall MHN server eeror #433に記載されていました。

# /opt/hpfeeds/env/bin/python -m pip install --upgrade pyopenssl
Collecting pyopenssl
  Downloading pyOpenSSL-17.2.0-py2.py3-none-any.whl (52kB)
    100% |████████████████████████████████| 61kB 2.8MB/s
Requirement already up-to-date: six>=1.5.2 in /opt/hpfeeds/env/lib/python2.7/site-packages (from pyopenssl)
Requirement already up-to-date: cryptography>=1.9 in /opt/hpfeeds/env/lib/python2.7/site-packages (from pyopenssl)
Requirement already up-to-date: ipaddress in /opt/hpfeeds/env/lib/python2.7/site-packages (from cryptography>=1.9->pyopenssl)
Requirement already up-to-date: idna>=2.1 in /opt/hpfeeds/env/lib/python2.7/site-packages (from cryptography>=1.9->pyopenssl)
Requirement already up-to-date: asn1crypto>=0.21.0 in /opt/hpfeeds/env/lib/python2.7/site-packages (from cryptography>=1.9->pyopenssl)
Requirement already up-to-date: enum34 in /opt/hpfeeds/env/lib/python2.7/site-packages (from cryptography>=1.9->pyopenssl)
Requirement already up-to-date: cffi>=1.7 in /opt/hpfeeds/env/lib/python2.7/site-packages (from cryptography>=1.9->pyopenssl)
Requirement already up-to-date: pycparser in /opt/hpfeeds/env/lib/python2.7/site-packages (from cffi>=1.7->cryptography>=1.9->pyopenssl)
Installing collected packages: pyopenssl
  Found existing installation: pyOpenSSL 0.14
    Uninstalling pyOpenSSL-0.14:
      Successfully uninstalled pyOpenSSL-0.14
Successfully installed pyopenssl-17.2.0

サービスを再起動します。

# supervisorctl restart all
honeymap: stopped
geoloc: stopped
mhn-collector: stopped
mnemosyne: stopped
mhn-celery-beat: stopped
mhn-uwsgi: stopped
mhn-celery-worker: stopped
mhn-celery-beat: started
honeymap: started
mnemosyne: started
geoloc: started
mhn-uwsgi: started
mhn-celery-worker: started
mhn-collector: started
hpfeeds-broker: started

hpfeeds-brokerが正常に起動していることが確認できました。

# supervisorctl status
geoloc                           RUNNING   pid 1477, uptime 0:00:39
honeymap                         RUNNING   pid 1475, uptime 0:00:39
hpfeeds-broker                   RUNNING   pid 1483, uptime 0:00:39
mhn-celery-beat                  RUNNING   pid 1474, uptime 0:00:39
mhn-celery-worker                RUNNING   pid 1481, uptime 0:00:39
mhn-collector                    RUNNING   pid 1482, uptime 0:00:39
mhn-uwsgi                        RUNNING   pid 1480, uptime 0:00:39
mnemosyne                        RUNNING   pid 1476, uptime 0:00:39

今回はエラーが出ていませんでしたが、mhn-celery-workerのサービスが停止している場合は下記の対応で解消されるかもしれません。ログローテーションしてmhn.logが新規作成されてしまうと意味がないので、根本的な対応策ではありませんが。。。。

cd /var/log/mhn/ sudo chown www-data mhn.log sudo supervisorctl start mhn-celery-worker

via MHN Troubleshooting Guide · threatstream/mhn Wiki · GitHub

Cowrieのインストール


下記の要件でDropletを1台作成します。

Choose an image Choose a size Choose a datacenter region
Ubuntu 16.04.3 x64 $5/mo (512MB/1CPU, 20GB SSD disk, 1000GB transfer) Singapore 1

MHNサーバーと同様に、パッケージの最新化とタイムゾーンの設定を行います。

http://<MHNサーバーのIPアドレス>/ui/login/にWEBブラウザで接続するとログイン画面が表示されます。Email,Passwordを入力してLOGINをクリックします。

2017082601

Attack Stats画面が表示されます。Deployをクリックします。

2017082602

Deploy画面が表示されます。Select Scriptで、Ubuntu - cowrieを選択します。

2017082603

Deploy Commandが発行されるので、ハニーポットをインストールしたいサーバー上で下記のコマンドを実行します。すると、Cowrieのインストールが始まるはずですが失敗します(なので、実行しないでください)。

wget "http://104.236.55.125/api/script/?text=true&script_id=14" -O deploy.sh && sudo bash deploy.sh http://104.236.55.125 dGjIQLRc

Scriptを修正します。
Cowrieのインストールに失敗してしまうのは、Cowrieの起動停止手順の変更スクリプトに反映されていないことが原因です。
Deploy画面にてSelect ScriptからUbuntu - cowrieを選択した後、Scriptに記載されているコマンドを全て削除します。そのあと、mhn/deploy_cowrie.sh at master · SmUrF3R5/mhnに記載されている内容をScriptにコピペしてUPDATEをクリックします。

ハニーポットをインストールしたいサーバー上で下記のコマンドを実行します。(最初に発行されたDeploy Commandと同じコマンドになります。)

wget "http://104.236.55.125/api/script/?text=true&script_id=14" -O deploy.sh && sudo bash deploy.sh http://104.236.55.125 dGjIQLRc

MHNサーバーで取得できる情報


Cowrieのインストールが完了して、MHNサーバーとSensorsサーバーが正常に通信出来ていれば、下記の情報が確認できます。

  • http://<MHNサーバーのIPアドレス>/ui/sensors/に接続すると、登録されているSensorsサーバーの一覧が表示されます。

2017082605

  • http://<MHNサーバーのIPアドレス>/ui/attacks/に接続すると、攻撃者の情報(国、IPアドレス)、攻撃されたポートなどの情報が一覧で表示されます。

2017082606

  • http://<MHNサーバーのIPアドレス>/ui/dashboard/に接続すると、過去24時間の間に攻撃された数の総数や攻撃元IPアドレスのTop5などが一覧で表示されます。

2017082607

  • http://<MHNサーバーのIPアドレス>/ui/chartに接続すると、SSHログインで試行されたユーザー名やパスワードが表示されます(SensorsサーバーにKippo,Cowrieを使用している場合のみ)。

2017082608

今回の設定の場合、CowrieにSSHログインした攻撃者のコマンドログを見たい時は従来通り、Cowrieにログインする必要があります。scriptを見れば分かりますが、OSにログインしたい場合は22ではなく2222でSensorsサーバーへログインします。

links

social