サイバーセキュリティの情報収集の一つで「ハニーポット」という技術があります。今回は業務中にハニーポットについて調べている中での覚書として本記事を残しておきます。
ハニーポットとは
ハニーポットは脆弱性のあるサービスを実際に、または疑似的に動かして不正アクセスを受け付けるためのシステムです。攻撃者は不正アクセスが成功すると、様々な手法で攻撃を試行してきます。ハニーポットは攻撃試行をログとして記録し、攻撃方法などを収集する目的で設置します。
収集方法としては大きく分けて、
- 実際に脆弱性のあるサービスを外部公開して攻撃を待ち受ける高対話型ハニーポット
- 脆弱性のあるサービスをエミュレートし、外部公開して攻撃を待ち受ける低対話型ハニーポット
があります。
高対話型ハニーポットでは本物の脆弱性のあるサービスを公開することで、より詳細なログ情報を収集することができますが、同時に感染リスクも高いのが特徴です。
低対話型ハニーポットではエミュレートされたサービスを公開するため、攻撃を受けてもエミュレートした範囲以上に攻撃を受けないため、高対話型ハニーポットに比べると安全に運用することができますが、エミュレートした範囲でしかログ情報の収集を行うことができないため、情報量が少なくなってしまいます。
今回は収集できる情報は少ないけど、比較的安全に運用することができる低対話型ハニーポットのうちSSH/Telnet特化のハニーポットであるCowrieについて触っていきたいと思います。
Cowrieとは
CowrieはSSH/Telnetに特化したOSSのハニーポットクライアント。SSH(Port22)とTelnet(23)のサービスを疑似的に立ち上げて、アクセスしてきた人の動作をログとして収集するプログラムです。これにより、攻撃者がSSHで接続試行するときのアカウント情報やログイン後に実行するコマンドを収集することができます。
インストールして動かすこともできますが、Dockerコンテナが公開されているので、実際に立ち上げて触ってみたいと思います。
事前準備
Dockerコンテナで起動するため、事前にDockerのインストールをしておいてください。
Dockerのインストール方法は下記の記事を参考にどうぞ。
インストール
公開されているDockerコンテナのリポジトリを指定してdocker pull
を行います。
$ docker pull cowrie/cowrie
これで動かす準備は完了です。
起動してみる
実際にCowrieのコンテナを起動してみたいと思います。
下記コマンドを実行してください。
$ docker run -p 2222:2222/tcp cowrie/cowrie
起動が完了すると下記のようなログが出力されます。
Join the Cowrie community at: https://www.cowrie.org/slack/ Using default Python virtual environment "/cowrie/cowrie-env" version check Starting cowrie: [twistd --umask=0022 --pidfile= -l - cowrie -n]... 2020-07-09T17:28:13+0000 [-] Python Version 3.7.3 (default, Dec 20 2019, 18:57:59) [GCC 8.3.0] 2020-07-09T17:28:13+0000 [-] Twisted Version 20.3.0 2020-07-09T17:28:13+0000 [-] Loaded output engine: jsonlog 2020-07-09T17:28:13+0000 [twisted.scripts._twistd_unix.UnixAppLogger#info] twistd 20.3.0 (/cowrie/cowrie-env/bin/python3 3.7.3) starting up. 2020-07-09T17:28:13+0000 [twisted.scripts._twistd_unix.UnixAppLogger#info] reactor class: twisted.internet.epollreactor.EPollReactor. 2020-07-09T17:28:13+0000 [-] CowrieSSHFactory starting on 2222 2020-07-09T17:28:13+0000 [cowrie.ssh.factory.CowrieSSHFactory#info] Starting factory <cowrie.ssh.factory.CowrieSSHFactory object at 0x7fd16a5c7f98> 2020-07-09T17:28:13+0000 [-] Generating new RSA keypair... 2020-07-09T17:28:13+0000 [-] Generating new DSA keypair... 2020-07-09T17:28:13+0000 [-] Ready to accept SSH connections
Ready to accept SSH connections
と表示されたらCowrieが立ち上がった証拠です。
アクセスしてみる
それでは実際にCowrieにアクセスしてみましょう。dockerを立ち上げているコンソールとは別のコンソールを立ち上げてください。
dockerコンテナにSSHでアクセスしてみます。docker起動の時にPort2222をポートフォワードするように起動しているので、Port2222に対してログインをしてみます。
$ ssh -p 2222 root@localhost root@localhost's password: The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. root@svr04:~#
パスワードを求められるのですが、ここではアカウントと同じ文字列でなければ、どんなパスワードを入れてもログインが成功します。
ログイン後、Cowrie側のログを見てみましょう。
2020-07-10T13:14:51+0000 [cowrie.ssh.factory.CowrieSSHFactory] New connection: 172.17.0.1:38570 (172.17.0.2:2222) [session: 2780b89da733] 2020-07-10T13:14:51+0000 [HoneyPotSSHTransport,1,172.17.0.1] Remote SSH version: b'SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3'
ログから確認できるのは、Remote SSHしてきたサーバのIP、SSHクライアントのバージョン、ログインしてきたサーバのカーネルバージョンが取得できます。
RemoteSSHしてきたサーバが入力してきたログインアカウント/ログインパスワードも
2020-07-10T13:15:00+0000 [SSHService b'ssh-userauth' on HoneyPotSSHTransport,1,172.17.0.1] login attempt [b'root'/b'password'] succeeded
上記の通り、丸わかりです。
RemoteSSH側でログインして、whoami
やid
、uname -a
などで情報を取得したり、netcatコマンドを実行してログアウトしてみます。
RemoteSSH側のコンソールでは次のようになります。
$ ssh -p 2222 root@localhost root@localhost's password: The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. root@svr04:~# whoami root root@svr04:~# id uid=0(root) gid=0(root) groups=0(root) root@svr04:~# uname -a Linux svr04 3.2.0-4-amd64 #1 SMP Debian 3.2.68-1+deb7u1 x86_64 GNU/Linux root@svr04:~# root@svr04:~# root@svr04:~# nc This is nc from the netcat-openbsd package. An alternative nc is available in the netcat-traditional package. usage: nc [-46bCDdhjklnrStUuvZz] [-I length] [-i interval] [-O length] [-P proxy_username] [-p source_port] [-q seconds] [-s source] [-T toskeyword] [-V rtable] [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] [destination] [port] root@svr04:~# root@svr04:~# root@svr04:~# exit Connection to localhost closed.
Cowrie側では次のようになります。
2020-07-10T13:25:48+0000 [cowrie.ssh.factory.CowrieSSHFactory] No moduli, no diffie-hellman-group-exchange-sha1 2020-07-10T13:25:48+0000 [cowrie.ssh.factory.CowrieSSHFactory] No moduli, no diffie-hellman-group-exchange-sha256 2020-07-10T13:25:48+0000 [cowrie.ssh.factory.CowrieSSHFactory] New connection: 172.17.0.1:38578 (172.17.0.2:2222) [session: 1731957be020] 2020-07-10T13:25:48+0000 [HoneyPotSSHTransport,3,172.17.0.1] Remote SSH version: b'SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3' 2020-07-10T13:25:48+0000 [HoneyPotSSHTransport,3,172.17.0.1] SSH client hassh fingerprint: 06046964c022c6407d15a27b12a6a4fb 2020-07-10T13:25:48+0000 [HoneyPotSSHTransport,3,172.17.0.1] kex alg, key alg: b'curve25519-sha256' b'ssh-rsa' 2020-07-10T13:25:48+0000 [HoneyPotSSHTransport,3,172.17.0.1] outgoing: b'aes128-ctr' b'hmac-sha2-512' b'none' 2020-07-10T13:25:48+0000 [HoneyPotSSHTransport,3,172.17.0.1] incoming: b'aes128-ctr' b'hmac-sha2-512' b'none' 2020-07-10T13:25:48+0000 [HoneyPotSSHTransport,3,172.17.0.1] NEW KEYS 2020-07-10T13:25:48+0000 [HoneyPotSSHTransport,3,172.17.0.1] starting service b'ssh-userauth' 2020-07-10T13:25:48+0000 [SSHService b'ssh-userauth' on HoneyPotSSHTransport,3,172.17.0.1] b'root' trying auth b'none' 2020-07-10T13:25:48+0000 [SSHService b'ssh-userauth' on HoneyPotSSHTransport,3,172.17.0.1] b'root' trying auth b'publickey' 2020-07-10T13:25:48+0000 [SSHService b'ssh-userauth' on HoneyPotSSHTransport,3,172.17.0.1] public key attempt for user b'root' of type b'ssh-rsa' with fingerprint bc:62:6b:16:0a:40:b6:58:a7:99:e7:ad:1a:9e:e4:4e 2020-07-10T13:25:48+0000 [SSHService b'ssh-userauth' on HoneyPotSSHTransport,3,172.17.0.1] b'root' failed auth b'publickey' 2020-07-10T13:25:48+0000 [SSHService b'ssh-userauth' on HoneyPotSSHTransport,3,172.17.0.1] reason: ('Incorrect signature', None) 2020-07-10T13:25:51+0000 [SSHService b'ssh-userauth' on HoneyPotSSHTransport,3,172.17.0.1] b'root' trying auth b'password' 2020-07-10T13:25:51+0000 [SSHService b'ssh-userauth' on HoneyPotSSHTransport,3,172.17.0.1] Could not read etc/userdb.txt, default database activated 2020-07-10T13:25:51+0000 [SSHService b'ssh-userauth' on HoneyPotSSHTransport,3,172.17.0.1] login attempt [b'root'/b'password'] succeeded 2020-07-10T13:25:51+0000 [SSHService b'ssh-userauth' on HoneyPotSSHTransport,3,172.17.0.1] Initialized emulated server as architecture: linux-x64-lsb 2020-07-10T13:25:51+0000 [SSHService b'ssh-userauth' on HoneyPotSSHTransport,3,172.17.0.1] b'root' authenticated with b'password' 2020-07-10T13:25:51+0000 [SSHService b'ssh-userauth' on HoneyPotSSHTransport,3,172.17.0.1] starting service b'ssh-connection' 2020-07-10T13:25:51+0000 [SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] got channel b'session' request 2020-07-10T13:25:51+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] channel open 2020-07-10T13:25:51+0000 [SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] got global b'no-more-sessions@openssh.com' request 2020-07-10T13:25:51+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] pty request: b'xterm-256color' (54, 202, 0, 0) 2020-07-10T13:25:51+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] Terminal Size: 202 54 2020-07-10T13:25:51+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] request_env: b'LANG'=b'C.UTF-8' 2020-07-10T13:25:51+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] getting shell 2020-07-10T13:25:55+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] CMD: whoami 2020-07-10T13:25:55+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] Command found: whoami 2020-07-10T13:25:56+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] CMD: id 2020-07-10T13:25:56+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] Command found: id 2020-07-10T13:25:59+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] CMD: uname -a 2020-07-10T13:25:59+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] Command found: uname -a 2020-07-10T13:26:01+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] CMD: 2020-07-10T13:26:01+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] CMD: 2020-07-10T13:26:03+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] CMD: nc 2020-07-10T13:26:03+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] Command found: nc 2020-07-10T13:26:04+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] CMD: 2020-07-10T13:26:04+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] CMD: 2020-07-10T13:26:05+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] CMD: exit 2020-07-10T13:26:05+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] Command found: exit 2020-07-10T13:26:05+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] exitCode: 0 2020-07-10T13:26:05+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] sending request b'exit-status' 2020-07-10T13:26:05+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] Closing TTY Log: var/lib/cowrie/tty/b5377bf3fdd31e29a30f8f18a4835d9f439157f591eafef456b563055e59a28e after 13 seconds 2020-07-10T13:26:05+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] sending close 0 2020-07-10T13:26:05+0000 [SSHChannel session (0) on SSHService b'ssh-connection' on HoneyPotSSHTransport,3,172.17.0.1] remote close 2020-07-10T13:26:05+0000 [HoneyPotSSHTransport,3,172.17.0.1] Got remote error, code 11 reason: b'disconnected by user' 2020-07-10T13:26:05+0000 [HoneyPotSSHTransport,3,172.17.0.1] avatar root logging out 2020-07-10T13:26:05+0000 [HoneyPotSSHTransport,3,172.17.0.1] connection lost 2020-07-10T13:26:05+0000 [HoneyPotSSHTransport,3,172.17.0.1] Connection lost after 16 seconds
CMD: hogehoge
となっている部分がRemote SSH側で入力されたコマンドです。このような形で、攻撃してきたときに入力されたコマンドを収集することができます。
ハニーポットではこのように攻撃を受けたときのログ情報などを収集することができます。世の中の色々なサービスをエミュレートできるハニーポットが色々あるので、調べつつ本ブログに残していきたいと思います。