KippoBrinker

結論だけ見たい人は最後の「第7回 ハニーポッター技術交流会(2020/1/25)で得た知見」を見て~


先日、すみだセキュリティ勉強会2015#2に参加してきました

すみだセキュリティ勉強会2015#2
http://ozuma.sakura.ne.jp/sumida/2015/08/20152.html

ろば電子が詰まっている
http://d.hatena.ne.jp/ozuma/20150829/1440837066

その中で、以下の知見を得ることができました。

sshのポートをデフォルトの22/tcpから変えるべきか論争

  • sshのポートは、やっぱり22/tcpから変えましょう
  • プリンタポート…具体的には9100/tcpから9107/tcpの8つのポートにするだけで隠れることができる
    9100/tcpはプリンタが使うポートで、一部の機種ではここに送られたデータをそのまま印刷するという機能を持ちます。バージョン情報取得のため、nmapでスキャンをすると大量の印刷をしてしまうおそれがあるため、デフォルトでスキャン対象していない。ため。

  • ポートスキャンをしても一発で分からないようにすればいい

  • ssh分身の術により、大量のsshを見せる

_人人人人人人人人人人_ 
> 突然の100個のssh <
  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

やってみた。
以下は、CentOS7で動作確認しています。

kippo

kippoとは

kippoとはsshっぽく振る舞うハニーポット
python(ver2系)製

kippoのインストール

必要なパッケージのインストール

# yum install python-devel

virtualenvによる仮想環境の作成(別に直でも問題ない)

virtualenvによる仮想環境を作ると、必要環境をユーザ環境にインストールできるようになる。
よく解らない人は、pythonを参照。

$ mkdir kippo
$ virtualenv --no-site-packages kippo
$ cd kippo
$ source bin/activate
(kippo)$

ちなみに仮想環境抜ける時は、以下ね。

(kippo)$ deactivate

必要パッケージのインストール&kippoセットアップ

仮想環境に必要パッケージをインストールする。
twistedは、最新バージョンだと動かないので注意。
起動時にFailed to load application: 'module' object has no attribute 'IPluggableAuthenticationModules'
というエラーが出る場合、どうやら Twisted のバージョンの問題らしい。15.2.0 を入れることで解決する。

(kippo)$ pip install twisted==15.2.0
(kippo)$ pip install PyCrypto
(kippo)$ pip install pyasn1
(kippo)$ git clone https://github.com/desaster/kippo
(kippo)$ cp -i kippo.cfg.dist kippo.cfg
(kippo)$ ./start.sh

起動したら、セットアップ完了。動作を確認してみる。

$ ssh localhost -p 2222

root:123456でログインできる。

動作確認後

動作が確認できたら、以下をやっておこう。

停止

(kippo)$ sh ./stop.sh

root:123456でログインできないようにする。

(kippo)$ cd data
(kippo)$ cp -pi userdb.txt  userdb.txt.org
(kippo)$ vi userdb.txt

- root:0:123456
+ [でたらめな文字列]:0:[でたらめな文字列]

kippoBrinkerSumida

概要

kippoは、通常は1つの環境しか立ち上げられない。
それを複数起動可能にするシェルスクリプトを作ってみた。

インストール&セットアップ

kippoインストール先に、以下のファイルを置く。

kippoBrinkerSumida.sh
kippoBrinkerStop.sh

実行権を付与する。

(kippo)$ chmod u+x kippoBrinkerSumida.sh
(kippo)$ chmod u+x kippoBrinkerStop.sh

ダミーとして起動したいポート番号を指定する。

(kippo)$ vi kippoBrinkerSumida.sh
- KIPPO_PORT_LIST="1020 1021 1022 1023 1024 1025" # ダミーsshdのポートリスト
+ KIPPO_PORT_LIST="任意のポート番号1 任意のポート番号2 任意のポート番号3..." # ダミーsshdのポートリスト

sshのバナーを合わせる。
自分のサーバのsshのバナーに合わせておかないと偽物だってバレちゃうので、自分のsshサーバのバナーを確認する。

$ telnet localhost 22
Trying ::1...
Connected to localhost.
Escape character is '^]'.
SSH-2.0-OpenSSH_6.7

上の結果だと、SSH-2.0-OpenSSH_6.7 がそれ。
確認したらCtrl+cで抜ける。

確認結果を設定する。

(kippo)$ vi kippoBrinkerSumida.sh
- SSH_VERSION_STRING="SSH-2.0-OpenSSH_6.6.1"
+ SSH_VERSION_STRING="SSH-2.0-OpenSSH_6.7"

このまま真似しないでね。みんなの環境とは、それぞれバージョンが違うはずだから。

起動

以下、実行するだけ。

(kippo)$ ./kippoBrinkerSumida.sh

起動完了後に、実際にsshっぽく見えるか確認してみよう。

$ telnet localhost [設定したポート番号]

ウェルノンポートを指定してダミーを起動したい場合

まず、前提としてkippoはユーザ権限で起動した方がいい。
万が一、kippoに脆弱性があった時に、root権限だったりすると死ぬ。

しかし、ユーザ権限ではウェルノンポート(0~1023のポート番号)をBINDできない。
でもウェルノンポートで起動したい場合もあるよね。
Linuxの機能により、以下の方法でrootの一部権限をファイルに付与できる。

ウェルノンポートでBINDする権限を付与

# setcap CAP_NET_BIND_SERVICE+ep /[virtualenv環境]/bin/python

確認は以下

# getcap /[virtualenv環境]/bin/python
# /[virtualenv環境]/bin/python = cap_net_bind_service+ep

権限剥奪は以下

# setcap -r /[virtualenv環境]/bin/python

停止

以下、実行するだけ。

(kippo)$ ./kippoBrinkerStop.sh

kippoBrinker

概要

kippoBrinkerSumidaには、1つデメリットがあって、ダミーsshを増やした分、プロセスが増えてリソースを圧迫します。
100個とかあげたら、それはもぅ大変な無駄遣いになりそう。
そこで、こいつの登場です。こんな動きをします。
本物sshサーバは、22番からポート番号を変更している前提です。

  • ダミープロセスが、22番ポート(変更可)を開いて待ち受ける。釣りである。勝手にアクセスしてくる奴は悪意があると判断する。
  • 接続してきた奴がいたら、すぐさまコネクションを切断する。
  • すぐさまkippoをポート番号ランダムで25個(変更可)立ち上げる。
  • 30分したら、25個のダミーsshは落とす。
  • 再び、22番ポートで、釣り。最初に戻る。

これなら、リソースを無駄に消費している状況が30分に抑えられます。
まぁ、しつこくアクセスしてきたら変わらないんですけどね。

インストール&セットアップ

kippoインストール先に、以下のファイルを置く。
kippoBrinkerStop.shは、kippoBrinkerSumida.shと共用なので、導入済みならやらなくていい。

kippoBrinker.sh
kippoBrinker.txt
kippoBrinkerDummyEntry.py
kippoBrinkerStop.sh

実行権を付与する。

(kippo)$ chmod u+x kippoBrinker.sh
(kippo)$ chmod u+x kippoBrinkerStop.sh

ダミー待受ポート番号、起動するkippoの多重度を、必要に応じて編集する。

(kippo)$ vi kippoBrinker.sh
MY_IP_ADDR=`hostname -i|head -1|cut -d' ' -f2`  # 自分のIPアドレスを設定(このIPでBINDする)
PROC_NUM="25"   # ダミーsshdを何個立ち上げるか
EXEMPT_PORT_LIST="80 443"     # ダミーsshdの対象外ポート
DUMMY_ENTRY_PORT="22"   # ダミー待ち受けポート

sshのバナー情報を設定する。デフォルトでいくつか入れてあります。
kippoBrinker.shは、ここからランダムに選択してダミーを起動する。
古くなったら、適宜新しいバージョンのバナーを追加するとよいだろう。

$ cat kippoBrinker.txt 
SSH-2.0-OpenSSH_6.7p1 Debian-5
SSH-2.0-OpenSSH_6.7
SSH-2.0-OpenSSH_6.6.1
SSH-2.0-OpenSSH_6.2
SSH-2.0-OpenSSH_6.0
SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1
SSH-2.0-OpenSSH_5.9
SSH-2.0-OpenSSH_5.8p2_hpn13v11 FreeBSD-20110503
SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu5
SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu6
SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu7
SSH-2.0-OpenSSH_5.5p1 Debian-6
SSH-2.0-OpenSSH_5.5p1 Debian-6+squeeze1
SSH-2.0-OpenSSH_5.5p1 Debian-6+squeeze2
SSH-2.0-OpenSSH_5.3

ウェルノンポートを指定してダミーを起動したい場合

上のkippoBrinkerSumidaと同じ。

起動

以下、実行するだけ。

(kippo)$ ./kippoBrinker.sh

以下、やってみると動作を確認できる。
すぐさま切断されて、kippoが起動していく。

telnet localhost 22

停止

以下、実行するだけ。
kippoBrinkerSumida.shで実行してある分があれば、もろとも一緒に停止する。

(kippo)$ ./kippoBrinkerStop.sh

第7回 ハニーポッター技術交流会(2020/1/25)で得た知見

第7回 ハニーポッター技術交流会で登壇しました

すごいね…難読化シェル芸の時もそうでしたが、技術って発信すると集まってくる…最高

つまりですね…こういう小難しいことしなくて良かったんです(5年間気づかなかった)

iptablesにポートリダイレクトを定義すればいい…と…

Memo

雑記帳 - cowrieはkippoを改良したSSHハニーポット
http://yagamikou.hateblo.jp/entry/2015/09/25/015735

kippoBrinker.sh Magnifier - 突然100個のssh起動シェル (2.493 KB) kanata, 2015/10/25 09:35

kippoBrinker.txt Magnifier - sshバージョンヘッダ定義ファイル (558 Bytes) kanata, 2015/10/25 09:36

kippoBrinkerDummyEntry.py Magnifier - ダミエントリー (734 Bytes) kanata, 2015/10/25 09:36

kippoBrinkerStop.sh Magnifier - kippoBrinkerSumida.sh,kippoBrinker.sh停止シェル (417 Bytes) kanata, 2015/11/03 09:07

kippoBrinkerSumida.sh Magnifier - kippoの多重起動 (707 Bytes) kanata, 2015/11/03 09:10

クリップボードから画像を追加 (サイズの上限: 100 MB)