이번에는 ARP 패킷을 만들고 전송하는 부분까지 하겠습니다.

 

간단하게 절차(?)를 써보자면

  1. 지난번에 검색한 네트워크 장치들중 내보낼 장치 선택
  2. ARP 패킷 만들기
  3. 이더넷 프레임 만들기
  4. ARP 패킷에 이더넷 헤더 씌우기
  5. 1번에서 선택한 네트워크 인터페이스로 패킷 전송

이런 순으로 진행되겠네요.

 

 

1. 프로젝트 열기

- 첫번째 포스팅에서 만든 TestApp 이라는 프로젝트를 이용하겠습니다.

 

가. Form 디자인하기 

- 정말 간단하게 만들겠습니다.

- [시작] 버튼을 누르면 패킷이 전송되고, [중지] 버튼을 누르면 패킷 전송이 중지되는 기능으로 하겠습니다.

나. 속성

- [시작], [중이] 버튼의 Text 및 Name은 편하실때로 하시면 되겠습니다.

- 저같은 경우 Name은 각각 btnARPStart, btnARPStop 이라고 하였습니다.

 

2, 코딩하기

- [시작] 버튼을 더블클릭하게 되면 코드를 작성할 수 있는 화면으로 바뀌게 됩니다.

 

가. 참조할 라이브러리 가져오기

- 두번째 포스팅에서 라이브러리 참조하는 방법을 알아보았습니다.

- 사용하기 위하여 지시문을 작성할 필요가 있습니다.

- 코드 작성 부분에서 맨위에 보시면 using ~~~~ 이런식으로 이미 작성되어 있는 코드가 보이실겁니다. (1~9 줄)

- 그아래 작성하였습니다. (13~14 줄)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
using System.Net;
using System.Net.NetworkInformation;
using PacketDotNet;
using SharpPcap;
using System.Threading;
cs

 

나. 장치 선택하기

- 두번째 포스팅에서 제가 사용한 인터페이스 인덱스 번호를 저는 1번이라고 정하였습니다.

- 이제 해당 인터페이스를 가져오겠습니다.

1
2
3
4
5
6
7
8
9
10
11
// Millisecond 단위 이며 초기연결 지연설정
int readTimeout = 1000;
 
// 현재 단말기의 네트워크 장치의 리스트들을 불러온다.
CaptureDeviceList devices = CaptureDeviceList.Instance;
 
// 무선 랜카드의 인덱스 번호는 1번(단말기 설정에 따라 다름)
ICaptureDevice device = devices[1];
 
// 무선 랜카드를 프러미스큐어스 모드로 연다.
device.Open(DeviceMode.Promiscuous, readTimeout);
cs

- 2 줄 : 인터페이스를 초기 연결할때 지연시간을 주어도 되고 주지 않아도 된다는데 저는 설정하겠습니다.

- 5 줄 : 익숙하지 않나요? 두번째 포스팅에서 장치 검색하는 부분입니다. 대신 devices 변수는 배열 형식으로 리스트를 저장하게 됩니다. 그렇기 때문에 제가 인덱스 번호를 확인하라고 했었습니다.

- 8 줄 : 저는 1번으로 선택합니다.

- 11 줄 : 1번 인터페이스를 열어줍니다. 보시면 DeviceMode 를 설정할 수 있습니다. Normal과 Promiscuous 모드가 있습니다.

Normal은 일반모드로 장치를 열겠다는 의미입니다. 중요한 것은 Promiscuous 모드입니다.

Promiscuous 모드로 장치를 설정하면 보통은 자신을 목적지로 되어있는 정보만 받게되고 나머지는 버리게 되는데, Promiscuous 모드는 자신의 것 이외의 모든 정보를 검증없이 받아볼 수 있게 됩니다. 스니핑공격의 가장 기본 옵션이기도 합니다. 와이어샤크에서도 이 기능을 확인하실 수 있습니다. ( http://redscreen.tistory.com/entry/SEEK-네트워크-해킹-및-보안-2 : 한창 공부할때 잠시 언급했었습니다.)

패킷을 전송할것이기 때문에 Normal 로 하시든 상관없습니다. 모드가 두가지 있다는 것을 보여드리기 위해서 저렇게 작성하였습니다.

그리고 2번째 줄에서 설정한 지연시간을 인자로 주게되면 초기연결 시 인자값 만큼 지연되게 됩니다.

 

다. 패킷 만들기

1) ARP

- ARP 패킷의 구조는 어떻게 되는지 먼저 살펴 보겠습니다. 

- 패킷을 만들기 위해서 입력해주어야 하는 부분으로 Opcode(requset 인지 reply 인지), 송신측 MAC, IP, 수신측 MAC, IP 이렇게 5가지 입니다.

 

2) 이더넷

- 이더넷의 구조를 살펴 보겠습니다. 

- 이더넷 프레임을 만들기 위해서 입력해주어야 하는 부분으로 송신측 MAC, 수신측 MAC, Type 입니다.

 

3) 코딩하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
IPAddress dstIP = null;
IPAddress srcIP = null;
PhysicalAddress dstMac = null;
PhysicalAddress srcMac = null;
 
dstIP = IPAddress.Parse("100.0.0.100");
dstMac = PhysicalAddress.Parse("AA-AA-AA-AA-AA-AA");
srcIP = IPAddress.Parse("111.0.0.111");
srcMac = PhysicalAddress.Parse("BB-BB-BB-BB-BB-BB");
 
ARPPacket arp = new ARPPacket(ARPOperation.Response, dstMac, dstIP, srcMac, srcIP);
EthernetPacket eth = new EthernetPacket(srcMac, dstMac, EthernetPacketType.Arp);
arp.PayloadData = new byte[] { 00000000000000000000 };
eth.PayloadPacket = arp;
device.SendPacket(eth);
cs

- 1~4 줄 : IP, MAC 주소 입력을 위해 해당 형식의 변수 지정부분

- 6~9 줄 : 괄호 안의 문자열을 각 IP, MAC 변수에 맞는 형태로 저장하는 부분 (이 부분을 공격자가 임의로 조작하면 되겠지요?)

- 11 줄 : ARP 패킷을 만드는 부분입니다.

입력 순서대로

[ Opcode , TargetHardwareAddress , TargetProtocolAddress(IP) , SenderHardwareAddress , SenderProtocolAddress(IP) ]

Opcode 는 Request, Response(Reply) 둘중 선택할 수 있습니다.

- 12 줄 : 이더넷 프레임을 만드는 부분입니다.

입력 순서대로

[ SourceHardwareAddress , DestinationHardwareAddress , Type ]

ARP 패킷을 담아서 전송할 것이니 Type을 Arp 로 합니다.

- 14 줄 : 이더넷 프레임에 ARP 패킷을 담아줍니다.

- 15 줄 : 위쪽에서 Promiscuous 모드로 열었던 인터페이스로 이더넷 프레임을 전송합니다.

 

라. 결과

- 와이어샤크로 확인해보겠습니다. 

 

- 저는 for 문을 통하여 10개를 전송하였습니다.

- 사진 보시면 하드코딩하였던 내용들이 그대로 담겨서 와이어샤크에서 확인되었음을 볼수 있습니다.

 

 

Visual Studio 에서 C# 의 기본적인 조작법은 저도 아직 공부단계에 있기 때문에 작성하지 않았습니다.

 

솔직히 SharpPcap 사용하시려고 저희 블로그 와주실 정도라면 저보다 훨씬 잘하실게 뻔하기 때문이죠...ㅎㅎ;

 

아무튼 오늘 드디어 원하는 패킷을 만들어서 전송까지 해보았습니다.

 

저도 처음에 놓쳤던 부분이 ARP 패킷만 만들어서 device.SendPacket(arp); 이런식으로 바로 보내려고 하니까 안되어서 고생했습니다.

 

이제와서보면 너무 기초적인 부분을 놓쳤기 때문에 막혔던 것이 너무나 부끄럽네요.....ㅜ 이더넷...ㅠ

 

저와 같은 실수 하실분은 없으시겠지만, 만약을 위해 그리고 나중에 제가 또 같은 실수 하지 않길 바라지만.. 혹시나.. 기록하기 위해...ㅎㅎ

 

posted by Red_Seek