패킷파일을 전달하여야 하는데, 사내 IP 정보들이 알려지기는 싫고 할때 어떤 방법을 써야 할까? 패킷인사이드를 꾸준히 방문한 분들이라면 앞서 몇번 언급했던 패킷조작 프로그램을 이용해 IP 등을 변경할 수 있다. 또는 지금 필자가 소개하고자 하는 tcpdpriv 를 이용하면 간단히 해결된다. tcpdpriv 는 프로그램 이름에서도 살짝 느껴지는 것과 같이 패킷파일에서 private 한 정보를 제거해 주는 기능을 갖고 있다.
다운 받은 파일은 컴파일 과정을 거쳐야 한다. 제작 된지 오래된 소스이기도 해서 첫 버전은 FreeBSD 와 같이 몇몇 시스템에서만 테스트 되었고 configure 옵션도 csh 로 지정되어 있었다.
지금 버전은 그래도 리눅스에서도 컴파일이 가능하다.
tcpdpriv.c:1749: error: static declaration of ‘usage’ follows non-static declaration
그런데 컴파일 하는 과정에서 에러가 발생한다. 이 에러는 다음과 같이 수정하면 된다
그리고 다시 컴파일을 하면 된다.
컴파일이 완료되면 다음과 실행하여 옵션들을 살펴볼 수 있다.
# ./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 는 간단하게도 사용할 수 있는 만큼, 패킷파일 에서 민감한 내용을 제거할 때 유용하게 사용할 수 있을것이다.