sshハニーポットをkippoで作ってみる

ハッカージャパンは結構昔からの愛読者なのだが、先日発売された2013年9月号ではSSH Honeypotであるkippo(http://code.google.com/p/kippo/)が紹介されていた。

ということで、今回このkippoを試してSSHハニーポットの構築をしてみる。

kippoとは何か

sshハニーポットはあまり数も多くなく、「これ!」という定番は無いのが現状である(たぶん、作るのが面倒くさい割に需要もほとんど無いからだろう)。本当に必要な研究者などが、各自で作っている話は聞いたことがある。そんな中、有名なものにKojoneyがあるが、2010年から更新されていないようだ。

Kippoもそんなsshハニーポットのひとつで、開発はそんなに活発では無いけど一応細々と続いている……ようだ(たぶん)。Kippoの公式ページには、"Kippo is inspired, but not based on Kojoney. " と書かれており、インスパイアはされたけどベースとしてはいないそうである。
http://code.google.com/p/kippo/

インストール

kippo自体はPythonで書かれているので、まずシステムにPython 2.5以上がインストールされている必要がある。また以下のPythonモジュールが必要である。

Pythonのモジュール群は、通常のお作法通りにtar.gzを展開してから中身のsetup.pyを以下のように実行すれば良い。

# python setup.py install

ちなみにCentOS 6.4では、pycrypto以外は公式rpmが用意されているのでyumで入れてしまえば良い。

# yum install python-twisted
# yum install python-zope-interface
# yum install python-pyasn1.noarch

モジュール類がインストールできたら、最後にkippoをダウンロードする。この記事を書いた時点で最新のkippo-0.8.tar.gzをダウンロードして、適当なディレクトリに設置する。kippo自体はpythonスクリプトなので、設置しただけでインストール完了である。

$ wget http://kippo.googlecode.com/files/kippo-0.8.tar.gz
$ tar xvzf kippo-0.8.tar.gz

kippoの起動と初期設定

先ほどkippoを展開したディレクトリ内で、start.shを実行すれば良い。twistdにパスが通っていない場合はエラーになるため、パスを通しておく必要がある。なお、セキュリティのためか(?)、rootユーザで起動しようとするとエラーになるため、一般ユーザで起動しよう。

$ cd kippo-0.8
$ ./start.sh

この状態で、ポート2222にsshアクセスしてみればすぐに動きが確認できる。初期状態ではrootのパスワードが 123456 として登録されているので、別のマシンから以下のようにアクセスしてみよう。ログインできたように見えるはずである。

$ ssh -p 2222 root@192.168.1.1
Password:

この初期設定ユーザは、data/userdb.txtを書き換えれば自由にユーザ追加・パスワード変更がおこなえる。中身は以下のような単なるテキストファイルなので、とてもお手軽。

root:0:123456
初期設定

kippoの設定ファイルは、kippo.cfgである。ポート番号などを変えたければこのファイルの ssh_port を変更すればよい。初期設定のままでだいたい動くけど、まずは最終行のコメントアウトを外して、テキストログが出るようにした方がいい。

logfile = kippo-textlog.log

これでssh接続された際にどんなID・パスワードが入力されたか、どんなコマンドが叩かれたか、を見ることができる。

このログは設定によってMySQLデータベースに直接保存することもできる。必要なテーブル定義はkippoのdoc/sql/mysql.sqlに入っているので、これを実行してCREATE TABLEしてからkippo.cfgの下記設定をいじればよい。

#[database_mysql]
#host = localhost
#database = kippo
#username = kippo
#password = secret
#port = 3306

ポートフォワード

前述した通り、kippoはrootユーザで実行しようとするとエラーになり起動できない。

# ./start.sh
Starting kippo in background...
ERROR: You must not run kippo as root!

しかしsshハニーポットとしたいならばポート22で起動しないといけないため、プロセスをrootで実行しなければならない(Well-known portにbindするにはroot権限が必要なため)。さてどうするか。

解決策として、先のハッカージャパン2013年9月号の極東パッチマネージャー氏の記事では、kippo.tacの以下行をコメントアウトしてuidチェックを回避する手法が書かれていた。

if os.name == 'posix' and os.getuid() == 0:
    print 'ERROR: You must not run kippo as root!'
    sys.exit(1)

しかしこの手法は、あんまりオススメできない。もしroot権限で実行して、kippo(あるいはtwistd)に脆弱性があったら、root権限が奪取されてしまうかもしれない。

というわけで、kippo自体は一般ユーザでデフォルトのポート2222で起動しておき、以下のようにiptablesで外部からのポート22/tcp宛て通信を、ポート2222/tcpにNATしてやるのが一番妥当でスマートだと思う。なおこの際は、本来のsshdは別ポートで起動しておく必要がある。

# iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 22 -j REDIRECT --to-port 2222

こうしてやれば、外から普通にsshすればkippoの待つ2222/tcpに繋がるし、もしkippoの脆弱性が突かれても最悪一般ユーザ権限しか手に入らない。

なおこれはeth0のPREROUTINGチェインに書いているので、localhost宛だとうまくいかないと思います。設定後に試すときは、localhostsshログインするんじゃなくて、外からグローバルIPに向けてログインしてみてください。

ログ再生(playlog.py)

kippoでも特に面白い機能がこれで、侵入者が打ち込んだコマンドを「再生」することができる。キーボードの待ち時間や打ち間違いなども全て再生されるため、とてもリアルで面白い。

utils/playlog.pyがこのログ再生スクリプトで、使い方もlog/tty/20131209-052302-8163.logなどkippoのログファイルを指定して実行するだけなので簡単。

$ cd log/tty
$ utils/playlog.py 20131209-052302-8163.log

これで実際に侵入者の様子を再生してみたのが以下です。apt-get install yumとか、PerlスクリプトPHPで実行しようとするとか、ツッコミ所満載で笑える。

ダウンロード保管

侵入者は往々にしてwgetで悪意のあるプログラムをダウンロードしようとします。kippoでは、ダウンロードされたファイルを[dl]フォルダに自動的に格納してくれます。

本物のマルウェアは、後で取りに行ってみると気がついた管理者に既に消されていた……なんてこともありますが、これなら確実に検体が手に入るため便利です。