仅通过 tcpdump 捕获 HTTP post 请求

仅通过 tcpdump 捕获 HTTP post 请求

出于安全考虑,我们希望列出应用程序中使用的所有 POST 请求 URI(因此我们将通过 mod_security 禁用除这些 URI 之外的 POST)。我们的想法是使用 tcpdump 在完整回归测试期间捕获这些 URI,然后使用 wireshark 获取所有 URI 的不同列表。

问题是我们无法找到正确的 tcpdump 参数来仅捕获 HTTP 发布请求(这是必要的,因为完整的 tcpdump 会很快填满磁盘)。

以下命令可以找到但显示 GET、POSTS 和一些其他数据包(太多):

sudo tcpdump -A 'tcp port 9081 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

以下仅捕获 POST 请求,但在 wireshark 中它们显示为 TCP 数据包,我们无法从中提取 URI(就像我们http.request.uri在 wireshark 中使用自定义值对 HTTP 所做的那样):

sudo tcpdump -A 'tcp port 9081 tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354'

我们应该使用什么 tcpdump 参数来捕获 HTTP POST 请求(在 wireshark 中显示为 HTTP 数据包)或者如何从这些 TCP 数据包中提取 URI(第二个命令)?

答案1

不久前我也遇到过类似的问题,我认为如果出现这种情况或者有人需要帮助时,这可能会有所帮助。

仅捕获传入端口 80 (Apache/NGINX) 的 HTTP POST 请求

使用此 Tcpdump 命令:

tcpdump -i enp0s8 -s 0 -A 'tcp dst port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504F5354'

这里 0x504F5354 代表 'P' 'O' 'S' 'T' 的 ASCII 值

这是文档我用过,效果很好

答案2

tcpflow -p -c -i bond0 port 9081 | grep -oE '(GET|POST|HEAD) .* HTTP/1.[01]|Host: .*'

相关内容