一些其他概念不严谨的补充

计算机网络微课堂笔记 5304 字 27 min read

DNS污染

DNS污染的原理是,攻击者在你查找电话号码(即请求DNS解析)的过程中,用假的电话协议(即篡改的IP地址)替换了真正的电话协议。这就导致当你拨打电话(访问网站)时,实际上连接的是一个错误的或恶意的地方。

以一个具体的例子来说,假设你想要访问一个网站,例如www.baidu.com。在正常情况下,你的计算机会发送一个DNS请求到DNS服务器,以找出这个域名对应的IP地址。然后,你的计算机将用这个IP地址来和网站建立连接。

但是,在DNS污染攻击中,当你的计算机向DNS服务器发送请求时,攻击者可能会干扰这个请求的响应,使DNS服务器返回一个错误的IP地址(这个地址可能指向一个攻击者控制的,看起来与真正银行网站相似的钓鱼网站)。因此,你的计算机会被引导到错误的网站,而你可能会在不知情的情况下,将你的用户名和密码输入到这个伪造的网站中。

预防DNS污染的策略主要包括使用DNSSEC(DNS安全扩展)以验证DNS响应的真实性,或使用VPN来创建一个安全的网络连接。

TCP重置攻击

TCP重置攻击(TCP Reset Attack)是一种网络攻击方式,攻击者通过发送伪造的TCP RST(Reset)报文来中断TCP连接。在TCP协议中,RST报文是用来中断一个已经建立的连接的。

在TCP协议中,每个TCP报文都有一个序列号,这个序列号用于保证数据的有序传输和对失序、丢失数据的重传。在TCP连接中,如果接收到一个RST报文,且这个报文的序列号在当前的有效窗口内,那么TCP连接就会被立即中断。

TCP重置攻击的原理是,攻击者首先要监听或预测出TCP连接的序列号,然后伪造一个RST报文,把序列号设置在有效窗口内,然后发送给通信的一方或双方。由于接收方收到了序列号有效的RST报文,所以会立即中断连接,导致通信失败。

举个例子,假设Alice和Bob正在进行TCP连接通信,攻击者Evil想要中断他们的通信。首先,Evil需要知道Alice和Bob通信的TCP序列号,这可能通过嗅探网络流量或者预测序列号获得。然后,Evil伪造一个RST报文,把序列号设置在Alice和Bob通信的有效窗口内,然后发送给Alice或Bob。当Alice或Bob收到这个RST报文,就会认为对方要求中断连接,从而立即中断TCP连接。

ss

假如搭建了一个ss的服务端代理 服务端口8388
同时本机运行了一个ss的客户端代理 监听的本地端口1080
同时 我们的浏览器设置了一个代理端口 也就是说 我们浏览器的访问请求会先走这个代理的端口
就相当于我们在浏览器里面发送一个访问谷歌请求的时候 这个请求就会转交到我们的1080端口
客户端拿到这么一个请求 他会对这个请求进行加密 把里面的内容加密
加密之后 我们是看不到数据包里面的内容

然后他会从这个应用层来到这个传输层
传输层会干什么 添加端口对不对
那么他会从源端口是监听1080 目标端口就是我们在这个ss客户端里面配置好的那个需要连接的那个服务器 
也就是8388 然后构建这么一个数据包 那么这个数据包来到网络层

网络层的话是添加ss服务器ip地址 注意 ss服务器ip一般都是国际互联网的ip
那么这个数据包就会来到防火墙这边 防火墙拆给你的数据包一看 这个6.6.6.6 没有在我的黑名单里面
然后再拆开数据这里一看 由于被加密了
所以说他就会放行通过来到这里之后 跳跳跳将会路由到这台服务器
这服务器拿到数据后进行解密之后 他就会获得原始的请求
也就是说 我们要访问google的这个请求 那么他得到这个请求之后
你小子想要访问谷歌对不对 那么我就帮你去访问
于是我他代替你去访问谷歌 他会从谷歌这里得到一份响应 首页的数据
这是谷歌返回给ss代理的响应
收到数据之后 同样的也会对数据进行加密
那么加密之后的这个数据会重新构造一个数据包从他的8388端口发往你的1080端口 源地址和目标地址 换一下 他会回应这么一个数据报

来到防火墙这一看这个6.6.6.6这个ip地址不在我的黑名单列表 同时这个数据包的内容由于加密了
于是乎他就放行通过来到你的电脑同样的一层一层解开
最后你的ss客户端得到这么一个数据包 你拿到这个加密的数据包 也可以进行解密 解密之后将会获得
首页的内容 你的SS客户端得到这个数据之后 将会
把它返回给浏览器 那么浏览器拿到这个数据之后 
它就可以愉快的访问内容了

但是防火墙除了这种被动的接受这个加密数据之外 他还可以发起主动探测
也就是防火墙主动往你这里面发送请求
如果说你所用的这个ss协议存在漏洞
那么他可以通过一些探测手段来检查你这个服务器是不是运行了ss的服务

中间人攻击

在中间人攻击中,攻击者位于通信的两个端点之间,会将自己伪装成这两个通信端点的另一方,收到一方的信息后,修改信息然后发送给另一方,或者完全控制通信信息。这样,通信两方可能会认为他们正在和预期的通信方进行通信,但实际上所有的信息都被攻击者截取和控制了。

中间人攻击可以在许多场景中发生,例如公共WiFi网络、电子邮件通信、网络银行等。而防止中间人攻击的主要手段之一就是加密,如使用HTTPS协议进行通信,或者使用VPN等其他加密通道。虽然加密无法阻止中间人拦截通信,但是由于他们无法解密通信内容,因此除非他们能获取到解密的密钥,否则他们无法理解也无法修改通信内容。

ss缺陷

密码学安全:ss支持各种加密方法,从最初的AES-256-CFB到现在的更为现代的AEAD密码,例如ChaCha20-Poly1305或AES-128-GCM。然而,这依赖于用户选用比较安全的加密算法并使用足够复杂的密码来保证加密的强度。如果用户选择了较弱的加密算法,或者使用了简单的密码,那么他们的通信内容可能被破解。

时间戳泄漏:ss在OTA(One-Time Authentication)模式中使用时间戳来作为一个部分的key。固不能清楚地泄露通信内容,但可能泄露一些信息,例如通过观察时间戳的变化,攻击者可能能猜测出通信的模式或行为。

对重放攻击的防护不完全:尽管ss在设计时考虑了防重放攻击,并在后来加入了OTA来进一步加强防护,但有研究指出,在某些特定情况下,ss仍可能受到重放攻击。这需要用户在使用时做好其它安全措施,例如使用最新版本的软件,及时更新和打补丁。

流量特征识别:虽然ss采用了流加密和混淆技术来尽可能减少流量特征,使得内容被审查的可能性降低,但目前的深度包检查(DPI)技术和机器学习技术在某些场景下仍有可能识别出ss的流量特征。

流量特征识别(Traffic Pattern Recognition)是网络安全和网络管理领域的一个重要研究课题。在这一领域中,研究者试图通过分析网络流量的各种属性和行为,来识别或预测这些流量的源、目的、协议等信息。这也被广泛应用在流量分类、应用识别、恶意流量检测等多个方面。

流量特征识别主要关注以下几个方面的信息:

  1. 数据包的大小和时间间隔:这可以帮助分析者了解网络连接的一些基本特性,例如其传输速率、周期性行为等。

  2. 传输层协议和端口:例如TCP、UDP和它们使用的端口号,这些信息可以帮助分析者推测数据流可能的应用类型。

  3. 数据包头部中的特定字段值:例如TCP的标志位、IP的TTL值、窗口大小等,这些信息可以反映网络连接的状态和行为。

  4. 链路层和网络层的信息:例如MAC地址、IP地址等,这些信息可以暴露网络连接的实际位置和路由路径。

  5. 数据流的统计信息:例如数据包的平均大小、方差、峰度、偏度等统计量,这些信息可以帮助分析者理解网络流量的整体特性。

这些信息通常会被收集并处理成特征向量,然后输入到一些机器学习模型(例如SVM、决策树、深度学习等)进行训练和预测。这样可以自动化地识别出各种特定的流量类型或行为模式。

  • Deep Packet Inspection (DPI) for *** Encrypted Traffic with Deep Learning Models

  • Automated Identification of *** Traffic with machine learning techniques

https

因为http是明文的数据 所以还是存在被防火墙探测的风险 想要将http流量进行加密的话又需要引入tls 让它成为https流量

HTTPS使用的是一种叫做“混合加密”系统的方法,它结合了对称加密和非对称加密的优势。具体来说:

  1. 非对称加密: 在握手阶段,服务器会给客户端提供它的公钥,并且可能会请求客户端的公钥。客户端选择一个会话密钥,然后使用服务器的公钥对其进行加密,并发送给服务器。服务器使用它的私钥解密会话密钥。

    这种加密方式主要用于在网络上安全地发送会话密钥,因为只有服务器才能解密通过其公钥加密的密钥。然而,非对称加密在计算上相当昂贵,因此不适合用于所有数据传输。

  2. 对称加密: 一旦服务器和客户端都有了会话密钥,他们就可以使用对称加密来加密和解密数据。对称加密要比非对称加密快得多,而且对资源的要求也更低,这使其成为加密大量数据的理想选择。

设想你是一个发信人,你要给朋友(接收人)寄一个需要保密的信件。因此,你在把信寄出去之前,选择把它放在一个有锁的箱子中,然后用一把钥匙把箱子锁起来。这个箱子就相当于HTTPS的加密数据,而那把钥匙就相当于是你的公钥。

连接请求:你(客户端/浏览器)首先向你的朋友(服务器)发送一个连接请求,就像你告诉朋友你打算寄给他一封信。

服务器响应与公钥分享:你的朋友(服务器)向你提供了一个公钥,就像他给你一把打开他的箱子的钥匙。

创建会话密钥:然后,你使用这把钥匙(公钥)来创建一个独特的会话密钥,这相当于你把锁上的箱子放在另一个箱子里,然后使用你自己的锁将其锁起来。然后,你将这个箱子(包含公钥加密后的会话密钥)寄给你的朋友。

解密会话密钥:你的朋友收到你的信件(加密的箱子),使用他的另一把钥匙(私钥)打开外面的箱子,得到里面的会话密钥。

数据交换:你和你的朋友都有了相同的会话密钥,你们可以用这个密钥来加密和解密信息。你把你的信(数据)放在箱子里,用这个会话密钥锁起来,然后寄给你的朋友。你的朋友收到后,用同样的会话密钥打开箱子,读取你的信。反之亦然。

连接结束:当你们的对话结束,你们会丢掉这个会话密钥,如果下次还要交谈,就重新生成一个新的会话密钥。

首先 当一个网站需要开启https访问的时候 他就必须要先有一个网站的证书
网站的证书的话又需要交到CA机构那里去申请 但是在申请证书之前我们又需要有一对公私钥
这对公私钥 就是我们在进行tls加密的时候必须要用到的
所以说我们又先要来了解一下这对公私钥
这对公私钥的作用主要就是用来进行非对称加密的

假设我现在对 网站证书 这几个字进行加密
我加密的时候 如果使用的是私钥对它进行加密的话
加面之后的内容完全看不见 我要解密的话 必须使用公钥去给它解密
它才能解密成原来的数据内容 你如果还是使用私钥去给它解密的话 它是解不出来的
这就是非对称加密算法的一种特性 反过来 如果我用公钥对这一串数据进行加密的话
我要解的话 也必须用私钥对他进行解密才能解读出来 你如果用公钥去给他解密的话
你是解不出来的 这就是非对称加密算法

有了这个基本概念之后 我们就可以来探索一下我们申请证书的一个流程
首先申请证书的话 我们需要到这个CA机构这里去申请
首先的话 我们的这个服务器生成了这么一个请求
我要申请证书 我要给这个baidu.com的域名申请证书 然后我的公钥是123
这就是申请证书里面必须要包含的内容 你发到这个是A机构这里去
所以这个拿到你这个申请表一看 你申请一个证书
他说好 但是你要证明这个域名是你的
我才能给你下发证书 证明的方式有很多种 假设 他说 在你的网站目录下放个文件 等一下 我过来看一下
如果你确实能把这个文件放在你这个网站的话
那说明你确实能控制这个域名 也就是说 这个域名确实是你的
然后我才能给你颁发证书

给了你一个证书 证书拿好 里面包含了是哪个机构给你颁发的
这个是A机构 颁发给这个域名的 然后他有一个有效期
同时也有你的公钥 这就是你申请的这个网站证书里面的一些基本信息
有了这个证书之后 我们才能建立https的连接

ok 现在我们这个网站证书也有了 网站也已经搭建了
现在又要开始进行https的访问了 在http阶段 我们生成了这么一个数据包
然后由于我们开起来https然后他就会把这个数据往tls里面扔
刚扔进来之后 他不会立刻对数据进行加密 因为我们现在根本就不知道加密的密钥
所以说tls我们要先进行握手连接
也就是要先跟这个网站建立一个tls的连接 首先的话 tls是跟这个网站说我要用https访问你
然后我这边的话也开起来https的访问 这台服务器的话就会同意这个连接请求
给他回一个 那你连接连呗 同时的话会把他的这个网站证书发送给你
这是我的证书 你看一下行不行
这个时候 你拿到这个证书 你就会对他进行一些验证 比如说 他是颁发给谷歌的
然后你比对一下我确实是访问谷歌 这里对上了 然后他的颁发机构是a的话
我的电脑里面有一个授信任的根证书颁发机构 里面有a 也就是说我信任
这个机构颁发的证书 同时它的有效期是多少 现在的话还没过期 也就是说条件都满足了
这个证书就是有效的 我就可以和他进行连接
如果说有其中一个条件不满足的话 浏览器就会报警
提示我们连接不安全 所以连接不安全的情况下有非常多的可能

我们这边收到服务器给我们的证书之后 发现证书是有效的
于是乎 我们就可以用它的这个公钥对我们的数据内容进行加密

这里要申明一下 我们的tls并不是直接使用公钥来对这一串数据内容进行加密的
他们之间的握手最终会协商出一个对称加密算法的密钥
来对我们的数据进行加密 因为对称加密算法的效率很高
如果所有的数据都用非对称加密上法进行加密的话
那效率是非常低的 他的具体的握手协商流程的话 如果你感兴趣的话 可以自行去搜索
我们这里的话仅仅是简单的讲解一下它的执行流程
为了能够让大家简单的理解 我们这里就不那么严谨了

这个经过加密后的数据的话就会从我们的电脑发送到网络上面去
防火墙这边拿的数据一看这边是经过了加密的 所以它是看不到里面的内容 也修改不了里面的数据
如果他想强行的对这一串数据进行中间人攻击 进行拦截或者篡改的话 网站的证书的话就会不匹配
所以我们的浏览器就会报警 如果你在浏览器看到了警告的信息的话
建议检查一下是否存在中间人攻击的这么一种情况

有的朋友可能会有这样的疑问 为什么不把我们的网址也进行加密 不加密的原因是可能这个服务器它不只运行了一个网站
除了谷歌之外 他可能youtube也在这个服务器上面 但是他只有一个ip
我们如果把这一串也进行加密了的话 他把这个数据发到这个服务器上面去
那服务器就不知道用哪个证书的私钥去进行解密 因为每个网站它都有自己的证书
而每个证书所用的公钥和私钥它是不一样的
所以说这一串的话必须是明文的 他有一个名称叫做sni

这个后面的话我们也会经常用到 当然 我这里说的是tls1.2的情况
1.3的话 他可以对这个sni进行加密 也就是esni 在传输的过程中 这个网址他也可以给你进行加密
也就他只露出了一个ip地址 但是这个的话目前还没有普及
而且据说防火墙会直接丢弃esni加密后的这个数据包流量
因为他看不到网址 他不知道你访问的是哪个网站