Networkについて
OSI参照モデル--------------|
| アプリケーション層 | <- HTTP通信はここ
| プレゼンテーション層 |
| セッション層 | <- Cとかで扱うソケットはこの層
|------------------------|
| トランスポート層 | <- TCP/UDP通信はここ,トランスポートプロトコルを提供
| |
|------------------------|
| | <- IP(IPプロトコル)はここ、パケットレベルの通信を扱う
| ネットワーク層 | ICMP(Pingとかで使うプロトコル)はこの層を使う
| | パケットサイズに制限がある場合のパケット分割機能も提供している。
| | コネクションの維持、パケットの確実な配送の確立はトランスポート層が担う。
|------------------------|
| データリンク層 | <-イーサネットのプロトコルがこの階層にあたる。
| | この辺でMACアドレスとかを管理してる。
| | arpはここと、ネットワーク層を使ってIPから
| | MACアドレスを割り当ててIPに対応したMACアドレス宛に通信を行う
|------------------------|
| 物理層 |
| |
|------------------------|
TCPとUDPの差異について
-
TCPはTCPヘッダを用いることで、データのやりとりを同期し、シーケンス番号でデータ並びを揃え、不足分の再送などをするため、通信時のオーバーヘッドが発生するものの、信頼できる双方向通信を実現できる。
-
UDPはTCPに比べ機能が少ないもののオーバーヘッドが小さくなる。コネクションの確立、信頼性も高くないため動作としてIPプロトコル(ネットワーク層)の動作に近い。
- UDPヘッダは、RFC 768にて、発信元ポート、宛先ポート、長さ、チェックサムの16バイトと規定されている。
ソケットについて
- ソケットにはストリームソケットとデータグラムソケットがある。
- ストリームソケット
- 誰かと電話するときのような、双方向通信をするものトランスポート層のTCPプロトコルを使用する。
- データグラムソケット
- 手紙のように一方通行で、送った順序で届くとは限らない上に、全く届かないこともある。
- パケットの喪失があっても許容できる場合に使われる。(ネットゲーム、ストリーミングメディアなど)
- ストリームソケット
ARP(Address Resolution Protocol)とは
- IPアドレスとハードウェアの対応付をするプロトコル。
- 機器毎のMACアドレスとネットワーク層で定期的に変わる可能性のあるIPアドレスとで対応付ることができるっぽい
- ARPメッセージには4つのタイプがある。
- 基本「ARPリクエストメッセージ」「ARPリプライメッセージ」の2つが最も重要なタイプとなる。
- 通信の流れの一例を挙げる。
- 同じネットワーク内にMACアドレス1のIP1を持つ機器1とMACアドレス2,IP2を持つ機器2があり、機器1から機器2に対して通信を行うとする。
- ARPを用いて機器1からIP2を指定してブロードキャストで「ARPリクエスト」を送る。(送信元のMACアドレスも送られる。)
- IP2を持つ機器2が送信元MACアドレス(機器1)に対して自身のMACアドレスを送信する。
- 以降の通信はARPキャッシュに保存されるため、ARPのやりとりをせずに直でMACアドレスを指定して通信を行う。
- 同じネットワーク内にMACアドレス1のIP1を持つ機器1とMACアドレス2,IP2を持つ機器2があり、機器1から機器2に対して通信を行うとする。
ネットワークのスニッフィング
『スニッフィング(snifing)』
: 他の機器宛てに送られるパケットをキャプチャする行為。
- スイッチングネットワークと非スイッチングネットワークのデータリンク層には、違いがある。
-
「非スイッチングネットワーク」では、イーサネットのパケットはネットワーク上の全ての機器に送られる。そのため、各機器が自ら判断して上位のレイヤーに引き渡すようになっている。
-
これをネットワーク機器の設定で
『プロミスキャストモード』
にすることで、パケットの宛先に関係なく全てのパケットを読み込むことができるようになる。- tcpdumpのような、ほとんどのパケットキャプチャプログラムは、デフォルトでネットワーク機器をプロミスキャストモードに変更するようになっている。
以下のコマンドで変更を行うことができる。
sudo ifconfig eth0 promisc
- tcpdumpのような、ほとんどのパケットキャプチャプログラムは、デフォルトでネットワーク機器をプロミスキャストモードに変更するようになっている。
以下のコマンドで変更を行うことができる。
-
- やり方
- こんな感じtcpdumpだけでなく、dsniffというツールだと、重要と判断したデータを解析して表示してくれる。
tcpdump -l -X 'ip host 172.17.0.2'
dsniff -n
- 🚨あくまでtcpのパケットだけで、UDP,ICMPのプロトコルは見れてない
生のソケットのスニッフィング
生のソケットに関する問題はlibpcap
を使うことで緩和できたりする。
BSDやSolarisなどプラットフォームでの問題も緩和してくれる。
また、生のソケットを使用して偽のパケットを作成し、ネットワークに注入するのに
libnet
というライブラリを使える。これもプラットフォーム間の非互換性を吸収してくれる。
アクティブスニッフィング
スイッチングネットワーク環境
では、パケットは宛先となっているMACアドレスに対してのみ送られる。そのため、プロミスキャストモード
でのスニッフィングの心配がなくなる。
しかし、送信元のアドレスが実際に送信したアドレスであることを保証していないため、
送信元を詐称することでハッキングが可能となる。
このように送信元を詐称することをスプーフィング
という。
で、以下のようにシステムCがA,Bのパケットをスニッフィングする場合、以下のようにして
MACアドレスを詐称し、A,B間の通信でCを経由させるようにすることで、パケットのキャプチャを実現できる。
このようにしてARPキャッシュを書き換える行為をARPキャッシュポイズニング
と呼ぶ。
また、ローカルのネットワークから外部のインターネットに接続する際に「ゲートウェイ
」を通るようにルーティングされる。
そのため、ゲートウェイのIP,MACアドレスと監視対象の機器のIP,MACアドレスを使うことで外部とのやりとりをスニッフィングすることができる。
- スプーフィング周りの操作は後日あげる。
システムA------------------| システムB------------------|
| IP : ipA | | IP : ipB |
| Mac: macA | | Mac: macB |
| 内部APRキャッシュ------| | | 内部APRキャッシュ------| |
| | IP : ipB | | | | IP : ipA | |
| | Mac: macC | | | | Mac: macC | |
| | (Macアドレスを詐称) | | || (Macアドレスを詐称) | |
| |------------------- | | | |--------------------| |
|-------------------------| |-------------------------|
↑ (BからAへパケットを送信する場合) ↓
↓ (AからBへパケットを送信する場合) ↑
システムC(攻撃者)-----------|
| IP : ipC |
| Mac: macC |
| 内部APRキャッシュ------| |
| | IP : ipA | |
| | Mac: macA | |
| | IP : ipB | |
| | Mac: macB | |
| |--------------------| |
|-------------------------|
ネットワークの攻撃形態について
- DoS攻撃
- サービスやリソースへのアクセスを妨害しようというもの。以下の2つの形態がある。
- サービスをクラッシュさせる
- プログラムの不適切な実装でOverflowを狙ったもの
- サービスを麻痺させる
- アクセス数が増えるため、リソースが増えて麻痺してしまう
- サービスをクラッシュさせる
- サービスやリソースへのアクセスを妨害しようというもの。以下の2つの形態がある。
- SYN Flooding
- 「TCP/IP」はコネクションを維持するため、
コネクションの情報と状態(TCPスタック)
をどこかに保存する。このスタックの管理できるコネクション数には限りがあるので、SYN Flooding
はそれをついて攻撃する。 - 大量の「存在しないIPアドレス」を設定した
「SYNパケット」
を攻撃対象へ送る、攻撃対象は「SYN/ACKパケット」
を応答し、「ACKパケット」
を待つことになる。 この応答待ちのコネクションは``バックログキューに格納され、タイムアウトまで放置される。 キューがいっぱいになっている間は、SYNパケット
を処理できないため、コネクションが確立できなくなる。
- 「TCP/IP」はコネクションを維持するため、
- Ping of Death
- ICMPの使用上、
ICMPエコー要求パケット
のデータ部分の長さは65536byte
までとなっている。基本的にICMPパケット
はヘッダ部分の情報が主であるため、データ部の実装が蔑ろとなっており、ICMPパケットで大きなパケット
を受け取るとクラッシュするOSが出てきた。(死のPing
と呼ばれている。) 現在ではこの脆弱性はほぼ対応されているため、問題とならない。しかし、Bluetoothプロトコルでは、L2CAP層でpingと似たパケットを使用しており、同様の問題を抱えているものがたくさんある。(この攻撃をBluesmack
という)
- ICMPの使用上、
- Teardrop
- Ping Flooding
- Amplification Attack
- 攻撃者側からは少量のパケットで攻撃対象に
Ping Flooding
攻撃を仕掛けるもの ICMP、UDPパケットでできる。
- 攻撃者側からは少量のパケットで攻撃対象に
- 分散DoS攻撃(DDoS攻撃)
- 事前に複数のホストにデーモンをインストールし、攻撃者からの指示で対象に向けて
サービス麻痺型のDoS攻撃
を一斉に仕掛ける。ネットワーク上に分散している複数のホストが同時に仕掛けるため、攻撃者の特定も難しい。
- 事前に複数のホストにデーモンをインストールし、攻撃者からの指示で対象に向けて