当前位置: 首页 > 科技观察

没有中间人就不可能劫持TCP吗?

时间:2023-03-17 16:45:16 科技观察

TCP的初始序号大家好,我是罗伯特。上次说过,我经过一番努力考上了linux帝国的公务员,分配到网络部协议栈建设的传输层工作。第一天上班,主管让我处理一个新的TCP连接来练习。虽然我对理论很熟悉,但是我没有实际动手处理过TCP数据包,所以还是有点紧张。收到请求连接的数据包后,我准备了一个响应包,同时点亮SYN标志和ACK标志后,接下来就是难点了。我知道确认号ACK是对方的序号+1,但是我回复的序号是多少?我闭上眼睛在脑海里飞快地搜索RFC,很快想起RFC793有话说,初始序列号ISN是一个计数器,每4ms递增1。我急忙向一旁的瑟夫求助,“瑟夫,你好,初始序列号计数器在哪?”瑟夫指了指墙上一个钟形的东西,“这里,就是,这是一个全球统一的柜台,大家Shared。”我填好序列号一栏,正要发送,瑟夫拦住我,“等等,你打算用这个计数器作为初始序列号,直接发送?”“这有什么不妥吗?RFC793就是你说的。”“这是旧版本,现在不是这样的!直接拿这个当序列号很危险。”你不知道的ISN有点尴尬,然后Cerf给我介绍了前因后果。”原来Bitverse的其他帝国都是直接按照RFC793设计ISN的。随后,攻击者冒充客户端向服务器发送数据包,劫持他人正常的TCP连接。窃取机密数据!你猜他是怎么做到的?”这并没有打扰我,我脱口而出:“这家伙一定是中途监听了网络通讯,拿到了他们通讯的序号和确认号,然后就可以伪造一方来”瑟夫摇摇头,“不,这家伙不是中间人,他没有监听通讯。知道序列号不知道序列号怎么能冒充呢?”听到我的问题,瑟夫会心一笑,“这家伙太聪明了。在冒充之前,他与服务器建立了连接并获得了服务器的初始序列号。因为这个序列号每4ms加1,所以后面计算出来,后面建立连接的时候你就可以计算出服务器新的ISN是多少了。”我恍然大悟,“这家伙真是个鸡贼,所以看来这个ISN不能这么简单的设置。”“所以,我就阻止你了,现在RFC又出了一个1948号的新文件,规定ISN应该这样计算:”ISN=M+F(localhost,localport,remotehost,remoteport)“M是刚才看的counter,在此基础上加一个F,对通信双方的IP和端口,即四元组信息进行操作,给counter加一个值,增加不可预测性国际标准号。“我点了点头,”这个F一般用什么算法?会犯错误的。”瑟夫拍了拍我的肩膀,语重心长地说:“你还是要继续学习,考上帝国文官只是第一步。”“不只是他要学习,你也必须学习。你不知道ISN有新规定吗?”回头一看,原来是主管走了过来。“主任,新规定是什么?”瑟夫问道。当前的ISN是这样计算的:"ISN=M+F(localip,localport,remoteip,remoteport,secretkey)"还有一个secretkey!",我一下子发现了不同。"没错!如果双方连续两次使用同一个端口通信,四元组是固定的,那么F函数计数的结果也是固定的,这样随机性就大大降低了。所以再加一个secretkey,让ISN更难预测。”“是不是万无一失?不再害怕被劫持了?”,我问道。主管顿了顿说:“除非是网络公司其他单位被中介劫持,否则应该没有别的办法。”不愧是主管,他知道的比我们多。延迟了很久,我的连接还没有得到应答,于是我赶紧按照新的算法计算出ISN。把对方还给从前。第一次练习联系教会了我很多。没想到一个简单的ISN竟然有这么多细节。神秘的柜台时间到了下午,瑟夫带着我在大楼里转了一圈,熟悉一下环境。不多时,我们来到了一个放着一堆柜台的房间,上面的信号灯还在忽明忽暗地闪烁着。“这是什么柜台,怎么这么多!”,我在一旁问瑟夫。“这些是记录我们网络部门工作数据的重要显示器,不仅在我们的传输层,在下面一楼的网络层,都有一个房间,存放着他们的计数器。我们每次开机,如何我们发了多少包,收到了多少包,错误收到了多少信息,收到了多少重复包等等,都记录在这里,以后正式上班,一定要经常来这里。”我环顾四周,每个计数器都被标记为:SyncookiesSentSyncookiesRecvSyncookiesFailedEmbryonicRstsPruneCalledRcvPrunedOfoPruned·······DelayedACKsDelayedACKLockedDelayedACKLostListenOverflowsListenDropsTCPPrequeued正在看,突然发现有很多同名的计数器,仔细看不是同名的,而是分了8个partition在这里,每个分区的计数器都是一样的。“瑟夫,为什么这里有8个相同的计数器?”“那是因为我们处理的CPU是8核的。为了防止多线程竞争,加锁也来不及了,所以拿到了8份。在最终统计数据中将它们放在一起就足够了。”离开柜台后,Cerf带我参观了存放连接请求队列的仓库,然后教我如何使用几个TCP定时器。这一天真是收获满满。明天就要正式开工了,不知道会是怎样的一天~未完待续...彩蛋“醒醒,上风给我们发任务,让我们配合他劫持TCP连接”“我们没有内核权限怎么劫持TCP连接?”“信里没说,就是让我们报一个柜台的价值”“什么柜台?”预告接下来会发生什么,敬请关注后续花絮……