如何通过袜子发送TCP数据包?

问题描述 投票:0回答:2

我有此代码:

import socket
import socks

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4, "IP_SOCK", PORT_SOCK, True)
s = socks.socksocket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((target,port))
s.close()
print("Connection tested.")

可以,但是数据包的长度为0。我想添加有效载荷数据,我该怎么做?

例如,在这里,我的工作代码与scapy库一起使用:

import socket
import socks
from scapy.all import *


def send(src_ip, dst_ip, dst_port):
    ip = IP(src=src_ip, dst=dst_ip)
    src_port = random.randint(20, 65000)
    transport = TCP(sport=src_port, dport=dst_port, flags="S")
    send(ip/transport/b"mydata")


if __name__ == '__main__':
    send('SRC_IP', 'DST_IP', DST_PORT)

并且它确实发送“ mydata”有效负载。如果我用tcpdump截获,则可以在syn数据包中看到数据字段的长度和“ mydata”。

我想通过袜子或http代理发送它,但是我不知道该怎么办。

事实是我不需要建立连接,因为即使端口关闭我也想发送数据包。

有些人继续告诉我,我不能使用袜子来发送tcp数据包。这不是真的。 SOCKS在第4层中起作用,因此完全可以实现,因为我不熟悉,所以我不知道如何在Python中执行此操作。

python python-3.x sockets scapy socks
2个回答
0
投票

您可以使用sendall();例如:s.sendall("GET / HTTP/1.1 ...")

[有关更多详细信息,请参见https://pypi.org/project/PySocks/,我从中获得了此示例以及https://docs.python.org/3/library/socket.htmlsocks模仿python的内置socket s]


0
投票

有些人继续告诉我,我不能使用袜子来发送tcp数据包。这不是真的。

即使您不喜欢也是如此。代理(HTTP代理或Socks代理)不是网络级别的数据包转发器。相反,它是应用程序级别的有效负载转发器。如果要使用数据包转发器,则需要一个真实的VPN(侧重于“ N”,即网络级别)。

使用Socks或HTTP代理时,首先需要建立与代理的TCP连接。然后,在此TCP连接内部进行一些初始握手,例如针对代理的身份验证和目标用户希望达到的规范。然后,代理连接到目标,一旦完成,就有两个TCP连接:一个在客户端和代理之间,另一个在代理和服务器之间。然后,代理将在这两个连接上进行读取,并将接收到的数据转发给对等方,即,将从客户端接收到的数据转发到服务器等。代理还可能会修改传输中的数据。

由于代理仅在应用程序级别转发数据,因此无法通过代理发送精心制作的TCP数据包。而且由于代理服务器维护两个独立的TCP连接,并且仅转发应用程序级别的数据,因此传入和传出的数据包大小可能会有所不同。

© www.soinside.com 2019 - 2024. All rights reserved.