ハニーポットCowrieのログをMySQLに突っ込んでKippo-Graphで可視化した話
はじめに
今回は前回に引き続き、ハニーポットCowrieの設定をこちらにメモしていきたいと思います。
なお、今回の記事作成時(2016年12月17日)においてはMySQLにCowrieのデータが入らないバグが報告されています。
output_mysql not sending data · Issue #309 · micheloosterhof/cowrie · GitHub
ここでは一時的な解決方法と、Cowrieのポートフォーワード設定(iptables)、Kippo-graphを用いたplaylogの可視化までを書いていきたいと思います。
ポートフォーワードの設定
Cowrieはsshハニーポットですが、ポート22で直接sshを待ち受けることは推奨されていません。よって、22番のポートに接続された場合にCowrieが待ち受けているポートにリダイレクトさせたいと思います。(管理用のsshポートも事前に別のポートで設定してください)
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222 $ sudo iptables -t nat -n -L
リダイレクトの設定が反映されていることを確認したら、再起動時にも設定が保持されるように以下のパッケージをインストールします。CowrieではIPv6は使用しないので、IPv6の設定に聞かれた時はnoでも大丈夫です。
$ sudo apt-get install iptables-persistent $ sudo systemctl enable netfilter-persistent
MySQLの設定
MySQLインストール
よしなに。インストールの際にrootユーザーのパスワードを設定する必要があるので設定しましょう。
$ sudo apt-get update $ sudo apt-get install mysql-server libmysqlclient-dev $ pip install mysql-python
pipはcowrieのvietualenv内でインストールしましょう
MySQLの設定
僕はこちらを参考に設定させてもらいました。
Kippo-GraphをインストールしてCowrieのログを可視化する
こんな感じです。
$ sudo vi /etc/mysql/my.cnf [mysqld] character-set-server=utf8 collation-server=utf8_general_ci skip-character-set-client-handshake default-storage-engine=InnoDB innodb_file_per_table innodb_buffer_pool_size=256M skip-name-resolve [mysqldump] default-character-set=utf8 [mysql] default-character-set=utf8
なお、僕の環境では上記の設定は各セクションの最後に追記しないとMySQLを起動できませんでした。
$ sudo systemctl restart mysql
ログの出力先の設定
次に、cowrieのログの出力先をMySQLに設定していきます。 mysqlを起動します。
$ mysql -u root -p mysql> CREATE DATABASE cowrie; mysql> GRANT ALL ON cowrie.* TO cowrie@localhost IDENTIFIED BY 'your_password'; # パスワードは自分のものを使用 mysql> exit # cowrieのインストール先ディレクトリに移動 $ cd /home/cowrie/cowrie/ $ mysql -u cowrie -p mysql> USE cowrie; mysql> source ./doc/sql/mysql.sql mysql> exit
次に、cowrie.cfg
を設定していきます。
$ cd /home/cowrie/cowrie/ $ nano cowrie.cfg # コメントアウトします。 #[iutput_jsonloi] #logfile = log/cowrie.json # コメントアウトを外します [output_mysql] host = localhost database = cowrie username = cowrie password = your_password # 先ほど設定したパスワードを使用 port = 3306 #debug = false # trueにすると、/home/cowrie/cowrie/log/coerie.log にmysqlとの接続時のデバッグメッセージが表示されます。
多分この時点ではまだMySQLにログが入ってないと思います。ローカルネットからアクセスして確かめてみてください。
ブランチを変更する(2016年12月17日現在)
本記事の序盤でも述べたように、CowrrieのログをMySQLに出力するようにしてもデータベースにログが出力されないというバグが報告されています(issue#321,issue#309あたりで一連の議論がなされています。)
これを回避するために、現時点ではbranchを以前のものに切り替えることでMySQLにデータが出力されます。
$ cd /home/cowrie/cowrie/ $ git checkout 45022b7
最後にcowrieを再起動してMySQLにデータが入ってることを確かめます。
$ ./stop.sh $ ./start.sh
Apache2のインストール
$ sudo apt-get install apache2
apache2のセキュリティ設定、文字コード設定、SeverName設定を行います。
$ sudo nano /etc/apache2/conf-available/security.conf ServerTokens Prod ServerSignature Off $ sudo vi /etc/apache2/conf-available/charset.conf #AddDefaultCharset UTF-8 $ sudo sh -c "echo ServerName ${HOSTNAME} > /etc/apache2/conf-available/fqdn.conf" $ sudo a2enconf fqdn
Apache2を再起動します。
$ sudo apachectl configtest $ sudo systemctl restart apache2
Kippo-Graphのインストール
README.mdみて。 ちなみに記事執筆時の最新バージョンは1.5です。
https://bruteforce.gr/kippo-graph
と思ったけど僕は(こちら)http://www.shinayoshi.net/post/2016/08/16/install-kippo-graph/参考にインストールしてました。
$ wget http://bruteforce.gr/wp-content/uploads/kippo-graph-1.5.1.tar.gz $ sudo tar zxvf kippo-graph-1.5.1.tar.gz -C /usr/share $ sudo vi /etc/apache2/conf-available/kippo-graph.conf <IfModule mod_alias.c> Alias /kippo-graph /usr/share/kippo-graph-1.5.1 </IfModule> $ sudo a2enconf kippo-graph $ sudo apachectl configtest $ sudo systemctl restart apache2
Kippo-Graphの設定をします。
$ sudo chmod 777 /usr/share/kippo-graph-1.5.1/generated-graphs/ $ sudo cp -p /usr/share/kippo-graph-1.5.1/config.php.dist /usr/share/kippo-graph-1.5.1/config.php $ sudo vi /usr/share/kippo-graph-1.5.1/config.php define('DB_HOST', 'localhost'); define('DB_USER', 'cowrie'); define('DB_PASS', 'your_password'); define('DB_NAME', 'cowrie'); define('DB_PORT', '3306');
Kippo-Graphの修正
もともとKippo-GraphはKippoのためのものなので、Cowrieだと動かない部分もあるっぽい。実際にPlaylogが動かないのでその解決法をこちらに載せておきます。 (ただし、色々いじくりまわした結果なので、自己責任でお願いします)
(こちらから引用させていただいてます。)http://www.shinayoshi.net/post/2016/08/16/install-kippo-graph/
class/KippoPlayLog.class.php
の修正
$ cd /usr/share/kippo-graph-1.5.1 $ sudo cp -p class/KippoPlayLog.class.php class/KippoPlayLog.class.php.org $ sudo nano class/KippoPlayLog.class.php $ diff class/KippoPlayLog.class.php.org class/KippoPlayLog.class.php 21c21 < SELECT ttylog.session, timestamp, ROUND(LENGTH(ttylog)/1024, 2) AS size --- > SELECT ttylog.session, timestamp, ROUND(size/1024, 2) AS size
include/play.php
の修正
$ cd /usr/share/kippo-graph-1.5.1 $ sudo cp -p include/play.php include/play.php.org $ sudo nano include/play.php $ diff play.php.org play.php 70c70 < $log = base64_encode($row['ttylog']); --- > $log = base64_encode(file_get_contents($row['ttylog']));
ttylogへのシンボリックリンク作成
$ cd /usr/share/kippo-graph-1.5.1/include $ sudo ln -s ${COWRIE_INSTALL_DIR}/log/ log $ sudo chgrp www-data /home/cowrie/cowrie/log/tty/ $ sudo chmod g+s /home/cowrie/cowrie/log/tty/
Cowrie起動スクリプトの修正
$ sudo su - cowrie $ cd ${COWRIE_INSTALL_DIR}/ $ cp -p start.sh start.sh.org $ vi start.sh $ diff start.sh.org start.sh 31c31 < twistd $XARGS -l log/cowrie.log --umask 0077 --pidfile cowrie.pid cowrie --- > twistd $XARGS -l log/cowrie.log --umask 0027 --pidfile cowrie.pid cowrie 33c33 < authbind --deep twistd $XARGS -l log/cowrie.log --umask 0077 --pidfile cowrie.pid cowrie --- > authbind --deep twistd $XARGS -l log/cowrie.log --umask 0027 --pidfile cowrie.pid cowrie
Cowrieの再起動
$ ./stop.sh $ ./start.sh
apacheのエラーログを見てみる
/var/log/apache2/error.log
を見てるとこんなのが出てた。
どうやら、書き込み先のファイルに書き込み権限がないみたいだが、ファイル名からするにtorの出口ノードのリスト?っぽい(詳しくないので本当にそうか分かってないが)
[Sat Dec 17 07:11:33.646658 2016] [:error] [pid 2732] [client 192.168.0.10:56649] PHP Warning: file_put_contents(/usr/share/kippo-graph-1.5.1/include/tor/tor_exit_node_list.txt): failed to open stream: Permission denied in /usr/share/kippo-graph-1.5.1/include/tor/tor.class.php on line 11, referer: http://192.168.0.202/kippo-graph/include/play.php?f=4e4556a6
中身を見てみるとIPアドレスが列挙されてるだけだったため大丈夫だろうと思い、パーミッションを変更してやるとWarningは出なくなった。
$ sudo chgrp www-data /usr/share/kippo-graph-1.5.1/include/tor/tor_exit_node_list.txt $ sudo chmod g+w /usr/share/kippo-graph-1.5.1/include/tor/tor_exit_node_list.txt
これでKippo-Graphも見れるはず。
感想
実はこの記事を書いたり設定がうまくいかなくて苦しんでいる間にも、sshでのアクセス試行が繰り返されていた。ログ出力周りまだ準備できてないのに待ってくれよ!とは思ったものの、攻撃者は待ってはくれないのである。この記事を書いてる間にも、十数分に1回くらいの頻度でアクセスを受けている。
思ったよりも攻撃者はすぐそばにいるし、パスワードの複雑化、公開鍵認証を使うなどはめんどくさいように思っていても(実際、僕も運用するまで日に数回くらいでしょwwwとか思ってた)大切であることを感じた。
年明けに運用結果の中間報告をしてみたいと思う。
(※そういえば、KIPPO-IPのページでSuccessの値がN/Aになってるのってなんでなんすかね…??途中で接続切れてるとか?もしわかる方いれば教えてほしいです。こちらでも調べておきます。)