이번에는 ARP 패킷을 만들고 전송하는 부분까지 하겠습니다.
간단하게 절차(?)를 써보자면
- 지난번에 검색한 네트워크 장치들중 내보낼 장치 선택
- ARP 패킷 만들기
- 이더넷 프레임 만들기
- ARP 패킷에 이더넷 헤더 씌우기
- 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[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
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); 이런식으로 바로 보내려고 하니까 안되어서 고생했습니다.
이제와서보면 너무 기초적인 부분을 놓쳤기 때문에 막혔던 것이 너무나 부끄럽네요.....ㅜ 이더넷...ㅠ
저와 같은 실수 하실분은 없으시겠지만, 만약을 위해 그리고 나중에 제가 또 같은 실수 하지 않길 바라지만.. 혹시나.. 기록하기 위해...ㅎㅎ
':: 프로그래밍 > 도구제작 & 개발' 카테고리의 다른 글
파이썬 한글 인코딩(UTF8, Unicode, Euc-Kr) 탐구 (2) | 2017.06.30 |
---|---|
Red_Message :: Python + PyQT 이용한 Xor 디코더 제작 (0) | 2016.08.12 |
Red_Seek :: [C#] SharpPcap 이용한 ARP Spoofing 2 (0) | 2016.04.06 |
Red_Seek :: [C#] SharpPcap 이용한 ARP Spoofing 1 (0) | 2016.04.05 |