プロジェクト

全般

プロフィール

KippoBrinker » 履歴 » バージョン 1

kanata, 2025/04/13 13:56

1 1 kanata
# KippoBrinker
2
3
{{toc}}
4
5
結論だけ見たい人は最後の「第7回 ハニーポッター技術交流会(2020/1/25)で得た知見」を見て~
6
7
8
---
9
10
先日、[すみだセキュリティ勉強会2015#2に参加してきました](https://raintrees.net/news/37)
11
12
すみだセキュリティ勉強会2015#2
13
http://ozuma.sakura.ne.jp/sumida/2015/08/20152.html
14
15
ろば電子が詰まっている
16
http://d.hatena.ne.jp/ozuma/20150829/1440837066
17
18
その中で、以下の知見を得ることができました。
19
20
## sshのポートをデフォルトの22/tcpから変えるべきか論争
21
22
- sshのポートは、やっぱり22/tcpから変えましょう
23
- プリンタポート…具体的には9100/tcpから9107/tcpの8つのポートにするだけで隠れることができる
24
9100/tcpはプリンタが使うポートで、一部の機種ではここに送られたデータをそのまま印刷するという機能を持ちます。バージョン情報取得のため、nmapでスキャンをすると大量の印刷をしてしまうおそれがあるため、デフォルトでスキャン対象していない。ため。
25
26
- ポートスキャンをしても一発で分からないようにすればいい
27
- ssh分身の術により、大量のsshを見せる
28
29
```
30
_人人人人人人人人人人_ 
31
> 突然の100個のssh <
32
  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
33
```
34
35
36
37
**やってみた。**
38
以下は、CentOS7で動作確認しています。
39
40
41
# kippo
42
43
## kippoとは
44
45
kippoとはsshっぽく振る舞うハニーポット
46
python(ver2系)製
47
48
## kippoのインストール
49
50
### 必要なパッケージのインストール
51
52
```
53
# yum install python-devel
54
```
55
56
### virtualenvによる仮想環境の作成(別に直でも問題ない)
57
58
virtualenvによる仮想環境を作ると、必要環境をユーザ環境にインストールできるようになる。
59
よく解らない人は、[[python]]を参照。
60
61
```
62
$ mkdir kippo
63
$ virtualenv --no-site-packages kippo
64
$ cd kippo
65
$ source bin/activate
66
(kippo)$
67
```
68
69
ちなみに仮想環境抜ける時は、以下ね。
70
71
```
72
(kippo)$ deactivate
73
74
```
75
76
### 必要パッケージのインストール&kippoセットアップ
77
78
仮想環境に必要パッケージをインストールする。
79
twistedは、最新バージョンだと動かないので注意。
80
起動時にFailed to load application: 'module' object has no attribute 'IPluggableAuthenticationModules'
81
というエラーが出る場合、どうやら Twisted のバージョンの問題らしい。15.2.0 を入れることで解決する。
82
83
84
```
85
(kippo)$ pip install twisted==15.2.0
86
(kippo)$ pip install PyCrypto
87
(kippo)$ pip install pyasn1
88
(kippo)$ git clone https://github.com/desaster/kippo
89
(kippo)$ cp -i kippo.cfg.dist kippo.cfg
90
(kippo)$ ./start.sh
91
```
92
93
起動したら、セットアップ完了。動作を確認してみる。
94
95
```
96
$ ssh localhost -p 2222
97
```
98
99
root:123456でログインできる。
100
101
### 動作確認後
102
103
動作が確認できたら、以下をやっておこう。
104
105
停止
106
107
```
108
(kippo)$ sh ./stop.sh
109
```
110
111
root:123456でログインできないようにする。
112
113
```
114
(kippo)$ cd data
115
(kippo)$ cp -pi userdb.txt  userdb.txt.org
116
(kippo)$ vi userdb.txt
117
118
- root:0:123456
119
+ [でたらめな文字列]:0:[でたらめな文字列]
120
```
121
122
123
# kippoBrinkerSumida
124
125
## 概要
126
127
kippoは、通常は1つの環境しか立ち上げられない。
128
それを複数起動可能にするシェルスクリプトを作ってみた。
129
130
## インストール&セットアップ
131
132
kippoインストール先に、以下のファイルを置く。
133
134
attachment:kippoBrinkerSumida.sh
135
attachment:kippoBrinkerStop.sh
136
137
実行権を付与する。
138
139
```
140
(kippo)$ chmod u+x kippoBrinkerSumida.sh
141
(kippo)$ chmod u+x kippoBrinkerStop.sh
142
```
143
144
ダミーとして起動したいポート番号を指定する。
145
146
```
147
(kippo)$ vi kippoBrinkerSumida.sh
148
- KIPPO_PORT_LIST="1020 1021 1022 1023 1024 1025" # ダミーsshdのポートリスト
149
+ KIPPO_PORT_LIST="任意のポート番号1 任意のポート番号2 任意のポート番号3..." # ダミーsshdのポートリスト
150
```
151
152
sshのバナーを合わせる。
153
自分のサーバのsshのバナーに合わせておかないと偽物だってバレちゃうので、自分のsshサーバのバナーを確認する。
154
155
```
156
$ telnet localhost 22
157
Trying ::1...
158
Connected to localhost.
159
Escape character is '^]'.
160
SSH-2.0-OpenSSH_6.7
161
```
162
163
上の結果だと、SSH-2.0-OpenSSH_6.7 がそれ。
164
確認したらCtrl+cで抜ける。
165
166
確認結果を設定する。
167
168
```
169
(kippo)$ vi kippoBrinkerSumida.sh
170
- SSH_VERSION_STRING="SSH-2.0-OpenSSH_6.6.1"
171
+ SSH_VERSION_STRING="SSH-2.0-OpenSSH_6.7"
172
```
173
174
このまま真似しないでね。みんなの環境とは、それぞれバージョンが違うはずだから。
175
176
## 起動
177
178
以下、実行するだけ。
179
180
```
181
(kippo)$ ./kippoBrinkerSumida.sh
182
```
183
184
起動完了後に、実際にsshっぽく見えるか確認してみよう。
185
186
```
187
$ telnet localhost [設定したポート番号]
188
```
189
190
### ウェルノンポートを指定してダミーを起動したい場合
191
192
まず、前提としてkippoはユーザ権限で起動した方がいい。
193
万が一、kippoに脆弱性があった時に、root権限だったりすると死ぬ。
194
195
しかし、ユーザ権限ではウェルノンポート(0~1023のポート番号)をBINDできない。
196
でもウェルノンポートで起動したい場合もあるよね。
197
Linuxの機能により、以下の方法でrootの一部権限をファイルに付与できる。
198
199
ウェルノンポートでBINDする権限を付与
200
201
```
202
# setcap CAP_NET_BIND_SERVICE+ep /[virtualenv環境]/bin/python
203
```
204
205
確認は以下
206
207
```
208
# getcap /[virtualenv環境]/bin/python
209
# /[virtualenv環境]/bin/python = cap_net_bind_service+ep
210
```
211
212
権限剥奪は以下
213
214
```
215
# setcap -r /[virtualenv環境]/bin/python
216
```
217
218
219
## 停止
220
221
以下、実行するだけ。
222
223
```
224
(kippo)$ ./kippoBrinkerStop.sh
225
```
226
227
228
229
230
# kippoBrinker
231
232
## 概要
233
234
kippoBrinkerSumidaには、1つデメリットがあって、ダミーsshを増やした分、プロセスが増えてリソースを圧迫します。
235
100個とかあげたら、それはもぅ大変な無駄遣いになりそう。
236
そこで、こいつの登場です。こんな動きをします。
237
本物sshサーバは、22番からポート番号を変更している前提です。
238
239
- ダミープロセスが、22番ポート(変更可)を開いて待ち受ける。釣りである。勝手にアクセスしてくる奴は悪意があると判断する。
240
- 接続してきた奴がいたら、すぐさまコネクションを切断する。
241
- すぐさまkippoをポート番号ランダムで25個(変更可)立ち上げる。
242
- 30分したら、25個のダミーsshは落とす。
243
- 再び、22番ポートで、釣り。最初に戻る。
244
245
これなら、リソースを無駄に消費している状況が30分に抑えられます。
246
まぁ、しつこくアクセスしてきたら変わらないんですけどね。
247
248
249
250
## インストール&セットアップ
251
252
kippoインストール先に、以下のファイルを置く。
253
kippoBrinkerStop.shは、kippoBrinkerSumida.shと共用なので、導入済みならやらなくていい。
254
255
attachment:kippoBrinker.sh
256
attachment:kippoBrinker.txt
257
attachment:kippoBrinkerDummyEntry.py
258
attachment:kippoBrinkerStop.sh
259
260
実行権を付与する。
261
262
```
263
(kippo)$ chmod u+x kippoBrinker.sh
264
(kippo)$ chmod u+x kippoBrinkerStop.sh
265
```
266
267
ダミー待受ポート番号、起動するkippoの多重度を、必要に応じて編集する。
268
269
```
270
(kippo)$ vi kippoBrinker.sh
271
MY_IP_ADDR=`hostname -i|head -1|cut -d' ' -f2`  # 自分のIPアドレスを設定(このIPでBINDする)
272
PROC_NUM="25"   # ダミーsshdを何個立ち上げるか
273
EXEMPT_PORT_LIST="80 443"     # ダミーsshdの対象外ポート
274
DUMMY_ENTRY_PORT="22"   # ダミー待ち受けポート
275
```
276
277
sshのバナー情報を設定する。デフォルトでいくつか入れてあります。
278
kippoBrinker.shは、ここからランダムに選択してダミーを起動する。
279
古くなったら、適宜新しいバージョンのバナーを追加するとよいだろう。
280
281
```
282
$ cat kippoBrinker.txt 
283
SSH-2.0-OpenSSH_6.7p1 Debian-5
284
SSH-2.0-OpenSSH_6.7
285
SSH-2.0-OpenSSH_6.6.1
286
SSH-2.0-OpenSSH_6.2
287
SSH-2.0-OpenSSH_6.0
288
SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1
289
SSH-2.0-OpenSSH_5.9
290
SSH-2.0-OpenSSH_5.8p2_hpn13v11 FreeBSD-20110503
291
SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu5
292
SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu6
293
SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu7
294
SSH-2.0-OpenSSH_5.5p1 Debian-6
295
SSH-2.0-OpenSSH_5.5p1 Debian-6+squeeze1
296
SSH-2.0-OpenSSH_5.5p1 Debian-6+squeeze2
297
SSH-2.0-OpenSSH_5.3
298
```
299
300
### ウェルノンポートを指定してダミーを起動したい場合
301
302
上のkippoBrinkerSumidaと同じ。
303
304
## 起動
305
306
以下、実行するだけ。
307
308
```
309
(kippo)$ ./kippoBrinker.sh
310
```
311
312
以下、やってみると動作を確認できる。
313
すぐさま切断されて、kippoが起動していく。
314
315
```
316
telnet localhost 22
317
```
318
319
## 停止
320
321
以下、実行するだけ。
322
kippoBrinkerSumida.shで実行してある分があれば、もろとも一緒に停止する。
323
324
```
325
(kippo)$ ./kippoBrinkerStop.sh
326
```
327
328
# 第7回 ハニーポッター技術交流会(2020/1/25)で得た知見
329
330
[第7回 ハニーポッター技術交流会](https://hanipo-tech.connpass.com/event/160302/)で登壇しました
331
332
{{rawhtml(<div class="iframely-embed"><div class="iframely-responsive" style="height: 140px; padding-bottom: 0;"><a href="https://hanipo-tech.connpass.com/event/160302/" data-iframely-url="//cdn.iframe.ly/qR9wn4e?iframe=card-small"></a></div></div><script async src="//cdn.iframe.ly/embed.js" charset="utf-8"></script>)}}
333
334
すごいね…難読化シェル芸の時もそうでしたが、技術って発信すると集まってくる…最高
335
336
つまりですね…こういう小難しいことしなくて良かったんです(5年間気づかなかった)
337
338
iptablesにポートリダイレクトを定義すればいい…と…
339
340
{{rawhtml(<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">すみません、先ほどの例はわかりにくいかったですね。訂正です。<br>例えば、cowrie(SSHハニーポット)を2222/tcpで待ち受けて、100個のポートリダイレクトを設定するイメージでしょうか。<a href="https://t.co/8aikpkt5ul">https://t.co/8aikpkt5ul</a></p>&mdash; ねこさん⚡🔜Ͷow or Ͷever🔙(ΦωΦ) (@catnap707) <a href="https://twitter.com/catnap707/status/1221248463569948674?ref_src=twsrc%5Etfw">January 26 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}}
341
342
# Memo
343
344
雑記帳 - cowrieはkippoを改良したSSHハニーポット
345
http://yagamikou.hateblo.jp/entry/2015/09/25/015735