![仅通过 tcpdump 捕获 HTTP post 请求](https://linux22.com/image/646363/%E4%BB%85%E9%80%9A%E8%BF%87%20tcpdump%20%E6%8D%95%E8%8E%B7%20HTTP%20post%20%E8%AF%B7%E6%B1%82.png)
出于安全考虑,我们希望列出应用程序中使用的所有 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: .*'