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>— ねこさん⚡🔜Ͷ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 |