ARP/DNS/SEOポイズニング(2014-10-04、更新:2016-11-30)
一緒くたにするのはどうかと思ったのですが、
中間者攻撃のメモを書いていたら、目的は似たようなものだと思ったのでまとめました。
・・・おや?追記しているうちに、すごく長い文章に。
一緒くたにするのは、まずかったか?
概要 †
ポイズニングというくらいだから、相手を毒のステータス異常にする攻撃。嘘です、半分ウソ。
毒というか、本来の正しいデータを不正なデータで上書きする攻撃手法です。
不正なデータとは、偽の通信相手情報のこと。
ユーザは、毒されていることに気付かずに、本来通信したかった相手と偽物を誤認してしまいます。
毒を仕掛けた偽物は、本物を装いつつ、ユーザの情報資源を盗もうとします。
イメージはオレオレ詐欺的な雰囲気ですかね。
周到に仕掛けられた攻撃に対しては、ユーザ側で対策することは難しいです。
よって、Webサイトやサーバ、ネットワークの管理者で対策することが必須になります。
共通して言える対策方法の一つは、
ユーザとWebサイト間での相互認証と暗号化があります。
特にWebサーバ側の身元証明は重要です(公開鍵基盤もその一例)。
金融機関なんかは色んな認証方式を試してますが、
言いかえると、
認証方式の甘いサイトは利用しない方が良いのだと思います。
以下、攻撃方法の説明です。
すこし難しい話かもしれません。
SEOポイズニング(Search Engine Optimization poisoning ) †
Web検索サイトの順位付けアルゴリズムを悪用して、
キーワードで検索した結果の上位に悪意のあるサイトを意図的に表示させる。
サイトは勿論、本物のサイトそっくりに偽装しておく。
URLを確認しないでクリックしてしまうユーザは偽物のサイトで、
例えばオンラインショッピングを楽しんだりしていたつもりが、
クレジットカード情報をごっそり抜き取られたりする。
攻撃手法は、良く分かりません ![[worried]](image/face/worried.png)
検索エンジンのアルゴリズムは一般には公開されないでしょうし。
SEO対策(検索エンジンの上位にランクインする)の為の本もたくさんあって、
SEO対策を請け負う業者も居るくらいだから、
メジャーな単語で検索上位になるのは結構難しいんじゃないかな~。
対策としては、少なくともURLやドメイン名 は確認すること。怪しいサイトには近づかないことですね。*1
DNSキャッシュポイズニング(DNS cache poisoning) †
DNSはドメイン名(null-i.net)とIPアドレス(219.94.~)を紐づける情報ですが、
ここに偽物のIPアドレスを上書きすることで、
ユーザは本物のURLをクリックしたのに偽物のサイトに誘導されるという手法です。
「DNSってな~に?」という説明はこちら
以下、攻撃手法の説明
DNS応答の偽装 †
DNSの問合せは、プロトコルが通常UDP*2なので、
TCPと違ってリクエストとレスポンスの関係は「コネクションレス」です。
セッションを接続するという概念が無いのです。
例えるなら、
電話みたいに「繋がっているの」ではなく、手紙みたいに一通一通(送信と返信)がバラバラに届く。
手紙って、相手からの返信が本人のものであるか証明する術がないですよね?そこがポイントになります。
DNSの流れと攻撃方法は以下
- 自分が知らないドメイン名があった場合は、
知ってそうなDNSサーバにDNS要求を出します。
例えば
「null-i.netって誰ですか?この人のIPアドレスを教えてください」
- DNSサーバは、DNS応答としてドメイン名に対応するIPアドレスなどの情報を返す。
このとき応答には、DNS要求に含まれた「ID(問合せ番号)」も添えて返す。
「問い合わせ番号○○番の方へ、null-i.net は "219.94.~" です」
- DNS応答を受け取った問合せ元は、この「ID」を見て、
(先ほどのDNS要求に対する正式な応答であるか判断して)
新しいDNS情報として覚えます(キャッシュします)
「null-i.net = 219.94.~ だな。覚えたぞ」
- よって、攻撃者は
DNS要求の発生後、正規のDNS応答が発生する前に、
推測した「ID」付きのの偽応答を、問合せ者に送りつける
「問い合わせ番号○○番(推測)の方へ、null-i.net は "192.168.~" です(嘘)」
- 攻撃を受けた(偽の応答を受け取った)問合せ者は
ドメイン名とIPアドレスの誤った組み合わせを覚えてしまう
以降は、正しいドメイン名(null-i.net)へアクセスした筈が、
おかしなIPアドレスへ接続されてしまう
対策はとして、DNSサーバの設定として、
上記の問合せに使うUDPの発信元ポート番号をランダムにすることで、
攻撃を受理する確率を下げます。
IDの組み合わせは1~65535番まで。
それに発信元ポート番号の49152~65535番を組み合わせて、
攻撃が成立する確率を約6万分の1から、10億分の1まで下げます。
もっと確実なのはDNSSECですが(DNS応答に署名をつける手法)
これは問合せ元と問合せ先の両方がDNSSECに対応していなければならず、普及にはもう暫くかかりそうです。
カミンスキー攻撃 †
Kaminskyさん考案の攻撃手法。先に言うと対策は、前述の通りポートのランダム化。
攻撃者は、攻撃対象のDNSサーバに
- DNSサーバが知らないドメイン名を問い合わせる
- DNSサーバは、答えを知ってそうな他の(上位の)DNSサーバへ問い合わせる
- 攻撃者は、問合せがが成立する前にDNSサーバに偽の応答を送りこむ
という手順を踏むのですが、
この方法は単純にやると1回失敗したら、2回目が続きません。
(null-i.netを問合せても、一回目の問い合わせの結果、
DNSサーバはnull-i.netの情報を既に持っているので(キャッシュしているので)、
上位のサーバへの問合せは発生し無い)
そこで、攻撃者は問合せ方を工夫します。
aaa.null-i.netとか、bbb.null-i.netとか毎回変えることで、
DNSサーバに毎回問合せを発生させることができる、
(null-i.net自体ではなく、
null-i.net内のaaa、bbbという「架空の」ドメインの場所を聞き続ける)
というのがカミンスキー攻撃のやり方です。
「架空」請求が何故成り立つのか違和感を覚えた方に、
補足すると、こうです。
- 「aaa.null-i.net」 は 「null-i.net」 のサブドメインで、
- 「null-i.net」 は 「 net 」 のサブドメイン、
- 「 net 」 は大元のドメイン(トップレベル・ドメイン:TLD*3)です。
aaa.null-i.net は null-i.net 子(サブドメイン)なので、
null-i.net と同じIPアドレスに住んでいるかもしれないし、
別居している子かもしれないし、
そもそもそんな子はいないかもしれない。
それが分からないので、結局問い合わせるしかない、という理屈です。
ファーミング詐欺 †
フィッシング詐欺(釣り)と違って、こちらは農業*5。
フィッシングは、攻撃対象に罠となるURLリンクをクリックさせて釣るのに対して、
ファーミングでは、上記のキャッシュポイズニングで本物のURLをクリックさせて、罠のサイトに誘導する。
怪しいメールで積極的に釣るのではなく、一度罠を構築したら収穫を待てばいい、という点が農業っぽい?らしいです。
hostsファイルの改変 †
これはキャッシュポイズニングでは無いのですが、
前述のようなまどろっこしい(?)やり方よりも手っ取り早い方法です。
WindowsでもUnixでも、ドメイン名とIPアドレスを紐づける為の「hosts」ファイルが存在しています。
手書きにせよウィルスにせよ、このファイルを直接書き換えてしまえば
DNSキャッシュよりも優先して嘘の情報を流しこめます。
対策は・・・やっぱり、ウィルスに感染しないことでしょうか。
あと、hostsファイルは管理者権限で書き換えることができるので、管理者IDは大切に扱いましょう。
DNSサーバ自体の詐称 †
これもキャッシュポイズニングでは無いのですが、
前述の観点は主に外部からの攻撃、でもウィルス・マルウェアはパソコン内部から攻撃します。
本来パソコンが参照するべきDNSサーバを、「俺がそのDNSサーバだよ!」って詐称するのです。
以下、攻撃の一例
- 多くの場合、パソコンはLANケーブルや無線LANに繋いぐと、
自動的にインターネットまで繋がるようになると思います。
- これは、DHCPというシステムで、
パソコンにIPアドレスやDNSサーバの場所を自動で教えてくれる係の人がいるからです。
- そこで、悪いシステムを組み込んだUSBメモリをパソコンに差し込みます。
このUSBメモリは、「俺がそのDHCPの係だよ」「DNSサーバも俺だよ」と
パソコンに嘘の情報を流し込みます。
- パソコンは偽のDNS情報で、偽のサイトへアクセス誘導されるようになります。
USBメモリはあくまで一例で、ウィルスがその役割を担うこともあります。
対策としては、ウィルス対策ソフトはもちろんですが、
まずは、怪しい機器や身元がわからない機器はパソコンに接続しないことにしましょう。
ARPキャッシュポイズニング(ARP cache poisoning) †
まず、ARP(Address Resolution Protoco)ですが。
これは製品出荷時に割り振られている識別コードとIPアドレスを紐づける為の情報です。
つまり、
通信機器はIPアドレスの前に、MACアドレスで通信しているとも言えます。
このARPなのですが、悪い意味で純粋無垢な子なので、ある端末が
「IPアドレス xx.xx.xx.xx に紐づくMACアドレスは俺の YY.YY.YY.YY だヨ」
と言われると、即信じます。
このIPアドレスがインターネットへの入り口(デフォルトゲートウェイ)だったりすると、
すべてのインターネットへの通信はこの偽物の YY.YY.YY を経由することになり、
YY.YY.YY は盗聴し放題ということになります(この手口をARPスプーフィングと言います)。
ARP(というかMACアドレスで通信するEthernet)は
データリンク層の通信なので~ルータを超えることはできません。
言いかえると、
ARPスプーフィングを仕掛ける攻撃元は必ず近く(同じLAN上)に居ます、インターネット上ではなく。
獅子身中の虫ってやつです。
ゆえに攻撃者(キャッシュポイズニングを仕掛ける者)は、
- 狙った端末が存在する、例えば同じ社内LAN上の別のPCとかに、
ARPスプーフィングを行うウィルス等を感染させます。
- 感染してしまったPCは、ARPスプーフィングを行います。
- 他のPCは、この感染した偽PCが通信相手だと勘違いして、以降の通信は偽PCへ送信してしまいます
- 偽PCは、通信の撹乱が目的ならそのまま黙っているもよし、
盗聴が目的なら受け取った通信を本来の正しい通信相手に転送するもよし
対策としては、
ARPスプーフィング対応の製品を導入すること。ウィルスに感染しないこと。
あと、ARPは後に送信された情報に上書きされるから、
ARPスプーフィングするならマメに偽ARPを飛ばす必要があるので、
通信量が異常に増すことを監視機器で検知できる可能性も無きにしも非ず。