ICMPタイムスタンプ要求/応答のDROPを確認する
経緯
TCP Timestamp Optionの脆弱性 〜Linux/Windowsでの設定無効化、確認方法〜 | SEの道標
どうやら、IPアドレスを偽装してパケット送信するときにtimestampをいじくることで、なんやかんやでDos攻撃ができるらしい、と(くわしいことはわからん)。
この脆弱性を回避するために、LinuxでのICMP Timestampを無効化をしたい!という試み。
前提
・Ubuntu 16.04.5 LTS
・iptablesにパケットフィルタリング制御をかけた状態。(今のLinuxカーネルではICMP Timestampを無効化する設定はなくて、途中経路またはiptables等のファイヤウォールでDROPするのが定石らしい。)
ICMPのtype一覧
ICMP Type / Code一覧
今回、iptablesで無効化したのは下記の2つ。
・タイプ13の「タイムスタンプ(Timestamp)」
・タイプ14の「タイムスタンプ応答(Timestamp Reply)」
pingを叩いたら拒否されるはず!
ICMPタイムスタンプ要求・応答をDROPする設定はすでに完了してるから、クライアントからサーバへ向けてping叩いて反応を見てみよう。
想定では、タイムスタンプを返却しなくなっているはず。結果は?
$ ping -D -T tsandaddr 10.10.10.230 PING 10.10.10.230 (10.10.10.230) 56(124) bytes of data. [] 64 bytes from 10.10.10.230: icmp_seq=1 ttl=64 time=2.44 ms TS: 10.10.10.231 23700782 absolute 10.10.10.230 56400773 # 変わらずタイムスタンプを取得できちゃってる 10.10.10.230 0 10.10.10.231 -56400770 [] 64 bytes from 10.10.10.230: icmp_seq=2 ttl=64 time=2.66 ms TS: 10.10.10.231 23701785 absolute 10.10.10.230 56400773 10.10.10.230 0 10.10.10.231 -56400771 ...
あれ???タイムスタンプを取得できなくなるはずが、変わらず取得できちゃってる。
タイムスタンプ情報を返却させないための、サーバ側での設定が足りないのかな????
「タイムスタンプ」は、pingとICMPで意味が違う
調べたり聞いたりしていくうちに、pingでいう「タイムスタンプ」とICMPで使う「タイムスタンプ」は意味が違うらしい、ということを知った。
pingコマンドで使用されるのは、
・タイプ8の「エコー要求(Echo Request)」
pingでいうタイムスタンプは、その応答の中にある「Timestamp: <IPアドレス> : <時刻情報>」のこと。つまり、"ICMPタイムスタンプ"とはそもそもの意味が違うらしい。わたしは、ここを混同してたみたい。
今回、iptablesで無効化したのは前述の通り
・タイプ13の「タイムスタンプ(Timestamp)」
・タイプ14の「タイムスタンプ応答(Timestamp Reply)」
だったのに、わたしはpingで
・タイプ8の「エコー要求(Echo Request)」
を投げて、拒否されることを期待していたのね...
ICMPタイムスタンプリクエストを出せるツール
pingがダメなら、じゃあどうしたらICMPタイムスタンプ(タイプ13,14)を叩けるのか?
Linuxの標準のpingだったりその他コマンドでは、ICMPタイムスタンプリクエストが出せる機能は備わっていないらしく。どうやらサードパーティ製ツールを使えば、ICMPタイムスタンプリクエストを出せるとのこと。
・xprobe
・hping パケット生成が簡単にできるhpingコマンド - 無題の備忘録
(使い心地については、長くなるからまたちがうときに書く。今回のケースはhping3のほうが合った)
前述の通りiptablesにパケットフィルタリングをかけた状態で、hping3を使用したところ、ICMPタイムスタンプ応答がない(DROPされている)ことを確認できた。
$ sudo hping3 -1 -C 13 192.168.104.230 sudo: unable to resolve host hdn-master HPING 192.168.104.230 (enx4 192.168.104.230): icmp mode set, 28 headers + 0 data bytes # hping通ってない ^C
よかったバンザイ\(^o^)/
メモ
・ICMPタイムスタンプリクエストは、ICMPのタイプ13を使用し、タイプ14のタイムスタンプ応答を受け取り、リモートシステムから現在の時間を受け取る
・ICMPタイムスタンプで、参考にしたサイト覚書(読み返すよりググったほうが速いけどいちおう)
iptablesの読み方覚え書き - Qiita
hping3コマンドの使い方 - Qiita
TCP Timestamp Optionの脆弱性 〜Linux/Windowsでの設定無効化、確認方法〜 | SEの道標
pingのポート番号ってあるの?(結論:ない)
良く使うiptablesの運用管理方法2つをメモ(ここに書いてあったことできなかった。RedHat系のみ適用?)