我有一个在端口 8888(不,它不是 http)和 TCP 之上运行的自定义协议。我已经将数据包流捕获到 PCAP 文件中。问题是现在我不能只显示它的数据部分。
我尝试过使用以下命令:
tshark -r test.pcap -R 'tcp.port==8888 && tcp.len>0' -T fields -e "tcp.data"
但它显示一个空字符串。tcp.data字段不是保存TCP数据包的数据吗?
如何只显示我需要的数据?
我有一个在端口 8888(不,它不是 http)和 TCP 之上运行的自定义协议。我已经将数据包流捕获到 PCAP 文件中。问题是现在我不能只显示它的数据部分。
我尝试过使用以下命令:
tshark -r test.pcap -R 'tcp.port==8888 && tcp.len>0' -T fields -e "tcp.data"
但它显示一个空字符串。tcp.data字段不是保存TCP数据包的数据吗?
如何只显示我需要的数据?
Wireshark 中有“分析/跟踪 TCP 流”功能。
只需从数据包列表中选择 TCP 数据包,然后“Follow TCP stream”.... 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
好的,我已经编写了一个 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"