我试图创建一个三向握手与Scapy,但似乎没有任何端口返回任何东西,无论如何。不管发生什么,响应总是没有。
for i in range(20, 1025):
syn_segment = TCP(dport=i, seq=123, flags='S')
my_packet = address / syn_segment
response = sr1(my_packet, timeout=2, verbose=False)
if not (response is None):
if response[TCP].flags == 18:
print(f'port {i} is open')
问题来源StackOverflow 地址:/questions/59379591/why-does-sr1-in-scappy-always-return-none
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您的描述,您在使用Scapy尝试实现TCP三向握手以探测目标主机的端口开放情况时遇到了问题,即sr1()
函数总是返回None。这可能有几个原因:
网络可达性问题:确保目标IP地址是可达的。如果目标不可达或防火墙阻止了您的探测包,您将收不到任何响应。
ICMP错误消息被过滤:当目标主机或中间网络设备(如防火墙)拒绝或丢弃您的SYN包时,通常会返回一个ICMP错误消息(如类型3代码13的“目的端口不可达”)。但如果您没有配置Scapy来监听这些ICMP错误,您可能就只会看到None。您可以尝试在发送SYN包时启用ICMP错误监听,通过在sr1()中设置verbose=0
和增加iface=
参数指定网卡接口来获取更详细的输出信息。
SYN Flood防护:许多系统和网络设备都启用了对SYN Flood攻击的防护,快速连续地发送大量SYN包可能会触发这些防护机制,导致您的数据包被丢弃且不返回任何响应。
Scapy配置问题:确认Scapy是否正确安装并且版本兼容。有时候,Scapy的某些功能在特定版本下可能存在已知的问题。
操作系统限制:某些操作系统对未建立连接的SYN包有严格的限制,特别是当它们来自同一源时。检查并确保您的操作系统的网络栈配置允许此类行为。
端口扫描策略:目标系统可能特别配置了对端口扫描的响应策略,比如静默丢弃SYN请求而不响应RST或ACK,以避免泄露信息。
为了解决这个问题,您可以尝试以下步骤: - 确认网络可达性和目标系统的可达性。 - 调整Scapy的使用方式,考虑使用srloop()
或者适当增加timeout
值。 - 检查并调整系统及Scapy的配置,确保没有本地限制阻碍数据包发送或接收。 - 分析网络流量(使用Wireshark等工具),查看SYN包是否实际发出以及是否有响应被过滤或丢弃。 - 如果可能,尝试在不同网络环境下进行测试,排除特定环境因素的影响。
希望这些建议能帮助您解决问题。