解剖TCP/IP数据包。详细的数据包中的内容。
github:Salah Ud Din — 4yub1k
阅读了大量文章,博客和测试。我写了这篇文章的目的,易于理解。我希望你能喜欢它。
确保在开始之前阅读此介绍性文章。 [READ]
本文和脚本纯粹是出于教育目的。忽略错误。
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:
- 源端口: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标志,则紧急指针指向按下紧急数据的字节的序列编号,
顾名思义,它将指出紧急数据/优先级,必须紧急处理。
让我们在填充值之后查看最终数据包:
填充值后,您必须更新几个值的总长度和要使用的协议。
IP标题中的一些更新:
总长度:(IP)
数据包中的32位单词的字节总数。这里的32个位单词(行)的数量,上方= 10行,每行为4个字节。
10 x 4 = 40字节= 0x0028。 (将小数40转换为十六进制)
协议:
TCP
现在,启动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:
发送的数据包:
IP:
TCP:
收到的数据包:
脚本的输出:
它使用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)
注释(快速修订):
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位。
希望您了解一切。 ðð