Tshark - не может отображать только данные пользовательского протокола

У меня есть собственный протокол, который работает на порту 8888 (нет, это не http) поверх TCP. Я записал поток пакетов в файл PCAP. Проблема в том, что теперь я не могу отображать только часть данных.

Я пробовал с помощью следующей команды:

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

Но он отображает пустые строки. Разве поле tcp.data не содержит данные TCP-пакета?

Как я могу отображать только те данные, которые мне нужны?


person eleanor    schedule 17.04.2012    source источник
comment
Вы можете попробовать tpcick   -  person Stephane Chazelas    schedule 29.10.2013
comment
@StephaneChazelas, у tcpick есть одно ограничение: он не поддерживает ipv6.   -  person maxschlepzig    schedule 29.01.2017


Ответы (2)


В Wireshark есть функция «Анализ/отслеживание потока TCP».

Просто выберите пакет TCP из списка пакетов, а затем «Следовать за потоком TCP».... и Wireshark отобразит диалог TCP выбранного соединения.

РЕДАКТИРОВАТЬ:

tcp.data не существует. Вместо этого используйте data.data:

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

Если wireshark знает протокол, который использует порт (8888), то предыдущий не будет работать. Но работает следующий трюк:

tshark -r mon.pcap -R "(tcp.port == 8888) && (tcp.len > 0)" -T  fields -d tcp.port==8888,echo -e echo.data
person SKi    schedule 17.04.2012
comment
Да, я знаю об этом, но я не хочу использовать его, так как это немного непрактично, потому что он показывает только TCP-диалог выбранного соединения. Я хочу отобразить весь TCP-разговор выбранных IP-адресов. Если вы знаете способ сделать это в Wireshark, я с удовольствием им воспользуюсь. - person eleanor; 17.04.2012
comment
Спасибо за обновление ответа, это действительно помогает. Первая команда печатает часть данных протокола, но в шестнадцатеричном формате. И поскольку это протокол ASCII, было бы намного лучше печатать печатаемые символы в их представлении ascii, а непечатаемые - с точкой '.'. Пример вывода: 45:58:49:54:0d:ff, что является ВЫХОДОМ?? как можно увидеть здесь: dolcevie.com/js/converter.html . Так что, в принципе, это все, что нужно сделать сейчас. Вы знаете, поддерживает ли tshark это? - person eleanor; 18.04.2012
comment
Я не знаю. Но помните: TCP может выполнять повторные передачи. Таким образом, иногда в выводе могут встречаться частично дублированные данные. - person SKi; 18.04.2012
comment
Я повторяю вопрос @eleanor. Есть data -- целый пакет строк в виде шестнадцатеричных фрагментов, а есть data.data, который выглядит как последовательность (или массив) байтов. Как получить ASCII для EXIT вместо длинной строки шестнадцатеричных фрагментов? Наверняка должно быть внутреннее решение tshark или инструмент, в который я могу передать свой вывод...??? - person will; 23.09.2019

Хорошо, я запрограммировал скрипт на Python, который выполняет необходимую работу. Я знаю, что код мог бы быть немного лучше, но он работает, и это все, что мне нужно на данный момент.

#!/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"
person eleanor    schedule 25.04.2012