CentOS6にKippoを入れてみた時の覚書

# CentOS6にKippoを入れてみた時の覚書
だいぶ前だけど、CentOS6にKippoを入れた時のメモ
cowrieに乗り換えるので、過去の覚書として残しておく
ダウンロード元について現在は[github](https://github.com/desaster/kippo.git)に移行しており、記載しているURLは404が返ってくる

## 環境
- CentOS release 6.9 (Final)
- kippo-0.8

## パッケージのインストール
必要なパッケージをインストールしておく

```
$ sudo yum install python-devel,python-twisted,python-zope-interface,python-pyasn1,pycrypto
```

## ユーザーの作成
kippoを起動するユーザを作成する
万が一kippoのバグで乗っ取られた場合を想定してrootでは起動しない

```
$ sudo useradd kippo
```

## kippoの入手
基本的にダウンロードして解凍するだけ

```
$ sudo su - kippo
$ wget http://kippo.googlecode.com/files/kippo-0.8.tar.gz
$ tar zxvf kippo-0.8.tar.gz
$ cd kippo-0.8
$ ls
data  dl  doc  fs.pickle  honeyfs  kippo  kippo.cfg  kippo.tac  log  start.sh  txtcmds  utils
```

## 設定ファイルの修正
```
$ vi kippo.cfg 
# Hostname for the honeypot. Displayed by the shell prompt of the virtual
# environment.
#
# (default: nas3)
hostname = seagull		<= 修正

～～～省略～～～

# Fake address displayed as the address of the incoming connection.
# This doesn't affect logging, and is only used by honeypot commands such as
# 'w' and 'last'
#
# If not specified, the actual IP address is displayed instead (default
# behaviour).
#
# (default: not specified)
fake_addr = 192.168.99.100		<= コメントイン

～～～省略～～～

# Text based logging module
#
# While this is a database logging module, it actually just creates a simple
# text based log. This may not have much purpose, if you're fine with the
# default text based logs generated by kippo in log/
#
# To enable this module, remove the comments below, including the
# [database_textlog] line.

#[database_textlog]
logfile = kippo-textlog.log		<= コメントイン
$ 
```

## 起動
start.shを実行するだけ

```
$ ./start.sh 
```

### デフォルトだとエラーがでて起動できなかったので修正
```
$ sudo vi /usr/lib64/python2.6/site-packages/Crypto/Util/number.py

～～～省略～～～

# You need libgmp v5 or later to get mpz_powm_sec.  Warn if it's not available.
#if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:
#    _warn("Not using mpz_powm_sec.  You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.", PowmInsecureWarning)u
	<= コメントアウト


～～～省略～～～

# Use the accelerator if available
#    if _fastmath is not None:
#        return _fastmath.getStrongPrime(long(N), long(e), false_positive_prob,
#            randfunc)
	<= コメントアウト


～～～省略～～～

$ 
```

### 起動後にエラーがでてうまくログをとれていなかったので修正
```
$ vi /home/kippo/kippo-0.8/kippo/core/honeypot.py
～～～省略～～～
from copy import deepcopy, copy
#import sys, os, random, pickle, time, stat, shlex, anydbm
import sys, os, random, pickle, time, stat, shlex, anydbm, struct	<= 修正
～～～省略～～～
    def resume(self):
        self.honeypot.setInsertMode()
        self.runCommand()

        if (self.honeypot.execcmd != None):
            return	<= 追記
～～～省略～～～
class HoneyPotProtocol(recvline.HistoricRecvLine):
    #def __init__(self, user, env):
    def __init__(self, user, env, execcmd = None):	<= 修正
        self.user = user
        self.env = env
        self.execcmd = execcmd 	<= 追記
～～～省略～～～
        self.keyHandlers.update({
            '\x04':     self.handle_CTRL_D,
            '\x15':     self.handle_CTRL_U,
            '\x03':     self.handle_CTRL_C,
            '\x09':     self.handle_TAB,
            })

        if self.execcmd != None:
            print 'Running exec cmd "%s"' % self.execcmd
            self.cmdstack[0].lineReceived(self.execcmd)
            self.terminal.transport.session.conn.sendRequest(self.terminal.transport.session, 'exit-status', struct.pack('>L', 0))
            self.terminal.transport.session.conn.sendClose(self.terminal.transport.session)
            self.execcmd = None
            return
            # self.terminal.transport.session.conn.sendEOF(self)
            # self.terminal.transport.session.conn.transport.loseConnection()	<= 追記
～～～省略～～～
    def execCommand(self, protocol, cmd):
        cfg = config()
        if cfg.has_option('honeypot', 'exec_enabled'):
            if ( cfg.get('honeypot', 'exec_enabled') != "true" ):
                print 'exec disabled not executing command: "%s"' % cmd
                raise os.OSError
 
        print 'Executing command: "%s"' % cmd
        serverProtocol = LoggingServerProtocol(HoneyPotProtocol, self, self.env, cmd)
        serverProtocol.makeConnection(protocol)
        protocol.makeConnection(session.wrapProtocol(serverProtocol))	<= 追記
        raise NotImplementedError	<= 削除
～～～省略～～～
$ 
```