개요
Tcpreplay는 패킷 캡처 Tool로 캡처 된 네트워크 트래픽을 편집 및 재 전송을위한 UNIX 시스템 유틸리티 모음입니다. Tcpreplay은 클라이언트 또는 서버로 트래픽 분류 하는 기능을 제공합니다, Layers2 ~ 4에서 패킷을 수정하여 스니핑 또는 장치를 통해 네트워크에 임의의 속도로 트래픽을 보낼수 있습니다. 쉽게 풀이 한다면, 캡처된 패킷을 재 전송할때 유용하게 사용 할 수 있습니다.
Tcpreplay는 1.x 버전에서는 단순히 패킷을 읽고 다시 전송하는 기능만 있었지만, 2.x버전에서 부터 패킷을 다양하게 재 작성 기능하는 기능을 추가하여 기능면에서 크게 향상되었지만 복잡성 및 성능등에 약간의 문제가 있었습니다. 하지만 현재 3.x버전에서 앞에서의 문제점들 수정과 동시에 tcprewrite와 결합하여 더욱 성능이 향상 되었습니다.
테스트 환경
운영 체제 (OS) : BackTrack5 R1 |
상세 분석
아래는 tcpreplay를 실행한 화면입니다.
[옵션] -q, --quit : 자동 모드 -T, --timer=str : 패킷 타이밍 모드를 선택 (select, ioport, rdtsc, gtod, nano, abstime) --sleep-accel=num : Sleep 시간을 지정 --rdtsc-clicks=num : RDTSC clicks 지정 /usec -v, --verbose : Tcpdump로 디코딩 된 패킷을 출력 (STDOUT:표준출력) -A, --decode=str :값을 Tcpdump 디코더로 전달 -K, --enable-file-cache : 파일 캐시 활성화 --preload-pcap : RAM에 보내기 전에 미리 로드 -c, --cachefile=str : tcpprep 캐시 파일을 통해 트래픽 분할 -i, --intf1=str : 서버나 일반적인 패킷 트래픽을 출력할 인터페이스 -I, --intf2=str : 클라이언트나 보조 패킷 트래픽을 출력할 인터페이스 --listnics : 사용가능한 네트워크 인터페이스 목록 출력 -l, --loop=num : 캡처된 패킷을 지정한 횟수 만큼 재 전송 --pktlen : snaplen을 무시하고 실제 패킷 사용 -L, --limit=num : 전송 패킷 수 제한 -x, --multiplier=str : multiple replay 속도 지정 -p, --pps=num : 재 전송 패킷의 Packets/sec(PPS) 지정 -M, --mbps=str : 재 전송 패킷의 Mbps 지정 -t, --topspeed : 가장 빠른 속도로 Replay packet 전송 -o, --oneatatime : 사용자 정의로 한번에 하나의 Replay packet 전송 --pps-multi=num : Replay packet을 전송하는 간격 지정 -P, --pid : tcpreplay PID 출력 --stats=num : 지정한 시간 마다 통계 출력 (단위:초) -V, --version : 버전 정보 출력 -h, --less-help : 간단한 Help 메시지 출력 -H, --help : Help 메시지 출력 -!, --more-help : 전체 Help 메시지 출력 (자세한 내용) --save-opts[=arg] : 설정 파일에 옵션 저장 --load-opts=str : 설정 파일에서 옵션 로드 |
tcpreplay를 사용하기 위해서는 미리 패킷을 캡처하여 *.pcap 형식으로 저장하고 있어야 합니다. 미리 준비된 *.pcap파일을 가지고 다시 패킷을 캡처된 목적지 IP로 재전송 하는것이 tcpreplay의 가장 중요한 역할 입니다.
아래는 그림은 tcpreplay를 사용하려는 PC의 IP와 재전송에 필요한 *.pcap 파일 내용 입니다.
캡처된 패킷의 Soure IP를 살펴 보면 동일한 PC가 아닌것을 확인 할 수 있습니다. 이제 tcpreplay를 이용하여, Destnation IP (74.125.128.147)로 패킷을 재 전송해 보도록 하겠습니다.
가장 기본적인 방법으로 아래와 같이 tcpreplay를 진행합니다.
root@bt# ./tcpreplay --intf1 eth1(인터페이스) /root/tcpreplay_test(캡처된 패킷 파일) |
재 전송되는 패킷을 Wireshark를 이용하여, 다시 캡처 해보면 아래와 같이 tcpreplay_test(캡처된 패킷 파일)과 동일하게 Destnation IP으로 전송하고 있는것을 확인 할 수 있습니다.
패킷을 재 전송 할때는 위 그림에서 보듯이 동일한 시간으로 패킷을 재 전송하는 것을 확인 할 수 있습니다.
캡처된 패킷을 모두 재 전송하면, 아래 그림과 같은 결과를 확인 할 수 있습니다.
Actual: 1062 packets (467067 bytes) sent in 59.45 seconds. Rated: 7856.5 bps, 0.06 Mbps, 17.86 pps Statistics for network device: eth1 Attempted packets: 1062 Successful packets: 1062 Failed packets: 0 Retried packets (ENOBUFS): 0 Retried packets (EAGAIN): 0 |
캡처된 패킷의 전송 속도가 너무 느리다 생각되면, 옵션을 적용하여 다양한 속도로 재 전송이 가능합니다.
① 최대속도로 재 전송
패킷을 최대 속도로 재 전송하고자 할때는 --topspeed옵션을 적용합니다.
./tcpreplay --topspeed --intf1 eth1 /root/tcpreplay_test |
Actual: 1062 packets (467067 bytes) sent in 0.03 seconds. Rated: 15568900.0 bps, 118.78 Mbps, 35400.00 pps Statistics for network device: eth1 Attempted packets: 1062 Successful packets: 1062 Failed packets: 0 Retried packets (ENOBUFS): 0 Retried packets (EAGAIN): 0 |
앞서 기본적으로 패킷을 재 전송한 경우 59.45초의 시간이 걸렸지만, 최대 속도 (--topspeed)옵션을 적용하였을때는 0.03초가 걸린것을 볼 수 있습니다.
② 캡처된 패킷의 전송 속도보다 n배 이상의 빠른 속도로 전송
캡처된 패킷의 전송 속도보다 n배 이상으로 빠른 속도로 전송하기 위해서는 --multiplier 옵션을 사용합니다.
./tcpreplay --multiplier=3 --intf1 eth1 /root/tcpreplay_test
Actual: 1062 packets (467067 bytes) sent in 19.89 seconds. Rated: 23482.5 bps, 0.18 Mbps, 53.39 pps Statistics for network device: eth1 Attempted packets: 1062 Successful packets: 1062 Failed packets: 0 Retried packets (ENOBUFS): 0 Retried packets (EAGAIN): 0 |
③ 사용자가 원하는 PPS로 패킷을 전송
사용자가 원하는 PPS로 패킷을 전송하기 위해서는 --pps 옵션을 사용합니다.
./tcpreplay --pps=15 --intf1 eth1 /root/tcpreplay_test |
Actual: 1062 packets (467067 bytes) sent in 70.76 seconds. Rated: 6600.7 bps, 0.05 Mbps, 15.01 pps Statistics for network device: eth1 Attempted packets: 1062 Successful packets: 1062 Failed packets: 0 Retried packets (ENOBUFS): 0 Retried packets (EAGAIN): 0 |
④ 사용자가 원하는 Mbps로 패킷을 전송
사용자가 원하는 PPS로 패킷을 전송하기 위해서는 --mbps 옵션을 사용합니다.
./tcpreplay --mbps=5 --intf1 eth1 /root/tcpreplay_test |
Actual: 1062 packets (467067 bytes) sent in 0.80 seconds. Rated: 583833.8 bps, 4.45 Mbps, 1327.50 pps Statistics for network device: eth1 Attempted packets: 1062 Successful packets: 1062 Failed packets: 0 Retried packets (ENOBUFS): 0 Retried packets (EAGAIN): 0 |
페킷을 한번만 재 전송하여 IDS/IPS에서 잘 모르겠다 생각되면, --loop 옵션을 적용하여 사용자가 원하는 만큼 해당 패킷을 재 전송이 가능 합니다.
./tcpreplay --loop=3 --intf1 eth1 /root/tcpreplay_test |
root@bt:/pentest/sniffers/tcpreplay# ./tcpreplay --loop=3 --intf1 eth1 /root/tcpreplay_test sending out eth1 processing file: /root/tcpreplay_test processing file: /root/tcpreplay_test processing file: /root/tcpreplay_test Actual: 3186 packets (1401201 bytes) sent in 178.16 seconds. Rated: 7864.8 bps, 0.06 Mbps, 17.88 pps Statistics for network device: eth1 Attempted packets: 3186 Successful packets: 3186 Failed packets: 0 Retried packets (ENOBUFS): 0 Retried packets (EAGAIN): 0 |
여기서 --loop 옵션값을 0을 주게 되면, 사용자가 강제로 멈추기 전까지 패킷을 재 전송하게 됩니다.
캡처된 패킷을 왜 재 전송 할까 의문을 가지면서 테스트를 진행 하였으나, 테스트를 진행 하면서 느낀것이 도입된 신규 장비에 대해서 다양한 테스트를 수행할 수도 있고, 안티 바이러스가 탐지 하지 못하는 신종 바이러스 및 악성코드들을 발견 할 경우 패킷을 캡처 후 IDS/IPS에 사용자 정의로 패턴 시그너처를 만든후 정상적으로 차단하는지 테스트하는 등에 쓰일수 있겠구나 생각되었습니다.
참고 URL 및 도서
[BackTrack5 R3] WebSploit (0) | 2013.02.05 |
---|---|
[BackTrack5 R1] Xplico (0) | 2013.02.05 |
[BackTrack5 R2] extundelete (0) | 2013.02.04 |
[BackTrack5 R2] findmyhash (0) | 2013.02.04 |
[BackTrack5 R2] hash-identifier (0) | 2013.02.04 |