2012-04-17 4 views
3

포트 8888 (아니오, http가 아님) 및 TCP 위에 실행되는 사용자 정의 프로토콜이 있습니다. PCAP 파일에 패킷의 흐름을 캡처했습니다. 문제는 이제 데이터 부분 만 표시 할 수 없다는 것입니다.Tshark - 사용자 정의 프로토콜의 데이터 만 표시 할 수 없음

tshark -r test.pcap -R 'tcp.port==8888 && tcp.len>0' -T fields -e "tcp.data" 

을하지만 빈 문자열을 표시

나는 다음과 같은 명령을 시도했습니다. tcp.data 필드가 TCP 패킷의 데이터를 보유하고 있지 않습니까?

필요한 데이터 만 표시하려면 어떻게해야합니까?

+0

['tpcick'] (http://tcpick.sourceforge.net/)을 시도해보십시오. –

+0

@StephaneChazelas, tcpick에는 한 가지 제한이 있습니다. ipv6을 지원하지 않습니다. – maxschlepzig

답변

4

Wireshark에는 "Analyze/Follow TCP stream"기능이 있습니다.

패킷 목록에서 TCP 패킷을 선택한 다음 "TCP 스트림 따르기"를 선택하면 Wireshark가 선택한 연결의 TCP 대화를 표시합니다.

편집 :

tcp.data

가 존재하지 않습니다. 대신 data.data를 사용

tshark -r mon.pcap -R "(tcp.port == 8888) && (tcp.len > 0)" -T fields -e data.data 

와이어 샤크 포트 (8888)를 사용하는 프로토콜을 알고있는 경우, 이전이 작동하지 않습니다. 는 그러나 다음과 같은 트릭 작동 :

tshark -r mon.pcap -R "(tcp.port == 8888) && (tcp.len > 0)" -T fields -d tcp.port==8888,echo -e echo.data 
+0

예, 그에 대해 알고 있지만 선택한 연결의 TCP 대화 만 표시하기 때문에 조금 비실용적이므로 사용하고 싶지 않습니다. 선택한 IP의 전체 TCP 대화를 표시하려고합니다. Wireshark에서 그렇게 할 수있는 방법을 알고 있다면 기꺼이 사용하게 될 것입니다. – eleanor

+0

@eleanor : 알겠습니다. 내 대답을 업데이트했습니다 – SKi

+0

답변을 업데이트 해 주셔서 감사합니다. 첫 번째 명령은 프로토콜의 데이터 부분을 인쇄하지만 16 진수로 인쇄합니다. ASCII 프로토콜이기 때문에 ASCII 문자로 인쇄 가능한 문자를 인쇄하고 도트로 인쇄 할 수없는 것이 더 낫습니다. '. 출력 예는 "45 : 58 : 49 : 54 : 0d : ff"이며, "EXIT ??"입니다. 여기에서 볼 수 있듯이 http://www.dolcevie.com/js/converter.html. 그래서 기본적으로 이것은 지금해야 할 모든 것입니다. tshark이 이것을 지원하는지 알고 있습니까? – eleanor

1

좋아, 내가 필요한 작업을 수행하는 파이썬 스크립트를 프로그램했습니다. 코드가 좀 더 좋을 수도 있지만, 그것이 작동하고 그것이 지금 필요한 전부입니다.

#!/usr/bin/python 
import subprocess 
import sys 
import binascii 

""" Input arguments. """ 
if len(sys.argv) != 3 and len(sys.argv) != 4 and len(sys.argv)!= 5: 
    print "[*] You didn't specify the right command line arguments." 
    print "Usage:\n" 
    print "\t"+sys.argv[0]+" <pcap> <port> [<src_ip> <dst_ip>]" 
    print 
    exit(-1) 

args = len(sys.argv) 
if args == 3: 
    pcap = sys.argv[1] 
    port = sys.argv[2] 
elif args == 4: 
    pcap = sys.argv[1] 
    port = sys.argv[2] 
    srcip = sys.argv[3] 
elif args == 5: 
    pcap = sys.argv[1] 
    port = sys.argv[2] 
    srcip = sys.argv[3] 
    dstip = sys.argv[4] 


""" Use tshark to read pcap file. """ 
targs = [] 
targs.append("tshark") 
targs.append("-r"+pcap) 
f = "-R (tcp.port=="+port+") && (tcp.len>0)" 
if args == 4: 
    f=f+" && (ip.src == "+srcip+")" 
elif args == 5: 
    f=f+" && (ip.src == "+srcip+" and ip.dst == "+dstip+")" 
targs.append(f) 
targs.append("-Tfields") 
targs.append("-edata.data") 
p = subprocess.Popen(targs, stderr=subprocess.PIPE, stdout=subprocess.PIPE) 

while True: 
    """ Read a line of output from the tshark output- """ 
    out = p.stdout.readline() 

    """ Print only non-empty lines.""" 
    if out != '': 
    """ Parse the line appropriately and print printable characters. """ 
    chars = out.split(':') 
    for c in chars: 
     if c >= '20' and c <= '7e': 
    try: 
      cc = binascii.unhexlify(c) 
    except: 
     pass 
    sys.stdout.write(cc) 
     else: 
     sys.stdout.write('.') 
    print 

    """ When there is no more data, break out of infinite loop.""" 
    if out == '' and p.poll() != None: 
    break 

p.stdout.close() 

우리는 스크립트 세 가지 방법으로 호출 할 수 있습니다

첫째 :

python tshark.py temp.pcap 8888 

둘째 :

python tshark.py temp.pcap 8888 "10.1.1.2" 

셋째 :

python tshark.py temp.pcap 8888 "10.1.1.2" "10.1.1.3" 
관련 문제