어느덧 벌써 4월이 성큼 다가왔습니다. 오늘은 여러분들에게 각종 프로토콜 헤더 정리가 잘된 엑셀 파일 하나를 공유합니다. 우연챦게 보게되었는데, 엑셀에 프로토콜 헤더를 깔끔하게 정리해 놓았더라고요.
서브넷, IPv4, IPv6 헤더, TCP, UDP, ICMP, ARP, DNS 등 헤더가 이쁘게 정리되어 있습니다. 그리고 Tcpdump, ngrep, ASCII 정보도 포함되어 있어요. 엑셀파일을 열어보면 다음 그림과 같습니다.
해당 파일을 다운로드 받을 수 있는 곳은 아래와 같습니다 :
http://wiki.gnhlug.org/twiki2/pub/Www/IpReference/Packet_Headers_Subnet_Breakdown.xls
그럼, 참고하세요 :=)
2013년 4월 2일 화요일
2010년 3월 29일 월요일
헤더 체크섬 오류 Header checksum: 0x0000 [incorrect 메시지
패킷을 들여다 보면 IP 또는 TCP ,UDP 헤더 체크섬(Header Checksum)이 올바르지 않다고
나오는 경우를 보았을 것이다. 와이어샤크를 통해 보았다면, 헤더 체크섬 부분이
Incorrect 로 되어 있고, 어떤 값이 되어야 할지를 알려준다.
헤더 체크섬은 전송중에 깨질 수도 있기 때문에
기본적으로 패킷의 헤더를 보호하기 위해 만들어진 것이다. IP 헤더의 경우를 보면 2바이트(16비트)로
구성되어 있고, 네트워크를 이동하는 각 홉 에서(예를 들면, 라우터 통과) 체크섬을 검증한다.
체크섬이 올바르지 않으면 네트워크 장비는 해당 패킷을 버리게 될 것이다. 네트워크를 거치는 과정에서
체크섬은 재 계산되고 업데이트를 하게된다.
최근의 와이어샤크에서는 헤더 체크섬 값 계산은 기본적으로 disabled 되어 있다. 와이어샤크의 이전인
이더리얼만 해도 기본적으로 체크섬 값을 계산하였지만, 아무래도 이 계산 자체도
퍼포먼스에 영향을 주기 때문에 disabled 되어 있다. 와이어샤크로 열었을때
[validation disabled] 라고 이 기능을 사용하지 않고 있으므로 우측을 클릭해
Protocol References 에서 아래 내용을 체크해 주면 된다. (참고로, IP 헤더에
대해서는 기본적으로 enabled 되어 있다)
- Validate the TCP checksum if possible
- Validate the UDP checksum if possible
헤더의 체크섬 값이 0x0000 으로 되어 있는 경우도 나타나는 경우가 있다.
Header checksum: 0x0000 [incorrect, should be 0x????]

[그림] IP 헤더 Checksum 오류
이럴 경우 네트워크 장비나 기타 원인에 의해 헤더 체크섬 값이 계산되지 않았거나
또는 의도적으로 빠지는 경우도 있다. UDP 프로토콜을 정의한 RFC 768 를 보면
체크섬 값이 제로로 채워져 있는 경우는 보내는 측 쪽에서 계산되지 않는 경우라 정의하고 있다.
이외 나의 경험상 악성코드와 같은 의도적으로 만들어지는 패킷에서도 이런 경우를 종종
볼 수 있었다. 특히 2003~2004년 경에 발생한 악성코드에서 많이 체크섬 값을 계산하지 않는
경우가 많았는데 트래픽을 더욱 많이 생성하기 위해서 약간의 연산이 들어가는 이런 계산 부분도
생략한 것으로 보인다. 물론 제작자의 실수로 인한 부분도 있었을 것이다.
대부분은 정상적으로 체크섬을 계산하기 때문에 계산되지 않은 헤더가 있다면
패킷을 전송한 지점에서의 문제 (애플리케이션 제작 오류, 네트워크 카드 오류, 의도적으로 생성된
악의적 트래픽 등) 그리고, 네트워크 전송장비등이 이유가 있을 것이다.
아마 많은 경우가 전송된 지점의 문제가 아닐까 한다. 전체 덤프된 패킷에서
이렇게 발생되는 비중을 살펴보고 한 단계식 찾아들어가면 원인은 찾을 수 있을 것이다.
2010년 2월 23일 화요일
PCAP 파일을 파헤쳐 보자 - 그 두번째 이야기
PCAP 파일 포맷 구조는 복잡한 부분이 크게 없다. 물론, 직접 바이너리 파일을 들여다 볼 일도 드물다. 단순히 패킷 파일을 분석하는 분석가 입장이라면, 와이어샤크 같은 분석기를 통해서 보면 되기 때문에 어려운 부분은 없다. 하지만, 패킷 분석 전문가를 꿈꾸는 당신이라는 PCAP 파일 포맷 정도는 익혀야 하지 않을까?
그렇다면 pcap 파일 포맷을 좀더 쉽게 볼 수 있는 방법은 없을까? 010 에디터(http://www.010editor.com)
의 기능중 템플리트 기능을 사용하면 바이너리 데이터를 템플리트 형식에 맞게 파싱해 준다.
사용하기 위해서는 다음의 사이트에서 PCAP 템플리트를 받아서 프로그램에 등록하자.
그리고 PCAP 데이터를 읽어들이면 아래 그림과 같이 PCAP 헤더 정보와 다수의 레코드를 볼 수 있다.
와이어샤크와 같이 각 패킷 정보를 세부적으로 보여주는 것이 아니라 PCAP 파일 포맷의 관점에서
보여주는 것이므로 포맷 형태를 이해하는데 참고하면 될 것이다.

워낙 포맷 자체가 간단하기 때문에, 이러한 구조로 만들어져 있고 한번 경험 삼아서 살펴보면 될 것이다.
2010년 2월 22일 월요일
PCAP 파일을 파헤쳐 보자 - 그 첫번째 이야기
패킷 분석을 하면서 가장 많이 듣는 단어중의 하나가 PCAP 이 아닐까 생각한다.
네트웍을 분석하다, 문제가 있다면 흔히 "그러면 PCAP 파일좀 전송해 달라고 한다"
PCAP 은 Packet Capture 의미로 네트워크 트래픽을 캡쳐하기 위한
API 로 구성이 되어 있다. 윈도우로 포팅되어 있는 것은 WinPcap 이며, 유닉스 환경에서는
libpcap 이다.
libpcap 과 winpcap 라이브러리를 이용하여 캡쳐된 패킷을 파일로 저장하거나,
저장된 패킷을 읽고 또는 다른 프로그램에서 라이브러리를 이용해 패킷파일을
분석/편집 등을 할 수 있다. 이를 이용한 대표적인 패킷 캡쳐 프로그램이 tcpdump 나
wireshark 이다.
자 그럼, 여기서 자주 다루고 있는 패킷파일의 내부를 깊게 살펴 보자.
패킷파일은 크게 다음과 같은 포맷 형태로 구성이 되어 있다.
PCAP 파일헤더 | 패킷 헤더 | 패킷 데이터 | 패킷 헤더 | 패킷 데이터 | 패킷 헤더 | 패킷 데이터 | ... | ...
제일 처음에 PCAP 포맷을 뜻하는 헤더가 오고 이후 각 패킷의 헤더와 데이터 정보가
쌓이게 된다. 헤더 구조체는 아래와 같으며,
struct pcap_file_header {
bpf_u_int32 magic;
u_short version_major;
u_short version_minor;
bpf_int32 thiszone; /* gmt to local correction */
bpf_u_int32 sigfigs; /* accuracy of timestamps */
bpf_u_int32 snaplen; /* max length saved portion of each pkt */
bpf_u_int32 linktype; /* data link type (LINKTYPE_*) */
};
매직넘버는 고정된 값으로 0xa1b2c3d4 이다. 버전 Major, Minor 는 패킷 파일 포맷 버전을
뜻하며, thiszone, sigfigs 는 시간과 관련한 것이고 snaplen 은 캡쳐된 패킷의 길이 network 은
데이터 링크 타입이다. 패킷 헤더 레코드는 아래와 같다.
typedef struct pcaprec_hdr_s {
guint32 ts_sec; /* timestamp seconds */
guint32 ts_usec; /* timestamp microseconds */
guint32 incl_len; /* number of octets of packet saved in file */
guint32 orig_len; /* actual length of packet */
} pcaprec_hdr_t;
좀더 쉽게 설명하기 위해 아래 예제 화면을 보자. 제일 처음에 패킷파일 헤더인 매직넘버가 나오고, 패킷 헤더 시작부분과 실제 패킷 데이터 시작 부분을 볼 수 있다. 캡쳐된 패킷의 길이가 66 bytes 나오는데 패킷 데이터 시작 전 4바이트는 실제 패킷의 길이다. 0x00000042 를 계산해보면 66 값을 얻을 수 있다. 단지 위 구조체에 값을 맞춰보기만 하면 된다.

[그림] PCAP 파일 포맷 형태 예제
이 헤더가 끝난 다음 에 또 패킷 헤더와 데이터가 붙으며 계속 이런 구조로 저장이 되는 것이다. 알고보면 구조는 상당히 간단한 형태로 구성이 되어 있다. 파일의 첫 4 바이트만 보아도 아 ~ 패킷 파일인가 보다 하고 추측해 볼 수 있을 것이다. 더불어 외우기도 쉽지 않은가요. 1234 와 ABCD :-)
라벨:
0xa1b2c3d4,
매직넘버,
와이어샤크,
패킷기본,
패킷분석,
패킷파일구조,
패킷헤더,
libpcap,
Magic,
pcap,
pcap_file_header,
pcaprec_hdr,
winpcap
피드 구독하기:
글 (Atom)
