2010년 6월 10일 목요일

Ngrep 을 활용한 패킷 데이터 추출

*NIX 환경을 접해본 사용자라면 grep 이라는 도구가 익숙할 것이다. 주어진 패턴에
매칭되는 것이 있으면 출력을 해주는 기능이다. 정규식 표현도 가능하고, 상당히
많이 사용되는 도구중에 하나이다. 이 grep 을 네트워크 기준에서 사용할 수 있는 것이
ngrep 이다. 말 그대로 network grep 이다. grep 과 비슷한 기능을 수행하는데,
다만 네트워크 환경에서 유용하게 사용할 수 있도록 디자인 된 것이다. 이더넷 인터페이스
에서 모니터링을 하고 PCAP 파일에서 grep 을 수행하고, 대충 이런 기능이 있다는 것만
들어도 유용하게 사용할 수 있지 않을까 생각이 들지 않나?

다운로드는 다음의 사이트에서 받을 수 있다.


세부적인 옵션별 사용법은
# man ngrep 을 통해 살펴보면 되고, 몇 가지 사용예제를 소개하겠다. 아 참고로,
윈도우 환경에서도 사용이 가능하다!

와이어샤크와 같은 도구이외 간단하게 네트에서 발생되는 상황 파악 및 원하는 패턴이
감지되는지 사용하기 유용할 것이다.

사용법은 간단한데

ngrep [옵션] [매칭할 패턴] [ BPF 스타일 Filter ] 와 같다.

예를 들어, 매칭할 패턴없이 포트 80번에 대해서 모니터링 하고자 한다면 우리가 흔히
앞서 소개한 와이어샤크 캡쳐 필터 형태와 같이 port 80 을 사용하면 된다.

# ngrep port 80
interface: eth0 (59.6.XX.XX/255.255.255.192)
filter: (ip or ip6) and ( port 80 )
####
T 59.6.XX.XX:58339 -> 66.199.XX.XX:80 [AP]
  POST /oms.php HTTP/1.0..Host: 66.199.2XX.XX..User-Agent: XML..Content-Length: 129..Co
  ntent-Type: application/x-www-form-urlencoded..Via: 1.0 localhost (squid/3.0.STABLE8).
  .
#
T 59.6.XX.XX:58339 -> 66.199.XX.XX:80 [AP]
  data=hv7ROPo0hN6TT3OuFat2j31FP3UE2uVDcXD903ulBKZyB8bnVohEDNW0mJT+0Jnplbyi6nsSKJLPQNe5S
  Y1MWNROxBqZWIbwZFfGpfBRgQZ==
###
T 66.199.XX.XX:80 -> 59.6.XX.XX:58339 [AP]
  HTTP/1.1 200 OK..Date: Tue, 08 Jun 2010 23:43:32 GMT..Server: Apache/1.3.42 (Unix) mod
  _gzip/1.3.26.1a PHP/5.2.12 with Suhosin-Patch..X-Powered-By: PHP/5.2.12..Expires: Mon,
   26 Jul 1997 05:00:00 GMT..Last-Modified: Tue, 08 Jun 2010 23:43:32 GMT..Cache-Control
  : no-store, no-cache, must-revalidate..Cache-Control: post-check=0, pre-check=0..Pragm
  a: no-cache..Connection: close..Content-Type: application/xml; charset=UTF-8....z+Xaau
  gyuuSvEib0Hft72iB+UUo05ulQZyzowC3iRvgzDcn2XINUYfSW4KKZ+5jz3Pyo9WQFPJGKB4+/VJMKWNcA30yS
  TObgOxLJ47MdjTxvCMPjHS/4r6R02nTDNcNa8AxRgCIoeYJ5tcNdWXOj/dE9h2BsyKRG+ebP7f6tygdCulsi1+
  s3P1ACgUub2l+iwOIQuBJ4yEZ2tcfNTinyB8URXOISwNk7JY/lYrsi3xdHQxUblHlhvual7F6wiaGB9wuOn3vO
  EL9ClMVEBWtNc7qd5DDpU/fJlfxRl1KGNcZHWrYNod+reJA6iS8LVQgC7U2NHK4wd60DXi5ls5rGtXq86I4cJC

#######^Cexit
15 received, 0 dropped

이번에는 우리에게 익숙한 PCAP 파일에서 원하는 패턴을 찾아보자. fake.pcap 에서 GET 이
들어가 있는 문구를 찾는 것이다.

# ngrep -I fake.pcap GET
input: fake.pcap
match: GET
###############
T XX.XX.3.101:1040 -> 66.249.XX.XX:80 [AP]
  GET / HTTP/1.1..Accept: */*..Accept-Language: en-us..Accept-Encoding: gzip, deflate..User-Ag
  ent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)..Host: google.com..Connection:
  Keep-Alive..Cookie: PREF=ID=8fa388f82bd5ab0a:TM=1274085704:LM=1274085704:S=w1R5HKZJTTO-Gmsf.
  ...
########
T XX.XX.3.101:1041 -> 66.249.XX.XX:80 [AP]
  GET / HTTP/1.1..Accept: */*..Accept-Language: en-us..Accept-Encoding: gzip, deflate..User-Ag
  ent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)..Cookie: PREF=ID=8fa388f82bd5ab
  0a:TM=1274085704:LM=1274085704:S=w1R5HKZJTTO-Gmsf..Connection: Keep-Alive..Host: www.google.
  com....
###################
T XX.XX.3.101:1042 -> 66.249.XX.XX:80 [AP]
  GET /ig/f/qXu29BUALEY/intl/ALL_kr/homepage_v3.css HTTP/1.1..Accept: */*..Referer: http://www
  .google.co.kr/..Accept-Language: en-us..Accept-Encoding: gzip, deflate..User-Agent: Mozilla/
  4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)..Host: www.google.co.kr..Connection: Keep-Al
  ive..Cookie: PREF=ID=b47af622bcc79368:U=11de8e3df8e3084c:NW=1:TM=1274085705:LM=1274085706:S=
  Wcbcl0vOfuoFL6of; NID=34=JYDtXd2p_OuHGvzlI-nQIq6KMwtHFAb4wr81asW6ODKZa_AOu1ixpIzTvtmnjQ-Qqux
  py-ASgNd8a4_-cKbX2Pn24v04t3h34t23ZwBE69sH_-c-M4Mf2F-HNpPccbYB....


GET 명령어가 아니라 이번에는 HEX 값을 찾아보자. 찾고자 하는 패턴은 MS DOS 파일의
매직 헤더진 0x4d5a 이다. 아래는 EXE 파일의 헤더 구조의 구조체로 제일 첫번째 오프셋에
있는 signature 부분을 탐지하고자 하는 것이다. HTTP 을 통해서 무언가 윈도우 EXE 파일을
받는다면 이 패턴이 포함되어 있기 때문이다. 2바이트 밖에 안되는 작은 값이라서
실질적으로 많은 결과값이 나올 수 있다. 단지, 여기서는 하나의 예로서만 소개하겠다.

struct EXE {
  unsigned short signature; /* == 0x5a4D */
  unsigned short bytes_in_last_block;
  unsigned short blocks_in_file;
  unsigned short num_relocs;
  unsigned short header_paragraphs;
  unsigned short min_extra_paragraphs;
  unsigned short max_extra_paragraphs;
  unsigned short ss;
  unsigned short sp;
  unsigned short checksum;
  unsigned short ip;
  unsigned short cs;
  unsigned short reloc_table_offset;
  unsigned short overlay_number;
};

-x 옵션은 ASCII 뿐만 아니라 HEX 형태로도 출력을 보여주는 것이고 -X 는
텍스트 패턴 매칭이 아니라 HEX 값으로 패턴 매칭을 해준다.

# ngrep -I fake.pcap -xX '0x4d5a' port 80
input: fake.pcap
filter: (ip or ip6) and ( port 80 )
match: 0x4d5a

이미지에서와 같이 MZ(0x4d5a) 라는 문구가 보이고
"This program cannot be run in DOS mode." 패턴은 윈도우 실행파일에서
많이 보이는 것이다. 대충 값을 보면 아, 윈도우 실행파일이구나 하고 추측이 가능하다.
(16진수인 HEX 를 표현할때 앞에 0x 라고 붙여준다)

그런데, MZ 로만 잡기에는 너무 많이 나오고 범위를 좀더 좁혀보자. HTTP 에서
다운로드 받는 다는 가정하에, 그렇다면 보통 HTTP 의 응답헤더 형태 기준으로 보면
응답헤더와 그리고 파일이 이어지는데. 이때 앞쪽에 개행 문자인 0x0d0a 가 붙는 경우가
일반적이다. 그래서 패턴을 0x0d0a 로 까지 넓혀 사용하면 출력되는 내용을 좀더
확실하게 좁힐 수 있다.

# ngrep -I fake.pcap -xX '0x0d0a4d5a' port 80

이외 정규 표현식을 사용하여 효과적으로도 쓸수 있는데, 아래 예는 GET, POST, HEAD, CONNECT
가 들어가 있는 패턴만을 찾는 것이다. 찾을때는 -d 옵션으로 디바이스인 eth0 을 지정했다.


# ngrep -qd eth0 '^(GET|POST|HEAD|CONNECT)' 'tcp'
interface: eth0 (59.6.XX.XX/255.255.255.192)
filter: (ip or ip6) and ( tcp )
match: ^(GET|POST|HEAD|CONNECT)

T 59.6.XX.XX:57348 -> 208.73.XX.XX:80 [AP]
  POST /icons.php HTTP/1.0..Accept: */*..Content-Type: application/x-www-form-urlencoded..User
  -Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)..Host: images-base.com..Content-L
  ength: 265..Pragma: no-cache..Via: 1.0 localhost (squid/3.0.STABLE8)..X-Forwarded-For: 111.3
  .1.57..Cache-Control: max-age=259200..Connection: keep-alive....

T 59.6.XX.XX:54712 -> 208.73.XX.XX:80 [AP]
  POST /icons.php HTTP/1.0..Accept: */*..Content-Type: application/x-www-form-urlencoded..User
  -Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)..Host: images-base.com..Content-L
  ength: 265..Pragma: no-cache..Via: 1.0 localhost (squid/3.0.STABLE8)..X-Forwarded-For: 111.3
  .1.57..Cache-Control: max-age=259200..Connection: keep-alive....

이외 -O 옵션을 통해 pcap 파일로 저장이 가능하다.

# ngrep -O test.pcap port 80

다양한 기능을 지원하고 있어 네트워크에서 흘러 다니는 특정 패턴만을 찾는 경우에는
유용하게 사용할 수 있을 것이다. 전체 패킷을 다 감시하면서 저장하는 것이 아니라,
이런 패턴이 존재하는지 네트워크 상에서 쉽게 검증이 가능하다.

댓글 없음:

댓글 쓰기