sshハニーポットをkippoで作ってみる
ハッカージャパンは結構昔からの愛読者なのだが、先日発売された2013年9月号ではSSH Honeypotであるkippo(http://code.google.com/p/kippo/)が紹介されていた。
Hacker Japan (ハッカー ジャパン) 2013年 09月号 [雑誌]
- 出版社/メーカー: 白夜書房
- 発売日: 2013/08/08
- メディア: 雑誌
- この商品を含むブログ (2件) を見る
ということで、今回この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宛だとうまくいかないと思います。設定後に試すときは、localhostにsshログインするんじゃなくて、外からグローバル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で実行しようとするとか、ツッコミ所満載で笑える。