Honeytrap + WOWHoneypot をDockerで構築

#はじめに
これまでに多くのハニーポッターが記事として残していますが、Honeytrapを含めた記事が余りなかったので、せっかくなので記事にしてみました。
これをきっかけにハニーポットに興味を持ってもらえば、嬉しいです。

#注意事項
こちらの環境で動かし、確認しながら構築していますが、作成は自己責任でお願いします。

また、ハニーポットは多少なりともリスクがありますのでしっかりと日々監視を行い、何かあったら止められるように準備しておきましょう。

# 前提
SSHを有効化にした上で作業することをおすすめします。

#構築環境
今回、VPS上で以下のスペックでの動作を確認しています。

OS：Ubuntu 18.04 amd64
メモリ：512MB
SSD：25GB

#Docker および Docker Compose のインストール
DockerおよびDocker Composeをインストールします。
インストールの方法はGoogleで検索すれば、多数出てくると思いますのでお好きな方法でインストールをしてください。
今回は、以下のサイトを参考にしてインストールを行いました。
https://qiita.com/tkyonezu/items/0f6da57eb2d823d2611d

```shell:
$ sudo apt-get update
$ sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    vim \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt-get update
$ sudo apt-get install -y docker-ce 
$ sudo usermod -aG docker ubuntu 
$ curl -L https://github.com/docker/compose/releases/download/1.25.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

```
次にWOWHoneypotおよびHoneytrapのDocker環境を構築します。
今回はホームディレクトリの直下にDockerフォルダを作成し、そこに必要なファイルを作成していきます。
まずは、各ハニーポットのフォルダを作成します。

```shell:
$ mkdir ~/docker 
$ mkdir ~/docker/wowhoneypot
$ mkdir ~/docker/wowhoneypotssl
$ mkdir ~/docker/honeytrap
```
#WOWHoneypotのDocker構築
WOWHoneypotのDocker構築に必要なファイルをダウンロードしていきます。

```shell:
$ git clone https://github.com/morihisa/WOWHoneypot.git ~/docker/wowhoneypot
```
wowhoneypot配下に以下のDockerfileを作成します。
今回は以下のブログを参考にしています。
https://qiita.com/ohhara_shiojiri/items/069b8fc95cad799e86dc

```docker:~/docker/wowhoneypot/Dockerfile
FROM ubuntu:latest
ADD ./ /opt/wowhoneypot
RUN apt-get update \
 && apt-get install -y git python3 \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*
WORKDIR /opt/wowhoneypot/
CMD ["python3", "wowhoneypot.py"]
```
#WOWHoneypot(SSL)のDocker構築
HTTPSに対応したWOWHoneypotの構築をしていきます。
今回は以下をブログを参考にさせて頂きました。
https://graneed.hatenablog.com/entry/2018/06/14/231740

まずは作成したWOWHoneypotの中身をコピーします。

```
cp -r ~/docker/wowhoneypot/* ~/docker/wowhoneypotssl/
```

次にwowhoneypot.pyを編集します。
以下に変更点を乗せておきます。

```
diff -u ~/docker/wowhoneypot/wowhoneypot.py ~/docker/wowhoneypotssl/wowhoneypot.py 

--- /home/ubuntu/docker/wowhoneypot/wowhoneypot.py	2020-01-26 21:28:37.942184258 +0900
+++ /home/ubuntu/docker/wowhoneypotssl/wowhoneypot.py	2020-01-26 21:49:32.186195416 +0900
@@ -17,6 +17,7 @@
 import socket
 import select
 import urllib.parse
+import ssl
 from http.server import HTTPServer, BaseHTTPRequestHandler
 from mrr_checker import parse_mrr
 from datetime import datetime, timedelta, timezone
@@ -43,6 +44,9 @@
 blacklist = {}
 separator = " "
 ipmasking = False
+ssl_enable = False
+certfilepath = ""
+hostport = 80
 
 class WOWHoneypotHTTPServer(HTTPServer):
     def server_bind(self):
@@ -191,8 +195,10 @@
                     hostname = self.headers["host"].split(" ")[0]
                 if hostname.find(":") == -1:
                     hostname = hostname + ":80"
+                    hostname = hostname + ":" + hostport
             else:
                 hostname = "blank:80"
+                hostname = "blank:" + hostport
 
             request_all = self.requestline + "\n" + str(self.headers) + body
             logging_access("[{time}]{s}{clientip}{s}{hostname}{s}\"{requestline}\"{s}{status_code}{s}{match_result}{s}{requestall}\n".format(
@@ -326,6 +332,13 @@
                     ipmasking = True
                 else:
                     ipmasking = False
+            if line.startswith("certfilepath"):
+                global ssl_enable,certfilepath
+                ssl_enable = True
+                certfilepath = line.split('=')[1].strip()
+            if line.startswith("hostport"):
+                global hostport
+                hostport = line.split('=')[1].strip()
 
         global accesslogfile
         accesslogfile = os.path.join(logpath, accesslogfile_name)
@@ -425,11 +438,15 @@
     logging_system("WOWHoneypot(version {0}) start. {1}:{2} at {3}".format(WOWHONEYPOT_VERSION, ip, port, get_time()), False, False)
     logging_system("Hunting: {0}".format(hunt_enable), False, False)
     logging_system("IP Masking: {0}".format(ipmasking), False, False)
+    logging_system("SSL Enable: {0}".format(ssl_enable), False, False)
     myServer = WOWHoneypotHTTPServer((ip, port), WOWHoneypotRequestHandler)
     myServer.timeout = timeout
+    if ssl_enable:
+        myServer.socket = ssl.wrap_socket(myServer.socket, certfile=certfilepath, server_side=True)
     try:
         myServer.serve_forever()
     except KeyboardInterrupt:
         pass
 
     myServer.server_close()
+
```
config.txtを以下のように修正します。

```shell:~docker/wowhoneypotssl/config.txt
# default port: 8080
port=44333

# default server header: Apache
serverheader=Apache

# art directory path
artpath=./art/

# WOWHoneypot logfile path
logpath=./log/

# Access logfile path
accesslog=access_log

# Access log separator
separator=" "

# WOWHoneypot logfile name
wowhoneypotlog=wowhoneypot.log


# Syslog (Output facility: local0(16), priority: info, only tcp protocol)
syslog_enable=False
syslogserver=127.0.0.1
syslogport=514

# Hunting
hunt_enable=False
huntlog=hunting.log

# for GDPR(True: replace source ip address with 0.0.0.0)
ipmasking=False

# SSL certfile path
certfilepath=./server.pem

# default host header port: 80
hostport = 443
```
次に証明書ファイルを作成します。

```shell:
$ openssl req -new -x509 -keyout ~/docker/wowhoneypotssl/server.pem -out ~/docker/wowhoneypotssl/server.pem -days 365 -nodes
```
これで、WOWHoneypot系のDockerの設定は完了です。

# HoneytrapのDocker構築
コンフィグファイルの格納先であるディレクトリを作成します。

```shell:
$ mkdir ~/docker/honeytrap/dist
```
作成したフォルダ内にコンフィグファイルを作成します。

```shell:~/docker/honeytrap/dist/honeytrap.conf
/* 
 * honeytrap 1.0.1 configuration file template -- please adjust
 * (c) Tillmann Werner <tillmann.werner@gmx.de>
 */

// log to this file
logfile		= "/opt/honeytrap/var/log/honeytrap.log"

// store process ID in this file
pidfile		= "/var/run/honeytrap.pid"

/* where to look for default responses
 * these are sent for connections handled in "normal mode" */
response_dir	= "/opt/honeytrap/etc/honeytrap/responses"

// replace rfc1918 IP addresses with attacking IP address
replace_private_ips = "no"

// bind dynamic servers to a specific address
//bind_address = "127.0.0.1"

/* put network interface into promiscuous mode
 * (only availabel when compiled with --with-stream-mon=pcap) */
//promisc = "on"

/* the user and group under which honeytrap should run
 * should be set to non-root */
user	= "honeytrap"
group	= "honeytrap"

// do not read more than 20 MB - used to prevent DoS attacks
read_limit = "20971520"


/* ----- plugin stuff below ----- */

/* where to look for plugins
   needs to be set before loading plugins */
plugin_dir	= "/opt/honeytrap/etc/honeytrap/plugins"


// include a plugin via plugin-[ModuleName] = ""

// plugin-magicPE = ""
plugin-ftpDownload = ""
plugin-tftpDownload = ""
plugin-b64Decode = ""
plugin-deUnicode = ""
plugin-vncDownload = ""


// store attacks on disk
plugin-SaveFile = {
	attacks_dir	= "/opt/honeytrap/var/attacks"
	downloads_dir	= "/opt/honeytrap/var/downloads"
}


// plugin for shellcode detection and emulation
/*
plugin-cpuEmu = {
	execute_shellcode = "no"
	createprocess_cmd = "/bin/sh -c \"cd /opt/honeytrap-libemu/.wine/drive_c/windows/system32; WINEPREFIX='/opt/honeytrap-libemu/.wine/' WINEDEBUG='-all' wine 'c:\\windows\\system32\\cmd_orig.exe'\""
}
*/



// scan downloaded samples with ClamAV engine
/*
plugin-ClamAV = {
	temp_dir	= "/tmp"
	clamdb_path	= "/var/lib/clamav"
}
*/


// calculate locality sensitive hashes
/*
plugin-SpamSum = {
	md5sum_sigfile	= "/opt/honeytrap/md5sum.sigs"
	spamsum_sigfile	= "/opt/honeytrap/spamsum.sigs"
}
*/

plugin-logAttacker = { logfile = "/opt/honeytrap/var/log/attacker.log" }

// log attack details in JSON format
plugin-logJSON = { logfile = "/opt/honeytrap/var/log/attackers.json" }


// store attacks in PostgeSQL database
/*
plugin-SavePostgres = {
	db_host	= "localhost"
	db_name	= "some_db"
	db_user	= "some_user"
	db_pass	= "some_pass"
//	db_port = "some_port"	// defaults to 5432/tcp if not set
}
*/


// invoke an external program (f.e. wget) to download files via http
/*
plugin-httpDownload = {
	http_program = "/usr/bin/wget"
	http_options = "-q -t1 -T1 -O-"
}
*/


// submit downloaded malware samples to the mwcollect alliance
/*
plugin-submitMWserv = {
	mwserv_url      = "https://submission-url/"
	guid            = "your-guid"
	maintainer      = "your-maintainer" 
	secret          = "your-secret"
	timeout		= "120"
}
*/

/* ----- port mode configuration below ----- */

// default port configuration (ignore, normal or mirror)
//   ignore: just ignore connection attempts
//   normal: send a default response
//   mirror: mirror connections back to the initiator (use with caution!)
portconf_default = "normal"

// explicit port configuration
/* portconf = {
	// ignore connection requests on these ports
	ignore = {
		protocol	= "tcp"
		port		= "22" 
	}
}
*/

// include a file
//include = "ports.conf"
```

次に、以下のDockerfileを作成します。

```docker:~/docker/honeytrap/Dockerfile
FROM debian:stretch-slim 
ENV DEBIAN_FRONTEND noninteractive
#
# Include dist
ADD dist/ /root/dist/
#
# Setup apt
RUN apt-get update -y && \
    apt-get dist-upgrade -y && \
#
# Install packages
    apt-get install -y autoconf \
                       build-essential \
                       git \
                       iptables \
                       libcap2 \
                       libcap2-bin \
                       libnetfilter-queue1 \
                       libnetfilter-queue-dev \
                       libjson-c-dev \
                       libtool \
                       libpq5 \
                       libpq-dev \
                       netbase \
                       procps \
                       wget && \
#
# Install honeytrap from source
    cd /root/ && \
    git clone https://github.com/armedpot/honeytrap && \
    cd /root/honeytrap/ && \
    autoreconf -vfi && \
    ./configure \
      --with-stream-mon=nfq \
      --with-logattacker \
      --with-logjson \
      --prefix=/opt/honeytrap && \
    make && \
    make install && \
    make clean && \
#
# Setup user, groups and configs
    addgroup --gid 2000 honeytrap && \
    adduser --system --no-create-home --shell /bin/bash --uid 2000 --disabled-password --disabled-login --gid 2000 honeytrap && \
    mkdir -p /opt/honeytrap/etc/honeytrap/ /opt/honeytrap/var/attacks /opt/honeytrap/var/downloads /opt/honeytrap/var/log && \
#    touch /opt/honeytrap/var/log/honeytrap.log && \
#    chmod -R 755 /opt/honeytrap/ && \
#    chown -R honeytrap:honeytrap /opt/honeytrap/ && \
    mv /root/dist/honeytrap.conf /opt/honeytrap/etc/honeytrap/ && \
    setcap cap_net_admin=+ep /opt/honeytrap/sbin/honeytrap && \
#
# Clean up
    rm -rf /root/* && \
    apt-get purge -y autoconf \
                     build-essential \
                     git \
                     libnetfilter-queue-dev \
                     libpq-dev && \
    apt-get autoremove -y --purge && \
    apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
#
# Start honeytrap
USER root:root
CMD ["/opt/honeytrap/sbin/honeytrap", "-D", "-C", "/opt/honeytrap/etc/honeytrap/honeytrap.conf", "-P", "/tmp/honeytrap/honeytrap.pid", "-t", "5", "-u", "root", "-g", "root"]

```

これでDockerに必要なファイルは作成終了です。

# docker-composeの実行
まずはlogファイルを格納するフォルダを作成します。

```shell:
$ mkdir ~/docker/log
```

次にdocker-compose.ymlを作成します。

```docker:~/docker/docker-compose.yml
version: '2.3'

services:

# Honeytrap service
  honeytrap:
    build: ./honeytrap/
    container_name: honeytrap
    restart: always
    tmpfs:
     - /tmp/honeytrap:uid=2000,gid=2000
    network_mode: "host"
    cap_add:
     - NET_ADMIN
    image: "honeytrap:1.0"
    read_only: true
    volumes:
     - ./log/honeytrap/attacks:/opt/honeytrap/var/attacks
     - ./log/honeytrap/downloads:/opt/honeytrap/var/downloads
     - ./log/honeytrap/log:/opt/honeytrap/var/log
   
  wowhoneypot:
    build: ./wowhoneypot/
    container_name: wowhoneypot
    restart: always
    image: "wowhoneypot:1.0"
    ports:
     - 80:8080
    volumes:
     - ./log/wowhoneypot:/opt/wowhoneypot/log

  wowhoneypotssl:
    build: ./wowhoneypotssl/
    container_name: wowhoneypotssl
    restart: always
    image: "wowhoneypotssl:1.0"
    ports:
     - 443:44333
    volumes:
     - ./log/wowhoneypotssl:/opt/wowhoneypot/log

```

# iptablesの設定
Honeypotに必要なiptableの設定をしていきます。
今回は例としてSSHを22ポートにしていますが、こちらは自分で設定したSSHのポート番号に設定してください。

```shell:iptables
$ sudo iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport  22 -j ACCEPT 
$ sudo iptables -A INPUT -m state --state NEW -m tcp  -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT 
$ sudo iptables -A INPUT -p tcp --syn -m state --state NEW -j NFQUEUE 
```

次にiptablesの設定を保存ため、iptables-persistent をインストールします。

```shell:
$ sudo apt install -y iptables-persistent
```

# Honeypotの起動
最後にDocker用に準備したハニーポットを動かします。
権限を有効にするため、一度 rebootを行います。

```shell:
$ sudo reboot
```
念の為、iptablesの設定が有効であるか確認します。

```shell:
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:https
NFQUEUE    tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN state NEW NFQUEUE num 0
```
iptablesに問題がなければ、Dockerを起動させます。

```shell:
$ cd ~/docker/
$ docker-compose build
$ docker-compose up
```
docker-compose up コマンドで特にエラーがないか確認し、問題がなければ、Ctrl+Cで終了します。
次に各ログが正常に動いているか確認します。
ログに何かしらの書き込みがあれば、正常に動いています。

```shell:
$ less ~/docker/log/honeytrap/log/attackers.json
$ less ~/docker/log/wowhoneypot/access_log
$ less ~/docker/log/wowhoneypotssl/access_log
```

最後に docker-compose をバックグラウンドで実行します。

```shell:
$ docker-compose up -d
```
これにて、ハニーポットの構築完了です。

#補足
死活監視ですが、ハニーポットから以下のサイトを教えてもらいました。ハニーポットはよく落ちたりするので登録しておくと便利です。
https://uptimerobot.com/

以上となります。