インターネットに危険っぽいサーバ立てて攻撃を見てみる(I)

# 挨拶
こんにちは。SIOS OSSエバンジェリスト/セキュリティ担当の面です。

今回QiitaのAdventCalendarということで、インターネット上に立てたサーバをハニーポットみたいにしていって攻撃のログとかを見てみたいと思います。
ほぼほぼスクリプトキディ的なノリなので、全然ディープな内容にはなっていません。
あくまでも、息抜き程度ということで、肩の力を抜いてお楽しみください。

# 基本的な構成
Debian(Stretch)を入れて、最新の状態にaptで上げています。また、iptablesを使って、開けたポート以外はデフォルトで閉じるようにしています。
ドメインを晒すのはアレなので、マシン名は「host1.hogehoge.jp」だとします。
このサーバを使って毎回お題を考えてエンハンスしていこうと思います。

# 第一回のお題
第一回は、「SSH」です。インターネット上でサーバを運用する際にはSSHで接続することがほとんどだと思いますが、実際には
- ソースIPアドレスで縛ったり
- パスワードじゃなく公開鍵認証にしたり
で運用するのがほとんどだと思います（というか、そうしないと危ないですよーというのをこれから見ていくわけです）。

そこで、偽物のSSHサーバを用意して
- ソースIPはどこからでもOKにして
- ID／パスワード認証にしたら
どういうことになるかを見てみます。

# 実際に使ったもの
実際には、FakeなSSHサーバを提供してくれる「[FakeSSH](https://github.com/fffaraz/fakessh)」を使用しました。こちらはGo言語を使って作った「偽物の」SSH  サーバを、Dockerを使ってPort22で起動するものです。

#実験
では、まずはDockerを使ってFakeSSHを起動しましょう。DebianでDockerを使うには、「[公式サイトに載っている方法](https://docs.docker.com/install/linux/docker-ce/debian/#install-docker-ce)」の通りに行えば、問題なくDockerをインストールすることが出来ます。

1. Dockerをインストール
2. [FakeSSH](https://github.com/fffaraz/fakessh)のReadmeに載っている通り、dockerコマンドを使ってFakeSSHをインストールする。うまく動いたら、Ctrl+cで一旦落とす。

```
docker run -it --rm -p 22:22 fffaraz/fakessh
```
3. FakeSSHをdockerでデーモンとして動かす。


```
docker run -d --restart=always -p 22:22 --name fakessh fffaraz/fakessh
```

4. 以下のコマンドで、ログを見る。sshで接続を試したIDとパスワードが見える。

```
docker logs -f fakessh
```

#FakeSSHのテスト

1. マシン名が"host1.hogehoge.jp"で、iptablesでPort22を開けて、実際にログインがあるかを確認してみました。単純にPort22を開けた後ですと、5時間以上待っていても、どこからもログインの渡来がありませんでした。
2. 次に、DNS設定をいじって、同じIPが"www.hogehoge.jp"だと登録しました（CNAME）。すると、www.hogehoge.jpの登録後10分以内に、SSHのログインが大量に発生しました。ログの例は下記になります。

```
12-06 07:24:55	xx.xx.xx.xx:45832	Connected
12-06 07:24:57	xx.xx.xx.xx:45832	SSH-2.0-libssh2_1.7.0	root	root
12-06 07:24:57	xx.xx.xx.xx:45832	SSH-2.0-libssh2_1.7.0	root	admin
12-06 07:24:58	xx.xx.xx.xx:45832	SSH-2.0-libssh2_1.7.0	root	12345
12-06 07:24:58	xx.xx.xx.xx:45832	SSH-2.0-libssh2_1.7.0	root	guest
12-06 07:24:58	xx.xx.xx.xx:45832	SSH-2.0-libssh2_1.7.0	root	123456
12-06 07:24:58	xx.xx.xx.xx:45832	SSH-2.0-libssh2_1.7.0	root	1234
12-06 07:24:58	xx.xx.xx.xx:45832	ssh: disconnect, reason 2: too many authentication failures
12-06 07:24:58	xx.xx.xx.xx:45832	Disconnected
12-06 07:24:59	xx.xx.xx.xx:45835	Connected
12-06 07:25:01	xx.xx.xx.xx:45835	SSH-2.0-libssh2_1.7.0	root	123
12-06 07:25:01	xx.xx.xx.xx:45835	SSH-2.0-libssh2_1.7.0	root	hlL0mlNAabiR
12-06 07:25:01	xx.xx.xx.xx:45835	SSH-2.0-libssh2_1.7.0	root	test
12-06 07:25:01	xx.xx.xx.xx:45835	SSH-2.0-libssh2_1.7.0	root	toor
12-06 07:25:01	xx.xx.xx.xx:45835	SSH-2.0-libssh2_1.7.0	root	qwerty
12-06 07:25:02	xx.xx.xx.xx:45835	ssh: disconnect, reason 11: disconnected by user
12-06 07:25:02	xx.xx.xx.xx:45835	Disconnected
12-06 07:25:02	xx.xx.xx.xx:45839	Connected
12-06 07:25:11	xx.xx.xx.xx:45848	SSH-2.0-libssh2_1.7.0	oracle	oracle
12-06 07:25:11	xx.xx.xx.xx:45848	ssh: disconnect, reason 11: disconnected by user
12-06 07:25:11	xx.xx.xx.xx:45848	Disconnected
12-06 07:25:11	xx.xx.xx.xx:45852	Connected
12-06 07:25:13	xx.xx.xx.xx:45852	SSH-2.0-libssh2_1.7.0	usuario	usuario
12-06 07:25:14	xx.xx.xx.xx:45852	ssh: disconnect, reason 11: disconnected by user
12-06 07:25:14	xx.xx.xx.xx:45852	Disconnected
12-06 07:25:14	xx.xx.xx.xx:45856	Connected
12-06 07:25:16	xx.xx.xx.xx:45856	SSH-2.0-libssh2_1.7.0	contador	contador
12-06 07:25:16	xx.xx.xx.xx:45856	ssh: disconnect, reason 11: disconnected by user
12-06 07:25:16	xx.xx.xx.xx:45856	Disconnected
12-06 07:25:16	xx.xx.xx.xx:45860	Connected
12-06 07:25:19	xx.xx.xx.xx:45860	SSH-2.0-libssh2_1.7.0	test	test
12-06 07:25:19	xx.xx.xx.xx:45860	ssh: disconnect, reason 11: disconnected by user
12-06 07:25:19	xx.xx.xx.xx:45860	Disconnected
12-06 07:25:19	xx.xx.xx.xx:45864	Connected
12-06 07:25:21	xx.xx.xx.xx:45864	SSH-2.0-libssh2_1.7.0	user	user
12-06 07:25:21	xx.xx.xx.xx:45864	ssh: disconnect, reason 11: disconnected by user
12-06 07:25:21	xx.xx.xx.xx:45864	Disconnected
12-06 08:40:12	yy.yy.yy.yy:59563	Connected
12-06 08:40:12	yy.yy.yy.yy:59563	EOF
12-06 08:40:12	yy.yy.yy.yy:59563	Disconnected
12-06 08:40:17	yy.yy.yy.yy:60311	Connected
12-06 08:40:23	yy.yy.yy.yy:60311	SSH-2.0-JSCH-0.1.54	cisco	cisco
12-06 08:40:23	yy.yy.yy.yy:60311	ssh: disconnect, reason 3: com.jcraft.jsch.JSchException: Auth fail
12-06 08:40:23	yy.yy.yy.yy:60311	Disconnected
12-06 08:41:33	yy.yy.yy.yy:52799	Connected
12-06 08:43:06	yy.yy.yy.yy:52799	EOF
12-06 08:43:06	yy.yy.yy.yy:52799	Disconnected

```
# 解析及びまとめ
ちなみに、上記のIPアドレスをインターネット上の「ソースIPで国がわかるサイト」等で調べると（この手のサービスはいっぱいあるので割愛します）

xx.xx.xx.xx: RU(ロシア)
yy.yy.yy.yy: CN(中国)

でした。一連の動きが数秒以内に纏まってきていることも併せて考えると、ボットの仕業のようです。
また、ホストとして「www」を登録した途端にアクセスが来たことから、Webサーバを狙ったボットが来たのではないかと考えられます。そう考えると、Webサーバを立てる場合には、やはり最初に書いた通り

- iptablesでSSHのソースIPアドレスを指定して、それ以外はリジェクトする
- SSHもID／パスワード認証ではなく、公開鍵認証を使う

というのが「必須」と言えると思います。