2011년 1월 6일 목요일

패킷파일의 민감한 정보를 지우고 전달하고자 하는 경우에는 이 방법을!

패킷파일을 전달하여야 하는데, 사내 IP 정보들이 알려지기는 싫고 할때 어떤 방법을 써야 할까? 패킷인사이드를 꾸준히 방문한 분들이라면 앞서 몇번 언급했던 패킷조작 프로그램을 이용해 IP 등을 변경할 수 있다. 또는 지금 필자가 소개하고자 하는 tcpdpriv 를 이용하면 간단히 해결된다. tcpdpriv 는 프로그램 이름에서도 살짝 느껴지는 것과 같이 패킷파일에서 private 한 정보를 제거해 주는 기능을 갖고 있다.

프로그램 정보 및 다운로드는 다음의 경로를 방문하면 된다 :

http://fly.isti.cnr.it/software/tcpdpriv/

다운 받은 파일은 컴파일 과정을 거쳐야 한다. 제작 된지 오래된 소스이기도 해서 첫 버전은 FreeBSD 와 같이 몇몇 시스템에서만 테스트 되었고 configure 옵션도 csh 로 지정되어 있었다.
지금 버전은 그래도 리눅스에서도 컴파일이 가능하다.

# ./configure
cat: VERSION: No such file or directory

./configure 를 통해 Makefile 이 만들어 지면 make 를 수행하자

debian:~/# make
gcc -g -Wall     -c -o tcpdpriv.o tcpdpriv.c
tcpdpriv.c: In function ‘verify_and_print_args’:
tcpdpriv.c:1504: error: invalid storage class for function ‘usage’
tcpdpriv.c:1570: warning: implicit declaration of function ‘usage’
tcpdpriv.c: At top level:
tcpdpriv.c:1749: warning: conflicting types for ‘usage’
tcpdpriv.c:1749: error: static declaration of ‘usage’ follows non-static declaration
tcpdpriv.c:1570: error: previous implicit declaration of ‘usage’ was here
make: *** [tcpdpriv.o] Error 1

그런데 컴파일 하는 과정에서 에러가 발생한다. 이 에러는 다음과 같이 수정하면 된다

# vi tcpdpriv.c

tcpdpriv 소스파일을 오픈하고 두군데를 수정하면 된다.

1) 1504 라인에서  static void usage(char *cmd); => 를 void usage 로 변경
2) 1749 라인에서 static 을 삭제

그리고 다시 컴파일을 하면 된다.

# make
gcc -g -Wall     -c -o tcpdpriv.o tcpdpriv.c
tcpdpriv.c:33: warning: ‘rcsid’ defined but not used
gcc -g -Wall     -c -o tcpdutil.o tcpdutil.c
tcpdutil.c:24: warning: ‘rcsid’ defined but not used
gcc -g -Wall   -o tcpdpriv  tcpdpriv.o tcpdutil.o  -lpcap

컴파일이 완료되면 다음과 실행하여 옵션들을 살펴볼 수 있다.

# ./tcpdpriv
attempt to write binary dump file to tty
usage:
./tcpdpriv [-Opq] [-a [[hh:]mm:]ss] [-A {0|1|2|50|99}] [-c count]
[-C {0|1|2|3|4|...|32|99}] [-F file] [-i interface]
[-M {0|10|20|70|80|90|99}] [-{P|T|U} {0|1|99}] [-r file]
[-s snaplen] [-w outputfile] [expression]
(one reasonable choice:  ./tcpdpriv -P99 -C4 -M20 ...)

간단하게 옵션 몇개를 살펴보자.

-A : IP 주소를 어떤식으로 표현할지를 결정한다. 레벨이 99인 경우 IP 주소는 변하지 않는다.
-c : 지정한 패킷 카운트 후에 종료한다.
-F : 사용할 필터를 지정
-i : 네트워크 인터페이스
-p : TCP, UDP 포트주소를 매핑한다.
-r : 읽어들일 패킷 파일을 지정
-w : 출력할 파일을 지정

위 옵션들을 보면 각 옵션마다 특정 값을 지정하는 것이 있어, 얼핏보면 복잡해 보인다.
간단하게 생각하면 0은 가장 안전한 옵션이라 생각하면 된다. 즉, 가급적 Private 한 정보는
제거하게 되고 , 99 는 많은 정보를 보여주는 것이라 볼 수 있다. 이런 개념으로 옵션에 사용되는 값을 이해하면 될것 같다.

직접 사용해 보는 것이 이해가 가능 빠르므로 한번 예를 살펴보자. 다음은 정상적인 일반 패킷 파일을 tcpdump 로 본 것이다.

11:11:33.480941 IP6 fe80::f95c:91a7:8bd8:6216.49403 > ff02::c.1900: UDP, length 146
11:11:34.532638 arp who-has 192.168.0.200 tell 192.168.0.240
11:11:34.534733 arp reply 192.168.0.200 is-at 00:01:36:2e:0b:a7 (oui Unknown)
11:11:34.534756 IP 192.168.0.240.48603 > kns.kornet.net.domain: 34133+ AAAA? www
.google.co.kr. (34)
11:11:34.545974 IP kns.kornet.net.domain > 192.168.0.240.48603: 34133 2/1/0 CNAM
E[|domain]
11:11:34.546180 IP 192.168.0.240.60837 > kns.kornet.net.domain: 30670+ A? www.go
ogle.co.kr. (34)
11:11:34.554454 IP kns.kornet.net.domain > 192.168.0.240.60837: 30670 8/4/4 CNAM
E[|domain]
11:11:34.555094 IP 192.168.0.240.45918 > pv-in-f99.1e100.net.www: S 2001641216:2
001641216(0) win 5840 <mss 1460,sackOK,timestamp 1127508 0,nop,wscale 4>

특별한 옵션을 사용하지 않고 -r 옵션을 통해 읽어들일 파일과 새로 저장할 파일을 지정하였다. 기본 옵션은 최대한 정보를 제거하는 것으로 설정되어 있다. (즉, 0 이다)

# ./tcpdpriv -w test2.pcap -r test.pcap
# map 32-bit addresses into sequential integers
# multicast addresses cloaked per -A and -C flags
# map 16-bit TCP port numbers into sequential integer
# map 16-bit UDP port numbers into sequential integer
# pktsin 138 pktsout 134 tooshort 0 uncoded 4

새롭게 저장된 test2.pcap 파일을 열어보면 IP 주소가 변경된걸 알 수 있다. 처음에 보였던 IPv6 와 ARP 정보도 보이지 않는다. 또한, 헤더 정보에 nop 이 많이 보여진다.

# tcpdump -r test2.pcap
11:11:34.534756 IP 1.0.0.1.1 > 1.0.0.2.2: UDP, length 34
11:11:34.545974 IP 1.0.0.2.2 > 1.0.0.1.1: UDP, length 132
11:11:34.546180 IP 1.0.0.1.3 > 1.0.0.2.2: UDP, length 34
11:11:34.554454 IP 1.0.0.2.2 > 1.0.0.1.3: UDP, length 314
11:11:34.555094 IP 1.0.0.1.tcpmux > 1.0.0.3.2: S 2001641216:2001641216(0) win 5840 <nop,no
p,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.685957 IP 1.0.0.3.2 > 1.0.0.1.tcpmux: S 959091973:959091973(0) ack 2001641217 win
 5672 <nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.686035 IP 1.0.0.1.tcpmux > 1.0.0.3.2: . ack 1 win 365 <nop,nop,nop,nop,nop,nop,no
p,nop,nop,nop,nop,nop>
11:11:34.686326 IP 1.0.0.1.tcpmux > 1.0.0.3.2: P 1:614(613) ack 1 win 365 <nop,nop,nop,nop
,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.816891 IP 1.0.0.3.2 > 1.0.0.1.tcpmux: . ack 614 win 108 <nop,nop,nop,nop,nop,nop,
nop,nop,nop,nop,nop,nop>
11:11:34.833127 IP 1.0.0.3.2 > 1.0.0.1.tcpmux: . 1:1419(1418) ack 614 win 108 <nop,nop,nop
,nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.833160 IP 1.0.0.1.tcpmux > 1.0.0.3.2: . ack 1419 win 546 <nop,nop,nop,nop,nop,nop
,nop,nop,nop,nop,nop,nop>

그럼 다른 옵션을 한번 사용해 보자. IP 주소의 변화를 좀 주고, -P 를 통해 포트번호가 바뀌지 않도록 99 를 주었다.

# ./tcpdpriv -A 50 -P 99 -w test2.pcap -r test.pcap
# tcpdump -r test2.pcap | more
11:11:34.534756 IP 16.76.127.170.48603 > 92.36.179.36.domain: [|domain]
11:11:34.545974 IP 92.36.179.36.domain > 16.76.127.170.48603: [|domain]
11:11:34.546180 IP 16.76.127.170.60837 > 92.36.179.36.domain: [|domain]
11:11:34.554454 IP 92.36.179.36.domain > 16.76.127.170.60837: [|domain]
11:11:34.555094 IP 16.76.127.170.45918 > 136.110.214.97.www: S 2001641216:2001641216(0) wi
n 5840 <nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.685957 IP 136.110.214.97.www > 16.76.127.170.45918: S 959091973:959091973(0) ack
2001641217 win 5672 <nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,n
op,nop,nop>
11:11:34.686035 IP 16.76.127.170.45918 > 136.110.214.97.www: . ack 1 win 365 <nop,nop,nop,
nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.686326 IP 16.76.127.170.45918 > 136.110.214.97.www: P 1:614(613) ack 1 win 365 <n
op,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.816891 IP 136.110.214.97.www > 16.76.127.170.45918: . ack 614 win 108 <nop,nop,no
p,nop,nop,nop,nop,nop,nop,nop,nop,nop>

그러면, 위와 같이 IP 는 좀더 랜덤하게 변했지만, 포트번호는 그대로 유지하고 있다. 포트번호는 유지하면서 IP 주소만 변경하여 패킷파일을 전달하는 경우 사용될 수 있다.

tcpdpriv 는 간단하게도 사용할 수 있는 만큼, 패킷파일 에서 민감한 내용을 제거할 때 유용하게 사용할 수 있을것이다.

댓글 3개:

  1. 이런 방법이 있었군요~ 항상 좋은 정보 감사합니다. ^^

    답글삭제
  2. 안녕하세요-컴퓨터보안에 대해서 아는게없는 일반인입니다..^^; 얼마전에야 패킷이란걸 알게 되었는데요.궁금한게 생겼습니다.
    어떤 방송에서 인터넷전화도 패킷을 캡쳐분석하여 들을 수 있는걸 보았는데요.(보고 많이 놀랬어요;;)
    전화 시작부터 끝까지의 통화가 아니라, 통화 중간에 5초~10초 정도의 패킷만 캡쳐하면 통화 전체를 다 들을 수 있는건가요? 아니면 그 부분의 통화만 들을 수 있는건가요?
    메일은 엔터 키를 누르는 순간이라는걸 알겠는데, 전화 같은건 어떤가 궁금하네요..

    그리고 이 블로그 내용대로하면 패킷을 개인적으로 암호화가능한건가요? 솔직히 읽어도 무슨 내용인지 모르겠네요;;ㅎ 그런거면 그냥 따라해보려구요;;ㅋ

    좋은 정보 많이 얻고 갑니다. 감사해요^^

    답글삭제
  3. 패킷을 검색하다가 들어오셨나 보군요. 인터넷전화라는 것도 결국은 인터넷이라는 데이터 통신에 기반한 것이기 때문에 패킷을 챕쳐하면 도청이 이론적으로는 가능합니다. 물론, 통화내용이 다 캡쳐되어야 들을 수 있는 거지 5~10초만 가지고 전체를 다 들을 수 있는것은 아닙니다. 다만, 통화내용이 암호화 되어 있거나 하면 패킷캡쳐를 한다 해도 데이터를 해독할 수가 없습니다. 여건이 되면 인터넷전화에 대해 테스트 해 보고 공유해 보도록 하겠습니다. 언제하게 되련지는 모르겠네요 ^^;;

    답글삭제