Docker版ZabbixでSYNフラッディングを監視する

## この記事は

↓の記事へのリスペクト記事です

[DDoS攻撃を受けてWebサービスがダウンしていく様子を『Zabbix』で監視してみました](https://qiita.com/nk9bb8/items/a129ab1ccebf95091361)

Dockerネットワーク内でWEBサーバーへ負荷をかけて
その様子をZabbixで監視します

[前の記事](https://qiita.com/t13801206/items/8aa3ab8f5fd53cb2c35a)でzabbixエージェントをつくったので
その延長でさらにエージェントを追加し、そいつにはWEBサーバーを役を担わせます

### 注意

:::note warn
一般のサイトに攻撃すると法に抵触するおそれがあります
:::

## WEBサーバーをDockerにたてる

`60080`ポートでHTTPアクセスを受け付けるようにしたこと以外は[前の記事](https://qiita.com/t13801206/items/8aa3ab8f5fd53cb2c35a)とほぼ同じ

もちろんWEBサーバーになってもらうためのパッケージが必要なので
`apache2`をインストールしてサービスを起動する

```bash
docker run --name zabbix-agent-web --hostname ZabbixAgentWeb -e ZBX_HOSTNAME="agent-web" -e ZBX_SERVER_HOST="172.20.240.0" --privileged --network=zabbix-net -p 60010:10050 -p 60080:80 -d zabbix/zabbix-agent:ubuntu-6.0.11

# コンテナに入る
docker container exec -u root -it zabbix-agent-web /bin/bash

# 必要なパッケージをインストールする
apt update
apt install -y vim iproute2 iputils-ping curl net-tools
apt install -y apache2

# WEBサービスを起動する
service apache2 status
service apache2 start
```

### サーバーが動いていることを確認する

`curl --head localhost`で`200 OK`なら成功

```powershell:curl --head localhost
HTTP/1.1 200 OK
```

ホストから`localhost:60080`へブラウザからアクセスしたときのようす
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/c3de14fa-3d31-bb42-4d5d-05ea40111acc.png)

ほかサーバーと区別するために、`vim /var/www/html/index.html`でタイトルを少し編集しておいた

### Zabbixサーバーへホストを登録する

[前の記事](https://qiita.com/t13801206/items/8aa3ab8f5fd53cb2c35a)の手順にしたがって、Zabbixエージェントをサーバーへ登録する
`60010`ポートからコンテナ内のWEBサーバー役エージェントを監視する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/54c35c4d-96d2-52d2-e639-ad000ccafe93.png)

### WEBサーバーを弱体化させる

甘んじて攻撃を受けてもらうために、サーバーの許容値を大きくして
さらに`tcp_syncookies=0`（無効化）する

:::note warn
本番環境のLinuxマシンでは絶対にやらないこと
:::

```vim /etc/sysctl.conf の冒頭に追記
net.ipv4.tcp_syncookies=0
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 16384
net.ipv4.ip_local_port_range = 1024 65535
kernel.threads-max = 1060863
fs.file-max = 5242880
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout=600
```

`sysctl -p`で設定を有効化

参考: [CentOS7 カーネルパラメータ チューニング](https://qiita.com/transformation33/items/92a9568c0dd708508880)

## 攻撃者を`zabbix-net`に参加させる


[docker hub](https://hub.docker.com/r/kalilinux/kali-rolling)の公式イメージを使ってKali LinuxをDockerに建てる

参考: [Kali linuxについて調査してみました。](https://dev.classmethod.jp/articles/kali-linux-toha/)

```powershell
docker run -it --name zabbix-kali --hostname KaliPC --privileged --network=zabbix-net -d kalilinux/kali-rolling
docker container exec -u root -it zabbix-kali /bin/bash

# パッケージのインストールに15分以上かかった...
apt update && apt -y install kali-linux-headless
```

### SYNフラッディング攻撃

Kali Linuxならではのコマンドで簡単に攻撃できる

`hping3 -V -i u1 -S -p 80 ZabbixAgentWeb --rand-source`

- 短周期で80番ポートに対してSYNパケットを送り付ける
- 送り元のIPアドレスはランダムになる

サーバーはクライアントからのACK待ちになりリソースが消費される

#### サーバー側のようす

`SYN_RECV`がたくさん溜まっている

```powershell:netstat -tan
tcp        0      0 172.20.240.8:10050      172.20.240.0:51802      TIME_WAIT
tcp        0      0 172.20.240.8:80         100.124.160.72:62780    SYN_RECV
tcp        0      0 172.20.240.8:80         13.236.147.53:62762     SYN_RECV
tcp        0      0 172.20.240.8:80         160.52.0.11:1108        SYN_RECV
tcp        0      0 172.20.240.8:80         18.185.137.249:62667    SYN_RECV
tcp        0      0 172.20.240.8:80         1.56.119.200:62765      SYN_RECV
tcp        0      0 172.20.240.8:80         158.151.112.217:10141   SYN_RECV
tcp        0      0 172.20.240.8:80         157.132.214.46:62772    SYN_RECV
tcp        0      0 172.20.240.8:10050      172.20.240.0:51498      TIME_WAIT
tcp        0      0 172.20.240.8:80         124.35.27.1:10653       SYN_RECV
tcp        0      0 172.20.240.8:80         151.36.176.69:10671     SYN_RECV
tcp        0      0 172.20.240.8:80         222.41.88.224:10709     SYN_RECV
tcp        0      0 172.20.240.8:80         164.47.40.249:10094     SYN_RECV
tcp        0      0 172.20.240.8:80         2.88.100.152:10607      SYN_RECV
tcp        0      0 172.20.240.8:80         190.207.35.221:10689    SYN_RECV
tcp        0      0 172.20.240.8:80         208.119.220.198:62709   SYN_RECV
tcp        0      0 172.20.240.8:10050      172.20.240.0:50820      TIME_WAIT
tcp        0      0 172.20.240.8:80         197.48.23.70:1123       SYN_RECV
```

正規の通信もふくめて、534の通信がある

```powershell:netstat -tan | wc -l
534
```

### Zabbixからみたサーバーのようす

#### WEBシナリオを作成する

設定→ホスト→Web→右上の「Webシナリオの作成」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/92cf8591-a914-5f48-d1ff-91eae3b92c60.png)

ダイアログに宛先URL`192.168.10.101:60080`や期待値`200`などを入力する

#### 通常時

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/be3a5e27-3bc3-291e-3e92-298ea0c1d3db.png)

#### 攻撃されているとき

赤文字でタイムアウトが表示されている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/b95f3cf1-c682-e72b-e9ce-9eab6cde3d68.png)

リスペクト先のサイトのように、ステータス`500`にすることはできなかった

## まとめ

DockerネットワークにApacheウェブサイトをつくり
Kali LinuxからSYNパケットを大量に送り付けた
そのときのようすをZabbixで監視した

Zabbixでは確かにステータスが異常になったが
Apacheが動作しなくなるほどの負荷をかけることはできなかった

## 参考

https://www.youtube.com/watch?v=OFIoYepv1LE

https://wireless-network.net/syn-flood-cookies/

https://cyber-security-forensic.com/dos-ddoshping3/

https://academy.gmocloud.com/qa/20200304/8822

https://ja.wikipedia.org/wiki/SYN_cookies

## 糸冬了！！