英文:
How to send a custom 'TCP' packet, without sudo - without three-way handshake
问题
我正在尝试发送一个不使用原始套接字、不经过三次握手并且不使用sudo的TCP(以及后续的ICMP)数据包。我已经尝试了Python的scapy模块和socket模块的各种方法,但都没有成功。
我知道没有经过三次握手,TCP实际上就是UDP,但我正在测试从网络中窃取数据的各种方法,这可能不会被检测到。
以下是一个可用的UDP版本,我需要一个可用的ICMP和TCP版本,它们不使用原始套接字,因此不需要管理员/根权限。
首选的解决方案是GO或Python,最理想的情况是在MacOS、Linux和(主要是)Windows上运行。
UDP_IP = "127.0.0.1"
UDP_PORT = 5005
MESSAGE = "Data to exfiltrate"
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
英文:
I am trying to send a TCP (and later an ICMP) packet that does not use raw sockets, does not go through the three-way handshake, and does not use sudo. I have tried various methods in python's scapy module, and in python's socket module, without success.
I understand that without the three-way handshake, TCP isn't necessarily TCP - it is basically UDP, but I am testing various ways to exfiltrate data from a network, that may go undetected.
Basically this is the working UDP version, I need working ICMP and TCP versions that do not use a raw socket, and therefore do not require admin/root privileges.
A solution in GO or Python is preferable, ideally I need to run on MacOS, Linux, and (mainly) Windows.
UDP_IP = "127.0.0.1"
UDP_PORT = 5005
MESSAGE = "Data to exfiltrate"
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
答案1
得分: 4
简而言之,你无法在Linux下这样做。
你试图发送一个数据包,而不遵守TCP的状态机。内核不会允许你这样做,除非你使用数据包套接字(直接使用或通过诸如pcap
或scapy
的库),而原始套接字需要CAP_NET_RAW
权限,通常只授予超级用户。
英文:
In short — you cannot, at least not under Linux.
You are trying to send a packet without obeying TCP's state machine. The kernel will not allow you to do that without using a packet socket (either directly or through a library such as pcap
or scapy
), and raw sockets require the CAP_NET_RAW
capability, which is normally only granted to the superuser.
答案2
得分: 0
TCP是一种面向连接的协议。为了建立TCP连接,你必须执行三次握手。在连接建立之前,你的操作系统中的TCP模块不会发送数据,而且任何接收到针对不存在连接的TCP段的设备都会忽略它。
没有连接的TCP不是TCP,但也不是UDP。TCP和UDP具有不同的协议头部。你会注意到TCP头部比UDP头部有更多的字段,并且其中许多字段将由握手过程中的信息填充。
> TCP头部格式
>
>
> 0 1 2 3
> 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
> | 源端口 | 目的端口 |
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
> | 序列号 |
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
> | 确认号 |
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
> | 数据 | |U|A|P|R|S|F| |
> | 偏移 | 保留 |R|C|S|S|Y|I| 窗口 |
> | | |G|K|H|T|N|N| |
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
> | 校验和 | 紧急指针 |
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
> | 选项 | 填充 |
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
> | 数据 |
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>
> TCP头部格式
> 格式
>
>
> 0 7 8 15 16 23 24 31
> +--------+--------+--------+--------+
> | 源端口 | 目的端口 |
> | 端口 | 端口 |
> +--------+--------+--------+--------+
> | | |
> | 长度 | 校验和 |
> +--------+--------+--------+--------+
> |
> | 数据字节 ...
> +---------------- ...
>
> 用户数据报头部格式
英文:
TCP is a connection-oriented protocol. In order to establish a TCP connection, you must perform a three-way handshake. The TCP module in you OS will not send data until a connection is established, and any device receiving a TCP segment for a non-existent connection will ignore it.
TCP without the connection is not TCP, but neither is it UDP. TCP and UDP have different protocol headers. You will notice that the TCP header has more fields than the UDP header, and many of those fields will be populated by information from the handshake.
RFC 793, Transmission Control Protocol:
> TCP Header Format
>
>
> 0 1 2 3
> 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
> | Source Port | Destination Port |
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
> | Sequence Number |
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
> | Acknowledgment Number |
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
> | Data | |U|A|P|R|S|F| |
> | Offset| Reserved |R|C|S|S|Y|I| Window |
> | | |G|K|H|T|N|N| |
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
> | Checksum | Urgent Pointer |
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
> | Options | Padding |
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
> | data |
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>
> TCP Header Format
RFC 768, User Datagram Protocol:
> Format
>
>
> 0 7 8 15 16 23 24 31
> +--------+--------+--------+--------+
> | Source | Destination |
> | Port | Port |
> +--------+--------+--------+--------+
> | | |
> | Length | Checksum |
> +--------+--------+--------+--------+
> |
> | data octets ...
> +---------------- ...
>
> User Datagram Header Format
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论