完了!TCP出了大事!
发布日期:2021-05-19 22:59:19 浏览次数:24 分类:精选文章

本文共 2693 字,大约阅读时间需要 8 分钟。

DelayedACKLost与TCP劫持的秘密任务

在Linux帝国的网络协议栈大厦里,夜色如墨,乌云低垂。一高一矮两个不速之客,身着黑衣,潜入了这片神秘的网络领域。他们的任务是配合上峰完成一项看似不可能的任务——TCP连接劫持。

“上峰让我们配合他们完成TCP连接的劫持”,高个子一边说一边摸了摸自己的黑衣。矮个子却一脸懵,“我们就是个普通程序,没有内核权限,怎么能修改网络连接啊,这不是强人所难吗?”高个子也对这事一知半解,但信上只约定了让他们到时候告诉上峰一个计数器的值,其他就不用管了。

两人决定先试试看。他们偷偷执行了上峰的指令,运行了cat /proc/net/netstat命令。眼前的一片密密麻麻的输出让他们愣住了,终于在这海量的数据中,他们找到了自己要的DelayedACKLost计数器。

“这是什么?”,矮个子指着屏幕问道。高个子解释道,“这是Linux网络协议栈中记录网络连接状态的重要信息。DelayedACKLost表示因为延迟确认而丢失的数据包数量。”

“这些信息居然是公开的,谁都可以看?”,矮个子有些惊讶。高个子笑了笑,“只能看,却改不了。怕什么?快找吧,找到DelayedACKLost再说。”

两人一边对着屏幕认真查看,一边讨论着这个神秘的计数器。最终,他们在这片数据中找到了答案。

第二天晚上,消息再次从上峰传来:“立即汇报DelayedACKLost的值。”两人再次执行了那条命令,拿到了计数器的值,按时上报给了上峰。

然而,上峰的询问从未停止。每次他们发完消息上峰就又来一条:“DelayedACKLost有无增加?”这条消息让两人头疼不已。经过几十次来回询问,上峰终于不再打扰他们。

然而,故事的主角并未因此放松。另一场惊天动地的事件正在上演。Robert是一名新来的网络工程师,他意外发现了一条异常的TCP连接。连接的数据包序列号不按理出牌,时大时小,甚至还有一次直接跳到了很大的数值。

Robert的困惑很快传到了Cerf的耳朵里。Cerf和Robert一起仔细分析了这条连接的通信记录。他们发现,这条连接上的数据包发送了很多次,但因为序列号不对,所有的数据包都被丢掉了。

“这不是普通的错误啊!”,Cerf皱着眉头说到。Robert点点头,“收到的包序列号有时候太小,有时候又太大,甚至还有一次直接跳到了很大的数值。”

Cerf和Robert开始了深入的分析。他们发现,这条连接上的数据包发送是按照某种特定的规律在进行的。最令人费解的是,这条连接居然在猜测序列号。更诡异的是,这个猜测策略看起来像是使用了二分法。

“二分法?需要知道猜大还是猜小才能知道下一步该猜什么。”Robert推了推眼镜,试图想象对方是如何得知猜大还是猜小的。

Cerf和Robert一边分析一边讨论,最终他们意识到,这条连接很可能已经被人劫持了。劫持方可能是在试图通过猜测序列号来建立连接,但由于不知道正确的序列号,反而暴露了自己的行为。

“这条连接一定有古怪,多半是被人劫持了。劫持方因为不知道序列号,所以一直在尝试猜测序列号。”Cerf说到。

Robert点点头,“你这么一说,确实是,而且你看,他不是瞎猜,好像是用二分法在猜!序列号是个32位的整数,二分法猜测,只需要32次就能猜出来。”

“二分法?要用二分法的前提他得知道他是猜大了还是猜小了,得不到这个反馈,他就只能瞎猜了。他是如何得知猜大还是猜小的呢?”两人一边说着,一边试图想象对方的猜测方式。

经过仔细分析,他们终于找到了答案。劫持方通过观察DelayedACKLost计数器的变化来判断自己的猜测是否正确。每当劫持方的猜测比实际序列号小时,DelayedACKLost计数器就会增加,从而告诉劫持方他猜小了;反之,如果猜大了,也会通过计数器的变化得到反馈。

“这计数器在我们这里,网络上其他人怎么可能知道。”Robert摇了摇头。

“不对,虽然这个计数器大家都在用,不过这里这个计数器很特别,发生的概率很小,一般不会走到这里来,网络哪那么容易出问题嘛。”

安全部长听完这个故事后,高度重视,要求全面排查网络部TCP小组相关的代码。经过仔细检查,他们在TCP数据包处理的流程中发现了问题。

“这里这个before判断是什么意思?”主管问道。Cerf解释道,“这是在判断收到的数据包的序列号是不是比期望的序列号小。如果小,就说明网络有重传,就要关闭延迟回复ACK的机制,立即回复ACK。”

“延迟回复ACK?”主管有些不明白。Cerf继续解释:“哦,主管,这是我们TCP小组的一个优化,TCP传输需要确认,但如果每一次交互数据都发送ACK就太浪费了,所以我们做了一个优化,等到多次或者有数据发送的时候,一并把回复的ACK带上,就不用了每次发送ACK报文,我们把这个叫Delayed ACK,也就是延迟确认。”

“那下面这个tcp_enter_quickack_mode是不是就是关闭这个机制,进入快速ACK回复模式?”主管问到。Cerf点点头:“没错没错!”

安全部长指着一行问到:“这里看着有些古怪,是在干嘛?”Robert回答道:“这个我知道,Cerf昨天教过我,这个是在进行统计。把这一次延迟ACK的丢失计入对应的全局计数器中。”

经验老道的安全部长此刻意识到了问题,“如此看来,收到的序列号比期望小的时候,这个计数器才会增加,如果大了就不会增加。各位试想一下,如果那个猜测的家伙能看到这个计数器有无增长,不就能知道是猜大了还是猜小了?”

Robert摇了摇头:“不会吧,这计数器在我们这里,网络上其他人怎么可能知道。再说了,这个计数器大家都在用,用这个判断,误差太大啦!”

主管也摇了摇头:“不对,虽然说是大家都在用,不过这里这个计数器很特别,发生的概率很小,一般不会走到这里来,网络哪那么容易出问题嘛。”

安全部长说到:“根据目前掌握的信息,之前就有其他部门反映帝国有奸细混了进来,不过他们一直藏在暗处,至今还没有揪出来。如若他们和外界勾结,作为眼线,观察这个计数器的变化,外面就能知道他的猜测是大是小。”

随后,安全部长来到了文件系统部门,调用了/proc/net/netstat的访问记录,根据记录很快定位到了隐藏在Linux帝国的两个细作,下令将他们逮捕。

高矮两位奸细如实交代了一切……

未完待续……


本文的攻击手法改编自看雪2018峰会,网络安全大牛钱志云分享的主题《TCP的厄运,网络协议侧信道分析及利用》

欢迎关注我的公众号“五分钟学算法”,如果喜欢,麻烦点一下“在看”~

上一篇:“kill -9”一时爽,秋后算账泪两行
下一篇:VS Code 变身小霸王游戏机!

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年05月06日 19时51分55秒