네트워크 패킷 포렌식

Chapter1. TCP/IP 개념

CrispyFriedPotato 2016. 5. 22. 00:47

*TCP/IP에 대한 자세한 내용은 네트워크 기본 개념 폴더 의 TCP/IP부분 참고를 바랍니다. 이번 장에서는 네트워크 패킷 분석에 필요한 기본기를 쌓고 넘어가도록 하겠습니다.


(구글링을 하다보니 TCP/IP 모델에 대해 다르게 얘기하는 이미지들을 발견했지만... 다수의 부분을 차지 하고 있는 것을 반영 했음을 고려해주세요.)

|--플리케이션 계층   다른 계층의 서비스를 위한 다양한 어플리케이션을 제공하고, 어플리케이션 상호간 데이터를 교환하기 위한 프로토콜을 정의한다. 
|                                 가장 많이 알려진 어플리케이션 계층 프로토콜 : HTTP , FTP,  SMTP, Telnet, DNS, RIP, SNMP  

|

|

|-- 트랜스포트 계층       전송 계층은 양 끝단(End to end)의 사용자들이 신뢰성 있는 데이터를 주고받을 수 있도록 해 주어, 상위 계층들이 데이터 전달의 유효성이 

|                                   또는 효율성을 보장해 준다.  전송 계층은 특정 연결의 유효성을 제어하기 때문에 패킷들의 내용이 유효한지 확인하고 전송 실패한 패킷들은

|                                  재전송하게 된다. ex)*TCP

|

|--네트워크 계층-IPV6   128bit, 2,128개의 주소를 표현할 수 있음 --> 인터넷 백본에서부터 소규모 사설 네트워크에 이르기까지 모든 단말기에 할당할 수 있는 주   |                                      소공간을 갖음

|                                    IPV4에서 IP주소를 절약하기 위해 사용되는 NAT(Network Address Translation)와 같은 주소 변환 기술을 필요로 하지 않는다.

|                                    *IPV6 헤더

|

|--네트워크 계층-IPV4 IP프로토콜 운영(이 안에는 목적지의 위치를 알려주는 32bit 주소값,즉 IP주소가 있다.)

|                                   IP주소 = 네트워크 부분 + 호스트 부분

|                                   IP프로토콜

|

|--데이터링크 계층   포인트 투 포인트 간 신뢰성 있는 전송을 보장하기 위한 계층 *CRC기반의 오류 제어와 흐름 제어를 요구

|                       ①네트워크 위의 개체들 간 데이터 전달 -> ②물리 계층에서 발생할 수 있는 오류 찾아냄 -> ③오류를 수정하는 데 필요한 기능적, 절차적 수단 제공 

|                       주소값: 물리적 할당 (네트워크 카드가 제작될 때부터 LAN카드 주소(*MAC address)가 정해짐) , 주소값을 통해 데이터 링크 계층에서 통신 가능

|                        *이더넷(이더넷 프레임):LAN상에서 동작 , CSMA/CD 통신 방식 채택

|--물리 계층  실제 장치들을 연결 하기 위해 필요한 전기적, 물리적 세부 사항 ex) 핀들의 배치나 전압, 전선의 명세, 허브, 리피터 등







데이터 링크 계층

*CRC(Cyclic Redundancy Check) = 순환 중복 검사  네트워크 등을 통하여 데이터를 전송할 때 전송된 데이터에 오류가 있는지 없는지를 확인하기 위한 체크값을 결정하는 방식

*MAC address : 데이터 링크 계층에서 사용되는 네트워크 카드의  48bit 하드웨어 주소 

                          = 생산 회사의 고유식별 번호 OUI (24bit)+ 회사 내에서 나오는 상품에게 부여하는  번호 NIC (24bit)

         ex)20-7C-8F-21-E3-13   OUI(Organizationally Unique Identifier)-NIC(Network Interface Controller)


*이더넷 구조

Wikipedia

동기신호(그림에서 생략) + MAC Header or Ethernet Header(목적지 MAC주소+ 발신지 MAC주소+ 패킷유형) + IP헤더 + TCP헤더 + DATA + CRC Checksum


++        ARP(주소결정) Protocol : 통신에 필요한 서버의 MAC 주소를 얻는 과정  , 데이터링크 계층에서 필수적인 프로토콜 but 네트워크 계층의    프로토콜임!

                        : 이더넷 헤더 다음에 바로 붙는 형태로 전송됨 

ARP 패킷 형식


  ▥Hardware Type: 네트워크유형을 정의, 이더넷 환경의 경우 0x0001 세팅

 ▥Protocol type:프로토콜을 정의, IP프로토콜 버전 4는 0x0800 세팅

 ▥Hardware Length: MAC주소의 길이를 정의, 이더넷의 경우 6(바이트) 세팅

 ▥Protocol Length: 프로토콜 길이를 정의, IP 버전4는 4(바이트)를 세팅

Operation: 패킷 유형, ARP Request의 경우 1, ARP Reply의 경우 2

Sender Hardware Address: 발신자 MAC 주소 세팅

Sender IP Address: 발신자 IP주소 세팅

Target Hardware Address: 목적지  MAC 주소나, 또는 ARP Request의 경우 알 수 없으므로 0 세팅

Target IP Address: 목적지 IP주소 세팅



네트워크 계층 중 IPv4 Header Structure


■Ver(Version) : IP 버전이 저장됨

빨간색으로 되어 있는 부분을 보면 Internet Protocol의 버전이 4임을 확인 할 수 있다. 이를 16진수 형태로 본다면 45로 되어있다.

이유는 두 번째 필드인 헤더 길이까지 함꼐 저장된 것으로 표기되기 때문이다.(45에서 4 값이 버전 정보이다.)--아직 이해 못함...


■IHL(Internet Header Length):헤더 길이의 정보를 담고 있다. 단 마지막 필드인 Options 값에 따라 길이가 가변적일 수 있음

단위 32bit, 최소 5(고정크기 20바이트를 가짐)에서 최대 15(헤더길이가 60바이트, 기본크기 20바이트를 제외한 40바이트까지 최대 늘어날 수 있음) 가능


■Type of Service:서비스 종류



■Total Length:헤더와 데이터의 길이를 합한 값이며 최대 65,535바이트가 사용될 수 있다.

161을 16진수로 표기한 a1이 세팅되어 있다.


■Identification

전송할 최대 사이즈를 초과하여 분할(fragmentation)된 경우, 분할되기 전, 어떤 패킷에 속한 것인지를 구분하기 위한 고유번호가 할당되어 있다. 즉 동일한 패킷에서 분할된 패킷들은 동일한 ID 값을 가진다.


Flags

분할된 추가 패킷이 있다는 것을 알려준다. 해당정보를 바탕으로 수신측에서 재조합을 통해 원래의 패킷으로 구성한다.

0비트: 예약 필드로, 무조건 0으로 세팅되어야 한다.

1비트: DF(Don't Fragment)비트, 분할된 패킷이 없는 경우에 세팅 된다.

             

2비트:MF(More Fragment) 비트, 하나의 데이터에서 분할된 조각들은 마지막 조각을 제외하고는 해당 비트를 설정하여 분할된 패킷이 더 있음을 알린다.


Fragment Offset: 수신지에서 재배열하는 과정에서 각 조각의 순서를 파악하는데 사용된다. 

 ex) 3개로 분할된 경우, 첫 번째 조각은 항상 0으로 세팅되며, 두 번째 조각은 첫 번째에서 보낸 패킷 사이즈를 세팅한다. 그리고 세 번째 조각은 두 번쨰까지 보낸 패킷 사이즈의 합을 세팅한다. 이와 같이 바로 전까지 보낸 패킷 사이즈의 합을 해당 필드에 세팅하게 된다. 예를 들어 ping으로 4000바이트를 전송하면, 최대 전송 사이즈가 1500 바이트이므로 3개로 분할되어 전송되고, 각 패킷마다 Fragment Offset 값이 세팅된다.

(p.27 p.28맥에서 하는 방법 찾기)

TIme to Live (TTL)

패킷수명을 제한하기 위해 데이터그램이 통과하는 최대홉수를 지정할 수 있으며, 패킷 전달 시 통과되는 흡수마다(라우터 등) TTL값은 감소된다. 만약 0인 경우는 라우터에서 폐기하여 불필요한 패킷이 네트워크 상에 방치되는 것을 제한한다.

Protocol

IP헤더에 따라올 상위 프로토콜을 지정하는 것으로 TCP,UDP,ICMP 등을 확인할 수 있다. 예를 들어 ICMP가 사용되는 경우 와이어샤크에서는 01값이 세팅된다.

 http://www.networksorcery.com/enp/protocol/ip.htm#Protocol

Header Checksum

헤더의 오류를 검증하기 위해 사용된다.

계산 방식은 Version 필도 값(4500~) 부터

마지막 필드인 목적지 IP 필드값 (~3B12,22E2)까지 모두 더한다.

단 체크섬 필드 값인 DA9B 값은 제외하고 합산해야 한다.

/*합산 값은 다음과 같다.

(16진법) 4500 + 0028 + 670E + 0000 + 4006 + DA9B + C0A8 + 1A8A + 3B12+ 22E2 = 2fffd

여기서 올림수가 발생한 첫 번째 값 2는 뒤의 4자리 값과 합산한다.

2+fffd = ffff

더한 값 ffff를 2진수로 표기한 후 해당 값을 1의 보수화(0은 1로, 1은 0으로 변경)한다.*/  //계산이 왜 틀리는지 모르겠음...우선 계산 방법만...


ex)다 더한 값이 2037B라고 합시다. 그럼 그곳에서 올림수가 발생한 첫 번째  값 2는 뒤의 4자리 값과 합산합니다.

2+037B = 037D

더한 값 37D를 2진수로 표기한 후 해당 값을 1의 보수화(0은 1로, 1은 0으로 변경)합니다.

37D(16진수) = 0000 0011 0111 1101(2진수)

FC82(보수화) = 1111 1100 1000 0010

보수화 값을 16진수로 표현하면 바로 체크섬 값인 FC82가 된다. 바로 이런 방식으로 체크섬 값을 함께 보내어 수신측에서 에러발생여부를 확인합니다.


Source Address : 송신자 IP주소 값이 세팅된다

Destination Address : 수신자 IP주소 값이 세팅된다.

Options : 새로운 실험 혹은 헤더 정보에 추가정보를 표시하기 위해 설계되었다.

-Security : 정보은폐에 사용

-Strict source routing : 1:1 경로를 지정하여 해당 경로로만 패킷이 이동하도록 지정

-Loose source routing : 경로를 지정하지만, 다른 경로로 이동하는 것을 허용

-Record Route : 경로사에 존재하는 라우터의 IP를 세팅하여 라우팅 알고리즘 버그탐지에 사용

-TimeStamp :  경로상에 존재하는 라우터의 타임스탬프를 세팅하여 라우팅 알고리즘 버그탐지에 사용





네트워크 계층 중 IPv6 Header Structure



■Version(4bit) IP버전을 나타내는 필드로 값이 6으로 세팅된다.

■Traffic Class(8bit) IPv6의 클래스 및 우선순위를 나타내고 있으나, 현재까지 정의되지 않았다.

■Flow Label(20bit) 실시간 데이터(음성, 화성)와 같은 서비스 설정을 위한 값이나, 현재까지 정의되지 않았다.

■Payload Length(16bit) IP  페이로드 즉, 데이터의 길이를 의미하여 길이가 16bit이므로 65,536바이트 까지 표시할 수 있다.

■Next Header(8bit) IPv6 기본 헤더 다음에 오는 프로토콜 헤더를 나타내는 값을 세팅한다.

http://www.iana.org/assignments/protocol-numbers/   참고

■Hop Limit(8bit)  IP 패킷이 전송되는 구간을 제한하기 위해 사용되는 값이며,  IPv4의 TTL필드 값과 같다. 즉 1개의 구간을 통과할 때 마다 1씩 감소

■Source Address(18byte) 출잘지 주소를 위한 필드, IPv6 주소를 표현하는 방법은 3가지


-첫째, 128비트를 16비트씩 8개의 부분으로 구분. 각 부분은 16진수 값, :(콜론)으로 구분하여 표현, 단 각 부분에서 leading zero는 표현하지 않아도 되나, 각 부분에 적어도 1개의 숫자가 표시되어야 한다.

                               FEDC : BA98 : 7654 : 3210 : FEDC : BA98 : 7654 : 3210

1080 : 0 : 0 : 8 : 800 : 200C : 417A

-둘째, IPv6 주소배정/할당 특성에 따라, 주소상에 연속된 "0"이 많을 수 있다.

이러한 연속된 "0"의 표현을 함축 및 표현하기 위해 "::"를 사용한다. 단, "::"는 주소에서 한번만 사용할 수 있다.

-셋째, IPv4와 IPv6 주소가 혼재된 경우에는 "x:x:x:x:x:x:d.d.d.d"의 표현방식을 이용한다. "x"는 상위 6개 16bit로 IPv6의 주소표현방법이며, "d"는 4개의 8bit로 IPv4의 주소표현 방식이다.

(기타 상세한 정보는 www.ipv6.or.kr을 참조)

■Destination Address(18 byte) 목적지 주소를 위한 필드,주소체계는 위에서 언급한 내용과 동일




트랜스포트 계층 중 TCP 프로토콜

 상대방에게 정확하게 데이터를 전달할 수 있다.

 UDP 프로토콜과는 다르게 상대방이 수신이 준비된 상태에서 데이터를 전달하는 세션연결 과정을 거친다.  세션을 맺은 이후에는 데이터를 전송하며, 데이터 전송 중 발생되는 데이터의 훼손 문제는 재전송 기능을 통해 보완하고 있다. 그래서 데이터통신의 신뢰성이 요구되는 인터넷뱅킹, 메일 등과 같은 서비스에 활용되고 있다. 반면 UDP는 데이터 전달에만 목적이 있기 때문에 상대방의 준비상태에는 관심이 없고 또한 상대방의 정상수신 여부에도 관심이 없다. 그래서 인터넷 전화 혹은 영상전송과 같이 일부가 손상되어도 서비스에 크게 지장을 받지 않는 서비스에 활용되고 있다. TCP 및 UDP 프로토콜은 포트(PORT)라고 지칭하는 서비스(어플리케이션)의 출입구가 존재하며, 고유번호를 할당하여 어떤 서비스를 사용할지를 결정하게 된다.

포트의 범위는 1~65535번 이지만 이중 어플리케이션에 미리 할당된 포트번호(Well Known포트) 1~1023이 정의되어 있다.

ex)80 HTTP(WEB), 23 TELNET, 53 DNS...  물론 임의의 포트번호 사용 가능 but  통신을 원하는 상대방과의 사전 약속이 되어있기 때문에 범용적 사용 X


TCP헤더는 다음 그림과 같이 이더넷 헤더와 IP헤더 다음에 따라붙는다.

<TCP Header Structure>

                    

■ Source Port Number(16비트)

송신자의 포트번호가 할당된다. ex)웹브라우저 이용 -->  google.co.kr 접속시 로컬 PC에서는 1024번 이상의 포트 번호 임의 할당 -->  구글 웹서버에 접속


■Destination Port Number(16비트)

접속하고자 하는 목적지 대상 서버 포트번호 할당됨. 

http://www.iana.org/assignments/port-numbers


■Sequence Number(32비트)

데이터의 순서를 나타내는 번호가 할당되며 또한 분할된 패킷의 경우 데이터 재조합에 사용됨.


■Acknowledge Number(32비트)

다음에 수신할 데이터 번호이며 해당 번호를 통해 전제 데이터 중 몇 번째 데이터 인지를 파악하게 됨.

다음 그림은 Sequence Number와 Acknowledge Number 절차에 대한 설명이다.

↖<3 Way HandShaking>


■ Offset(=Header Length)

TCP헤더길이를 제공한다.


■Reserved

예약된 필드로 사용되지 않는 경우 0 값으로 세팅된다.


■Control Flags

6개 비트로 구성되어 있으며, 해당 비트 조합을 통해 통신 시작, 데이터 전송, 통신 해제 등의 통신상태를 제공한다.                                       

                                   

URG 긴급요청

ACK 응답 메시지

PSH 수신한 데이터를 어플리케이션계층으로 즉시 전달

RTS 강제 세선 종료

SYN 연결 요청

FIN 정상 세션 종료


사용자의 웹 브라우저와 웹 서버간 통신과정을 보면서 Control Flags 조합을 보면 


●통신 시작(세션 연결)

TCP 통신에서 가장 핵심적인 부분. "3 Way HandShaking"이라고 불리는 세션을 맺는 과정.

SYN(요청), SYN+ACK(요청확인+승낙), ACK(확인)의 조합을 통해  작업을 수행한다.(각 단계별로 flag에 1의 값을 넣어 전송)


●데이터 송·수신

사용자: 홈 페이지 초기 파일을 요청 < - > 웹 서버: 요청한 초기파일을 만들어 다시 사용자에게 전달

PUSH를 통해 요청한 데이터에 대한 빠른 처리 요청

PSH(페이지 요청,GET/index.html),ACK(요청확인), PSH(페이지 전달),ACK(확인)


●통신 종료

통신을 시작한 쪽에서 먼저 통신해제 요청 by FIN + ACK             &&          수신자도 동일한 방식으로 FIN + ACK를 보냄 --> 상호간 합의, 통신 종료

ACK + FIN(통신 종료 요청),ACK(확인),ACK + FIN(통신 종료 승낙), ACK(확인)


플래그 값은 사전에 약속된 형태이므로, 임의로 변경하여 전송하게 되면 상대방에서 거부하게 된다. 그러나 이러한 비정상적인 조합된 값을 전송하여 서버가 사용 중인 포트를 확인하는 포트스캔에 악용되기도 한다.

참고 Flags 값 변경을 통한 TCP 포트스캔

*Connect Scan          플래그 비트 중 SYN만 전송하여 대상 서버에서 SYN + ACK 을 응답하는 경우 포트가 오픈되어 있는 것으로 판단할 수 있다.

*Fin Stealth Scan      FIN플래그만을 전송하면 대상 포트가 닫혀있는 경우 RST플래그가 세팅된 패킷이 수신된다.

*NULL  Scan             6개의 플래그 비트를 몸두 0으로 전송하면 대상 포트가 닫혀있는 경우 RST 플래그가 세팅된 패킷이 수신된다.

*XMAS Scan             6개의 플래그 비트를 모두 1로 전송하면 대상 포트가 닫혀있는 경우 RST 플래그가 세팅된 패킷이 수신된다.


■Windows Size

윈도우 사이즈는 한 번에 받을 수 있는 패킷 사이즈를 의미, 2개 PC간에 윈도우 사이즈가 다른 경우 작은 사이즈에 맞추어 데이터를 송신


■TCP Checksum

헤더 값의 에러발생여부를 검사하기 위해 사용, 계산 방법은 첫 번째 IP헤더정보 및 TCP헤더의 일부 값과  

두 번째 TCP헤더정보의 합계와 보수화과정을 통해 만들어진다.

①IP헤더(상위프로토콜 + 송신자IP주소 + 발신자 IP 주소) + TCP 헤더길이 

16진수로 변환한 값을 합산한다. 단 TCP헤더의 길이는 16진수(32바이트는 16진수로 )로 표기하여 4자리씩 합산한다. IP주소를 16진수로 바꾸는 방법은 . 이 찍힌 구간의 세자리 수를 각각 16진수로 바꾸어 주면 된다. 그래서 나온 결과 두 자리수를 4개씩으로 묶어 덧셈을 진행하면 된다.

0006 + C0A8 + 0003 + 67F6 + 3BC4 + 0020 =1648B

②TCP헤더의 합계(소스포트부터 윈도우사이즈까지)


TCP헤더의 체크섬필드 전까지 모든 필드를 16진수형태로 4자리씩 합산한다.

EACE + 1467 + 0002 +  0001 + 0001 + 0020 + 0018 + 1000= 10F71


그리고 첫 번째와 두 번째 결과값을 다시 합산한다.

1648B +  10F71   = 273FC

여기서 자리올림이 발생한 첫 번째 숫자 2를 나머지 4자리와 합산한다.


2 + 73FC = 73FE

이를 2진수로 표현한 후, 해당 값을 1의 보수처리하여 TCP 체크섬 값을 만든다. 

-원본 값 : 73FE( 0111 0011 1111 1110 )

-1의 보수 : 8C01( 1000 1100 0000 0001)

-Urgent pointer : 플래그필드에 URG 플래그가 세팅된 패킷에서만 유효하다.

-Options : 상세한 조정기능을 위해 예약되어 있다.

-Padding : 헤더가 가변적이기 때문에 헤더의 크기를 일정하게 맞추기 위해 사용한다.


UDP

 TCP 프로토콜에 비해 헤더정보도 단순하고, 속도 또한 빠르다는 특징을 갖음 

BUT

TCP프로토콜이 가지고 있는 신뢰성은 보장되지 않는다.

①데이터 정상 전달 

UDP는 상대방의 수신준비를 위한 사전논의(TCP의 3 Way HandShaking)없이 데이터를 전달

송신 컴 :  "네가 바쁜게 나랑 뭔 상관! 걍 받아!!!"


② 전달 중 데이터 손실 발생 

데이터 전달 중 손실이 발생된 경우, 해당 데이터를 폐기할 뿐 다시 요청하지는 않는다.

수신 컴 : "뭐 이딴걸 보냈어.손실된 데이터잖아. 버려!!!"


③잘못된 포트 접속시도

대상 서버가 제공하지 않는 포트로 접속 시도 시 UDP 프로토콜에는 에러처리기능이 없기 때문에 ICMP 프로토콜이 대신 처리한다. 

(Port Unreachable  메시지를 상대방에게 전달한다)

송신 컴 : "난 이 곳의 무법자!!!!! 내 맘대로 포트를 정하겠다!!!" (UDP)

수신 컴 : " 너 뭐야? "

송신 컴: "ㅠㅠㅠㅠ포트 접속 실패...." (ICMP)


이더넷 헤더와 IP헤더 다음에 온다.

↖UDP header structure

-Source Port :  송신측 포트번호 세팅

-Destination Port : 수신측 포트번호를 세팅

-Length : 헤더와 데이터의 사이즈 세팅


■Checksum

데이터의 훼손유뮤를 확인, 계산방법은

 첫째 IP헤더 및 UDP헤더일부 값을 합산,

 둘째 UDP헤더필드값 전체를 합산,

 셋째 UDP데이터값 전체를 합산한 다음 3개 값을 모두 더하고 보수화 처리를 통해 만들어진다.


첫째 : IP헤더(프로토콜 필드 + 송신자  IP 주소 + 수신자 IP주소 ) + UDP헤더길이


 0011 + C0A8 + 001A + C0A8 + 00FF = 1827A


둘째 : UDP 헤더의 합


0089 + 0089 + 003a = 14c


셋째: UDP데이터의 합

*NetBIOS : (Network Basic Input/Output System) 

:통신망에 참가하는 개인용 컴퓨터(PC) 등에 NetBIOS명을 부가해서 그 명칭을 근거로 통신을 실행하는데, 현재 윈도 통신망의 기본형이 되어 있다.

FAF1  + 0110 + 0001 + 0000 + 0000 + 0000 + 2045 + 4A46 + 4445 + 4246 + 4545 + 4246 

+ 4143 +  4143 + 4143 + 4143 +4143 + 4143 + 4143 + 4143 + 4143 + 4141 + 4100+ 0020 + 0001 = 54260


 3개의 합/*(1827A + 14C + 54260)  =  6C626*/

--> 올림수가 발생한 제일 앞 숫자 /*6을*/  뒤의 4자리와 합 /* 4260 + 5 = 4265 */

--> 이를 2진수로 표기하고 다시 1의 보수화하여 16진수로 변환

/*4265의 2진수 = 0100 0010 0110 0101

1의 보수화 = 1011 1101 1001 1010(16진수로 BD9A < -- 이 값이 UDP체크섬 값)  또 계산이 틀렸네요...여러분은 성공 하시길...왜 자꾸 틀리지 ㅠㅠㅠ*/







출처 :< 네트워크 패킷 포렌식 >, SECU BOOK,  최경철

참고 : 구글, 네이버, 위키