我正在使用python和scapy将HTTP请求发送到特定的URL地址。发送后,我想阅读响应状态代码(200,401,404等)。
我使用了这种方法:
>>> syn = IP(dst='www.google.com') / TCP(dport=80, flags='S')
>>> syn_ack = sr1(syn)
>>> getStr = 'GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n'
>>> request = IP(dst='www.google.com') / TCP(dport=80, sport=syn_ack[TCP].dport, seq=syn_ack[TCP].ack, ack=syn_ack[TCP].seq + 1, flags='A') / getStr
>>> reply = sr1(request)
出于某种原因,我无法在“回复”中看到它。
感谢您的帮助!
答案 0 :(得分:1)
通过使用sr1(),您只能接收从服务器响应的第一个数据包,在某些情况下会收到“空”ACK以确认您发送的数据,因此您无法找到HTTP响应和响应代码。我的建议是使用sr()而不是sr1(),如下所示:
reply = sr(request, multi=1, timeout=2)
这将收到包括HTTP响应在内的所有数据包在2秒内到达,但您需要迭代回复数据包以查找包含HTTP响应代码的数据包。
答案 1 :(得分:0)
您的操作系统可能会自动发送RST数据包以响应收到的SYN + ACK。通过使用wireshark之类的嗅探工具,您可以看到。
可以通过添加iptables规则来解决问题,以抑制传出RST
sudo iptables -A OUTPUT -p tcp --dport 80 --tcp-flags RST RST -j DROP
稍后将其删除
sudo iptables -A OUTPUT -p tcp --dport 80 --tcp-flags RST RST -j DROP