我能用tcpdump获取HTTP请求、响应头和响应体吗?

100

我正在使用tcpdump命令来获取HTTP数据,命令如下:

sudo tcpdump -A -s 1492 dst port 80

上述命令的结果:

  1. Headers,我认为是请求和响应头。
  2. 无法读取的数据。
  3. URL为 GET /modules/mod_news_pro_gk1/cache/stories.ilbalad.ajayeb.strange-tractor.jpg

我需要更清晰的结果,例如可读的请求 > 响应头 > 响应体等。如何过滤我的结果?


3
HTTP响应可能会被压缩或分块,直接获取它们的原始文本可能无法满足您的需求(“不可读数据”)。您可能需要更完整地解释您想要做什么以及您的环境允许什么(例如,您不能像Charles或Fiddler这样使用HTTP代理吗?)。 - EricLaw
你是如何在Android操作系统上运行tcpdump的?你是将命令嵌入到你的应用程序中还是在连接到Android手机的PC上运行它? - faizal
1
@faizal - 你应该将tcpdump二进制文件安装到设备中,然后可以从设备本身运行它,请使用此链接了解如何将tcpdump安装到Android设备中:http://gadgetcat.wordpress.com/2011/09/11/tcpdump-on-android/ - kimo
4个回答

236

有针对HTTP GET和HTTP POST(或两者加上消息体)的tcpdump过滤器:

  • 运行man tcpdump | less -Ip examples以查看一些示例

  • 以下是用于HTTP GET的tcpdump过滤器(GET = 0x470x450x540x20):

sudo tcpdump -s 0 -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
  • 这是一个用于HTTP POST的tcpdump过滤器(POST= 0x50, 0x4f, 0x53, 0x54):

  • sudo tcpdump -s 0 -A 'tcp dst port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'
    
  • 监控HTTP流量,包括请求和响应头以及消息正文(来源):

  • tcpdump -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
    tcpdump -X -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
    

    欲了解 TCP 报头中的位操作详细信息,请参阅:字符串匹配捕获过滤器生成器(链接到 Sake Blok 的解释)。


    18
    我不知道 less -Ip 这个命令,真是省了不少时间。 - n611x007
    11
    我愿意为您解释那些tcpdump调用的内容。 - tmc
    1
    是否有可能同时针对 HTTP GET 和 POST 请求进行过滤? - Jim Ho
    4
    这是巫术。请有人解释一下它是如何工作的。 - user3905644
    1
    https://explainshell.com/explain?cmd=sudo+tcpdump+-s+0+-A+%27tcp%5B%28%28tcp%5B12%3A1%5D+%26+0xf0%29+%3E%3E+2%29%3A4%5D+%3D+0x47455420%27 - jmunsch
    显示剩余3条评论

    33

    我建议使用Wireshark,它有一个“跟踪TCP流”选项,可以非常容易地查看特定TCP连接的完整请求和响应。如果您更喜欢使用命令行,则可以尝试使用tcpflow,这是一种专用于捕获和重组TCP流内容的工具。

    另一个选择是使用HTTP调试代理,例如CharlesFiddler,正如EricLaw所建议的那样。它们具有特定的HTTP支持,使处理各种编码变得更加容易,并具有保存请求以重放或编辑请求等其他功能。

    您还可以使用像Firebug(Firefox)、Web Inspector(Safari、Chrome和其他基于WebKit的浏览器)或Opera Dragonfly这样的工具,它们提供了查看请求和响应头和正文的一些能力(尽管大多数工具不能让您查看精确的字节流,而是浏览器解析请求的方式)。

    最后,您始终可以手动构造请求,使用诸如telnet、netcatsocat连接到端口80并手动键入请求,或者使用htty这样的工具帮助轻松构造请求并检查响应。


    2
    非常感谢您的回答,Brain。 我正在使用Android操作系统中的tcpdump :) 因此,我受限于使用tcpdump,当然我可以获取标头和链接请求,但我还需要获取正文。有什么帮助,任何Perl转换脚本或类似的东西吗? - kimo
    11
    在这种情况下,我建议使用tcpdump -w outfile ...将原始数据包转储到文件中,然后将其复制到您的计算机上,并使用Wireshark进行分析。 Wireshark可以打开数据包转储文件,解码TCP流并解压缩HTTP内容(我假设无法读取的原因是因为它被压缩了)。 - Brian Campbell
    谢谢Brian,我会尝试实现这个解决方案,但移动文件到PC上会更好,因为我需要筛选数据以获取所需的请求,而在Android系统上做这件事并不容易。 - kimo
    Brian,我想我们想要表达的是,我们如何使用Busy Box来完成这个任务。我在Android设备上也遇到了相同的限制。 - Tegra Detra
    1
    @JamesAndino 是的,在Android设备上,我建议使用tcpdump -w outfile,然后将其复制到具有Wireshark的机器上,并使用Wireshark查看转储。 - Brian Campbell
    有一个名为Live HTTP Headers的Firefox插件,可以提供完整的HTTP请求和响应。它也可以在Chrome上使用 - SKWebDev

    7
    这里还有另一个选择:Chaosreader 所以我需要调试一个向第三方应用程序发布XML的应用程序。我找到了一个非常棒的小Perl脚本,它可以完成所有的困难工作 - 你只需将tcpdump输出文件扔给它,它就会进行所有的操作并输出你需要的一切......
    这个脚本叫做chaosreader0.94。请参见http://www.darknet.org.uk/2007/11/chaosreader-trace-tcpudp-sessions-from-tcpdump/ 它非常好用,我按照以下步骤操作:
    tcpdump host www.blah.com -s 9000 -w outputfile; perl chaosreader0.94 outputfile
    

    3

    这是我倾向使用的:

    tcpdump -s0 -Aql host example.com and port 80 -i any | grep -A5 -P 'HTTP'
    

    -A5是HTTP之后您想匹配的行数。


    1
    由于HTTP头通常以空行结尾,所以类似于sed '/HTTP/,/^$/!d'这样的命令可能会取代grep - mwfearnley

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接