我可以使用tcpdump获取HTTP请求,响应标头和响应正文吗?


78

我正在tcpdump通过执行以下命令来获取HTTP数据:

sudo tcpdump -A -s 1492 dst port 80

上面命令的结果:

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

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


3
HTTP响应可能被压缩或分块,并且获取其原始文本可能无法真正满足您的需要(“无法读取的数据”)。您可能需要更完整地说明您想做什么以及您的环境允许什么(例如,您不能仅使用Charles或Fiddler之类的HTTP代理)吗?
EricLaw 2011年

您如何tcpdump在Android OS上运行?您是否以某种方式将命令嵌入了您的应用程序,或者是在连接到Android手机的PC上运行了该命令?
faizal

1
@faizal-您应该将tcpdump二进制文件安装到设备中,然后可以从设备本身运行它,请使用以下链接了解如何将tcpdump安装到Android设备中:gadgetcat.wordpress.com/2011/09/11/tcpdump -on-android
kimo

Answers:


203

有用于HTTP GET和HTTP POST的tcpdump筛选器(或同时包含消息正文的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= 0x500x4f0x530x54):

    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的说明)。


13
我不知道less -Ip-什么
节省

11
我想看一下这些tcpdump发票的说明
tmc 2014年

1
是否可以同时使用HTTP GET和POST过滤器?
Jim Ho

4
这是巫术。有人请解释它是如何工作的。
sdkks


34

我建议使用Wireshark,它具有一个“ Follow TCP Stream”选项,可以很容易地查看特定TCP连接的完整请求和响应。如果您希望使用命令行,可以尝试tcpflow,这是一个专用于捕获和重建TCP流内容的工具。

其他选项将使用HTTP调试代理,如EricLaw建议的CharlesFiddler。这些优点是具有对HTTP的特定支持,可以更轻松地处理各种编码,以及其他功能,例如保存重播请求或编辑请求。

您还可以使用Firebug(Firefox),Web Inspector(Safari,Chrome和其他基于WebKit的浏览器)或Opera Dragonfly之类的工具,所有这些工具都可以提供查看请求和响应标头和正文的功能(尽管大多数它们不允许您查看确切的字节流,而是查看浏览器如何解析请求。

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


2
非常感谢您的回答Brain。我在android操作系统中使用tcpdump :)因此,我受到tcpdump的限制,确保可以获取标头以及链接请求,我还需要获取正文,任何帮助,任何Perl转换脚本或类似的东西?
kimo

11
@kimo在这种情况下,建议您tcpdump -w outfile ...将原始数据包转储到文件中,然后将其复制到您的计算机上,并使用Wireshark对其进行分析。Wireshark可以打开一个数据包转储,解码TCP流,并解压缩HTTP内容(我假设它不可读的原因是因为它已压缩)。
Brian Campbell

谢谢Brian,我将尝试实现此解决方案,无论如何,最好将文件移动到PC,因为我应该过滤数据以获取所需的请求,并且在android系统上实现起来并不容易。
kimo

布莱恩,我想我们要说的是。我们如何用Busy Box愚弄这个。我在Android设备上也有相同的限制。
詹姆斯

1
@JamesAndino是的,我建议在Android设备上使用tcpdump -w outfile,然后将其复制到具有Wireshark的计算机上,并使用Wireshark查看转储。
Brian Campbell

6

这是另一个选择: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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.