私がこの状況にあり、デバイスMで正常にMITMを実行するために、ローカルネットワーク上の2つのデバイス(たとえばAとB)のARPキャッシュに感染するプログラムを書いているとします。プログラムはMデバイスで実行されます。デバイスMでコマンドを使用してIP転送を有効にすると、sysctl net.ipv4.ip_forward=1
デバイスAからBへのHTTP接続が問題なく確立され、デバイスMからのトラフィックが表示されます。
ただし、同じ状況でデバイスMでコマンドを使用してIP転送を無効にした後、ARPキャッシュが破損してsysctl net.ipv4.ip_forward=0
デバイスAからBへのHTTP接続を確立できません。デバイスMでは、デバイスAのTCP SYNパケットを見ることができます。私のプログラムでは、デバイスMからSYNパケットを受信し、パケットのsrc MACアドレスをMのMACアドレス(AのMACアドレス)に変更し、dst MACアドレスをBのMACアドレス(MのMACアドレス)に変更します。ネットワークに注入します。私はネットワーク層から何も修正しません。 TCPdump コマンドを使用して、B 内のパケットに新しい src および dst MAC があることを確認できます。これは、パケットがBに到着したことを意味します。しかし、Bはパケットに応答せず、その理由を理解できません。
もしそうなら、問題はip_forward=1
このMITMの状況に特別なものがあるかということです。明確に言えば、すべてのマシンはLinuxです。デバイスMで転送を有効にした後は、パケットのMACアドレスを変更する必要はありません。ちょうどキャッシュを中毒し、そこからすべてがうまくいきました。
答え1
Mのコアは、宛先IPアドレスがパケットがMのためではないことを示すパケットを受信します。それは何をしますか?
当時ip_forward=0
は「これがなぜ私に送られたのか分からないし、気にしない。ゴミ箱に捨てられるぞ!」
vs ip_forward=1
、「まあ、それは私がすることではありません。しかし、受信者がどこにいるのかを知っているので、正しいMACアドレスに送り返します」
つまりip_forward=1
、あなたカーネルは自動的にMACアドレスを変更するので、MACアドレスを変更する必要はありません。
答え2
最小限のサンプル実験がnet.ipv4.ip_forward=1
重要です
次のトポロジを検討してください。
Internet --- Wi-Fi --- Computer 1 --- Ethernet --- Computer 2
たとえば、コンピュータ2にWi-Fiがないため、コンピュータ2がコンピュータ1を介してインターネットにアクセスできるようにしたいとします。私はこれが基本的にコンピュータ1をルーターに置き換えることを意味すると思います。
存在する:https://askubuntu.com/questions/3063/share-wireless-connection-with-wired-ethernet-port/1502850#1502850私は2つのUbuntuノートブックを使ってこの設定をうまく実装しました。
sudo sysctl net.ipv4.ip_forward=1
これがなければ、コンピュータ1はコンピュータ2のIPパケットをインターネットに転送しないので、これは重要なステップである。
を介してnet.ipv4.ip_forward=0
コンピュータ2からコンピュータ1にアクセスできますが、コンピュータ1を超えてインターネットにアクセスすることはできません。
コンピュータ1でできる1つの素晴らしいことは、net.ipv4.ip_forward=1
パケットフローを観察することです。
sudo wireshark -k -f 'icmp' -i enp1s0f0 -i wlp2s0
コンピュータ2でこれを行う場合:
ping example.com
したがって、各 ping は 4 つの Wireshark ラインを生成し、コンピュータ 1 がコンピュータ 2 からの要求パケットを消費してインターネットに転送し、インターネットから返信を受けてコンピュータ 2 に送信する方法を明確に見ることができます。
Time Source Dest Hw src Hw dst Protocol
1 0.000000000 10.42.0.70 93.184.216.34 54:e1:ad:b5:5b:08 fc:5c:ee:24:fb:b4 ICMP request id=0x79ee, seq=8/2048, ttl=64 (reply in 4)
2 0.000074761 192.168.1.123 93.184.216.34 04:7b:cb:cc:1b:10 9c:53:22:17:e2:0e ICMP request id=0x79ee, seq=8/2048, ttl=63 (reply in 3)
3 0.098882299 93.184.216.34 192.168.1.123 9c:53:22:17:e2:0e 04:7b:cb:cc:1b:10 ICMP reply id=0x79ee, seq=8/2048, ttl=51 (request in 2)
4 0.098952451 93.184.216.34 10.42.0.70 fc:5c:ee:24:fb:b4 54:e1:ad:b5:5b:08 ICMP reply id=0x79ee, seq=8/2048, ttl=50 (request in 1)
基本的に、マルチネットワークインタフェースを持つLinuxを実行しているすべてのシステムがルータとして機能できると考えるのは興味深いものです。
テストコンピュータ1 = Lenovo ThinkPad P14s、コンピュータ2 = Lenovo ThinkPad P51(Wi-Fiオフ)、両方Ubuntu 23.10を実行します。
答え3
ARP キャッシュを破壊すると、A と B はそれぞれ M の MAC アドレスと B と A の IP アドレスを使用して M にデータグラムの送信を開始します。したがって、これらのデータグラムはレイヤ2(イーサネット)のMに渡されますが、レイヤ3(IP)の他のデバイスに転送されます。これらのデータグラムをレイヤ3受信者(IPアドレスベース)に送信するには、MはIP転送を実行する必要があります。
net.ipv4.ip_forward=0
IP転送を無効またはnet.ipv4.ip_forward=1
有効にできます。
IP転送が必要なのはなぜですか?
見てオープンシステム相互接続モデル。そこであなたは見つけるでしょう
- HTTPレイヤ7
- TCPレイヤ4
- レイヤ3 IP
- イーサネットレイヤ2
ARP中毒はレイヤ2に影響します。
ARP中毒がない場合、AからBへのHTTPメッセージはTCPストリーム(ポート80で指定)でラップされ、IPとともにBのIPアドレスに送信されます。 BのIPアドレスはBのイーサネットアドレスに関連付けられています(ハブまたはスイッチを介して)。 AからBへ、またはその逆に直接移動します。 IPを転送する必要はありません。
Mを指すようにAとBのARPキャッシュに感染すると、次のことが起こります。 AからBへのHTTPメッセージは、TCPストリーム(ポート80で指定)でラップされ、IPを介してBのIPアドレスに送信されます。 BのIPアドレスはMのイーサネットアドレスに関連付けられ、データグラムはMに送信されます。Mは、このデータグラムの意図された受信者ではありません。。
HTTP接続が正しく機能するためには、MはIPデータグラムを渡す必要があります。AからBへ、またはその逆。これは、上記の設定を使用してカーネルを介して、またはこれらのデータグラムを受信して再送信する特別なプログラムによって発生する可能性があります。