我是一款网络监控软件,我开发的任务是监控所有进出网络的通信流量。我可以清楚地看到这个网络中每个人的在线内容。不可怕吗?我被一个公司老板买来运行在配置极高的Linux服务器上。这台服务器上的网卡很糟糕。公司所有进出的网络数据包都要经过它,它不断抓取数据包发给我分析。你也应该知道网络通信是有层次的,最常见的就是TCP/IP协议体系。拿到数据包之后,我就得按照这个协议规范,一层一层的去掉协议的壳,拿到他们的payload数据。对于TCP会话重组,我主要关注TCP协议,因为很多应用都是使用TCP进行传输,比如上网用HTTP,用SMTP发邮件,微信聊天等等。如果我想控制网络中的通讯,我要做的第一件事就是使用TCP。我得想办法把TCP传输的数据包重新组装成一个完整的会话,这样才能知道应用层传输的是什么,这一步称为会话重组。不过,这个TCP协议有点复杂。除了我们抓包的乱序情况,它还有三次握手、四次握手、超时重传、延迟回复等多种机制。当涉及到时间跨度很长的长连接时,这无疑让我很难重新组织TCP会话。而我重新组装TCP会话的唯一线索是数据包头中的序列号SEQ和确认号ACK。不过,我还是砸了RFC规范,克服了所有这些问题。能够成功的将TCP会话数据一一重组,成功率还是挺高的。应用协议识别到TCP会话重组,我可以拿到里面传输的数据。接下来要做的是识别在应用层传输的是什么应用程序?用我们的行话来说,就是识别应用协议。这时候就得看端口了。根据三次握手包的方向,我可以判断谁是client,谁是server。看服务器的端口号(这个可以在TCP头中看到),就知道是什么服务了。常见的有以下几种:22:SSH远程登录25:邮件服务53:域名解析服务80:HTTPweb服务3306:MySQL数据库服务3389:远程桌面连接服务最常见的是80端口的Web服务,人们每天上网时都会使用它们。有时Web服务不使用端口80,而是用其他端口替换它,但这并不困扰我。我可以分析一下TCP的负载数据的特点,看看有没有HTTP协议的特点,因为HTTP协议的特点太明显了!后来根据端口的经验出错的概率越来越大,所以我就统一根据内容来识别判断,??不再信任端口了。每个应用程序都有自己的协议特征。这个身份我下了功夫,不会轻易说出来。文件还原知道了应用层协议是什么之后,我就可以完全理解应用层协议传输的数据了。我们以最常见的Web服务为例。HTTP协议是一种基于请求-响应的协议。比如下面的通信:请求是GET包,请求的资源好像是JPG图片。再看响应包,状态码是200OK,好像没有问题。看Content-Type,image/jpeg,是一张JPG图片,没有运行。现在我可以定位到响应数据包的有效载荷段,它是HTTP标头,后面跟着两个回车符和换行符(0D0A)是数据。找到数据所在的位置,然后根据Content-Length的大小,提取数据写入PNG格式的文件,就大功告成了!妈的,哪个死小子又在看美女图!上面一个传输协议中文件的提取过程称为文件还原。除了HTTP协议,我还支持文件传输协议FTP,邮件传输协议SMTP,文件共享的SMB协议。我可以把你通过这些协议传输的文件还原出来,这不是很可怕吗?HTTPS解密有一天,发现80端口的数据包越来越少了。同时,443端口的通信数据未知。感觉更起来。后来才知道,为了不让像我这样的网络中间人窥探我的隐私,他们都使用了一种叫做HTTPS的技术。HTTPS对传输的数据进行了加密,这样我拿到之后就加密了,传输的是什么内容是无从知晓的。不过,这家公司的老板很聪明。他要求公司全体员工在电脑上安装一个“安全软件”。它被称为保护计算机免受入侵。其实就是中间人劫持了他们的电脑,并更换了HTTPS证书(不信可以看这篇:谁动了你的HTTPS流量?)。这个“安全软件”充当中介,告诉我HTTPS证书和密钥,我就可以解密HTTPS流量了!我仍然可以确切地知道你在网上做什么!你以为网络不通我只能在一旁听吗??图案!如果你去访问那些敏感网站,或者试图偷偷把老板托付给我这个重点看护人的数据,那我就不会看起来那么简单了,这时候我会启动屏蔽功能。为了不影响公司网络的运行,我一般都是旁路部署,这样哪天遇到BUG,立马撤掉。这个所谓的bypassdeployment,就是把抓到的包复制过来,而不是由我转发。但是,这也给我造成了一些阻塞网络通信的麻烦。如果我串联连接到网络,那就简单了。当遇到那些可疑的网络连接时,我只是丢弃数据包而不转发它们。但是现在我不是串联的,而是bypassdeployment,怎么办?聪明如我,怎么会被这个小问题难倒呢?我是TCP协议方面的专家。当我发现有可疑连接建立时,我会防患于未然!具体来说,TCP连接的建立需要三次握手:当我发现可疑的SYN包,在服务器回复第二次握手包之前,我就捂住耳朵,以迅雷不及掩耳之势偷铃,用服务器IP的名字伪造一个RST数据包给客户端,这样连接就被我砍掉了!虽然这一招不能保证100%成功,但是我离客户端比较近,我伪造的数据包一般比真正的服务器响应数据包早一步到达客户端,所以成功率还是蛮高的!哦,说曹操,曹操就到!发现可疑连接来了,不说了,我要忙了~本文转载自微信公众号“编程技术宇宙”,可以通过以下二维码关注。转载本文请联系编程技术宇宙公众号。
