환경 : Windows xp
winpcap
MFC로 제작
일차적으로 VICTIM의 맥테이블을 변조시키기 위해 ARP-REPLY패킷을 생성하여, VICTIM에게 5초마다
Send하여, 갱신되게 프로그래밍은 쉽게 되었습니다.
나머지 어려운게, 윈도우에서는 디바이스에 대한 접근이 제한이 있고, 그래서 패킷을 조작하여 , 릴레이
를 시도해볼려고합니다.
MAC주소를 라우터MAC주소로 다시 복구하여, 네트워크로 흘려보낼려고 합니다만, 역시나 제가
VICTIM으로 부터 받은 패킷은 순서제어 에의해 재전송 혹은 변조하여 보내면, 모두 DIE되 버리네요.
이더넷프레임의 MAC주소만 변조 하여서, CRC에는 문제가 없으리라고 보고, 잘 될지 알았는데, 흐름제어 에서
막힙니다. 순서번호 혹은 응답번호 변조 는 TCP CheckSum 함수를 이용하면 되기에
가능한데, 이론적으로 순서번호,응답번호 변조를 하면, 패킷 릴레이 기능을 완성 할수있을까요 ?
전에 쓰신글(포스팅된 글 ) 을 보니, 왠만하면, 패킷을 변조 시켜서 릴레이 기능을 하는것을 하지 말라고 했던것 같은데,,
다른 방법은 있는건가요 ?
MAC주소를 라우터MAC주소로 다시 복구하여, 네트워크로 흘려보낼려고 합니다만, 역시나 제가 VICTIM으로 부터 받은 패킷은 순서제어 에의해 재전송 혹은 변조하여 보내면, 모두 DIE되 버리네요.
DIE의 구체적은 현상이 무엇인가요? Gateway를 통해서 상대방 호스트(Destination IP)에 IP packet이 전달되지 않는다는 건가요? Destination 호스트에서 확인해 보셨나요?
이더넷프레임의 MAC주소만 변조 하여서, CRC에는 문제가 없으리라고 보고, 잘 될지 알았는데, 흐름제어 에서 막힙니다.
ARP spoofing에서 relay를 하려면 일반적으로 Ethernet Header만 변경해서 보내 주면 됩니다. 하지만 특수한 packet은 TCP checksum을 변경해 줘야 하는 경우도 있습니다. 흐름제어에서 막힌다는 정확한 현상을 말씀해 주시기 바랍니다.
순서번호 혹은 응답번호 변조 는 TCP CheckSum 함수를 이용하면 되기에 가능한데, 이론적으로 순서번호,응답번호 변조를 하면, 패킷 릴레이 기능을 완성 할수있을까요 ?
sender, attacker, receiver 3곳 모두에서 packet을 잡으면서 디버깅을 해 보시기 바랍니다. 초보자들은 ARP spoofing 모듈을 구현할 때 일반적으로 attacker에서만 패킷을 잡으면서 디버깅을 하는 경우가 있는데, 그러면 제대로 된 디버깅을 할 수가 없습니다.
전에 쓰신글(포스팅된 글 ) 을 보니, 왠만하면, 패킷을 변조 시켜서 릴레이 기능을 하는것을 하지 말라고 했던것 같은데,, 다른 방법은 있는건가요 ?
packet 변경은 충분히 가능합니다 똑같은 기술이 router나 NAT 등의 in-path 장비를 만드는데 사용이 되어 집니다. 네트워크 장비 개발 엔지니어에게는 이미 보편화된 기술입니다.
이러한 질문을 하실 때에는 기본적인 절차가 필요합니다.
Wireshark에서 잡은 화면을 screen capture하여 보내 주시는 경우가 많은데
그것만으로는 정확한 원인을 알아낼 수가 없습니다.
pcap 파일을 같이 보내면서 장애 문의를 하는 것이 바람직합니다.
1. sender : IP packet을 보내는 호스트(Victim)
2. attacker : ARP spoofing을 하여 packet을 처리하는 호스트(BlackJo님 컴퓨터)
3. receiver : 같은 LAN 상에서 IP packet을 받아야 하는 호스트(일반적으로 Gateway)
4. remote receiver : Destination IP를 가지고 있는 호스트(일반적으로 Server)
1, 2, 3번은 IP 및 Mac을 명시해 주시구요, 4번은 IP를 명시해 주시구요,
1, 2, 4d에서 Wireshark를 이용해서 동시에 packet을 잡은 다음
각각에서 잡은 pcap 파일을 첨부해서 보내 주시기 바랍니다.
ARP spoofing 디버깅은 한대에서만 해서 되는 것이 아니고
동시에 여러군데에서 packet을 잡아서 디버깅을 해야 합니다.
그만큼 ARP spoofing을 직접 구현하는 것은 쉬운 것이 아닙니다.
ps : gateway를 통해 밖으로 나가야 하는 IP packet으로 디버깅을 하면 어렵습니다.
sender, receiver를 전부 같은 네트워크 대역으로 잡고 디버깅하는 것을 추천합니다.
아울러 다음 사항을 공부해 보시기 바랍니다.
1. L2 Switch의 CAM Table의 작동 원리
2. TCP/UDP/IP의 checksum offload 기능
1. DIE의 구체적은 현상이 무엇인가요? Gateway를 통해서 상대방 호스트(Destination IP)에 IP packet이 전달되지 않는다는 건가요? Destination 호스트에서 확인해 보셨나요?
- Acknowledgement 번호 중복으로 3~4번 다시 재전송 시도하다 , 패킷이 라우터까지 릴레이가 안된다는 말이었습니다.
- 말씀하신데로 sender, attacker, receiver 3곳 모두에서 packet을 잡으면서 디버깅을 해보겠습니다.
2. ARP spoofing에서 relay를 하려면 일반적으로 Ethernet Header만 변경해서 보내 주면 됩니다. 하지만 특수한 packet은 TCP checksum을 변경해 줘야 하는 경우도 있습니다. 흐름제어에서 막힌다는 정확한 현상을 말씀해 주시기 바랍니다.
- 흐름제어에서 막힌다는말은 제가 VICTIM의 맥테이블을 변경시켰기때문에 VICTIM의 외부로나가야되는 패킷이 제PC로 오게되지만, 제가 그패킷을 다시 변조하거나
릴레이 해줄때는 Acknowledgement번호를 적절히 조절해줘야하지 않나해서 올린 글이었습니다만, 제가 공부를 더 하고 심도있게 질문을 해야할것같습니다.
단순히 EthernetFrame만 바꿔서 다시 패킷을 전송하니, 모두 Acknowledgement 중복 이라는 현상이 나오더군요.
3. sender, attacker, receiver 3곳 모두에서 packet을 잡으면서 디버깅을 해 보시기 바랍니다. 초보자들은 ARP spoofing 모듈을 구현할 때 일반적으로 attacker에서만 패킷을 잡으면서 디버깅을 하는 경우가 있는데, 그러면 제대로 된 디버깅을 할 수가 없습니다.
- GilGil님 말씀데로 저는 제 PC에서만 디버깅을 했었네요. . 좋은말씀 감사합니다.
4.이러한 질문을 하실 때에는 기본적인 절차가 필요합니다.
Wireshark에서 잡은 화면을 screen capture하여 보내 주시는 경우가 많은데
그것만으로는 정확한 원인을 알아낼 수가 없습니다.
pcap 파일을 같이 보내면서 장애 문의를 하는 것이 바람직합니다.
조금더 삽질과 공부를 한다음에 , 다음 질문부터는 Pcap파일을 첨부하고, 말씀하신 절차데로 질문을 올리도록 하겠습니다.
그리고
친절한 답변 감사합니다. 저한테는 많은도움과 힘이 되네요..
Attacker PC에서 Acknowledgement 중복이라고 나타나는 것은 L3 이상이 동일한 packet이 2개가 잡히기 때문입니다.
그리고 ARP spoofing relay를 할 때에는 TCP 헤더의 Acknowledgement를 변경하지 않아도 됩니다.
원래 packet loss에 의한 패킷 재전송을 충분히 일어날 수가 있습니다.
1. Victim --- Server 간에 PING이 잘 되는지 확인한다.
2. Victim --- Attacker --- Server 간에 PING이 잘 되는지 확인한다.
3. Victim --- Server 간에 TCP 연결(SYN / SYN+ACK / ACK)이 잘 되는지 확인한다.
4. Victim --- Attacker - Server 간에 TCP 연결(SYN / SYN+ACK / ACK)이 잘 되는지 확인한다.
우선 이까지만 확인해 보시기 바랍니다.
ARP spoofing을 하나의 interface로 하는 경우 말씀하신 것처럼 자신이 보낸 relay packet을 또 다시 relay하는 경우 무한 loop이 발생할 수 있습니다(대부분의 ARP spoofing 모듈은 하나의 intere로 하는 것이 일반적임). 이 현상을 방지하기 위해서 Victim이 보낸 packet이냐, 아니면 Attacker가 보낸 packet이냐를 판단할 수 있어야 합니다. 이 구분은 frame의 source mac 및 destination mac으로 구분을 할 수 있습니다.
용어 정리를 먼저 해 보죠.
sender : IP packet을 보내는 주체(victim)
attacker : ARP spoofing 을 하는 주체
receiver : local상에서 IP packet을 받아야 하는 주체(gateway)
여기에서 중요한 것은
(1) victim > attacker > gateway 가 하나의 ARP spoofing session이고
(2) gateway > attacker > victim은 별도의 ARP spoofing session입니다.
(1)과 (2)는 반드시 같이 작동시킬 필요가 없습니다. (1)번만 해도 되고, (2)번만 해도 됩니다.
ARP spoofing을 정확하게 얘기할 때에는 victim, attacker, gateway로 얘기를 하면 안됩니다.
sender, attacker, receiver로 얘기를 해야 합니다.
즉 다시 말해서
ARP spoofing은 하나의 attacker에 여러개의 (sender, receiver)의 조합이 모여서 하나의 ARP spoofing이라고 합니다.
통상적으로 sender > attacker > receiver 의 반대 세션도 같이 spoofing을 하는 것이 관례이지만
반드시 2개의 session이 같이 존재해야 할 필요는 없습니다.
그리고 attacker가 sender로부터 IP packet을 받았을 때 relay packet은 다음과 같이 변경해 줘야 합니다.
source mac : attacker의 mac(sender의 mac으로 하면 안됨) <---(A)
destination mac : receiver의 mac
일반적으로 처음 ARP spoofing 모듈을 작성하는 사람이 (A)를 간과합니다. source mac을 sender의 mac으로 하죠.
이러한 경우 처음 몇개의 packet은 receiver에게 잘 도착합니다.
그러다가 몇개의 packet이 지나 가고 나면 그 다음부터는 relay packet이 receiver에게 도달하기도 하고 하지 않기도 합니다.
엄밀히 말해서 처음 BlackJo님이 말씀하신 DIE라는 현상은 잘못된 표현입니다.
receiver에서 정확히 packet을 잡으면서 디버깅을 해 보시기 바랍니다.
분명 처음 몇개의 packet은 receiver에게 제대로 도착이 되다가
그 다음부터는 도달하기도 하고 도달하지 않기도 합니다.
제가 이것을 확인해 보라는 얘기였습니다.
이정도 확인을 해 보지도 않고 그냥 DIE라고 하면 안되죠.
네트워크 디버깅은 절대 쉬운게 아닙니다.
(A)로 보내야 하는 이유는 처음 말씀 드린 switch의 CAM table 작동 원리를 알고 있어야 합니다.
이를 모르는 상태에서 ARP spoofing 모듈을 만단다는 것은 모래를 가지고 성을 쌓는 것과 다를 것이 없습니다.
결론지어서 말씀드리건데, ARP spoofing 을 공부하기 이전에
Network(L2(ethernet), L3(ARP, IP), L4(TCP, UDP), switch, router)등에 대해서 공부해 보시기 바랍니다.
충고 감사합니다.
기초가 항상 중요합니다. 빨리 만들고 싶다는 욕구만..앞서서 .... 서두없는 질문 죄송합니다.
Ethernet , IP ,ARP 등은 충분히 공부했는데도 .. 아리까리 하네요. .
다른건 조금씩 다 본상태라... CAM Table은 꼭 공부하도록 하겠습니다.
ARP Spoofing 은 GilGil 님 말씀데로 Sender > Attacker > Receiver 이 방향만 시도했습니다.
Sender로 부터 받은 패킷의 DestinationMAC은 Receiver의 MAC주소로
SourceMAC 은 Attacker의 MAC주소로 바꿨습니다.
그랫더니 ICMP 는 패킷손실률 없이 잘 오갔습니다. 인터넷도 잘 되고, 스니핑도 가능했습니다.
다만 인터넷이 조금 느려지는 현상이 있습니다.
예전에 발표한 동영상이 있으니 참고하시기 바랍니다.
http://www.youtube.com/my_playlists?p=50BFBAAE2846BD8B
pcap_open의 4번째 인자(read_timeout)에는 어떤 값을 주셨나요?
1000 을 주었습니다. 저는 이값이 네트워크카드가 패킷을 받아들이는 속도로 알고있습니다.
유투부동영상은 잘 보겠습니다.
그.. 길길님이 보시고.. 초보자가 볼만한... 그리고 꼭 알아야되는 개념이 잡힌 책이 있으면
추천 부탁 드려도 될까요 ? 아직 기본기가 부족한터라..
참고로 전 이쪽 분야에 관심이 너무 많습니다. 도와주시면. 열심히 하고싶은데요.
학교졸업 할때는 IDS - TCP RST 이용한 IDS기능 ,즉 특별한 TCP 패킷에 대해 DROP시키는 걸 했구요
그리고 그 이후에는 WireShark 같은 툴 도 직접 노가다 하면서 만들업고
포트 스캐너 (TCP -SYN 만 날려서 포트OPEN 여부) 툴도 제작 하고있습니다. 더 업그레이드
해야겠지만요.. ^^
현재 참고하고 공부하고 있는책은 아래 이구요.
TCP/IP 프로토콜 3판
1. read_timeout 에는 1이나 0의 값을 주시기 바랍니다. pcap_open API help를 보면 해당 인자에 대한 설명이 자세하게 나와 있습니다.쉽게 얘기를 하자면 packet이 잡힐 때마다 pcap_nextex(혹은 pcap_loop)이 실행이 되게 되면, 잦은 thread switching에 의해서 CPU의 효율이 떨어 지기 때문에 이러한 read_timeout이라는 인자를 통해서 그 시간동안 잡힌 packet을 한꺼번에 처리를 하는 기능을 제공하는 것입니다. OS의 process / thread scheduling의 원리는 이해한다면 왜 이러한 인자가 필요한 지를 알게 될 것입니다.
2. 국내 서적은 "후니의 네트워크 이야기"가 괜찮고, 외국 서적은 "TCP/IP Illustrated" 책이 좋습니다. 번역본 말고 원문 추천.
저기능이 성공되면, 이더넷카드를 2개 설치후 , ARP리다이렉트를 이용, 내부네트워크의 흐름을 제PC로 흐르게 한다음. IDS 기능을 구현해볼려고 합니다.