ブログ/こばさんの wakwak 山歩き

2017-11-28 SIP 攻撃で 050 発信不能にされたので、国外IP を全て弾いてやった

SIP 攻撃で 050 発信不能にされたので、国外IP を全て弾いてやった

| SIP 攻撃で 050 発信不能にされたので、国外IP を全て弾いてやったを含むブックマーク

 我が家は未だに ADSL でして、そのルーターはヤマハ RT58i なんですが、NTT 0XY番号のほか、IP電話(ISP提供の 050)も利用しています。


 黒電話 on RT58i って記事を書いたのがついこの前のように感じていたのですが、もうすぐで8年。

 着信拒否に登録した電話番号数が200を超えたくらいで、基本的には運用形態は当時のままです。

 ADSLモデムは何度か買い換えているものの、ヤマハルーターは本当に壊れないですね。

 もし将来、フレッツ光ネクストに移行することがあれば、NVR500(NVR510) を指名買いさせて頂きます!


 さて、RT58i ですが

  • 市内へは普通にNTT網にて
  • 市外へは 050 を使うが不通時は NTT網 に迂回
  • 携帯へは 0039 を付与したうえでNTT網にて

という風にルーティング定義しています。


 ほとんど放置状態なんですが、超久しぶりにルーターに telnet で入って show log してみたんですよ。

 そしたら・・・

[SIP] SIP Call to [sip:06xxxxxxxx@xxx.xxxxx.ne.jp] from [sip:050xxxxxxxx] rejected with cause NO CHANNEL (3034).

ってログが割と残ってるじゃないですか。

 050 で発信できなかったことを意味するログです。


 おいおい、いつの間にかプロバイダのIP電話サービスが終了してたのか?って確認したら、050 同士の無料範囲が狭まったという残念な事実を知ってしまったものの、とりあえずはサービスは続行してるみたい。

 じゃあ、いつから NO CHANNEL になってるだい?って追っかけみたら

[SIP] SIP Call from [sip:c@218.xxx.xxx.xxx] to [sip:+90041315281818@192.168.1.1] rejected.

[SIP] SIP Call from [sip:c@218.xxx.xxx.xxx] to [sip:++41315281818@192.168.1.1] rejected.

[SIP] SIP Call from [sip:trunk@218.xxx.xxx.xxx] to [sip:011+41315281818@192.168.1.1] rejected.

[SIP] SIP Call from [sip:test@218.xxx.xxx.xxx] to [sip:00+41315281818@192.168.1.1] rejected.

みたいな風がトリガーであると発覚。

(218.xxx.xxx.xxx はプロバイダから割り当てられた自ルーターのグローバルアドレス)


 知らん間に SIP 攻撃を受けていたぜ


 ログによれば正常に rejected されたぽいし、クレカの請求額も常識的な範囲内であることから、経済的損失はなかったと推定されるものの、この攻撃を食らうと 050 への発信が出来なくなってしまうみたいです。

※050 への着信は皆無なため当方では確認できませんでしたが、着信も不能にされていたかもしれません。


 どうも同様の攻撃は 11/13 付近から始まっていたものの毎朝未明に reboot するようにスケジュール登録していたため翌朝には勝手に回復してしまい、また普段から家の電話で発信する頻度が少なかったことと相まって、050 発信不能に気がつくことなく過ごしてきましたが、ヤマハルーターの SIP 実装に何らかの脆弱性があるのは確実で、かつ RT58i はサポート終了しているので自力で何らかの緩和策を取らないと危険です。


 ファームウェアを弄るのは不可能なので、どうしたものか・・・

 きっと攻撃者は日本人じゃないはず・・・

という思い切った仮説のもと、国外IP を全ブロックするフィルターを書いてみることにしました。


※ファイル形式にてのダウンロードは こちら


 0.0.0.0/8 の扱いはよく分からないので放置(笑)

 単純にこれだけを ip pp secure filter in に当てるとブラウジングも不能になるので、

ip filter 200 pass * * tcp * 5060

ip filter 201 pass * * udp * 5004-5035,5060

ip filter 300 reject * * udp,tcp 135,netbios_ns-netbios_ssn,445 *

ip filter 999 pass * * * * *

ip filter dynamic 10 * * tcp

ip filter dynamic 11 * * udp

としたうえで、外に繋がってる pp に対してフィルターを適用します。

ip pp secure filter in 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 200 201

ip pp secure filter out 300 999 dynamic 10 11

 内側から外に出て行くパケット(と、その戻り)は、ほぼ全スルーという、かなりユルユル設定ですが、その辺は各自で追い込んで頂くとして、ひとまずは海外からのSIP攻撃は防ぐことができます。


 WEBサーバーを設置・公開していて、それは国外OKにしたいなら、100 の前に 80/tcp や 443/tcp を pass するフィルターを追加してやって下さい。

 また、22/tcp や 500/udp・4500/udp 等々を公開していて、それらを国内限定にしたい場合は、200・201 付近を参考にして後ろの方に追加してやって下さい。


 攻撃そのものを防げるわけじゃないですけど、少なくとも国内IPからならば、日本の警察を動かすことができますから。


 IPアドレスの範囲は定期的に変わるので、その更新を含めて何とか自動化させたいですよね。

 って焦らしつつも実のところ概ね目処は立ってるんですが、さて、これをボランティアで無料公開すべきなのかどうか・・・


 商売と無関係な個人の方々の細々とした用途には広く活用してもらいたいけど、ボランティアを利用して自らの利益を最大化しようと企む輩の手駒にはなりたくない・・・

 うーん、ジレンマですな。しばらく悩んでみよう。


 それはそうと、114KB ものフィルターリストを追加で突っ込んでも、(少なくとも体感上では)特に速度が悪化することなく、何事もなかったかのように普通に動いてしまうヤマハルーターって、真剣に凄いですわ。

通りすがり通りすがり 2017/11/30 07:27 海外からの攻撃を緩和する手段の一つとして興味を持って拝見させていただきました。
一つ質問があるのですが「日本のみをpass」じゃなくて「日本以外をreject」という風にするのは何か特別な理由があるのでしょうか。

こばさんこばさん 2017/11/30 14:04 こんにちは。
たとえば、5060/tcp と 5004-5035/udp と 5060/udp を、日本からだけ pass という風で定義しようとすると

ip filter 100 pass [日本のアドレス] * tcp * 5060
ip filter 200 pass [日本のアドレス] * udp * 5004-5035,5060

って、2行書かないといけなくなります。
つまりフィルターリストが 2倍 に膨れちゃうんです。

これに加えて、例えば PPTP の GRE も国内のみ通したかったら

ip filter 300 pass [日本のアドレス] * gre

という風になり、フィルターリストが3倍になっちゃいます。

終点アドレスを * じゃなくて、ルーターは 192.168.1.1 で 22/tcp は別のマシンだから・・・なんて贅沢を言い出すと

ip filter 100 pass [日本のアドレス] 192.168.1.1 tcp * 5060
ip filter 200 pass [日本のアドレス] 192.168.1.1 udp * 5004-5035,5060
ip filter 300 pass [日本のアドレス] 192.168.1.1 gre
ip filter 400 pass [日本のアドレス] 192.168.1.2 tcp * 22

って感じで、増殖し続けちゃいます。
[日本のアドレス] の数は [日本以外のアドレス] よりも少ないですが、それでも 2000〜3000 くらいあった気がするので、ちょっとした違いで何倍にも膨れるのはさすがにキツイと思います。

ヤマハのフィルターは先頭から順番に評価していって、条件に該当したところで pass や reject で振り落とされる(以降のフィルターは評価しない)という風なので

1.起点にかかわらず制限なく受け入れるポートの pass 定義
2.起点が国外なIPの reject 定義
3.その他 pass 定義(国外は 2.で振るい落とされているので、国内起点を想定して)

って大きく3ブロックに分けることにして、この順番に評価させると無駄なく行えます。
1. と 3. とは、終点アドレスを明示したり SYN パケットまで確認したり、好きなだけ追い込んでもらっても全く平気。

こんな意図で、わざわざ「日本以外をreject」というリストにすることにしました。