TCP/UDP/IP/ICMP 헤더구조
TCP/UDP/IP/ICMP
네트워크나 컴퓨터 쪽 공부했던 사람이라면
한 번쯤은 들어봤겠죠?
오늘은 들어만 보았던 헤더들과
멀어질 기분이 아니기 때문에
어떠한 내부구조와 항목으로 이루어져 있는지
보다 가까이 다가가서 들여다보겠습니다.
1. UDP 헤더
1) UDP헤더의 길이는 8바이트(64비트)로 구성되어 있습니다.
2) 출발지포트(16비트), 목적지포트(16비트), 길이(16비트), 오류검사(16비트)
4가지 항목으로 구성되어 있습니다.
3) 길이는 응용계층에서 생성한 UDP페이로드와
전송계층에서 생성한 UDP헤더가 더해진 데이터그램의 길이정보가 들어있습니다.
요약하면 아래 그림과 같이 구성이 됩니다.
4) 오류검사 항목은 일반적으로 비활성화상태이나 활성화상태인 경우도 있습니다.
위의 [그림2]의 경우는 오류검사항목이 비활성화상태이지만,
오류검사항목이 활성화상태라면 데이터그램을 생성할 때
12바이트(96비트)의 가상헤더(Pseudo Header)가 붙습니다.
가상헤더의
출발지IP(32비트)와 목적지IP(32비트),
제로항목(8비트)은 0이고,
프로토콜 ID는 UDP(17번) 또는 TCP(6번)의 식별자 값이 들어있고,
길이에는 프로토콜 ID 항목에 따른
UDP데이터그램의 길이정보나 TCP 세그먼트의 길이정보가
들어있습니다.
2. TCP 헤더
1) TCP헤더의 길이는 20바이트(160비트)로 구성되어 있습니다.
2) 출발지포트(16비트), 목적지포트(16비트),
Sequence Number(32비트)의 일련번호,
Acknowledgment Number(32비트)의 확인번호,
Offset(4비트), Reserved(4비트)의 예약항목, TCP Flags(8비트), Window(16비트),
Checksum(16비트)의 오류검사항목, Urgent Pointer(16비트)의 긴급포인터와
TCP Options(optional) 항목으로 구성되어 있습니다.
3) Offset은 TCP헤더의 길이정보(일반적으로 20바이트)가 있습니다.
4) Reserved(예약항목)는 공백으로 채워져 있습니다.
5) Sequence Number(32비트)의 일련번호와
Acknowledgment Number(32비트)의 확인번호와
TCP Flags항목은
TCP의 3-Way Handshaking과 3-Way Terminating의
연결설정과 종료에 관련이 있습니다.
6) Window항목은 Flow Control(흐름제어)와 관련이 있습니다.
7) Checksum(오류검사)항목은 UDP와 동일하게 일반적으로 비활성화상태이나 활성화상태인 경우도 있습니다.
[그림5]의 경우 Checksum(오류검사)항목이 비활성화된 상태입니다.
[그림6]의 경우 Checksum(오류검사)항목이 활성화되어 아래 가상헤더(다른색)가 추가로 붙었습니다.
3. 헤더 양식에 맞춰서 패킷제작
모의침투를 하기 위해서
간단한 UDP헤더구조와 복잡한 TCP헤더구조를 익혔으니
공격을 하기위해 원하는 패킷을 제작해보겠습니다.
scapy라는 네트워크패킷 분석 도구를 이용하겠습니다.
환경은 칼리를 사용해도 좋지만
저는 백박스를 한 번도 사용해보지않아 이번에 설치하였습니다.
백박스 다운로드 링크 : https://www.backbox.org/download/
ISO를 선택 후 가난하기 때문에 0유로를 기부하고 다운로드를 진행하였습니다.
(1) UDP 헤더
(2) TCP 헤더
TCP헤더의 길이정보 20바이트(가로4바이트 * 세로 5행) 중
dataofs = 5는 세로 행을 의미합니다.
flags는 기본 SYN으로 되어있지만 필요에 따라
위 표에 맞게 적어주시면 됩니다.
만약 flags가 [SYN + ACK]라면
0x2(SYN) + 0x10(ACK) = 0x12을 입력하시면 되겠죠?
추가로 시프트연산자를 이용해서 설정하는 것도 가능합니다.
그 외에도 파이썬에서는 변수를 8비트의 배수단위로 처리를 합니다.
그래서 TCP헤더의 offset(4비트)과 reserved(4비트)의 경우
한 개의 변수처럼 처리해야 하는 유의사항이 있죠..
댓글