「ポートスキャンしたらsshが100個見えるようにしてみた」をやってみた
突然の100個のssh
_人人人人人人人人人人_ > 突然の100個のssh <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
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にポートリダイレクトを定義すればいい…と…
すみません、先ほどの例はわかりにくいかったですね。訂正です。
— ねこさん⚡🔜Ͷow or Ͷever🔙(ΦωΦ) (@catnap707) January 26 2020
例えば、cowrie(SSHハニーポット)を2222/tcpで待ち受けて、100個のポートリダイレクトを設定するイメージでしょうか。https://t.co/8aikpkt5ul
Memo¶
雑記帳 - cowrieはkippoを改良したSSHハニーポット
http://yagamikou.hateblo.jp/entry/2015/09/25/015735
コメント