Python 如何通过socks发送TCP数据包?

Python 如何通过socks发送TCP数据包?,python,python-3.x,sockets,scapy,socks,Python,Python 3.x,Sockets,Scapy,Socks,我有以下代码: 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。我想

我有以下代码:

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”

我想通过sock或http代理发送它,但我不知道如何才能做到

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

有些人继续告诉我,我不能使用socks发送tcp数据包。这不是真的。SOCKS在第4层中起作用,所以它是完全可以实现的,问题是我不知道如何在Python中实现它,因为我是新手。

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

有关更多详细信息,请参见,我从何处获得此示例,以及(
socks
模仿python内置的
socket
s)

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

即使你不喜欢,这也是真的。代理(HTTP代理或Socks代理)不是网络级别的数据包转发器。相反,它是应用程序级别的有效负载转发器。如果你想要一个包转发器,你需要一个真正的VPN(关注“N”,即网络级别)

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


由于代理仅在应用程序级别转发数据,因此无法通过代理发送精心编制的TCP数据包。由于代理维护两个独立的TCP连接,只转发应用程序级数据,即使传入和传出的数据包大小可能不同,也就是说,两个传入的数据包可以合并在一个输出的包中,或者可能导致三等。因为TCP只是字节流包大小在应用程序级别上并不重要。

您是否考虑到那些“继续告诉”您不能通过袜子发送原始TCP包的人可能是正确的?是相关规范。袜子在第4层不起作用。这是一个应用程序协议。即使端口关闭,也不会发送数据包。