2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

浅析 TCP 握手欺骗

  • 2015-12-10
  • 本文字数:1230 字

    阅读完需:约 4 分钟

通常来说,TCP 握手就表示通讯双方互相验证了 IP 地址。事实却并非如此,TCP 握手欺骗是一种新型的攻击方式。

假设 A 是客户端,正在连接 B:

A: Hi B, I’m A, send number 5.
B: Hi A, I’m B, 5, send number 3.
A: Hi B, I’m A, 3, send number 6. I’d like example.net.
B: Hi A, I’m B, 6, send number 4. Here comes the data: …

在这之后,A 与 B 将会互发数据。同时为了保证所有数据都能被收到,即通信的可靠性,数字会不断增加。在 1981 年设计 TCP 协议时,安全性没有被优先考虑。ARPANET 给出了一个列表,他们需要一个协议来发送数据,并且不用担心数据重传错误、校验数据完整性、保持数据包序列等等,TCP 解决了这些问题。这些数字被称为序列号(Seq)和确认号(Ack),它们会引发两个问题:

  • 字段不够大(32 位)
  • 由于他们承担了双重责任,为了不破坏连接不正确的数字必须被丢弃。换句话说,你可以发送不正确的 Ack,但只要后续的数据包拥有正确的 Ack 将会被正常接收。

我们来演示一下利用者两个缺陷进行攻击,A 发送数据给 B:

A: Hi B, I’m C, send number 5.
B: Hi C, I’m B, 5, send number 3.
A: Hi B, I’m C, 1, send number 6. I’d like example.net.
B: Hi C, I’m B, that’s incorrect. Close the connection please.
A: Hi B, I’m C, 2, send number 6. I’d like example.net.
B: Hi C, I’m B, that’s incorrect. Close the connection please.
A: Hi B, I’m C, 3, send number 6. I’d like example.net.
B: Hi C, I’m B, 6, send number 4. Here comes the data: …

上面的情形中 B 根本无从知道自己在响应一个伪装的 IP 地址,真正的 C 也根本不知道发生了什么。平均需要花费 120GB 网络流量就能创建一个欺骗连接,这取决于你的运气,不好的话可能需要 200GB,但运气好时只需要 72GB。许多拥有 1gbps 带宽的 VPS 非常便宜,如果你充分利用它,每次攻击平均只要 17 分钟左右。通常如果你想要注入一个有效载荷,例如发送一个命令,它需要被放在现有数据后面,这会增加攻击所需的流量。例如发送“GET / HTTP/1.0\n\n”平均需要 152GB 或者 20 分钟,但这会使得你的连接在对方的 access logs 显示为一个正常的连接。

由于 TCP 协议自身的原因,这种攻击很难解决。虽然可以拒绝大量的不正确的 Ack,并可以以此为理由关闭连接,即便如此,还是会留下巨大的利用空间。如果要互相认证对方,那就需要额外的安全条件,例如使用 TSL。即使证书没有被认证过,由于客户端需要接收额外的数据,任何加密的 TSL 会话都会认证,这样欺骗就无法进行。总之,不要使用基于 IP 地址的认证,不要相信 IP 地址白名单,当你需要安全性的时候使用安全协议认证。


感谢魏星对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。

2015-12-10 18:003503
用户头像

发布了 32 篇内容, 共 21.2 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

DICOM图像中灰度理解

Lazy

脑科学 脑科学软件工程 脑影像

音视频同步!RTCP协议解析及代码实现

明儿

c++ 音视频 协议 Wireshark 流媒体

浪潮云“1231”业务战略正式发布 “分布式云+”行动计划首次亮相

云计算

【得物技术】浅谈本地缓存与分布式缓存

得物技术

缓存 测试 质量 本地缓存 分布式缓存

记一次java读取matlab数据方式

Lazy

Java 后端 matlab 脑科学软件工程

研发知识:MDD、MDF是什么?

paraboy1

c++的并发操作(多线程)

赖猫

c++ Linux 多线程 服务端 并发

谈谈企业的成本

石云升

创业 职场经验 5月日更

C++ & Linux 后端:进BAT的学习路线

赖猫

c++ Linux 后端 服务器端开发

Flutter Tab

Geek_7e907c

Java岗面试攻略分享,阿里的offer真的不难拿

Java架构师迁哥

在FL Studio中如何混音你的鼓组采样与旋律采样

奈奈的杂社

经验分享 知识分享

数据线索梳理

顿晓

数据 5月日更

Webrtc 屏幕共享

融云 RongCloud

Docker网络学习第五篇-基础网络模式

Lazy

Docker

阿里技术官最新总结12W字JAVA面试宝典,吊打面试官的硬核法宝!

Java架构之路

Java 程序员 架构 面试 编程语言

飞书悄然开辟新战线,协同办公之外另有新动作?

ToB行业头条

飞书 协同办公

中国信创生态系列报道|融云CEO韩迎:坚持双轮驱动,信创未来大有可为

融云 RongCloud

如何设计高效的HBase数据模型

Jowin

HBase

低代码行业涌出大量玩家,企业该如何做出选择?

优秀

低代码

为什么突然谁都能造车了?

白洞计划

看完了蚂蚁金服年薪180万的大佬扔给我的“Java成长笔记”,差距不止一点点

Java 程序员 架构 面试 计算机

5G Capital一年,“首都标准”初现

脑极体

Flutter

Geek_7e907c

阿里内网流传的9w字图解网络(全彩版)GitHub现已下载量过百万

Java架构之路

Java 程序员 架构 面试 编程语言

这份Github下载量高达76.9W次的《Java系列面试宝典》,足以吊打各个大厂面试官!

Java架构之路

Java 程序员 架构 面试 编程语言

从一线城市回到三四线城市的第一个月

布衣骇客

生活,随想 个人总结

cornerstone 基础概念篇(二)

Lazy

大前端 脑科学 脑科学软件工程 脑影像

开源十问, 社区新人快速上手指南

DT极客

容器Pod语系修改

ilinux

打字员为什么要去看商业模式

ES_her0

5月日更

浅析TCP握手欺骗_安全_百占辉_InfoQ精选文章