[펌] tcpdump

os/Linux 2004. 11. 3. 16:33 |
  • security라는 호스트로부터 날아오고, 날아가는 패킷들을 출력
    # tcpdump host security
  • security와 mazinga, getarobo 사이에 날아다니고 있는 패킷들을 출력
    # tcpdump host security and \( mazinga or getarobo \)
  • security에서 elgaim을 제외한 모든 호스트로 날아다니는 IP 패킷들을 출력
    # tcpdump ip host security and not elgaim
  • gateway amurorei를 거치는 ftp에 관련된 패킷들을 출력
    # tcpdump 'gateway amurorei and ( port ftp or ftp-data )'
  • local호스트가 아닌 호스트와 로컬호스트가 맺는 TCP 커넥션의 시작과 마지막 패 킷들을 출력한다(SYN, FIN 패킷).
    # tcpdump 'tcp[13] & 3 != 0 and not src and dst net non-local'
  • gateway amurorei를 지나는 576Byte보다 큰 패킷들을 출력한다
    # tcpdump 'gateway amurorei and ip[2:2] > 576'
  • Ethernet boradcast 혹은 multicast를 통해서 보내진 것이 아닌, IP broadcast 혹 은 multicast 패킷들을 출력한다.
    # tcpdump 'ehter[0] & 1 = 0 and ip[16] >= 224'
  • Echo request/reply가 아닌 ICMP 패킷들을 모두 출력한다.
    # tcpdump 'icmp[0] != 8 and icmp[0] != 0'

tcpdump -l -vvv -x -X > tcpdat & tail -f tcpdat

 

 

    사용법

tcpdump [ -adeflnNOpqStvx ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]  [ exulssion ]

 

   <Option>

 

-a   : Network & Broadcast 주소들을 이름들로 바꾼다.
-c Number  : 제시된 수의 패킷을 받은 후 종료한다.
-d  : comile된 packet-matching code를 사람이 읽을 수 있도록 바꾸어 표준 출력으로
      출력하고, 종료한다.
-dd   : packet-matching code를 C program의 일부로 출력한다.
-ddd : packet-matching code를 숫자로 출력한다.
-e  : 출력되는 각각의 행에 대해서 link-level 헤더를 출력한다.
-f  : 외부의 internet address를 가급적 심볼로 출력한다(Sun의 yp server와의 사용은
     가급적 피하자).
-F file  : filter 표현의 입력으로 파일을 받아들인다. 커맨드라인에 주어진 추가의 표현들은
          모두 무시된다.
-i device  : 어느 인터페이스를 경유하는 패킷들을 잡을지 지정한다. 지저되지 않으면
               시스템의 인터페이스 리스트를 뒤져서 가장 낮은 번호를 가진 인터페이스를
               선택한다(이 때 loopback은 제외된다).
-l   : 표준 출력으로 나가는 데이터들을 line buffering한다. 다른 프로그램에서 tcpdump로부터      데이터를 받고자 할 때, 유용하다.
-n  : 모든 주소들을 번역하지 않는다(port,host address 등등)
-N  : 호스트 이름을 출력할 때, 도메인을 찍지 않는다.
-O  : packet-matching code optimizer를 실행하지 않는다. 이 옵션은 optimizer에 있는
      버그를 찾을 때나 쓰인다.
-p  : 인터페이스를 promiscuous mode로 두지 않는다.
-q  : 프로토콜에 대한 정보를 덜 출력한다. 따라서 출력되는 라인이 좀 더 짧아진다.
-r <file> : 패킷들을 '-w'옵션으로 만들어진 파일로 부터 읽어 들인다. 파일에 "-" 가
               사용되면 표준 입력을 통해서 받아들인다.
-s <spaplen> : 패킷들로부터 추출하는 샘플을 default값인 68Byte외의 값으로 설정할 때
사용한다(SunOS의 NIT에서는 최소가 96Byte이다). 68Byte는 IP,ICMP, TCP, UDP등에 적절한 값이지만 Name Server나 NFS 패킷들의 경우에는 프로토콜의 정보들을 Truncation할 우려가 있다. 이 옵션을 수정할 때는 신중해야만 한다. 이유는 샘플 사이즈를 크게 잡으면 곧 패킷 하나하나를 처리하는데 시간이 더 걸릴 뿐만아니라 패킷 버퍼의 사이즈도 자연히 작아지게 되어 손실되는 패킷들이 발생할 수 있기 때문이다. 또, 작게 잡으면 그만큼의 정보를 잃게되는 것이다. 따라서 가급적 캡춰하고자 하는 프로토콜의 헤더 사이즈에 가깝게 잡아주어야 한다.
-T <type> : 조건식에 의해 선택된 패킷들을 명시된 형식으로 표시한다. type에는 다음과 같은 것들이 올 수 있다. rpc(Remote Procedure Call), rtp(Real-Time Applications protocol), rtcp(Real-Time Application control protocal), vat(Visual Audio Tool), wb(distributed White Board)
-S   : TCP sequence번호를 상대적인 번호가 아닌 절대적인 번호로 출력한다.
-t    : 출력되는 각각의 라인에 시간을 출력하지 않는다.
-tt   : 출력되는 각각의 라인에 형식이 없는 시간들을 출력한다.
-v   : 좀 더 많은 정보들을 출력한다.
-vv : '-v'보다 좀 더 많은 정보들을 출력한다.
-w  : 캡춰한 패킷들을 분석해서 출력하는 대신에 그대로 파일에 저장한다.
-x   : 각각의 패킷을 헥사코드로 출력한다.

 

 

   <exulssion>

    exulssion은 패킷을 선택적으로 캡처하기 위한 조건을 적는 부분이다. exulssion이 없다면
    네트워크상의 모든 패킷을 캡처하여 보여 주며exulssion이 정의 되어있다면 이 exulssion을     참으로 하는 패킷만을 선별하여 보여준다. exulssion은 하나이상이 primitives로 구성되며,     primitives는 일반적으로qualifer을 앞에 내세운 id(이름이나 숫자)로 구성된다.

        Qualifier

    type : id(이름이나 숫자)가 어떠한 의미를 가지는지를 알려준다. 가능한 type으로는 host,          net, port가 있다.
                 ex) " host foo", "net 123.4", "port 23"     
                                               특별한 qualifier가 정해져 있지 않으면 "host"로 가정한다.

    dir   : 전송방향을 결정한다. 가능한 방향은 "src", "dst", "src or dst", "src and dst"이다
                 ex) "src foo", "dst net 123.4", "src or dst port ftp"  
                                       특별한 qualifier가 정해져 있지 않으면 "src or dst"로 가정한다.

    proto : 특정한 프로토콜의 패킷만을 받아들이게 한다. 가능한 proto로는 "either", "fddi",
              "ip" ,"arp", "rarp", "decnet", "lat",  "sca", "moprd", "mopdl", "tcp","udp"가 있다.
                 ex) "either src foo", "arp net 123.4", "tcp port 23"
                                      특별한 qualifier가 정해져 있지 않으면 "src or dst"로 가정한다.

 

        primitives

    dst host <host> : 패킷의목적지 필드에 있는 IP주소와 <host> (hostname, name
                             둘다 가능)가 일치하면 참.

    src host <host> : 패킷의 발신지 필드에 있는 IP주소와 <host> (hostname, name
                             둘다 가능)가 일치하면 참.

    host <host> : 패킷의 목적지 IP나 발싲니 IP중 어느하나라도 <host>와 일치하면 참.

    ether dst <ehost> : 패킷의 목적지 ethernet 주소(48bit의 주소로 일반적으로 X:X:X:X:X;X로                             표시된다.여기서 X는 16진수)가<ehost>와 일치하면 참.

    ether dst <ehost> : 패킷의 목적지 ethernet 주소가  <ehost>와 일치하면 참.

    gateway <ehost> :  <host>가 gateway로 쓰일 때 참. 즉, ethernet발신지 혹은 목적지
                                 주소는 <host>이나 IP 발신지 혹은 목적지 주소로 <host>는 될 수
                                 없다는 것을 의미한다.
                                 <host>는 반드시 /etc/hosts와 /etc/ethers에서 찾을 수 있어야 한다.                              이 exulssion은 "ether host <ehost> and not host <host>"와
                                 동일한 의미를 가진다.

    dst net <net> : 패킷의 IP목적지 주소가 <net>과
                          동일한 테트워크 번호(network number)를 가지면 참.

    src net <net> : 패킷의 IP발신지 주소가 <net>과
                          동일한 테트워크 번호(network number)를 가지면 참.

    net <net> : 패킷이 IP목적지 혹은 발신지 주소 둘 중 어느 하나라도 <net>과
                    동일한 network number를 가지면 참 .

    net <net> mask <mask> : IP주소가 지정된 netmask(<mask>)를 통하여
                                          network number <net>와 일치하면 참.

    net <net>/<len> : IP주소가 network number <net>과 netmaks의 <len>비트만큼
                              일치하면 참.

    dst port <port> :  패킷이 IP혹은 UDP 이면서 목적지 port값으로 <port>를 가지고 있다면 참.                         <port>는 숫자나 /etc/services에 정의 되어있는 port이름을
                             사용할 수 있다.

    src port <port> : 패킷이 IP혹은 UDP 이면서 발신지 port값으로 <port>를 가지고 있다면 참.

    port <port> : 패킷의 목적지 혹은 발신지 port값에서 둘주 어느하나라도 <port>와 같으면
                      참이된다.
                      위의 port exulssion들은 "tcp"나 "udp"와 함께쓰일 수 있다.
      ex) tcpdump tcp src port 23  -tcp패킷중에서 발신지 port 23인 것만 검출하여 보내준다.

    less <length> : 패킷의 길이가 <length>Byte보다 작거나 같으면 참이된다.

    greater <length> : 패킷의 길이가 <length>Byte보다 크거나 같으면 참이된다.

    ip proto <protocol> : 패킷이 <protocol> protocol형태의 ip패킷이면 참.
                                 <protocol>에는 icmp, igrp, udp , tcp이름이 들어갈 수 있다.
                                  tcp, udp,icmp는 키워드로도 사용되기 때문에 <protocol>의 값이
                                  되기 위해서는 앞에 backslash를 붙여준다.

    ether broadcast : 패킷이 ethernet broadcast패킷이면 참. "ehter" keyword는 생략 가능.

    ip broadcast : 패킷이 ip broadcast패킷이면 참.

    ether multicast : 패킷이 ethernet multicast 패킷이면 참이된다.
                            "ether"keyword 는 생략가능.

    ip multicast : 패킷이 ip multicast패팃이면 참.

    ether proto <protocol> : 패킷이 <protocol>의 ether형태라면 참.
                                     <protocol>의값으로는 숫자나 ip, arp, rarp와 같은 이름이 될수있다.

    decnet src <host> : DECNET발신지 주소가 <host>이면 참이 된다.
                                 <host>의 값으로는 "10.123"나 DECNET호스트 이름이 될수있다.

    decnet dst <host> : DECNET목적지 주소가 <host>이면 참.

    decnet host <host> : DECNET목적지혹은 발신지 주소중에서 어느 하나라도
                                  <host>와 일치하면 참.

    ip, arp, rarp, decnet : "ether proto <p>"의 축약형이다.
                                    여기서 <p>값은 위의 protocol중의 하나가된다.

    tcp, udp, icmp : "ip proto <p>"의 축약형이다. 여기서 <p>값은 위의 protocol중 하나가된다.

 

        간단한 exulssion들을 다음의 관계연산자를 통하여 묶음으로서 더욱 복잡한 filter          exulssion을 구성할 수 있다.

    * Nagation : "!", "not"
    * Concatenation : "&&", "and"
    * Alternation : "||", "or"

 

 

    tcp_dump의 사용

 .shell> tcpdump -t
tcpdump: listening on eth0
0:a0:c9:4:2e:48 sap c4 > 0:60:b0:f2:5f:b sap b4 sabme/P len=43
arp who-has 143.248.1.200 (6:6b:e8:c0:4:11) tell kaist-gw.kaist.ac.kr
211.205.0.142.1432 > gaya.kaist.ac.kr.telnet: . ack 4254948997 win 15826 (DF)
gaya.kaist.ac.kr.telnet > 211.205.0.142.1432: P 1:93(92) ack 0 win 32522 (DF)
arp who-has ns.kaist.ac.kr tell gaya.kaist.ac.kr
arp reply ns.kaist.ac.kr is-at 8:0:20:cc:66:1f
gaya.kaist.ac.kr.1043 > ns.kaist.ac.kr.domain:  17263+[|domain]
ns.kaist.ac.kr.domain > gaya.kaist.ac.kr.1043:  17263 NXDomain*[|domain] (DF)
gaya.kaist.ac.kr.1043 > ns.kaist.ac.kr.domain:  17264+[|domain]
ns.kaist.ac.kr.domain > gaya.kaist.ac.kr.1043:  17264*[|domain] (DF)
gaya.kaist.ac.kr.1043 > ns.kaist.ac.kr.domain:  17265+[|domain]
ns.kaist.ac.kr.domain > gaya.kaist.ac.kr.1043:  17265 NXDomain[|domain] (DF)
gaya.kaist.ac.kr.1043 > ns.kaist.ac.kr.domain:  17266+[|domain]
ns.kaist.ac.kr.domain > gaya.kaist.ac.kr.1043:  17266*[|domain] (DF)

 

        Example 1
    1. icmp패킷만 출력한다.
    2. 패킷의 수신지 혹은 발신지가apple 인 것을 출력한다.
    3. 패킷의 수신지 혹은 발신지가 sun이나 moon이면 출력하지 않는다.

   shell> tcpdump ip proto '\icmp && host apple && !(sun || moon)'
               or
   shell> tcpdump ip proto \\icmp and host apple and not \(sun || moon \))



        Example 2
    패킷의 발신지가apple이고 수신지는 banana가 아닌 패킷을 출력한다.

   shell> tcpdump src host apple and not dst host banana


         Example 3

    echo requests/replies가 아닌 모든 ICMP패킷을 출력한다.

   shell> tcpdump 'icmp[0] != 8 and icmp[0] != 0"


        Example 4

    tcp 프로토콜 통신에서 123.45.67.89가 수신지나 발신지가 아닌 모든 SYN ,
    FIN 패킷을 출력한다

   shell> tcpdump 'tcp[13] & 3 != 0 and not net 123.45.67.89'

 

 

TCP 플래그tcpdump에서 쓰는 플래그플래그의 의미
SYNsSyn 패킷, 접속요청을 할 때 보낸다. TCP 접속을 할 때 가장 먼저 보내는 패킷이다.
ACKackAck 패킷, 상대방으로부터 패킷을 받았음을 알려주기 위해 보낸다. 다른 플래그와 함께 출력되는 경우도 있다.
FINf접속 종료를 위한 플래그로, 이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 접속을 끊고자 할 때 사용한다.
RESETr이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 즉시 연결을 끊고자 할 때 사용한다.
PUSHp데이터를 즉시 목적지로 보내라는 의미이다. 텔넷(telnet)과 같이 상호작용이 중요한 프로그램의 경우, 빠른 응답이 생명이다. 그래서 "push" 플래그를 사용한다.
URGENTurg긴급한 데이터는 다른 데이터에 비해 우선 순위가 높아야 한다. 예를 들어 ftp로 자료를 받고 있는 도중 Ctrl-C를 받으면 즉시 자료 받기를 중단해야 한다.
Placeholder.패킷이 syn, finish, reset, push 등의 플래그가 없는 경우, placefolder 플래그가 세팅된다. 이 플래그는 ack 플래그와 함께 사용되는 경우도 있다.

Posted by 큰바우
: