如何发送自定义' TCP'数据包,没有sudo - 没有三次握手

时间:2017-07-11 14:07:28

标签: python sockets networking go tcp

我正在尝试发送一个不使用原始套接字的TCP(以及后来的ICMP)数据包,不进行三次握手,并且不使用sudo。我在python的scapy模块和python的套接字模块中尝试过各种方法,但没有成功。

据我所知,如果没有三方握手,TCP不一定是TCP - 它基本上是UDP,但我正在测试从网络中泄露数据的各种方法,这些方法可能无法检测到。

基本上这是工作的UDP版本,我需要使用不使用原始套接字的ICMP和TCP版本,因此不需要admin / root权限。

GO或Python的解决方案更可取,理想情况下我需要在MacOS,Linux和(主要)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))

2 个答案:

答案 0 :(得分:2)

简而言之 - 你不能,至少不能在Linux下。

您正在尝试发送数据包而不遵守TCP的状态机。如果不使用数据包套接字(直接或通过诸如const util = require('util'); const fs = require('fs'); const stat = util.promisify(fs.stat); // usage of promisified function stat('.').then((stats) => { // Do something with `stats` }).catch((error) => { // Handle the error. }); pcap之类的库),内核将不允许您这样做,并且原始套接字需要scapy功能,这是通常只授予超级用户。

答案 1 :(得分:0)

TCP是面向连接的协议。为了建立TCP连接,必须执行三次握手。您的操作系统中的TCP模块在建立连接之前不会发送数据,并且任何接收到不存在连接的TCP段的设备都将忽略它。

没有连接的TCP不是TCP,但也不是UDP。 TCP和UDP具有不同的协议头。您会注意到TCP标头的字段多于UDP标头,其中许多字段将由握手信息填充。

RFC 793, Transmission Control Protocol

  

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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          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

  

格式

              0      7 8     15 16    23 24    31
             +--------+--------+--------+--------+
             |     Source      |   Destination   |
             |      Port       |      Port       |
             +--------+--------+--------+--------+
             |                 |                 |
             |     Length      |    Checksum     |
             +--------+--------+--------+--------+
             |
             |          data octets ...
             +---------------- ...

                  User Datagram Header Format