1日ひとつだけ強くなる

おべんきょうのーと

ハニーポットCowrieのログをMySQLに突っ込んでKippo-Graphで可視化した話

はじめに

今回は前回に引き続き、ハニーポットCowrieの設定をこちらにメモしていきたいと思います。

hal0taso.hateblo.jp

なお、今回の記事作成時(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になってるのってなんでなんすかね…??途中で接続切れてるとか?もしわかる方いれば教えてほしいです。こちらでも調べておきます。)

www.youtube.com