GCP無料枠で始めるハニーポット入門

# 更新内容

- WOWHoneypot Dockerコンテナを追加(2020/01/15)
- Citrix ADCの脆弱性(CVE-2019-19781)を観測するハニーポットCitrixHoneypotを追加(2020/01/14)

# 背景
なるべく安価で安全にハニーポットをはじめてみる入門メモです。

ハンズオンで実習するイベントを予定しています。

第2回 塩尻セキュリティウィークエンド（SSWE）2019　2日目
https://connpass.com/event/149847/


# 注意事項
ハニーポットは意図してサイバー攻撃を受けて調査する目的の為、場合によっては壊れる事も想定して、いつでも止められる様に準備しましょう。
また様々なマルウェアなどを捕獲する事もありますので、アンチウイルスソフトやサンドボックス環境などで防御策も考慮しておきましょう。

# 動作環境

- パブリッククラウド：Google Cloud Platform(GCP)
- OS:Ubunru Server 18.04 LTS

# GCPの無料枠

Googleのパブリッククラウドサービスを利用します。Googleのアカウント作成とクレジットカードの登録が必要です。
無料枠には「12か月間 $300 分の無料トライアル」と「Always Free」があります。
リソースの利用に上限があり、その範囲ならば「Always Free」として課金されない事になっているようです。
詳細は以下のページを参照してください。

- Google Cloud Platform の無料枠 https://cloud.google.com/free/?hl=ja

今回、ハニーポットで使用するのはGCPの中で仮想マシンサービスを提供する「Compute Engine」になります。
以下の条件ならば「Always Free」になります。

- f1-micro VM インスタンス
- リージョンは北米のいずれか１つ(おすすめは日本に近い北米西海岸のus-west1)
 - オレゴン: us-west1
 - アイオワ: us-central1
 - サウスカロライナ: us-east1
- 30GBのHDD

最初の12ヶ月は$300分利用出来るので上限超えて課金の様子を見てもいいですね。

作成したインスタンスは以下のようになります。
<img width="428" alt="gcp-honeypot-01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35898/66d6d8b3-0cea-27b2-47aa-b4556d33c1d3.png">

# ファイアウォール設定

２箇所のファイアウォール設定が必要になります。

- 「Compute Engine」インスタンスの外側（ブラウザ画面で設定）
- インスタンスのOS側（OSにログインして設定）

両方の設定を適切に設定しないと動作しませんので注意しましょう。

## ufw設定

OS側Ubuntuでファイアウォールのufwを設定します。

```
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install ufw
$ sudo ufw default DENY
$ sudo ufw allow 22/tcp
$ sudo ufw allow 23/tcp
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
$ sudo ufw allow 5000/tcp
$ sudo ufw allow 8080/tcp
$ sudo ufw allow 22022/tcp
$ sudo ufw enable
$ sudo ufw status
```

## インスタンスのファイアウォール設定

ブラウザ画面から設定します。
インスタンス作成時のファイアウォール設定でHTTPとHTTPSを有効にしてあれば、ルールに80番と443番は設定されているので、追加で作成するルールはCowrieハニーポットで使用する23番と5000番、メンテナンス用SSHの22022番になります。
特にメンテナンス用SSHのポート番号の設定を忘れるとSSHサーバー設定でポート番号を変更した後に接続が出来なくなるので注意です。多くの方がこれを１度は失敗していますw

<img width="511" alt="gcp-honeypot-02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35898/f77421d9-1db1-09a6-a92d-ef2c2d2e3f92.png">


# SSHの設定

作成したインスタンスにはSSHにてWebブラウザからもログインが出来ます。別途TeraTermなどのターミナルソフトは不要です。
SSHのハニーポットCowrieを設置するので、SSHの標準ポート番号を変更しておきます。
今回は例として22022番にしてあります。別の番号や接続元IPアドレスの制限なども状況に応じで個々に設定して下さい。

SSHサーバーの設定ファイル修正

```:/etc/ssh/sshd_config
port 22022
```

SSHサーバーの再起動

```
$ sudo systemctl restart ssh
```

接続中のセッションは変更前のポート番号で維持されるので、もう１つ別のターミナル画面を変更したポート番号を指定して開いて動作確認します。
SSH接続の「ブラウザウィンドウでカスタムポートを開く」で変更したポート番号を指定します。

<img width="218" alt="gcp-honeypot-03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35898/e3faf5c7-4166-9a66-19f8-de322ccc3d53.png">
<img width="274" alt="gcp-honeypot-04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35898/614b55ce-8d64-47cf-9230-e1ab2691683e.png">

無事にSSH接続が出来れば成功です。出来ない場合は最初の接続セッションが維持されているので戻って再確認しましょう。

# Cowrie(Telnet/SSH ハニーポット)

IoT機器を狙ったマルウェアが世界中から大量にTelnetやSSHのサービスポートへ侵入を試みてきます。これはIoT機器の多くに組み込みのLinuxが使用されている事にも起因します。
この状況を観察するハニーポットとしてCowrieを使用してみます。

- Cowrie SSH and Telnet Honeypot https://www.cowrie.org/
- GitHub https://github.com/cowrie/cowrie
- Welcome to Cowrie’s documentation! https://cowrie.readthedocs.io/en/latest/index.html

## Cowrie インストール

公式ドキュメント通りにインストールすれば簡単に出来ますが、要点をメモしておきます。

基本的なライブラリ等をインストール

```
$ sudo apt-get install git python-virtualenv libssl-dev libffi-dev build-essential libpython3-dev python3-minimal authbind virtualenv
```

専用のユーザーアカウントcowrieを作成します、

```
$ sudo adduser --disabled-password cowrie
```

作成したcowrieアカウントに切り替えます。

```
$ sudo su - cowrie
```

GitHubからCowrieのコードをチェックアウトします。その後はディレクトリを移動します。

```
$ git clone http://github.com/cowrie/cowrie
$ cd cowrie
```

仮想環境を設定します。

```
$ pwd
/home/cowrie/cowrie
$ virtualenv --python=python3 cowrie-env
$ source cowrie-env/bin/activate
(cowrie-env) $ pip install --upgrade pip
(cowrie-env) $ pip install --upgrade -r requirements.txt
```

## Cowrie環境設定ファイルの修正

設定ファイルの「cowrie.cfg.dist」はアップグレードなどで変更されるので、コピーして別の「cowrie.cfg」を用意します。どちらも起動時に参照されます。

```
$ pwd
/home/cowrie/cowrie
$ cp etc/cowrie.cfg.dist etc/cowrie.cfg
```

標準ではTelnetが無効なので有効「true」にします。また、待受ポート番号を変更する場合も修正します。
Cowrie標準では、SSHが2222番、Telnetが2223番になっています。
これは22番などがroot権限が無いと利用出来ない為で、root権限のないcowrieユーザーでは何らかの方法が必要になります。公式ドキュメントでは例として3つの方法が掲載されています。
ここではufwのNAT機能でポートリダイレクト（ポートフォワーディング）を使用する事にして、ポート番号は修正しません。

```:etc/cowrie.cfg
[ssh]
enabled = true
listen_endpoints = tcp:2222:interface=0.0.0.0

[telnet]
enabled = true
listen_endpoints = tcp:2223:interface=0.0.0.0
```

## Cowrieの起動

```
$ pwd
/home/cowrie/cowrie
$ bin/cowrie start
$ exit
```

## ufw NATポートリダイレクト設定

ufwにCowrieのポート番号を追加します。

```
$ sudo ufw allow 2222/tcp
$ sudo ufw allow 2223/tcp
```

ufw設定ファイルにNAT機能ポートリダイレクト（ポートフォワーディング）のルールを追加します。
「*filter」行より手前に追加します。

```:/etc/ufw/before.rules
*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222
-A PREROUTING -p tcp --dport 23 -j REDIRECT --to-port 2223
COMMIT
```

ufwを再読み込みします。

```
$ sudo ufw reload
```

これでSSHの22番に来たパケットはCowrieの2222番へ転送されます。
ログファイルを確認してみましょう。

```
$ sudo su - cowrie
$ cd cowrie
$ tail -f var/log/cowrie/cowrie.log
```

しばらくするとIotマルウェアの侵入ログが表示されると思います。

## cowrie-logviewer

ログファイルをそのまま読む以外に専用のログビューアで見易く観察する事ができます。
大量のログを観察する時に便利ですが、CPUやメモリやストレージのリソースがより多く要るので、場合によってはクラウドより手元に持って来て解析する事を考慮した方が良いかも知れません。
今回はcowrie-logviewerを同じインスタンスに設定します。

- cowrie-logviewer https://github.com/mindphluxnet/cowrie-logviewer

インストール設定

```
& sudo su - cowrie
$ cd cowrie
$ git clone https://github.com/mindphluxnet/cowrie-logviewer
$ cd cowrie-logviewer
$ source ~/cowrie/cowrie-env/bin/activate
$ pip install -r requirements.txt
$ mkdir maxmind
$ cd maxmind
$ wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
$ gunzip GeoLite2-Country.mmdb.gz
```

スクリプトファイル修正

```:/home/cowrie/cowrie/cowrie-logviewer/cowrie-logviewer.py
log_path = '../var/log/cowrie/'
dl_path = '../var/lib/cowrie/downloads/'
```

ログビューアの起動

```
$ python cowrie-logviewer.py &
```

サービスポートの5000番で起動するので、インスタンスのグローバルIPアドレスで5000番を指定してブラウザで確認してみましょう。

<img width="589" alt="gcp-honeypot-05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35898/c0dd0fc3-a3e2-14b8-8990-ffad392d0f02.png">


# WOWHoneypot(HTTPハニーポット)

WebサーバーのHTTPサービスに来るサイバー攻撃を観察するハニーポットで、WOWHoneypotを使用します。

- GitHub https://github.com/morihisa/WOWHoneypot

## ufw NATポートリダイレクト設定

サービスポート8080番でWOWHoneypotは起動しますので、Cowrieと同様にufwのNAT機能でポートリダイレクト（ポートフォワーディング）を使用する事にして、ポート番号は修正しません。
ファイアウォール設定については、HTTPの80番やHTTPSの443番は、ここまでの記載途中で既に設定済みです。

ufw設定ファイルにNAT機能ポートリダイレクト（ポートフォワーディング）のルールを追加します。

```:/etc/ufw/before.rules
-A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
```

ufwを再読み込みします。

```
$ sudo ufw reload
```

これでHTTPの80番に来たパケットはWOWHoneypotの8080番へ転送されます。

## WOWHoneypotインストール

専用のユーザーアカウントwowを作成します、

```
$ sudo adduser --disabled-password wow
```

作成したwowアカウントに切り替えます。

```
$ sudo su - wow
```

GitHubからWOWHoneypotのコードをチェックアウトします。その後はディレクトリを移動します。

```
$ git clone https://github.com/morihisa/WOWHoneypot.git wowhoneypot
$ cd wowhoneypot
```

起動します。

```
$ python3 wowhoneypot.py &
```

## WOWHoneypot Dockerコンテナ

ローカル実行ではなく、Dockerコンテナで実行する場合

GitHubからWOWHoneypotのコードを落としてきます。その後はディレクトリを移動します。

```
$ git clone https://github.com/morihisa/WOWHoneypot.git wowhoneypot
$ cd wowhoneypot
```

以下のように「Dockerfile」を作成します。

```:Dockerfile
FROM python:3
RUN mkdir /wowhoneypot
RUN mkdir /wowhoneypot/art
RUN mkdir /wowhoneypot/log
COPY ./. /wowhoneypot
WORKDIR /WOWHoneypot
CMD [ "python", "./wowhoneypot.py"]
```

Dockerイメージの作成

```:
$ docker build -t wowhoneypot .
```

Dockerコンテナの実行

```
$ docker run -d -p 8080:8080 -v /[ローカルPATH]/wowhoneypot:/WOWHoneypot -w /WOWHoneypot --name wowhoneypot wowhoneypot
```

Docker Volumeオプションでローカルディレクトリにマウントしているので、ログはローカル側に共有されて参照が可能です。


## ログファイルを確認してみましょう。

```
$ tail -f log/access_log
```

Cowrieよりは少ないですが、しばらくするとマルウェアの侵入ログが表示されると思います。

Web脆弱性診断ツールのOWASP ZAPを使用して、どんなログが表示されるかテストしても良いでしょう。
ただしくれぐれもインスタンスのグローバルIPアドレスを間違えないように注意しましょう。
管轄外の所へ行うと場合によってはサイバー攻撃として責任を問われます。

# CitrixHoneypot

Citrix ADCの脆弱性(CVE-2019-19781)を観測するハニーポットCitrixHoneypotを植えてみました。

- GitHub https://github.com/MalwareTech/CitrixHoneypot


## CitrixHoneypotインストール

GitHubからCitrixHoneypotのコードを落としてきます。

```:
$ git clone https://github.com/MalwareTech/CitrixHoneypot.git CitrixHoneypot
```

ディレクトリを移動して「logs」「ssl」のディレクトリを作成します。

```:
$ cd CitrixHoneypot
$ mkdir logs ssl
```

SSLの自己証明書を作成します。

```:
$ openssl req -newkey rsa:2048 -nodes -keyout ssl/key.pem -x509 -days 365 -out ssl/cert.pem
```

CitrixHoneypotを実行します。

```:
$ python3 CitrixHoneypot.py
```

## CitrixHoneypot Dockerコンテナ

ローカル実行ではなく、Dockerコンテナで実行する場合
GitHubから落としてきてSSLの自己証明書を作成するまでは同様に行います。
ビルドに必要な「Dockerfile」は含まれています。以下が続きになります。

Dockerイメージの作成

```:
$ docker build -t citrixhoneypot .
```

Dockerコンテナの実行

```
$ docker run -d -p 443:443 -v /[ローカルPATH]/CitrixHoneypot:/CitrixHoneypot -w /CitrixHoneypot --name citrixhoneypot citrixhoneypot
```

Docker Volumeオプションでローカルディレクトリにマウントしているので、ログはローカル側に共有されて参照が可能です。

## ログファイルを確認してみましょう。

```
$ tail -f logs/server.log
```