手动制作数据包的艺术(TCP/IP)。
#python #安全 #linux #网络安全

解剖TCP/IP数据包。详细的数据包中的内容。

github:Salah Ud Din — 4yub1k

阅读了大量文章,博客和测试。我写了这篇文章的目的,易于理解。我希望你能喜欢它。

确保在开始之前阅读此介绍性文章。 [READ]

本文和脚本纯粹是出于教育目的。忽略错误。

IP:

IP

重要:
对于任何计算(除了添加校验和二进制)以避免错误,您必须至少要做8个单词(除了增加校验和二进制)。并填充零,如上图所示。

示例:

  • 版本 + ihl&tos(服务类型)= 0x45是8位,0x00也是8位字(1个字节),在binary = 01000101 00000000 16位。
  • flags&fragment offset =(000 3位)&(000000000 13位),但要计算为8位单词或1个字节,二进制= 00000000 0000000 = 00 00。
  • 您可以仅写协议0x6,因为它将被视为4位,因此必须为0x06,二进制= 00000110 = 06 = 06 = 0x06。即使它是领先的0。
  • 如上图所示,总共有5行,每行为32位,除了地址行以外的16位块。

我们需要IP:

  • 版本:4位
  • IHL:4位
  • 服务类型:8位
  • 总长度:16位
  • 识别:16位
  • 标志:3位
  • 片段偏移:13位
  • 是生活的时间(TTL):8位
  • 协议:8位
  • 标题校验和16位
  • 源地址:32位
  • 目标地址:32位

IHL:

数据包中的32位单词的数量:计数上图= 5中的字段/行数。

总长度:

在(IP和TCP)中结合32位单词的长度。在数据包中的32位单词的排行中。
*我们将在填充TCP标头后填充。

鉴别:

将任何随机值少于0xffff(16位)。它仅适用于数据包身份。

标志 +片段:

在000 + 0000000000中,您可以将其保持原样,但是如果要使用它,

不要碎片包:
标志位= 010 + 00000 00000000 = 0100000000000000000000 = 4 0,将它们组合在一起,因为它们是16位字= 0x40

是时候居住(TTL):

每次路由器将数据包转发时,它都会减小数据包标头中的TTL字段,如果值达到零,则将数据包删除。
值范围为0 225,0x00 0xff,为8位。
示例:64 DECIMAL = 0x40十六进制。

协议 :

  • tcp = 06
  • icmp = 01 了解更多互联网协议:GOTO11

标题校验和

对于计算,所有必要的值以16位单词的形式使用并添加在一起。如果该值不长16位,则将用零进行启动。 0x6 = 0x0006(16位)。

|意味着将碎屑加入。

您可以看到我们将IP地址分为16位Word而不是32位。

Checksum = (Version | IHL | Type of Service) + Total Length + Identification + (Flags | Fragment Offset) + (TTL | Protocol + Header Checksum (0x0000 in calculation) ) + Source Address (IP) + Destination Address (IP)

*如果校验和值的值大于0xffff,则会有一个携带,0x12345 - 0x2345 + 0x0001 = 0x2346,这就是我们可以补偿结转的方式。



总校验和将从0xfff减去0x2346。
校验和校验和结转(如果有)

总校验和0xffff(校验和),否(0xffff)

来源和目的地IP:

将IP地址转换为十六进制值。
192.168.242.133
192 = 0xc0。
168 = 0xa8。
242 = 0xf2。
133 = 0x85。

TCP:

TCP

我们需要TCP:

  • 源端口:16位
  • 目的地端口:16位
  • 序列编号:32位
  • 确认编号:32位
  • 数据偏移:4位
  • 保留:3位
  • 标志:9位
  • 校验和16位
  • 紧急指针:16位

来源和目的地端口:

十进制端口值的十六进制值,
12336 = 0x3030
80 = 0x50

ACK和序列编号:

最初将它们设置为0x0000&0x0000。

数据偏移:

是TCP标头中的32个位单词的数量,在上图中计数行= 5,有5 32位单词。 0x5 =二进制=0101。(数据偏移为4位)。

标志:

当我们想发送SYN请求时,SYN位将设置为1如上所示。
000000010 = 0x2

窗口大小:

用于流量控制,2个字节长,我们选择了一个随机值不大。
窗口大小=带宽(MBITS连接)x延迟(MS),
详细信息:goto

TCP校验和

校验和由TCP标头本身和伪标头组成。对于计算,所有必要的值以16位单词使用并加在一起。
如果该值不长16位,则将用零式。

伪头:

TCP伪标头用于将TCP段与IP标头关联。 TCP伪标头仅在校验和计算过程中仅在TCP段的开头中添加,并且不会作为TCP段的一部分发送。

为什么? TCP Pseudo标头的使用确保接收器的路由或碎片过程不会不当修改IP标头中的密钥字段。
简而言之,它确保TCP数据报(数据包)已达到正确的目的地。

计算:

pseudo =协议 +源地址(ip) +目标地址(ip) + TCP长度(包括数据零件)字节(不需要实际标头字段,必须计数)

TCP校验和 TCP header = Source Port + Destination Port + Sequence Number + Acknowledgement Number + (Data Offset | Reserved | Flags ) + Window Size + Checksum (set to 0x0000 in calculation) + Urgent Pointer

*如果TCP标头的值更大,则为0xffff,则会有一个携带,0x12345 - 0x2345 +0x0001 = 0x2346,这是如何补偿结转的方法。

总计将为0xfff - 0x2346 =
TCP标头= TCP标头 +结转(如果有)。

total charchsum =0xfffâ(pseudo + tcp标头),否(0xffff)

紧急指针:

如果设置了URG标志,则紧急指针指向按下紧急数据的字节的序列编号,
顾名思义,它将指出紧急数据/优先级,必须紧急处理。

让我们在填充值之后查看最终数据包:

TCP/IP Packet

填充值后,您必须更新几个值的总长度和要使用的协议。

IP标题中的一些更新:

总长度:(IP)
数据包中的32位单词的字节总数。这里的32个位单词(行)的数量,上方= 10行,每行为4个字节。
10 x 4 = 40字节= 0x0028。 (将小数40转换为十六进制)

协议:
TCP

的协议= 06

现在,启动Wireshark,并过滤源IP-> ip.addr =。

运行脚本:

下载脚本[GOTO]
python3 tcp_ip.py -h

tcp/ip工艺:github @4yub1k
参数:

  • -H, - 螺旋显示此帮助消息和退出
  • -s,-srcip源IP地址。
  • -sp,-srcport源端口。
  • -d, - DSTIP目标IP地址。
  • -dp,-dstport目标端口。
  • -t, - 时间等待响应。(默认= 5秒)

示例:
python3 tcp_ip.py -s=192.168.0.16 -sp=12333 -d=192.168.0.1 -dp=80 -t=2

更改值并运行脚本。

Wireshark:

Wireshark

发送的数据包:

IP:

IP Bytes

TCP:

TCP Bytes

收到的数据包:

Packet Received

脚本的输出:

IP Checksum

TCP Checksum

Final Output

它使用Wireshark并使用脚本研究数据包。

是的,您可以欺骗MAC地址和IP。响应将发送到使用的源Mac/IP。有关更多信息,请尝试一下ð。

要更改MAC地址,只需在数据包之前添加它们即可。就是这样。

  • 目的地:62:3A:3A:35:6C:49:0A(62:3A:3A:35:6C:49:0A)
  • 来源:VMware_f4:E7:AC(00:0C:29:F4:E7:AC)
  • 类型:IPv4(0x0800)

MAC/IP Spoof

注释(快速修订):

TCP标头是十六进制字符串。
TCP字节是十六进制字符串的字节。

这就是我们可以发送这些字节(16位单词)的方式。
(|)是串联。

Packet = (Version | IHL | Type Of Service) + Total Length + Identification + (Flags | Fragment Offset) + (Time To Live | Protocol) + Header Checksum(IP) + Source Address+ Destination Address + Source Port + Destination Port + Sequence Number + Acknowledgement Number + (Data Offset | Flags) + Window Size + Checksum(TCP) + Urgent Pointer.

Packet = 4500 + 0028 + abcd + 0000 + 4006 + d7ab + c0a8 + f285 + 8efa + b52e + 3030 + 0050 + 0000 + 0000 + 0000 + 0000 + 5002 + 7110 + 16fb + 0000

字节中的最终数据包:

Packet = b'\x45\x00\x00\x28\xab\xcd\x00\x00\x40\x06\xd7\xab\xc0\xa8\xf2\x85\x8e\xfa\xb5\x2e\x30\x30\x00\x50\00\x00\x00\x00\x00\x00\x00\x00\x50\x02\x71\x10\x16\xfb\x00\x00'

e-g它们是\ x(1个字节)\ x(1个字节) …您必须完全像这样发送它们。 \ x45 = 1个字节= 8位。 (这里4 = 4位,5 = 4位)。因此,45 = 4+4 = 8位。

希望您了解一切。 ðð