SSH
golang
docker
SIOSDay 6

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


挨拶

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

今回QiitaのAdventCalendarということで、インターネット上に立てたサーバをハニーポットみたいにしていって攻撃のログとかを見てみたいと思います。

ほぼほぼスクリプトキディ的なノリなので、全然ディープな内容にはなっていません。

あくまでも、息抜き程度ということで、肩の力を抜いてお楽しみください。


基本的な構成

Debian(Stretch)を入れて、最新の状態にaptで上げています。また、iptablesを使って、開けたポート以外はデフォルトで閉じるようにしています。

ドメインを晒すのはアレなので、マシン名は「host1.hogehoge.jp」だとします。

このサーバを使って毎回お題を考えてエンハンスしていこうと思います。


第一回のお題

第一回は、「SSH」です。インターネット上でサーバを運用する際にはSSHで接続することがほとんどだと思いますが、実際には

- ソースIPアドレスで縛ったり

- パスワードじゃなく公開鍵認証にしたり

で運用するのがほとんどだと思います(というか、そうしないと危ないですよーというのをこれから見ていくわけです)。

そこで、偽物のSSHサーバを用意して

- ソースIPはどこからでもOKにして

- ID/パスワード認証にしたら

どういうことになるかを見てみます。


実際に使ったもの

実際には、FakeなSSHサーバを提供してくれる「FakeSSH」を使用しました。こちらはGo言語を使って作った「偽物の」SSH サーバを、Dockerを使ってPort22で起動するものです。


実験

では、まずはDockerを使ってFakeSSHを起動しましょう。DebianでDockerを使うには、「公式サイトに載っている方法」の通りに行えば、問題なくDockerをインストールすることが出来ます。


  1. Dockerをインストール


  2. FakeSSHのReadmeに載っている通り、dockerコマンドを使ってFakeSSHをインストールする。うまく動いたら、Ctrl+cで一旦落とす。

docker run -it --rm -p 22:22 fffaraz/fakessh


  1. FakeSSHをdockerでデーモンとして動かす。

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


  1. 以下のコマンドで、ログを見る。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/パスワード認証ではなく、公開鍵認証を使う

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