제가 이런 상황에 처해 있고 장치 M에서 성공적으로 MITM을 수행하기 위해 로컬 네트워크에 있는 두 장치(가령 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저는 두 개의 Ubuntu 노트북을 사용하여 이 설정을 성공적으로 구현했습니다.
sudo sysctl net.ipv4.ip_forward=1
이것이 없으면 컴퓨터 1이 컴퓨터 2의 IP 패킷을 인터넷으로 전달하지 않기 때문에 이는 중요한 단계입니다.
를 통해 net.ipv4.ip_forward=0
컴퓨터 2에서 컴퓨터 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로 또는 그 반대로. 이는 위 설정을 사용하여 커널을 통해 또는 이러한 데이터그램을 수신하고 다시 보내는 특수 프로그램을 통해 발생할 수 있습니다.