加密一直都是保护用户通讯隐私的重要特性,早期的网络世界几乎所有的数据都是通过HTTP这个无状态的协议来进行明文传播的,这就导致一旦数据包被截获,那么其中的信息就会泄漏,对用户造成严重的安全威胁;当然这也有好处,那就是对于网络安全人员来说,所有的数据都是明文或是被自主加密,他们在分析攻击者的危险行为时就可以直接抓包进行数据包的分析,或是入侵检测系统也是通过数据包来进行入侵检测。但是网络世界并不是以安全人员为主角,而是以网络用户为主角,所以这个明文传输的问题就变成了一个安全隐患。
为了解决这一隐患,网景公司推出了SSL(Secure Sockets Layer)安全套接字协议层,SSL是基于HTTP之下TCP之上的一个协议层,是基于HTTP标准并对TCP传输数据时进行加密,所以HTTPS是HTTP+SSL的简称,虽然之后的SSL又发展为TLS(Transport Layer Security Protocol)传输层安全协议,但是其加密后的数据包依然称之为HTTPS,通过使用SSL对数据包的加密就可以解决明文传输中信息泄露的问题。国外部分研究机构的数据显示,已有至多60%的网络流量采用TLS,也就是HTTPS来进行安全传输,当然也包括一些恶意程序(虽然大约只有10%)。
可如果恶意程序在传播过程中也加密的话,对这样的流量做拦截分析就麻烦了很多,不能像HTTP一样直接来进行分析,但是安全人员又没法对所有加密的数据进行解密再分析,这样不仅会使用户感到不安,而且工作量过于庞大,因此如何来进行密文的恶意流量分析,也就是HTTPS数据包的恶意流量分析,一直是一个难题。
本篇文章我通过利用网络资源对SSL/TLS的学习,来谈一谈对别人在加密数据下恶意流分析方法的理解,以及自己对加密数据下恶意流分析的一些简单想法。
早期的网络世界中的所有数据都是通过http这种无状态的协议进行传播的,但是网络数据容易被别人抓取到,而http协议中的数据又都是明文的,所以一旦通信数据被截获,就意味着信息的泄漏,这是非常危险的,虽然说POST提交的数据是放在报体里看不到的,但是还是可以通过抓包工具窃取到。
在使用了HTTP+SSL的HTTPS之后,所有的数据包都是加密再传输的,SSL/TLS的握手过程如下:
服务器认证阶段:
在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。
访问以下HTTPS的网站,抓包来分析在SSL/TLS协议的加密下,数据包的内容,由于现在的SSL 3.0版本已经发展为为TLS 1.0,且TLS最新的已经是1.2版本,所以抓取的数据包中协议显示不再是SSL,而是TLS,但是原理要悉知。
上图是抓取的一组TLS握手过程数据包,包括say hello、验证身份、交换key、协商密钥等步骤,红色和蓝色框起来的是针对两个不同站点的两次握手过程。
现针对抓取的数据包,使用Wireshark进行详细分析。
1)Client Hello
握手第一步是客户端向服务端发送 Client Hello 消息,这个消息里包含了一个客户端生成的随机数 Random1、客户端支持的加密套件(Support Ciphers)和 SSL Version 等信息。通过 Wireshark 抓包,我们可以看到如下信息:
2)Server Hello
第二步是服务端向客户端发送 Server Hello 消息,这个消息会从 Client Hello 传过来的 Support Ciphers 里确定一份加密套件,这个套件决定了后续加密和生成摘要时具体使用哪些算法,另外还会生成一份随机数 Random2。注意,至此客户端和服务端都拥有了两个随机数(Random1+ Random2),这两个随机数会在后续生成对称密钥时用到。
3)Certificate
这一步是服务端将自己的证书下发给客户端,让客户端验证自己的身份,客户端验证通过后取出证书中的公钥。
4)Server Key Exchange
如果是DH算法,这里发送服务器使用的DH参数。
5)Server Hello Done
Server Hello Done 通知客户端 Server Hello 过程结束。
6)Certificate Verify
客户端收到服务端传来的证书后,先从 CA 验证该证书的合法性,验证通过后取出证书中的服务端公钥,再生成一个随机数 Random3,再用服务端公钥非对称加密 Random3 生成 PreMaster Key。
7)Client Key Exchange
上面客户端根据服务器传来的公钥生成了 PreMaster Key,Client Key Exchange 就是将这个 key 传给服务端,服务端再用自己的私钥解出这个 PreMaster Key 得到客户端生成的 Random3。至此,客户端和服务端都拥有 Random1 + Random2 + Random3,两边再根据同样的算法就可以生成一份秘钥,握手结束后的应用层数据都是使用这个秘钥进行对称加密。为什么要使用三个随机数呢?这是因为 SSL/TLS 握手过程的数据都是明文传输的,并且多个随机数种子来生成秘钥不容易被暴力破解出来。客户端将 PreMaster Key 传给服务端的过程如下图所示:
8)Change Cipher Spec(Client)
这一步是客户端通知服务端后面再发送的消息都会使用前面协商出来的秘钥加密了,是一条事件消息。
9)Encrypted Handshake Message(Client)
这一步对应的是 Client Finish 消息,客户端将前面的握手消息生成摘要再用协商好的秘钥加密,这是客户端发出的第一条加密消息。服务端接收后会用秘钥解密,能解出来说明前面协商出来的秘钥是一致的。
10)Change Cipher Spec(Server)
这一步同第8步作用一致,是服务端通知客户端后面再发送的消息都会使用加密,也是一条事件消息。
11)Encrypted Handshake Message(Server)
这一步对应的是 Server Finish 消息,服务端也会将握手过程的消息生成摘要再用秘钥加密,这是服务端发出的第一条加密消息。客户端接收后会用秘钥解密,能解出来说明协商的秘钥是一致的。
12)Application Data
到这里,双方已安全地协商出了同一份秘钥,所有的应用层数据都会用这个秘钥加密后再通过 TCP 进行可靠传输。
SSL:(Secure Socket Layer,安全套接字层),为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取。当前版本为3.0。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。
由于HTTPS的推出受到了很多人的欢迎,在SSL更新到3.0时,IETF对SSL3.0进行了标准化,并添加了少数机制(但是几乎和SSL3.0无差异),标准化后的IETF更名为TLS1.0(Transport Layer Security 安全传输层协议),是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本,可以理解为SSL 3.1,它是写入了 RFC 的。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面,因此可以说TLS就是SSL的新版本3.1。
TLS 协议包括两个协议组――TLS记录协议和TLS握手协议――每组具有很多不同格式的信息。
TLS记录协议是一种分层协议。每一层中的信息可能包含长度、描述和内容等字段。记录协议支持信息传输、将数据分段到可处理块、压缩数据、应用MAC 、加密以及传输结果等。对接收到的数据进行解密、校验、解压缩、重组等,然后将它们传送到高层客户机。
TLS连接状态指的是TLS记录协议的操作环境。它规定了压缩算法、加密算法和MAC算法。
TLS记录层从高层接收任意大小无空块的连续数据。密钥计算:记录协议通过算法从握手协议提供的安全参数中产生密钥、 IV 和MAC密钥。
TLS 握手协议由三个子协议组构成,允许对等双方在记录层的安全参数上达成一致、自我认证、例示协商安全参数、互相报告出错条件。
最新版本的TLS(Transport Layer Security,传输层安全协议)是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。在TLS与SSL3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL3.0不能互操作。
TLS的主要目标是使SSL更安全,并使协议的规范更精确和完善。TLS 在SSL v3.0 的基础上,对于安全性进行了改进,有以下几个方面:
1)对于消息认证使用密钥散列法:TLS 使用“消息认证代码的密钥散列法”(HMAC),当记录在开放的网络(如因特网)上传送时,该代码确保记录不会被变更。SSLv3.0还提供键控消息认证,但HMAC比SSLv3.0使用的(消息认证代码)MAC 功能更安全。
2)增强的伪随机功能(PRF):PRF生成密钥数据。在TLS中,HMAC定义PRF。PRF使用两种散列算法保证其安全性。如果任一算法暴露了,只要第二种算法未暴露,则数据仍然是安全的。
3)改进的已完成消息验证:TLS和SSLv3.0都对两个端点提供已完成的消息,该消息认证交换的消息没有被变更。然而,TLS将此已完成消息基于PRF和HMAC值之上,这也比SSLv3.0更安全。
4)一致证书处理:与SSLv3.0不同,TLS试图指定必须在TLS之间实现交换的证书类型。
5)特定警报消息:TLS提供更多的特定和附加警报,以指示任一会话端点检测到的问题。TLS还对何时应该发送某些警报进行记录。
SSL/TLS协议应用
SSL/TLS协议提供的服务主要有:
因从,从协议的提供服务出发,大致的应用可以体现在以下三个方面:
1)用户和服务器的合法性认证
认证用户和服务器的合法性,使得它们能够确信数据将被发送到正确的客户机和服务器上。客户机和服务器都是有各自的识别号,这些识别号由公开密钥进行编号,为了验证用户是否合法,安全套接层协议要求在握手交换数据进行数字认证,以此来确保用户的合法性。
2)加密数据以隐藏被传送的数据
安全套接层协议所采用的加密技术既有对称密钥技术,也有公开密钥技术。在客户机与服务器进行数据交换之前,交换SSL初始握手信息,在SSL握手情息中采用了各种加密技术对其加密,以保证其机密性和数据的完整性,并且用数字证书进行鉴别。这样就可以防止非法用户进行破译。
3)保护数据的完整性
安全套接层协议采用Hash函数和机密共享的方法来提供信息的完整性服务,建立客户机与服务器之间的安全通道,使所有经过安全套接层协议处理的业务在传输过程中能全部完整准确无误地到达目的地。
思科针对加密流量的分析方法
本文章的另一个点是分析如何在SSL/TLS加密的情况下,对HTTPS数据包进行恶意流量分析,对此,我在思科的官网上学习到了他们的工作人员对于加密流量的分析方法,具体如下:
思科一组研究员认为,TLS(传输层安全)隧道中的恶意流量可在不解密用户流量的情况下,被检测并封锁。在文章中,几位研究员解释称,恶意软件会在TLS流中留下可识别的痕迹。
他们的研究涵盖了18类恶意软件的几千个样本,从某企业网络中捕获的数百万加密数据流中识别出了数万恶意流量。他们指出,这种检测可能只企业网络有效,而对诸如服务提供商之类的无效。在研究人员数据集中的深度包检测,其主要应用是嗅探出客户端和服务器之间的联系消息,以及识别出TLS版本,而不是用户数据。
仅仅网络数据本身,就足以鉴别TLS流是否属于绝大多数恶意软件家族。甚至在不同恶意软件家族使用同样的TLS参数的情况下,通常也能经由“基于流的特征”而被鉴别出来。这些特征包括:流元数据(输入输出的字节、包、网络端口号、流持续时间);包长度和时间的序列;字节分布;TLS头信息。
研究囊括的恶意软件家族有:bergat、Deshacop、Dridex、Dynamer、Kazy、Parite、Razy、Zedbot和Zusy等等。
研究人员认为,针对流分析的正确机器学习应用,让他们在单独加密流的恶意软件归属问题上拥有了90.3%的准确率,而在5分钟窗口时间对所有加密流的分析中达到了93.2%的准确率。
因为HTTPS是使用SSL/TLS协议对数据进行了加密再传输,因此在不知道解密方法的情况下,或者是无法解密时,是没有办法像HTTP数据包那样直接对原始数据进行分析的。前边分析了思科技术人员利用机器学习来进行检测的方法,对于HTTPS加密流量的异常流量分析,我目前有以下几个观点:
1)借助TCP三次握手协议。
虽然HTTPS中数据包是加密的,但是HTTPS的连接依然是建立在TCP协议之上,也就是说在HTTPS之前还必须完成TCP的三次握手;因此当一个固定IP在短时间内产生了重复大量的TCP三次握手,或者是半连接,该行为就会归为异常行为,这是利用HTTPS连接建立在TCP协议之上来完成的一部分异常流量分析。
2)建立异常数据包的特征库。
异常流量的产生是因为发送了异常操作(或含有恶意代码)的数据包,以Web攻击为例,在执行攻击之前以及执行攻击之中,都会发送一些具有相似特征的恶意代码,在无法查看原始数据包时,就可以仿照漏洞库的形式,建立一个庞大的异常数据包特征库,该库中的内容是对大量已知恶意代码、异常流量的各种加密之后的特征分析结果,因此当某数据包在特征库中匹配到时,该流量包就归为异常流量。
3)从SSL证书出发。
由于恶意操作依然会用到加解密,也就会使用到信任证书,那么就可以搜集大量已知的恶意流量的证书特征,对其版本、名称、签发时间等信息做详细记录并进行大数据分析,得出恶意流量的证书特征,进而可以在检测恶意流量时,当发现符合证书特征的数据包时,就对其进行解密,随后验证是否为恶意流量,以此达到HTTPS数据集加密情况下的恶意流量分析。
这些方法仅为我的一些思路,还没有切实进行操作,但是针对如何在加密环境下对数据包进行恶意流量分析,的确是一个比较困难的问题,希望以后能够有更使用、更高效的观点。
[1] 《Deciphering malware’s use of TLS (without decryption)》 Anderson, Blake, Paul, Subharthi, McGrew, David 10.1007/s11416-017-0306-6
[2] SSL/TLS协议运行机制的概述 http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
[3] TLS 握手优化详解 https://imququ.com/post/optimize-tls-handshake.html
[4] 不解密数据竟也能识别TLS加密的恶意流量 https://www.freebuf.com/news/108628.html
[5] 利用机器学习检测识别TLS加密恶意流量 https://blog.csdn.net/qq_42362440/article/details/102802511
[6] 无需解密:在TLS加密连接中揭开恶意软件的面纱 https://www.aqniu.com/learn/17674.html
[7] 浅谈SSL/TLS工作原理 https://zhuanlan.zhihu.com/p/36981565