Skip to content

Latest commit

 

History

History
85 lines (57 loc) · 1.8 KB

tcp_handshake.md

File metadata and controls

85 lines (57 loc) · 1.8 KB
date author title url tags series categories toc draft
2022-04-03 18:57:43 +0800
Rustle Karl
用 Scapy 实现 TCP 握手协议
posts/protocols/docs/net/ip/tcp_handshake
Protocols
README
Protocols 学习笔记
学习笔记
true
false

前言

Windows 上无法模拟,Windows 内核会在服务器回送 SYN_ACK 时,发送一个 RST 重置包,导致连接不成功,这是不可避免的,本质上,Scapy 在用户空间中运行,Windows 内核将首先接收到 SYN-ACK。在用 scapy 做任何事情之前,Windows 内核将发送一个 TCP RST。

所以发送一方只能是 Linux。至少两台 Linux,不能发给自己。

TCP 接收方

启动一个基本的 TCP 服务器

nc -l -p 9090

监视连接情况

watch "netstat -an | grep 9090"
  • SYN_RECV 已经收到 SYN 包
  • ESTABLISHED 已经建立连接

端口占用

lsof -i:9090

netstat -tunlp | grep 9090

TCP 发送方

修改防火墙

Scapy 可以发送原始的 TCP SYN 包,但是 Linux 内核(包括 Window 内核)不允许其他程序直接发送原始 TCP 报文,在程序发完之后,内核会立即发送一个 RST 包取消/中断这个不正常的连接。

为了避免这种情况,必须手动修改 Linux 的防火墙规则。

iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP
iptables -L

启动 Scapy

scapy -H
dst = "192.168.0.106"

syn_packet = IP(dst=dst) / TCP(dport=5555, sport=9000, flags="S", seq=17)

syn_ack_packet = sr1(syn_packet)

ack_packet = IP(dst=dst) / TCP(
    dport=5555,
    sport=9000,
    flags="A",
    seq=18,
    ack=syn_ack_packet.seq + 1,
)

sr1(ack_packet)

挥手协议

类似。