2010년 7월 28일 수요일

PCAP 파일에서 UNIX 도구를 이용한 IP 주소 요약

서핑하다가 본 패킷 관련 블로그 글 하나를 소개하고자 한다. 유닉스 환경에 익숙한 사용자 분들이라면
awk, uniq, sed 와 같은 유틸리티들이 얼마나 막강하고 유용한지를 알 것이다. tcpdump 의 출력내용을
이 도구를 이용해 활용하는 방법이다. 원문의 글은 아래 경로에서 볼 수 있고,


필자가 명령어 관점에서 적절히 내용을 요약 소개하도록 하겠다. 일부 명령어는 조금 수정하였다. 이 글은 SANS 의 Incident Handler 인 Guy Bruneau 가 작성한 글이며, 여러분들에게 소개해도 좋다는 승낙을 받았다.

수집된 큰 파일의 PCAP 파일을 분석하려고 하면 시간이 많이 소요될 뿐만 아니라 복잡하기만 하다. 3개의 예제를 소개할 것인데, 한개는 의심스러운 포트를 찾기 위한 것과 출발지 IP 를 찾는 것이다.
참고로 여기서 사용한 IP 는 필자가 가지고 있는 PCAP 파일의 IP 를 랜덤하게 rewrite 한 것이다.

첫번째 예제는 어떤 소스IP 가 목적지 107.251.237.45 번에 80 번 포트로 SYN 패킷을 보냈는지 찾는 것이다.

일단 사용한 명령어를 보면 아래와 같으며, 하나하나 살펴볼 것이다.

#  tcpdump -ntr fake2.pcap 'dst host 107.251.237.46 and tcp[13] = 0x02 and dst port 80' | awk '{print $2}' | tr . ' '| awk '{print $1"."$2"."$3"."$4}' | sort | uniq -c | awk '{print $2 "\t" $1 }'

1) tcpdump 를 사용하면서 -n 은 resolving 을 하지 말라는 것이다. 그리고 -t 옵션은 날짜/시간을 출력하지 않으며, -r 은 fake2.pcap 파일을 읽어들이라는 뜻이다. resolving 이라고 표현한 것은 tcpdump 를 통해서 볼때 IP 주소로 안 나오고 DNS 로 변환되어 나오는 것들을 말하는데, -n 은 IP 로만 출력된다고 보면 된다.

2) 'dst host 107.251.237.46 and tcp[13] = 0x02 and dst port 80' 는 필터 문법을 사용한 것으로 tcp[13] = 0x02 는 TCP SYN 패킷을 뜻하고 dst host 107.251.237.46 가 목적지 IP 주소와 dst port 80 은 목적지 포트 80번을 뜻한다. 아래와 같은 결과를 얻을 수 있다.

# tcpdump -ntr fake2.pcap 'dst host 107.251.237.46 and tcp[13] = 0x02 and dst port 80'
reading from file fake2.pcap, link-type EN10MB (Ethernet)
IP 45.129.53.45.1107 > 107.251.237.46.80: S 2848095605:2848095605(0) win 65535 <mss 1460,nop,nop,sackOK>
IP 45.129.53.45.1109 > 107.251.237.46.80: S 2969874981:2969874981(0) win 65535 <mss 1460,nop,nop,sackOK>
IP 45.129.53.45.1113 > 107.251.237.46.80: S 3283036520:3283036520(0) win 65535 <mss 1460,nop,nop,sackOK>
IP 45.129.53.45.1117 > 107.251.237.46.80: S 1316869520:1316869520(0) win 65535 <mss 1460,nop,nop,sackOK>
IP 45.129.53.45.1118 > 107.251.237.46.80: S 416262863:416262863(0) win 65535 <mss 1460,nop,nop,sackOK>
IP 45.129.53.45.1119 > 107.251.237.46.80: S 1231482360:1231482360(0) win 65535 <mss 1460,nop,nop,sackOK>
IP 45.129.53.45.1120 > 107.251.237.46.80: S 4007769174:4007769174(0) win 65535 <mss 1460,nop,nop,sackOK>
IP 45.129.53.45.1121 > 107.251.237.46.80: S 2037777415:2037777415(0) win 65535 <mss 1460,nop,nop,sackOK>
IP 45.129.53.45.1122 > 107.251.237.46.80: S 2064521910:2064521910(0) win 65535 <mss 1460,nop,nop,sackOK>
IP 45.129.53.45.1125 > 107.251.237.46.80: S 2824615168:2824615168(0) win 65535 <mss 1460,nop,nop,sackOK>
IP 45.129.53.45.1126 > 107.251.237.46.80: S 578435425:578435425(0) win 65535 <mss 1460,nop,nop,sackOK>
IP 45.129.53.45.1127 > 107.251.237.46.80: S 3649101981:3649101981(0) win 65535 <mss 1460,nop,nop,sackOK>
IP 45.129.53.45.1128 > 107.251.237.46.80: S 4156669539:4156669539(0) win 65535 <mss 1460,nop,nop,sackOK>
IP 45.129.53.45.1130 > 107.251.237.46.80: S 2942142219:2942142219(0) win 65535 <mss 1460,nop,nop,sackOK>
IP 45.129.53.45.1131 > 107.251.237.46.80: S 1880140019:1880140019(0) win 65535 <mss 1460,nop,nop,sackOK>

3) 파이프와 awk ( | awk '{print $2}') 를 이용하여 tcpdump 의 결과중 출발지 IP 만 출력하게 한 것이다. 필드 $2 가 출발지 IP 이며, 목적지 주소로 할 경우 $4 로 변경하면 된다.

# tcpdump -ntr fake2.pcap 'dst host 107.251.237.46 and tcp[13] = 0x02 and dst port 80' | awk '{print $2}'
reading from file fake2.pcap, link-type EN10MB (Ethernet)
45.129.53.45.1107
45.129.53.45.1109
45.129.53.45.1113
45.129.53.45.1117
45.129.53.45.1118
45.129.53.45.1119
45.129.53.45.1120
45.129.53.45.1121
45.129.53.45.1122
45.129.53.45.1125
45.129.53.45.1126
45.129.53.45.1127
45.129.53.45.1128
45.129.53.45.1130
45.129.53.45.1131

4) 파이프와 tr  (| tr . ' ')를 이용하여  . 을 공백으로 바꾸는 것이다.

# tcpdump -ntr fake2.pcap 'dst host 107.251.237.46 and tcp[13] = 0x02 and dst port 80' | awk '{print $2}' | tr . ' '
reading from file fake2.pcap, link-type EN10MB (Ethernet)
45 129 53 45 1107
45 129 53 45 1109
45 129 53 45 1113
45 129 53 45 1117
45 129 53 45 1118
45 129 53 45 1119
45 129 53 45 1120
45 129 53 45 1121
45 129 53 45 1122
45 129 53 45 1125
45 129 53 45 1126
45 129 53 45 1127
45 129 53 45 1128
45 129 53 45 1130
45 129 53 45 1131

5) 다시 파이프와 awk (| awk '{print $1"."$2"."$3"."$4}') 를 이용하여 IP 주소 형태로 구성한 것이다. $5는 포트인데 제외시킨 것이다.

# tcpdump -ntr fake2.pcap 'dst host 107.251.237.46 and tcp[13] = 0x02 and dst port 80' | awk '{print $2}' | tr . ' '| awk '{print $1"."$2"."$3"."$4}'
reading from file fake2.pcap, link-type EN10MB (Ethernet)
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45

6)  sort 명령어를 ( | sort) 를 이용하여 트래픽을 IP 로 정렬한다.  ** 여기 예에서는 하나의 IP 만 이용되었음을 참고하길 바란다.

0# tcpdump -ntr fake2.pcap 'dst host 107.251.237.46 and tcp[13] = 0x02 and dst port 80' | awk '{print $2}' | tr . ' '| awk '{print $1"."$2"."$3"."$4}' | sort
reading from file fake2.pcap, link-type EN10MB (Ethernet)
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45
45.129.53.45

7) 다음으로 | uniq -c 명령어를 통해 출발지 IP 가 몇번 반복했는지 출력하는 것이다.

# tcpdump -ntr fake2.pcap 'dst host 107.251.237.46 and tcp[13] = 0x02 and dst port 80' | awk '{print $2}' | tr . ' '| awk '{print $1"."$2"."$3"."$4}' | sort | uniq -c
reading from file fake2.pcap, link-type EN10MB (Ethernet)
     15 45.129.53.45

8) 그러면 출발지 IP 45.129.53.45 가 15번 SYN 을 보냈다는 것을 알 수 있다. 다음 명령어인 awk '{print $2 "\t" $1 }' 는 보기 좋게 IP 주소와 카운트 출력을 서로 맞바꾼 것이다.

# tcpdump -ntr fake2.pcap 'dst host 107.251.237.46 and tcp[13] = 0x02 and dst port 80' | awk '{print $2}' | tr . ' '| awk '{print $1"."$2"."$3"."$4}' | sort | uniq -c | awk '{print $2 "\t" $1 }'
reading from file fake2.pcap, link-type EN10MB (Ethernet)
45.129.53.45    15

다른 예제로 사용한 것은 목적지 80 번 포트로 목적지 IP 의 건수를 출력한 것이다.  위 예제와 큰 차이는 없다.

# tcpdump -ntr fake2.pcap 'dst port 80' | awk '{print $4}' | tr . ' '| awk '{print $1"."$2"."$3"."$4}' | sort | uniq -c | awk '{print $2 "\t" $1 }'
reading from file fake2.pcap, link-type EN10MB (Ethernet)
103.215.23.19   119
105.143.221.251 5
105.143.229.47  5
107.211.203.241 20
107.251.105.215 34
107.251.237.46  75
111.157.46.185  653
111.190.92.253  12
111.200.248.236 21
111.212.148.21  40
121.166.117.57  25
121.205.250.221 10
121.205.250.223 24
123.187.14.83   31
123.187.14.89   15
125.167.70.221  15
159.180.121.215 11
189.252.57.215  5
189.252.57.217  5
43.197.190.189  6
45.219.248.116  15
59.185.219.21   5
59.185.219.245  28
59.185.219.57   113

다음은 목적지 포트번호인 $5 를 사용하였는데 출력을 시키고 정렬하면서 , sed 명령어로 제일 끝부부의 출력인 : 를 삭제하여 출력한 것이다.

# tcpdump -n -r fake2.pcap | awk '{print $5}' | tr . ' ' | awk '{print $5}' | sort | uniq -c | sed 's/:$//'
reading from file fake2.pcap, link-type EN10MB (Ethernet)
      2
     16 1039
      3 1040
      3 1041
     30 1042
     10 1043
     10 1044
      7 1045
      6 1046
      6 1047
      7 1048
      9 1049
      7 1050
      3 1051
      3 1052
      3 1053
     21 1054
     42 1055
     64 1056
     15 1057
     10 1058
     77 1059
     49 1060
     22 1061
     16 1062
     24 1063
     22 1064
     19 1065
     21 1066
   
간단하게 원문의 예제와 다르게 수정한 것을 소개해 보았는데, 아주 기본적인 형태를 언급한 것이다. awk, sed 와 파이프 문만 잘 사용해도 출력되는 스트링을 자유자재로 편집하여 유용한 수치를 뽑아낼 수 있다. 나 또한 즐겨쓰는 유틸리티 인데, 이 각각의 도구가 책 한권씩 소개되어 있을만큼 문자열을 다루는데 있어서는 최고다.

tcpdump 를 예로 들어 설명했는데 tshark 의 결과를 이용하는데도 유용하다. tshark 는 출력시키고자 하는 내용을 원하는 포맷 형태로 맞추어 출력도 가능하여 효과적으로 사용할 수 도 있는데, 정리가 되는대로 여러분들에게 소개할 것이다.

2010년 7월 27일 화요일

패킷인사이드에 붙여진 IPv4 할당중지 카운터

패킷인사이드를 유심히 본 분이라면 몇일 전 부터, 오른쪽 하단에 아래 이미지와 같은 IPv4 카운터를 보았을 것입니다.

패킷 인사이드에서도 IPv6 전파에 일조하고자, IPv4 주소가 이제 얼마남지 않았음을 알리는 카운터를 달아놓았습니다. 현재 이 글을 작성하는 시점에서는 전체 IP 중 6% 만이 남았고, 2011년 7월2일이 IPv4 신규 할당 중단 일자입니다. 이제 340 일 남았는데, 제가 처음에 IPv4 주소를 언급하였을 때가 예상시점이 2011년 10월경이었는데, 빨라지고 있네요.

국내에서의 IPv6 인식은 여전히 낮은것 같습니다. 네트워크를 전문으로 서비스 하는 곳에서야 어느 정도 준비를 하는 것 같고, 큰 규모의 IT 전문업체라도 앞으로 테스트망을 준비하고 스터디 하는 단계로 추정됩니다. 물론 저만의 생각입니다.

저도 틈틈이 IPv6 를 다시 공부해 보면서 여러분들과 공유해 나가려고 하는데, 글 한편편 쓰기가 쉽지 않네요. ㅋㅋㅋ

중요한 것은 이제 6% 남았습니다. 그리고 우측에 IPv6 메뉴를 따로 만들었습니다. 앞으로 얼마나 많은 글을 써 나갈 수 있을지는 모르겠지만, 차곡 차곡 모아봐야죠.
요새 날씨가 너무나 덥던데, 냉방병 걸리지 않도록 주의하시고요. :-)

/Rigel

안드로이드(Android)폰에서 tcpdump 를 이용한 패킷덤프!

이전에 몇번 안드로이드 패킷과 관련한 글을 포스팅 하였다. 오늘은, 그간 직접 패킷덤프를 하지 못한 아쉬움이 있었는데, 직접 패킷 덤프를 한 사례를 소개한다. 패킷덤프 프로그램은 *NIX 환경에서 많이 사용하는
tcpdump 이다. 바로 이 tcpdump 를 안드로이드에서 동작시켜 보는 것이다.

와이어샤크 같은 GUI 환경은 아니지만, 그래도 충분하다. 동작시키기 위해서는 다음 2가지 요건이
갖춰져야 한다.

- 루트 권한
권한이 없는 상태에서 실행하면
You don't have permission to capture on that device 메시지를
- 안드로이드 환경에서 동작 가능한 tcpdump
다음 URL 에서 다운로드:
또는 첨부파일 다운




위 환경이 준비되었다면, 간단하다. tcpdump 파일을 휴대폰에 넣어주고 루트권한으로 실행만 해주면 된다.
필자가 사용하는 안드로이드 스마트폰은 국내에 처음으로 소개된 모토로이이다. 그간 루트권한을 얻을 수 있는 방법이 없어, 사용하지 못했는데. 이제야 가능해 졌다. 자 실행전에 'netcfg' 를 사용해 인터페이스 현황을 살펴보자.

usb0 는 휴대폰과 컴퓨터간 연결되어 할당된 주소이고, rmnet0 라고 하는 부분이 3G 사용할때 할당되는 인터페이스 이다. 10.163.36.86 IP 가 할당되어 있고, 서브넷은 255.0.0.0 이다. 자, 10.x.x.x/8 주소는 인터넷에서 라우팅되지 않는 Private Address 이다. 그러면 추측이 가능하다. rmnet0 에 할당되는 것이 Private 주소 이므로, 결국 통신이 될때는 NAT 를 거쳐서 통신이 될 것이다. 다음 프로그램은 Network Info II 라는 프로그램을 실행한 것인데, External IP 로 공인 IP 주소가 보인다. 실제 외부와의 통신은 이 IP 를 가지고 하게 되는 것이다.
네트워크 구성을 잠깐 살펴보았고, 이제 tcpdump 를 실행해 보자. 실행 해보니 *NIX 환경에서 실행되는 것과 같다. 그렇다면 원하는 대로 자유롭게 사용가능하다는 점!.









자 그럼 tcpdump 를 실행해 보면 아래 그림과 같이 통신 내용을 볼 수가 있다. 내부 IP 주소인 10.163.36.86 이 보인다. 그리고 외부 IP 주소도 보인다.

왠지 새로운 세상이 열리는 것 같다. 앞으로 해 볼수 있는 것이 많을것 같기 때문이다. 앞으로 차차 다뤄보기로 하고 마지막 이미지는 -c 카운터 옵션을 주고 20개의 패킷만 덤프하여 -w 옵션으로 /sdcard/moto.pcap 으로 저장하라는 것이다. 사실 계속 보여지는 덤프 화면을 볼 수는 없고, 저장하여 살펴보는 것이 가장 적절한 방법이다. 화면도 작고, 명령어 하나 타이핑 치는게 불편하다.
그래도 이동중에도 어디서든 패킷 분석을 할 수 있으니 이것은 장점이다. 3G 뿐만 아니라 WiFi 도 당연히 가능하다. 이것으로 할 수 있는 것은 여러분의 상상으로 맡긴다. 언제나 휴대하고 가지고 다닐 수 있는 ' 작은 패킷 분석기'를 몸에 하나 지니고 다닌다 라고 생각하면 된다.

참고로 캡쳐된 패킷파일은 이전에 소개한 클라우드 기반 형태의 웹 패킷 분석기를 이용하면 그래픽 환경으로
조금은 더 낳은 분석 환경을 제공할지도 모른다.

앞으로 저와 함께 모바일 패킷 세계로 GoGo 해요~
단, 악의적인 사용은 안됩니다.

P.S Capture Size 가 제한되므로 -s 옵션을 통해 덤프할 패킷의 길이를 지정해주세요. -s 1514 와 같이.

2010년 7월 23일 금요일

와이어샤크 개발버전 1.4.0RC1 의 새로운 기능을 느껴보자.

6월초에 1.4.0 RC1 에 나왔는데, 여러분들에게 소개한다는 것이 깜빡 잊었다.
현재 사용하는 Stable 버전이 1.2.9 이고, 개발 버전이 1.4.0 이다. 기존까지는 계속 개발 버전으로 나오다
6월초네 RC1 버전이 처음으로 릴리즈 된 것이다. 어느정도 안정화 단계에 들어간것 같으니
멀지않은 시기에 정식버전이 나오리라 생각된다.

외관적으로 크게 변화된 것은 별로 없고, 느낌상으로는 속도가 좀 빨라진것 같다.
몇가지 새롭거나 업데이트 기능을 소개하면 다음과 같다 :
(새롭게 바뀐 기능을 웹에서 찾기가 힘들어, 어떤 기능들이 새로워졌는지 찾는데 시간이 걸렸다. :-) )

  • 와이어샤크의 메인 화면에서 컬럼을 쉽게 이동할 수 있거나, 오른쪽 클릭을 통해 조정이 가능
  • 파이썬 스크립트 지원
  • 많은 부분에서 메모리 누수 버그 Fix (그래서 그런가, 처리가 조금 자연스러운듯)
  • 와이어샤크 1.4 버전에서는 윈도우 2000을 지원하지 않음. 그러므로 윈도우 2000 에서는
    1.2 나 1.0 버전을 이용해야 함
  • Manually Resolve Address 기능
    유용하게 이용할 수 있는 부분인데, IP 를 특정 이름으로 변경시켜 놓을 수 있다.
    예를들어, 172.16.1.254 라는 것을 쓰고 있다면 이 기능을 통해 Internal Router 이런식으로 바꿀 수 있다.
  • 'Ignore Packet' 기능, 필요없는 패킷에서 오른쪽 클릭을 통해 무시해 버릴 수 있다.
  • 시간 표시가 이제는 시:분:초 형태로 출력된다.
  • 유닉스와 리눅스 환경의 와이어샤크에서 캡쳐 버퍼 사이즈를 설정할 수 있다.
  • 와이어샤크에서 바로 JPEG 파일을 오픈할 수 있음
    JPEG 파일을 와이어샤크로 던져보면 알 수 있다.
  • 새로운 프로토콜 지원
  • 이외 기타 등등

몇 가지 분석에 유용한 기능들도 보이고, 계속 발전해 나가는 와이어샤크를 보니 역시 최고의 패킷 분석기 다워 보인다. 말로는 설명하기 다 힘드니, 궁금한 분들은 직접 사용해 보며 느껴보기를 바란다.

2010년 7월 22일 목요일

택배박스 버릴때 운송장의 바코드 번호도 주의합시다!

얼마전 택배를 받았다. 택배를 받으면, 박스를 버릴때에는 개인정보가 담겨있는 운송장은 떼내고
버린다. 언론에서도 한번 소개된적이 있지만 이 정보를 가지고 범죄에 이용하는 경우도 있었다고 한다.
나야 원래부터 그렇게 해왔는데, 다 뜯고 버리려고 하는데. 한쪽 구석에 남겨진 바코드 정보.
윗 부분만 남아있고 아래부분은 사라진 것이지만, 왠지 느낌이....왔다.

이 남은 정보로 알수 있지 않을까? 그래서 핸드폰의 바코드 리더기능을 이용해 바코드를 조심스레 읽어봤다.
그랬더니. 짜잔, 운송장 번호가 나타난다. 이 운송장 번호를 해당 택배사에서 찾아보면 정보가 나타난다.
인텔리전트한 도둑이라면 이런 정보까지도 활용하지 않을까? 예전에는 별로 생각하지 않았겠지만
이제는 휴대폰만 있으면 바코드도 뚝딱 읽어들인다.

이젠 버릴때 더욱 완벽하게 흔적하나 남기지 않고 버려야 겠다. 여러분들도 주의하세요.~

2010년 7월 21일 수요일

구글의 크롬브라우저로 정보가 새어나갈 수 있다고?

내가 주로 즐겨쓰는 브라우저는 구글의 크롬(Chrome)브라우저 이다. 우선 빠르고, Safe Browsing 기술, 스킨 등등 다양한 기능에 즐겨쓰고 있다. 별 생각없이 기본 옵션으로 사용하는데, 주소를 잘못치거나 존재하지 않는 주소를 치면 아래와 같은 화면을 가끔 보게 된다.

별 생각없이 사용하다, 내가 요청한 정보가 넘어가는게 아닐까 하여 패킷캡쳐를 해 보았더니. 역시나 아래 그림과 같이 구글 쪽 서버로 내가 요청하였던 쿼리 정보가 넘어간다. 어떻게 생각하면 별일 아닐 수도 있으나, 내부용도로만 이용되는 서비스가 있거나, 기타 내부 시스템을 브라우저를 이용해 사용하는 경우. 타이핑을 잘못하면 아래와 같이 구글쪽으로 쿼리 정보가 넘어가므로, 내부의 운영정보가 새어나갈 수도 있다. 단순한 주소이지만, 내부 정보에 대해서 민감하게 생각하는 곳에서는 생각해볼 문제이다.

물론, 브라우저를 이용해 검색엔진을 사용하면 내가 쿼리하는 정보가 당연히 기록이 된다. 이건 검색엔진 서비스를 이용하기 때문이다. 그런데, 브라우저에서 이렇게 쿼리 정보가 넘어간다면 예상치 않은 결과일수 있다. 서비스 관점에서 보면 더욱 편리하게 이용할 수 있도록 제안해주는 기능이 좋을 수도 있지만 싫어하는 이들도 분명 있다. 이런 경우에는 크롬 브라우저 옵션 메뉴에서 'Show suggestions for navigation errors' 기능을 제거해 주자.
그러면 내가 잘못 친 주소라도 쿼리 정보가 넘어가지는 않는다. 머 이런 정보를 구글에서 알았다고 어떻게 하겠느냐만 혹시라도 민감한 분들은 참고하길 바란다.
모르는 것 보다는 이런식으로 동작된다는 것을 알고 대처하는 것이 좋을 것이다.
그래도 개인적으로는 아직 구글브라우저가 내 맘에 쏙 드는 것은 사실이다. :-)

2010년 7월 20일 화요일

IP 주소의 위치정보를 활용하여 멋진 그래프 만들기

패킷파일을 열어보면 IP 정보들이 가득하다. 필요에 따라 IP 주소를 Whois 하여 찾아보고, 어느 국가의 것인지, 어느 기관의 것인지 알아볼 수 있다. 오늘은 패킷 파일의 IP 주소의 위치정보를 좀더 쉽게 확인할 수 있는 방법을 소개해 보고자 한다. 일단 도구가 필요한데, IPLocation 이라는 것을 받아보자.


IPLocation 은 각 IP 주소를 쿼리하여 위치 정보를 리턴해주는데, 보여주는 정보의 형태가 CSV 이다. 루비로 만들어져 있는 스크립트 형태이며, 사용하기 위해서는 루비 PCAP 라이브러리가 필요하다.
루비 PCAP 라이브러리는 다음의 경로에서 받을 수 있다.


PCAP 라이브러리의 컴파일은 ruby extconf.rb 를 실행해 주면 된다.

# ruby extconf.rb
checking for socket() in -lsocket... no
checking for gethostbyname() in -lxnet... no
checking for hstrerror()... yes
checking for pcap.h... yes
checking for pcap_open_live() in -lpcap... yes
checking for pcap_compile_nopcap()... yes
creating Makefile

그러면 위와 같이 Makefile 이 만들어지고 make 명령어를 통해 컴파일을 시작한다.

# make
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c icmp_packet.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c ip_packet.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c packet.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c Pcap.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c udp_packet.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c tcp_packet.c
cc -shared -o pcap.so icmp_packet.o ip_packet.o packet.o Pcap.o udp_packet.o tcp_packet.o -L. -L/usr/lib -L/usr/local/lib    -lruby1.8 -lpcap  -lpthread -ldl -lcrypt -lm   -lc

컴파일이 되었다면 make install 하는 것으로 쉽게 설치가 끝난다.

# make install
/usr/bin/install -c -m 0755 pcap.so /usr/local/lib/site_ruby/1.8/i486-linux
/usr/bin/install -c -m 644 ./lib/pcaplet.rb /usr/local/lib/site_ruby/1.8
/usr/bin/install -c -m 644 ./lib/pcap_misc.rb /usr/local/lib/site_ruby/1.8

자,이제 IPLocation 을 실행해 보자. 실행하면, 바로 패킷 캡쳐모드로 발견되는 IP 주소에 대한 정보를 보여준다.
Inbound 와 Outbound 로 나뉘어 보여지게 되며, 중지는 CTRL-C 를 누르면 된다.

# ./iploc.rb
Aggregating...CTRL-C to finish (if in live capture mode).
^CInbound Addresses:
168.126.63.1,KOREA, REPUBLIC OF (KR),(Unknown city),,,27
201.76.40.2,(Unknown Country?) (XX),(Unknown City?),,,1
75.126.229.92,UNITED STATES (US),(Unknown city),,,1
174.133.246.194,UNITED STATES (US),Houston TX,29.7687,-95.3867,2
189.126.108.2,(Unknown Country?) (XX),(Unknown City?),,,1
203.119.29.1,CHINA (CN),(Unknown city),,,1
89.253.195.102,RUSSIAN FEDERATION (RU),Moscow,55.75,37.6,1
59.6.145.185,KOREA, REPUBLIC OF (KR),(Unknown city),,,86
200.219.159.10,BRAZIL (BR),(Unknown city),,,1
174.129.200.54,UNITED STATES (US),Seattle WA,47.6218,-122.35,27
213.248.61.180,RUSSIAN FEDERATION (RU),Moscow,55.75,37.6,4
192.33.14.30,UNITED STATES (US),(Unknown city),,,4

Outbound Addresses:
59.6.145.185,KOREA, REPUBLIC OF (KR),(Unknown city),,,11
200.219.159.10,BRAZIL (BR),(Unknown city),,,1
301 packets received by filter
95 packets dropped by kernel

그럼 어떤 옵션들이 있는지 살펴보자.

# ./iploc.rb -h

Usage: iploc.rb [ -dnv ] [ -i interface | -r file ]
                [ -c count ] [ -s snaplen ] [ filter ]
Options:
  -n  do not convert address to name
  -d  debug mode
  -v  verbose mode

도움말은 아주 간단하다. 대략 어떤 형태의 옵션인지 추측이 가능할 것이다. -r 은 파일을 읽어 들이고, -c 는 카운트 만큼 동작하고 중지하며 필터는 tcpdump 와 같은 필터를 걸때 사용하는 것이다. 저장되어 있는 패킷파일이 있다면 -r 옵션을 통해 기록되어 있는 IP 주소의 위치 정보를 알 수 있다.

# ./iploc.rb -v -r fake.pcap
Aggregating...CTRL-C to finish (if in live capture mode).
Inbound Addresses:
93.186.124.94,(Unknown Country?) (XX),(Unknown City?),,,31
91.207.192.25,UNITED KINGDOM (GB),(Unknown city),,,10
125.56.214.113,(Unknown Country?) (XX),(Unknown City?),,,4
72.14.203.100,UNITED STATES (US),Mountain View CA,37.402,-122.078,3
188.124.7.155,TURKEY (TR),Bursa,40.1833,29.0667,5
66.249.89.104,UNITED STATES (US),Mountain View CA,37.402,-122.078,61
188.124.7.156,TURKEY (TR),Bursa,40.1833,29.0667,5
209.190.85.9,INDONESIA (ID),Gombong,-6.1167,107.117,12
[생략]

너무 많은 경우에는 -c 옵션을 통해 제한하면 카운트 만큼만 보여준다.

# ./iploc.rb -v -r fake.pcap -c 100

이렇게 얻은 정보는 유용하게 사용될 수 있는데, 결과로 나온 형태가 CSV 라는 점에 주목해야 한다.
CSV 로 얻었으니, 내가 원하는 형태로 가공하여 사용할 수 있다. 보고서에 이용하는 것이라면 그래프등으로
변환하면 더욱 유용할 것이다.  필자는 이렇게 얻어진 CSV 데이터를 오픈오피스(OpenOffice)를 통해 가공해 보았다. CSV 파일을 로드하고, 구분자 옵션으로 콤마를 선택한다. 그러면 아래 그림과 같이 이쁘게 분리가 된다.


이후, 데이터가 로드되었으니 자기 입맛에 맞게 만들어 사용하면 된다. 아래 예제는 데이터를 나라별로 정렬하여 통계를 내 본것이다.

텍스트 파일 보다는 훨씬 깔끔하고, 분포를 쉽게 볼 수 있다.  IPLocation 을 통해 나온 그 데이터의 결과만 보지 말고 다양하게 활용할 수 있는 방법을 생각해 보면 무궁무진하다. 비싼 도구 없이도 오픈소스만으로도 멋진 보고서를 만들어 보도록 하자.

참고로, 위 내용과 관련한 이전 포스팅을 참고하면 도움이 될 것이다.

2010년 7월 16일 금요일

윈도우에서 마우스한번으로 패킷파일(PCAP)을 빠르고 쉽게 분할하여 보자!


이전 포스팅에서 패킷파일을 자르기 위한 방법을 몇 가지 소개하였다. 유닉스 기반에서는 주로 콘솔 기반에서 사용하다 보니 명령어를 하나 호출하여 사용하면 금방 되지만 GUI 환경으로 주로 사용하는 윈도우에서는 패킷 파일 한번 자르려면 도스창을 열어야 하고 귀챦은 점이 있다. 간단한 방법을 통해 한번에 이 문제를 해결할 수 있는 방법을 소개하고자 한다.

[과거 PCAP 분할과 관련된 글]
어떤 방법이 가장 쉬울까 하고 생각해 보았더니, 오른쪽 마우스를 클릭했을때 메뉴로 등록하는 것이 가장 빠른 방법 같았다. 오른쪽 마우스를 클릭했을때 나타나는 메뉴는 레지스트리를 수정하는 것만으로도 쉽게 만들 수 있으므로, 가장 최적의 방법이다.

우선, 여기서는 와이어샤크에 기본으로 포함되어 있는 editcap.exe 를 사용할 것이다. 그러므로 어느 경로에서나 실행될 수 있도록 패스 경로에 넣어두는 것이 필요하다. 어느 경로에서나 editcap 을 실행할 수 있다면 일단 기본 준비는 완료되었다. 그 다음은 레지스트리를 수정하는 것이다.

1. regedit 를 실행
2. HKEY_CLASSES_ROOT\*\Shell 아래에 내가 원하는 것을 만들어 넣으면 메뉴로 쉽게 추가가 가능하다.
그리고 다음의 명령어를 실행하는 것이다.

editcap.exe -c 300000 %1 %1_split.pcap

-c 옵션은 패킷 파일당 30만개씩을 넣는 것이고, %1 은 받아들이는 인자명이다. 즉, 이 명령어를 실행하면 패킷파일을 30만개씩 나누라는 것이다. 자 그럼 레지스트리에 등록하는 것으로 끝이난다. 막상 레지스트리 찾아서 입력하려고 하면 귀챦다. 그래서 아래와 같이 자동으로 입력될 수 있도록 만들어 보았다.

;
; "Spliting Network Packet File(PCAP) - SplitCap"
; Are you looking for packet information? please visit following site.
; http://packetinside.com
; written by Rigel

[version]
signature="$CHICAGO$"

[SplitCapInstall]
AddReg    = SplitCap.Reg

[DefaultInstall]
AddReg    = SplitCap.Reg

[SplitCap.Reg]
HKCR,*\Shell\SplitCap,,,"%SplitCapName%"
HKCR,*\Shell\SplitCap\command,,,"cmd.exe /c editcap.exe -c 300000 %1 %1_split.pcap"

[Strings]
SplitCapName="SplitCap"

위 내용을 splitcap.inf 파일로 저장하자. (또는 splitcap.inf 다운로드) 그리고 저장한 splitcap.inf 에서 오른쪽을 클릭하면 Install 또는 설치 라는 메뉴를 볼 수 있다. 선택을 해주면 자동으로 레지스트리에 삽입이 된다.




입력된 내용은 아래와 같다:

※ 잘못된 레지스트리의 사용은 시스템에 영향을 줄 수 있으므로, splitcap.inf 의 사용 및 직접 레지스트리 수정에 의한 어떤 영향도 필자는 책임을 질 수 없다.

레지스트리에 삽입이 되면 이제 분할 할 패킷파일에서 오른쪽 마우스 클릭하여 선택하는 것만으로 쉽게 파일을 자를 수 있다.

위 예에서 300 메가 되는 파일에서 SplitCap 을 선택하였더니 , 아래와 같이 한번에 파일이 분할 되었다.

대략 23 메가 정도의 크기로 잘라졌는데, 이 정도면 PC 에서 읽어 들이는데도 문제 없을 것이다. 분명 300 메가 단일 파일을 읽는 것보다는 좋을 것이다. 앞서 -c 로 지정된 값은 여러분들이 사용하는 컴퓨터의 사용에 따라 적절하게 조정하면 된다.

이 정도면 윈도우에서 불편했던 패킷파일 자르기가 어느정도 해결이 되지 않을까?

From Rigel

P.S 이 글을 거의 다 써 놓은 시점에서 브라우저가 깨지는 바람에 썻던 글을 모두 날리고 다시 쓴 글이다. 똑같은 내용을 다시 쓰려니 어찌나 맘이 아프던지. 앞으로는 자주 저장하거나 특단의 방법을 마련해야 할 것 같다 ^^

2010년 7월 15일 목요일

윈도우 비스타, 7 환경에서 많이 보이는 LLMNR 프로토콜 정체는?

이전 포스팅에서 살짝 언급된 LLMNR 프로토콜에 대해서 소개해 볼까 한다.

LLMNR(Link Local Multicast Name Resolution)은 DNS 패킷 포맷형태로 로컬 링크상에서 호스트들의 이름을 조회하는데 이용되는 프로토콜이다. 윈도우 비스트, 윈도우 7, 윈도우 서버 2008 에 기본으로 포함되어 있다.
그렇기 때문에 같은 서브넷 상에 이런 호스트가 존재하면 LLMNR 프로토콜이 많이 나타난다. 윈도우 7 출시 이후로는 로컬 네트워크 상에서 패킷 캡쳐시 LLMNR 형태가 많이 보이는데, 그 많큼 앞서 언급한 운영체제가 증가하고 있는 것으로도 간접적 추측이 가능하다.

LLMNR은 UDP 5355 포트를 사용하며 멀티캐스트 주소이다.

IPv4 - 224.0.0.252 이고 맥 주소는 01-00-5E-00-00-FC
IPv6 - FF02:0:0:0:0:0:1:3 (이 주소는 줄여서 -> FF02::1:3 표현이 가능하다)

아래 그림은 와이어샤크에서 패킷 캡쳐된 것으로 주소를 확인할 수 있다.

LLMNR 의 헤더 포맷은 아래와 같다. DNS 의 헤더 포맷과 크게 다르지는 않다.
QR 은 Query/Response 로 1비트 필드를 사용하며 설정되어 있을 경우 LLMNR 의 응답,설정되어 있지 않을 경우 LLMNR 쿼리이다. OPCODE 는 4비트로 쿼리 타입의 형태를 가리킨다.

                                      1  1  1  1  1  1
        0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
      +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
      |                      ID                       |
      +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
      |QR|   Opcode  | C|TC| T| Z| Z| Z| Z|   RCODE   |
      +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
      |                    QDCOUNT                    |
      +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
      |                    ANCOUNT                    |
      +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
      |                    NSCOUNT                    |
      +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
      |                    ARCOUNT                    |
      +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

세부적인 사항은 RFC 4795 를 살펴보기 바란다. 아래 이미지는 IPv6 의 LLMNR 세부 정보로 목적지 포트가 5355 임을 알 수 있고, Questions 필드가 1로 Set 되어 있다.

그런데, 이제 LLMNR 은 알겠는데. 왜 이게 사용되어야 하는 것일까?
IPv4 호스트에서는 네트워크 상 주변에 있는 컴퓨터 이름을 Resolving 하기 위해서 NetBIOS 를 이용하여 네임쿼리를 요청하는 메시지를 브로드캐스팅한다. 이때 노드상에 요청한 쿼리에 해당하는 호스트가 있다면 네임쿼리를 응답하게 된다. 이런 형태가 일반적인 네트워크 상에서 많이 보는 형태이다. 그런데, NetBIOS 가 IPv4 환경에서만 동작한다. 그러므로 양 환경에서 모두 이용될 수 있는 LLMNR 프로토콜이 요구되었다. 얻을 수 있는 이점에 대해서는 다음 글을 참고해 보길 바란다.


실 환경에서는 LLMNR 로 인한 네트워크 트래픽 폭주를 경험했다는 사례를 들었다.(초당 2만개) IPv4,IPv6 로 함께 요청되다 보니 Request 되는게 NetBIOS 보다 많은 경우가 있다. 만약 악성코드에 감염되었는데, 이것이 Name Query 가 많은 형태라면 아무래도 영향을 미칠수도 있을 것이다. 어찌되었든 이것은 참고하시고, 만약 LLMNR 을 중지하기 위해서는 다음과 같은 방법을 이용하면 된다.

<윈도우7의 경우>
제어판->네트워크 및 인터넷 -> 네트워크 및 공유센터 -> 고급공유 설정 -> 홈 또는 회사 선택 후
네트워크 검색 끄기를 설정.


[참고]
1. RFC 4795
http://tools.ietf.org/html/rfc4795
2. The Cable Guy - Link-Local Multicast Name Resolution
http://technet.microsoft.com/en-us/library/bb878128.aspx

2010년 7월 11일 일요일

와이어샤크에서 깨져보이는 '한글', 이거 무슨 뜻이지?

와이어샤크를 통해 패킷 분석을 하는 경우, 아래와 같이 문자열이 <xx> 로 보이는 경우가 있다. 문자열로 추측이 되는데 무엇일까? 한글이 이렇게 표현되는 경우가 있다.  왜 와이어샤크에서 한글이 깨져보일까?
와이어샤크에서는 한글 컨버전이 제대로 안돼 한글을 windows-1252 코드로 표현한 것이다. 참고로 영어와 서방 언어 윈도우에서 기본으로 사용되는 코드페이지이다.


가끔 이렇게 표현되는 한글이 무엇일까? 필요한 경우가 있다. 간단한 것은 우리가 알아볼 수 있도록 컨버전을 하는 것이다. 다양한 방법을 통해서 할 수 있겠는데, 일단 필자는 다음과 같이 파이썬을 통해 해 보았다.

x 변수에 각 값을 넣어주고, 디코드를 EUC_KR 로 해 보았다.

>>> x = "\xb0\xe6\xbf\xb5\xc1\xf6\xbf\xf8\xc6\xc0"
>>> print x.decode("euc_kr")
경영지원팀
>>>

그러면 짠 하고 의미가 나타난다. 넷바이오스 관련한 것을 보다보면 이러한 이름뒤에 <00>, <1b>, <20>, <1c> 를 볼 수 있다.  예를 들면 ,  TEST<00>, 홍길동<1C> 와 같은 것들이다. 위에서도 마찬가지로 이름에서 젤 마지막에 붙은 <00> 은 실제 이름이 아니고 다른 의미이므로 그것은 떼어내고 변환해야 한다.

이렇게 변환외에도 알수 있는 방법은 출발지 IP 를 보고 nbtstat 명령어를 통해 보는 것이다.

C:\>nbtstat -A 192.168.x.x
Local Area Connection:
Node IpAddress: [192.168.x.x] Scope Id: []

           NetBIOS Remote Machine Name Table

       Name               Type         Status
    ---------------------------------------------
    TEST12          <00>  UNIQUE      Registered
    경영지원팀     <00>  GROUP       Registered

    MAC Address = 00-19-B9-XX-XX-XX

단, 같은 네트워크 라면 모르지만 원격의 경우는 여러 제약이 있으므로 패킷만 전달받은 상태에서는 이렇게 알기 힘드므로 직접 변환 작업등이 필요하다.

아래 도표는 NetBios 의 Number 를 정리한 도표이다.

NameNumberTypeUsage
<computername>00UWorkstation Service
<computername>01UMessenger Service
<''_MSBROWSE_>01GMaster Browser
<computername>03UMessenger Service
<computername>06URAS Server Service
<computername>1FUNetDDE Service
<computername>20UFile Server Service
<computername>21URAS Client Service
<computername>22UExchange Interchange
<computername>23UExchange Store
<computername>24UExchange Directory
<computername>30UModem Sharing Server Service
<computername>31UModem Sharing Client Service
<computername>43USMS Client Remote Control
<computername>44USMS Admin Remote Control Tool
<computername>45USMS Client Remote Chat
<computername>46USMS Client Remote Transfer
<computername>4CUDEC Pathworks TCPIP Service
<computername>52UDEC Pathworks TCPIP Service
<computername>87UExchange MTA
<computername>6AUExchange IMC
<computername>BEUNetwork Monitor Agent
<computername>BFUNetwork Monitor Apps
<username>03UMessenger Service
<domain>00GDomain Name
<domain>1BUDomain Master Browser
<domain>1CGDomain Controllers
<domain>1DUMaster Browser
<domain>1EGBrowser Service Elections
<INet~Services>1CGInternet Information Server
<IS~Computer_name>00UInternet Information Server
<computername>[2B]ULotus Notes Server
IRISMULTICAST[2F]GLotus Notes
IRISNAMESERVER[33]GLotus Notes
Forte_$ND800ZA[20]UDCA Irmalan Gateway Service

또 다른 예제를 보자. 아래는 LLMNR 프로토콜에서 이름 쿼리를 한 것인데. 위에서 본것과 같이 <xx> 로 표현된 것이 아니라 \xxx\xxx 와 같이 표현되었다. 이건 또 무엇일까? 이 값은 OCT 로 표현된 것이다. 즉, 네트워크 패킷을 덤프할때 시스템 언어의 영향을 받아 덤프할때 언어 표현이 달라진 것이다.


자, 이것은 아래와 같이 변환을 해보자. (참고로 파이썬은 윈도우에서도 사용이 가능하다)
Query 값을 복사할때는 Detail 창에서 해당 값 위에서 오른쪽 클릭을 하면 Copy->Value 를 통해 쉽게
복사가 가능하다는 것을 잊지말자!

# python
Python 2.5.2 (r252:60911, Jan 24 2010, 14:53:14)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> x = "\355\231\215\352\270\270\353\217\231"
>>> type(x)
<type 'str'>
>>> print x.decode('utf-8')
홍길동
>>>

내용을 utf-8 로 디코드 해 보았더니 홍길동 이라는 이름이 나온다.  자, 필요한 경우 한글로 변환해서
패킷 분석에 도움이 될만한 정보를 얻어보도록 하자!


[참고]
1. Windows-1252

2010년 7월 8일 목요일

패킷인사이드 6개월이 지나며...

어느덧 패킷인사이드를 운영한지도 6개월이 지났다. 블로그가 한창 유행할 무렵부터 블로그를 운영해봐야지 하고 생각만 하다 2009년12월말이야 겨우 시작했다. 시작이 늦었던 것은 너무 거창하게 준비를 하려고
한 이유때문인것 같다. 직접 설치형 블로그로 서비스를 올리고 다양한 여러 기능을 제공하려고 하다 보니
엔지니어의 귀차니즘으로 계속 미루어만 간 것이다.

그래서 그냥 선택한 것이 서비스형 블로그이다. 내가 원하는 기능을 딱 제공하지는 않지만, 나는 일단 관리라는
것에서 자유로워진다. 여기서 관리란 시스템 운영과 관련한 것들이다. 그런데, 지금 이용하고 있는
서비스가 구글 블로그와 통합된다고 한다. 다른 곳으로 이사를 가야 하는 것인가? 직접 시스템을 다시 설치해서
운영해야 하는 것인가? 그러다 내린 결론은. 일단 계속 운영해 나가다 그때 생각해 보기로 했다. ^^

6개월이 되었지만 벌써 매일 300-500 명 분들이 방문해 주신다. 패킷이라는 주제로 한정되어서 많은 분들이 방문해 주실것이라고 생각하지는 않았는데. 이렇게들 와 주시니 너무 감사드린다.

패킷인사이드를 만들었을때, 국내에는 패킷분석과 관련한 블로그가 없었던것 같아 시작하였다. 그것보다도 내가 알고 있는 것을 함께 공유하고 기록을 남기고 싶었다.

- 기억은 한정되어 있다. 그러다 보니 내가 사용해 보고도 어느 새 다시 사용하려고 하면 기억이 가물가물 해진다. 그러므로 기록이 필요하였다.
- 사람들만의 기억으로만 남아 있으면, 접해 보지 않은 분들은 또 다시 찾기 위해 시간을 낭비한다.
- 내가 언제까지 이 일을 할지 모른다.
- 정보는 공유되어야 더 발전한다. 정보 찾는건 시간이 걸릴 뿐이지, 누구나 필요한 정보를 찾을 수 있다.
  그 시간을 여기서 줄여줄 것이다.
- 인터넷이라는 넓은 공간에는 수 많은 정보들이 쌓여있다. 그러나 여기 저기 흩어져 있는 정보를 이곳에서 쉽게 찾아 볼 수 있게 하고 싶다. 비록 패킷 분석이라는 작은 주제이지만 말이다.
- 정보는 어딘가에 존재한다. 네트워크/패킷 분석을 처음 접하는 분들에게는 처음 정보 접근이 힘들다. 이곳은 단지 정보를 쉽게 찾을 수 있는 고리 역할이 되어줄 것이다.

적고 보니 비슷비슷한 말들이다. :-)

어찌되었든, 분석가들에게 나의 지식을 공유하고 싶다. 그러다 보니 앞으로의 블로그 범위도 더욱 넓어질 것 같다. 패킷 분석 뿐만 아니라 컬럼,보안,시스템,가상화,IPv6,새로운 기술등 그리고 나의 취미 범위까지도 함께 공유하려고 한다. 그 중에서도 주제가 주제이니 만큼, 패킷과 관련한 내용이 그래도 많지 않을까 생각한다.

/From Rigel

P.S 공개된 포스팅이 100 개 된날이네요. 이 글은 101 번째 글..

2010년 7월 7일 수요일

.NET 환경의 패킷캡쳐 라이브러리 SharpPcap 을 소개합니다.

SharpPcap 은 닷넷 환경의 패킷캡쳐 프레임워크이다. 이미 잘 알려진
Pcap 과 WinPcap 라이브러리를 기반으로 하고 있다. 패킷 캡쳐, 인젝션,
분석 및 생성 관련한 API 를 제공하고 있다. 다운로드는 다음 경로에서 할 수 있다.


그리고, SharpPacketGenerator 도 있다.  이름 그대로 패킷을 생성해 낼 수 있는
기능을 가지고 있다.


참고로 SharpPcap 을 이용한 튜토리얼 링크를 하나 소개한다.

[1] SharpPcap tutorial: a step by step guide to using SharpPcap
http://www.tamirgal.com/blog/page/SharpPcap-tutorial-a-step-by-step-guide-to-using-SharpPcap.aspx

2010년 7월 6일 화요일

WinPcap 4.1.2 버전 릴리즈

WinPcap 이 2009년 10월 말 이후로, 최근에 (2010년7월2일) 업데이트 되었다. 참 오랜만의 업데이트 이다.
WinPcap 4.1.2 버전이며 다운로드는 아래의 경로에서 할 수 있다.


이번 릴리즈에서는 몇몇 OS 에서 발생되었던 Crash 의 원인인
드라이버의 버그가 픽스 되었다. 이번 버전의 주요 변경된 내용은
ChangeLog 를 확인해 볼 수 있다.


업데이트가 귀챦으신 분들은 그냥 넘어가도 되겠다. 큰 Major 변화는 있지 않기 때문이다.

2010년 7월 5일 월요일

네트워크 포렌직 분석 도구 - Xplico 에게 분석을 맡겨라!

트래픽 패킷 데이터 분석은 때로는 어려운 일이다. 특히나 분석 데이터가 아주 많을 경우와, 전달받은
패킷데이터의 네트워크 구조를 모르는 경우에는 더욱 그러하다. 앞서 소개한 포스팅에서 설명한 몇가지 도구들이 있기는 한데, 딱히 성에 차지는 않는다. 하지만, 현재 개발중이며 앞으로 더욱 발전해 나가리라 믿는 몇 가지 분석도구들이 있다. 오늘은 그 중에서도 Xplico 라는 것을 소개하고자 한다.

세부정보는 아래 사이트에서 얻을 수 있으며, 도구 이외에도 유용한 정보들을 얻을 수 있을 것이다.

일단 Xplico 의 목적은 인터넷 트래픽 데이터에서 정보를 추출하는 것이다. 예를 들면, POP3, IMAP, SMTP 와 같은 메일 관련 프로트콜에서 메일 정보를 수집한다든지, HTTP 프로토콜에서 웹 관련 정보를 얻는다거나 VoIP 관련 프로토콜을 통해 음성 데이터 정보를 얻는등 인터넷 트래픽 데이터가 모든 대상이 된다.
다만, 현재 나와있는 모든 프로토콜을 지원하지는 않으나 일반적으로 우리가 이용하는 프로토콜을 지원하므로 사용에는 큰 문제가 없다. 참고로 Xplico 홈페이지에서 보면 Xplico 는 네트워크 프로토콜 분석기라고 하지 않는다. 네트워크 포렌직 분석 도구로 언급하고 있다. 앞으로 나 또한 여러분들에게 지속적으로 소개하고 연구해나가고자 하는 방향도 네트워크 포렌직으로 맞춰질 것이다.

무엇보다 이 도구가 궁금한 분들은 다음 경로에서 스크린샷을 통해 미리 기능을 맛 볼 수 있다.

설치방법은 여기서는 생략하고, VirtualBox 이미지를 이용한 간단한 방법을 소개한다. (가상 이미지만 실행하면 되니 기능을 맛보기에는 얼마나 편한 방법인가 ^^)

(소스코드 또는 패키지, VirtualBox 이미지를 받을 수 있다)

이미지를 받은 경우 실행 후, 유저아이디,패스워드, 루트패스워드는 xplico 이며
쉘에서 /opt/xplico/script/sqlite_demo.sh 를 실행하면 데모 형태로 동작된다.

실행한 창에서는 분석되는 데이터 정보등의 통계를 볼 수 있다.

tcp: running: 0/0, subflow:1/50, tot pkt:7966
udp: running: 0/0, subflow:416/450, tot pkt:8316
http: running: 15/148, subflow:0/0, tot pkt:861
pop: running: 0/0, subflow:0/0, tot pkt:0

로컬컴퓨터에서 TCP/9876 포트로 동작하게 되어
브라우저를 띄우고 http://localhost:9876 으로 접속만 하면 Xplico 화면을 쉽게 볼수 있다.
세션 정보들을 보면 HTTP, FTP, DNS, Undecoded 탭에 정보가 있는 것이 보인다.
왼쪽 옆에는 각 메뉴들이 보이는데, 해당 메뉴를 클릭하면 이용가능한 정보가 나온다.

여기 글로서는 표현하는데 한계가 있으므로 직접 경험해 보는 것이 좋을것 같다. 본인이 분석할 대상의
PCAP 파일을 집어놓고 어떤 정보가 분석되어 출력되는지 사용해 보면 과연 이 도구가 나에게 유용할 것인지
판단해 볼 수 있을 것이다. 와이어샤크와 같은 분석도구보다는 형태별로 정보를 나누어 쉽게 볼 수 있도록
해주므로 정보를 빨리 찾아볼 수도 있다. 단, 그렇다고 이 도구만을 믿어서는 안된다. 엄연히 분석하여
찾고자 하는 대상에 따라서 사용될 도구는 달라진다.

패킷분석에 익숙하지 않은 사용자라면 이 도구가 오히려 패킷분석에 쉽게 접근할 수 있는 통로가 될 수도 있을것이다. 이 판단은 여러분에게 맡긴다.

난 단지 앞으로 여러분들에게 많은 것을 소개하고, 분석과정을 계속 만들어나갈 뿐이다.
참고로, 여기서 테스트로 이용된 PCAP 파일은 와이어샤크 샘플페이지의 PCAP 데이터를 사용한 것이다.

From Rigel



2010년 7월 2일 금요일

안드로이드에서 패킷 분석을, with Andro Shark

아이폰 단말기에서 패킷 분석기를 소개한 적이 있다. 점차 세력을 넓히고 있는 안드로이드는 방법이 없을까? XDA 포럼의 한 멤버가 안드로이드 기반의 패킷 스니핑 프로그램인
Andro Shark 를 만들었다. (소개된지는 좀 되었지만, 저는 처음 알았네요)

이 프로그램은 WIFI 와 3G 네트웍의 모든 트래픽을 덤프할 수 있으며, 이 데이터는 sdcard 로 저장된다고 한다. sdcard 로 저장된 패킷 파일은 와이어샤크와 같은 패킷 분석 프로그램을 통해 읽을 수 있다.

다운 받아 설치해 보려고 하였으나, 공개 베타 기간이 끝나 받을 수가 없었다. 곧 릴리즈가 되리라 믿어 보고 , 나오는 그날까지. :-)

공개베타 테스트와 관련한 소식은 다음 URL 을 참고한다.

[이미지 출처: XDA 포럼]

P.S 이름에 샤크가 붙어 있는걸로 봐서는 와이어샤크 안드로이드버전 느낌을 주지 않나요. ^^