'Network' 카테고리의 다른 글
[Network/ARP] ARP Request/Reply (0) | 2016.06.25 |
---|---|
[Network/Ethernet] EthernetII header (0) | 2016.06.21 |
[Network/libtins] Sending ARP, ICMP Packet with libtins (0) | 2016.06.21 |
[Network/ARP] ARP Request/Reply (0) | 2016.06.25 |
---|---|
[Network/Ethernet] EthernetII header (0) | 2016.06.21 |
[Network/libtins] Sending ARP, ICMP Packet with libtins (0) | 2016.06.21 |
-ARP Request/Reply-
[ Hardware Type ]
Size : 2 Bytes
Offset : 0 ~ 1
[ Protocol Type ]
Size : 2 Bytes
Offset : 2 ~ 3
[ Hardware Length ]
Size : 1 Bytes
Offset : 4
[ Protocol Length ]
Size : 1 Bytes
Offset : 5
[ Operation ]
Size : 2 Bytes
Offset : 6 ~ 7
[ Sender Hardware Address ]
Size : 6 Bytes
Offset : 8 ~ 13
[ Sender IP Address ]
Size : 4 Bytes
Offset : 14 ~ 17
[ Target Hardware Address ]
Size : 6 Bytes
Offset : 18 ~ 23
[ Target IP Address ]
Size : 4 Bytes
Offset : 24 ~ 27
Hardware Type / Protocol Type :각각 네트워크 유형과 프로토콜을 정의하며, Hardware Type의 경우 Ethernet은 0x0001을 세팅하고 Protocol Type의 경우 IPv4는 0x0800을 세팅하게 됨
Hardware Length / Protocol Length : 각각 MAC주소와 IP주소의 길이를 설정하며, MAC주소의 경우 0x06에서 바뀌는 경우가 없고 Protocol Length의 경우 IPv4일 경우에는 0x04를 세팅하게 됨
Operation : Request Packet의 경우 0x0001을, Reply Packet의 경우 0x0002를 세팅하게 됨
Sender/Target Hardware/IP Address :각각 발신지/목적지의 MAC/IP주소를 명시하며, ARP Request의 경우에는 Target Hardware Address필드를 0x000000000000으로 세팅해서 보내게 됨
[ ARP ]
ARP (Address Resolution Protocol)은 추상적인 주소인 IP주소를 실제 통신에 쓸 수 있는 H/W주소(MAC)으로 변경하는데 필요한 프로토콜이다.
상대방의 IP를 알지만, MAC을 알지 못할 때 Broadcast를 통해 Request를 보내면, 해당 IP를 소유하고 있는 시스템은 자신의 MAC주소를 채워, Request를 한 시스템에게 Unicast방식으로 Reply를 보내게 된다.
Reply를 받은 시스템은 Reply의 Sender Hardware Address필드에서 MAC주소를 알아낼 수 있다.
[ Example ]
A (MAC : 00:1b:78:7b:5d:8c, IP : 192.168.0.1)
B (MAC : 00:13:77:bd:2d:5c, IP : 192.168.0.2)
이 상황에서, A가 B의 IP주소(192.168.0.2)를 알고, H/W주소를 모를경우 다음과 같은 과정을 거치게 된다.
A
→
B (ARP Request : Broadcast)
[EthernetII Src : 00:1b:78:7b:5d:8c]
[EthernetII Dest : ff:ff:ff:ff:ff:ff]
A ←
B (ARP Reply : Unicast)
[EthernetII Src : 00:13:77:bd:2d:5c]
[EthernetII Dest : 00:1b:78:7b:5d:8c]
[Network/libtins] Wi-Fi auto deauthentication attack (C++) (0) | 2016.06.27 |
---|---|
[Network/Ethernet] EthernetII header (0) | 2016.06.21 |
[Network/libtins] Sending ARP, ICMP Packet with libtins (0) | 2016.06.21 |
-EthernetII header-
[ Preamble ]
Preamble (7) + SFD (1)
Total : 8 Bytes
Offset : #0~#7
[ MAC Header ]
Destination MAC Address (6) + Source MAC Address (6) + Ether Type (2)
Total : 14 Bytes
Offset : 0~13
[ Data ]
PDU Payloads (46 ~ 1500)
Total : 46 ~ 1500 Bytes
Offset : 14 ~ 59 (Min)
[ CRC Checksum ]
CRC Checksum (4)
Total : 4 Bytes
Offset : 60 ~ 63
Preamble, SFD : 동기 신호로서, 본격적인 프레임 시작 전에 미리 알리는 역할, 이 부분을 기점으로 NIC는 데이터를 Byte단위로 해석하기 시작, EthernetII Header에서 제외하는 경우도 많음
MAC Header : 송, 수신 MAC주소를 각각 6 Bytes (48 bits)로 지정, Ether Type 같은 경우에는 상위 프로토콜이 Patload에 포함되어 있을 경우, 해당 프로토콜의 종류를 서술함.
Data : 상위 프로토콜이나 Raw Data등이 포함되며, 데이터 그 자체임
CRC Checksum : CRC 알고리즘으로 생성된 값을 포함하여 무결성 검사를 수행, 송, 수신 중의 오류 여부를 확인하게 됨
[ 대표적인 Ether Type ]
0x0800 : Internet Protocol Version 4 (IPv4)
0x0806 : Address Resolution Protocol (ARP)
0x0842 : Wake-on-Lan (WOL)
0x8137 : Internet Packet Exchange (IPX)
0x86DD : Internet Protocol Version 6 (IPv6)
0x8808 : Ethernet flow control
[Network/libtins] Wi-Fi auto deauthentication attack (C++) (0) | 2016.06.27 |
---|---|
[Network/ARP] ARP Request/Reply (0) | 2016.06.25 |
[Network/libtins] Sending ARP, ICMP Packet with libtins (0) | 2016.06.21 |
-Sending ARP, ICMP Packet (libtins Examples)-
[ARP]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <iostream> #include <tins/tins.h> #include <unistd.h> int main() { Tins::PacketSender sender; //Libtins packetsender(Virtual L1 Physical Layer) Tins::IPv4Address target = Tins::IPv4Address("192.168.43.1"); //Target IP Tins::NetworkInterface iface = Tins::NetworkInterface::default_interface(); Tins::NetworkInterface::Info info = iface.addresses(); //Get addresses from network interface Tins::EthernetII eth = Tins::EthernetII("ff:ff:ff:ff:ff:ff", info.hw_addr); //Set L2 Ethernet Packet as Broadcast Packet Tins::ARP testARP = Tins::ARP(target, info.ip_addr, "00:00:00:00:00:00", info.hw_addr); //Setup L3 ARP Packet (target_ip, sender_ip, target_hw, sender_hw) testARP.opcode(Tins::ARP::Flags::REQUEST); //Set ARP flag as Request eth /= testARP; //Build-up ARP Protocol on Ethernet printf("Send!\n"); sender.send(eth, iface); //Send Packet return 0; } | cs |
Source Code
Request Packet (Crafted by libtins)
Reply Packet (Android Nexus5x)
[ICMP]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <iostream> #include <tins/tins.h> #include <unistd.h> int main() { Tins::PacketSender sender; //Libtins packetsender(Virtual L1 Physical Layer) Tins::IPv4Address target = Tins::IPv4Address("192.168.43.1"); //Target IP Tins::NetworkInterface iface = Tins::NetworkInterface::default_interface(); Tins::NetworkInterface::Info info = iface.addresses(); //Get addresses from network interface Tins::EthernetII eth = Tins::EthernetII("ff:ff:ff:ff:ff:ff", info.hw_addr); //Set L2 Ethernet Packet as Broadcast Packet Tins::IP ip = Tins::IP(target, info.ip_addr); ip.protocol(Tins::IP::ICMP); //Set L3 IPv4 Packet Tins::ICMP testICMP = Tins::ICMP(); testICMP.code(Tins::ICMP::ECHO_REQUEST); //Set L3 ICMP Packet as ECHO_REQUEST Packet eth /= ip; eth /= testICMP; //Build-up IPv4&ICMP Protocol printf("Send!\n"); sender.send(eth, iface); //Send Packet return 0; } | cs |
Source Code
Request Packet (Crafted by libtins)
Reply Packet (Android Nexus5x)
[Network/libtins] Wi-Fi auto deauthentication attack (C++) (0) | 2016.06.27 |
---|---|
[Network/ARP] ARP Request/Reply (0) | 2016.06.25 |
[Network/Ethernet] EthernetII header (0) | 2016.06.21 |