都知道Burp可以通过设置代理并添加证书来抓取https流量,但是具体的原理可能还有些不理解,这里把具体的原理进行讲解,我们访问网站时https单向认证,属于服务端对客户端进行认证,另外延申可以通过app添加证书对服务端进行认证,进行https双向认证校验。
首先看下如何通过Burp添加证书来抓取https流量:
首先下载插件FoxyProxy添加代理到burp,然后浏览器访问127.0.0.1:8080
点击后可以下载burp的内置证书到本地,然后将证书导入到浏览器中:
导入成功后其中ProtSwigger就是我们导入的BURP证书,然后我们访问我们要抓取的https网站,会提示是否信任证书,我们选择信任就可以抓取到对应的流量了。为什么我们添加了证书就可以抓取到https证书,下面进行讲解:
首先我们要知道https=http+SSL,在之前使用http的时候,数据在传输过程中是不加密的,所以只要我们中间放任意一个流量设备,就可以获取到完整的内容,拿到这些流量可以干什么,首先可以盗取其中的敏感信息,其次我可以往里面穿插数据,将一堆的广告信息插入到正常流量里,这样我们访问正规网站的时候却发现有大量的低俗的广告信息,更严重的会添加钓鱼信息,诱骗访问者进入钓鱼网站进行诈骗,这些问题就出在流量没有加密,只要在链路中间架设任意一个流量设备就可以对内容进行修改,如何解决这个问题就出现了https,就是对流量进行加密,这样中间人拿到流量也是加密的,如果没有对应的密钥没有办法解开内容,自然就不能进行上述违规操作。下面简单讲解下https的原理:
先看一张网上的流程图:
具体的过程如下:
1 客户端访问https连接
这一步,就是相当于我们在浏览器上输入url回车的过程。这个时候浏览器或者客户端(接下来统一为客户端)会把我们客户端支持的加密算法Cipher Suite(密钥算法套件)带给服务端。
2 - 3 服务端发送证书(公钥)给客户端
服务端接收Cipher后,和自己支持的加密算法进行比对,目前TLS算法有1,1,1,1,2,1,3,其中1和1.1是存在漏洞的,存在被中间人伪造证书的风险。这里会判断客户端要求的Cipher服务器是否支持,如果不符合,则断开连接。否则,服务端会把符合的算法和证书发给客户端,包括证书时间、证书日期、证书颁发的机构。
4- 5 客户端验证服务端的证书
1、客户端验证证书,包括颁发证书的机构是否合法与是否过期,证书中包含的网站地址是否与正在访问的地址一致等,类似如下就是验证通过的证书,可以看到详细的证书信息。
2、验证通过后(或者用户接受了不信任的证书),客户端会生成一个随机字符串,然后用服务端的公钥进行加密。这里就保证了只有服务端才能看到这串随机字符串(因为服务端拥有公钥对应的私钥,RSA解密,可以知道客户端的随机字符串)。
3、生成握手信息 用约定好的HASH算法,对握手信息进行取HASH,然后用随机字符串加密握手信息和握手信息的签名HASH值,把结果发给服务端。这里之所以要带上握手信息的HASH是因为,防止信息被篡改。如果信息被篡改,那么服务端接收到信息进行HASH时,就会发现HASH值和客户端传回来的不一样。这里就保证了信息不会被篡改。
6 - 7 服务端接收加密信息,解密得到客户端提供的随机字符串
服务端接收到加密信息后,首先用私钥解密得到随机字符串。然后用随机字符串解密握手信息,获得握手信息和握手信息的HASH值,服务端对握手信息进行HASH,比对客户端传回来的HASH。如果相同,则说明信息没有被篡改。
服务端验证完客户端的信息以后,同样使用随机字符串加密握手信息和握手信息的HASH值发给客户端。
8 客户端验证服务端返回的握手信息,完成握手
客户端接收到服务端发回来的握手信息后,用一开始生成的随机字符串对密文进行解密,得到握手信息和握手信息的HASH值,像一步服务端验证一样对握手信息进行校验,校验通过后,握手完毕。从这里开始,客户端和服务端的通信就使用那串随机字符串进行AES对称加密通信。
以上就完成了https的认证和通信,所以整个https最重要的就是对于证书的验证,如果证书可以被伪造,则整个加密将被破解。
上面说了https的原理,下面说说Burp是如果对https进行中间人劫持的,先看张图网上的图:
其实这个图已经说的很细了,简单点说我们的BURP就是在中间变换身份来实现,首先我们需要向浏览器导入BURP的证书,为什么要这样,因为当客户端访问服务器中,我们添加了burp代理,客户端就会将burp认为是服务端,burp在向服务器发送数据时,服务端又会认定burp为客户端,所以本来客户端和服务端进行一次的https认证,通过Burp变成了两次https认证,
首先是客户端到服务端,客户端首先访问到burp,burp模仿服务器进行https认证,需要返回一个burp的证书进行验证,这里如果没有事先将burp证书导入到浏览器为证书颁发机构证书则会认证失败,所以一定需要导入证书到浏览器原因就在这,由于证书被导入到浏览器,则证书验证成功,这里可以看到浏览器证书变成了burp证书。
这样就完成了客户端到burp的证书校验,我们就可以抓取到客户端的流量。
下面burp就需要扮演客户端将数据发送给服务器,这里就会进行第二次https认证,通过burp的Server TLS证书我们可以看到在burp中存储了服务器的tls证书
这样大家也就理解了burp是如何实现对https数据的抓取和重放的,通过扮演不同的身份来实现偷梁换柱抓取流量,我们没有办法获取到服务器的证书,所以只能采用这种办法对两端进行欺骗,通过上述办法实现对https单向认证的绕过。
上面讲解了如何绕过https的单向认证,下面我们说下如何绕过https的双向认证,单向认证主要是客户端对服务端进行认证,双向认证则加入了服务端对客户端的认证,这样就需要客户端存在自己的证书,通过浏览器访问的是办不到的,因为没有办法通过访问网站的形式将证书放到浏览器中,所以双向认证多在app或者独立的客户端中,所以如果碰到app抓取流量没有办法抓取到的时候要考虑是否存在双向认证,这个时候我们需要去客户端中寻找对应的客户端证书。
当找到对应的客户端证书后可以导入到burp中:
导入成功后就可以进行流量的抓取。
当我们需要攻击环境内网数据进行测试中,我们需要对burp进行设置,这样可以完成浏览器->burp->SOCK服务器->服务器,这样的攻击流程:
首先我们可以看到我们工具的sock端口为7890
然后对burp进行设置,添加sock:
这样流量就会被burp发送到工具然后通过SOCK服务器转发到对应服务器。