0x01 背景前瞻
前一阵在项目过程中遇到个有意思的情况-国密SSL系统。现象为常规浏览器无法访问、常规方式无法抓包,浏览器代理失效、系统代理失效~真是天霸动霸tua了
国密SSL证书,全称为国家密码算法SSL证书,是基于我国自主研发的密码算法标准(如SM2、SM3、SM4等)设计的SSL证书。符合国密标准(GM/T0024-2014和GB/T38636-2020)的安全传输协议。
简而言之,国密SSL就是SSL/TLS协议的国密版本。
先来看看火狐和谷歌:挂代理,bp访问的样子:
根本没有响应包!(哈哈哈哈,顶!)
0x02 丑系统迟早要见公婆(不是)
既然你有如此神秘的面纱,那也一定有揭下它的方法!国密+安全,脑子里突然想到了一个牌子:360!看看360全家桶里有木有什么神奇的东西 疯狂百度360中。。。。
网址:https://browser.360.net/gc/index.html/?src=se哈哈哈,360国密浏览器看着很对味,点击进去
哇哦,全国首家诶,看着免费诶,那么。。嘿嘿嘿~ 下载国密版!修改安装位置!安装!原神启动!不是,双击启动!再次访问系统,哈哈,能看了,发现URL旁边有个“国密”字样的标识,超级重码保命!
0x03 BP,你怎么看
浏览器是可以访问了,但是burpsuite还是抓不到包。搜了一下,还需要一个专门的国密代理工具-我用的是GMSocks
网址:https://www.gmssl.cn/gmssl/index.jsp打开后点击国密代理-下载,支持win、Linux、mac
下载好后就是个可执行文件、可以命令行直接运行,默认监听127.0.0.1:1080,也可以自己设定 指令:
gmsocks.exe -a ip -p port
启动好后,就是安装证书,访问http://ip:port/rca 下载证书 然后导入到"受信任的根证书颁发机构"
导入好后,在burp里配置一下,找到Connections-上游代理器,填写上ip,和端口。
然后浏览器再开启代理,就可以抓到包啦~
0x04 回手掏-国产ssl的小秘密
既然遇到了,那就仔细看看这东东吧~
1、执行标准:
国产SSL技术规范曾经是以 SSL VPN 技术规范 GM/T 0024-2014和签名验签服务器技术规范GM/T 0029-2014作为标准,后来上升为信息安全技术传输层密码协议(TLCP)GB/T 38636-2020
2、密码套件
密码套件是一组算法的集合,这些算法用于确保通信的安全性。每个密码套件的名称通常定义一个密钥交换算法、一个批量加密算法、一个消息认证码(MAC)算法,以及一个伪随机函数。从支持的密码套件上看,TLCP支持的密码套件更多。从表格中可以看到,TLCP的加密算法只有SM4,加密模式有GCM和CBC两种
3、协议原理
对于TLCP握手过程如下:
1、客户端发送hello消息给服务端,服务端应回应服务端hello消息。这一步是用于客户端和服务端进行基于SM2、RSA或IBC的密码算法协商,以及确定安全传输能力,包括协议版本、会话标识,密码套件等属性,并且产生和交换随机数。
2、在服务端发送完 hello 消息之后,接着发送自己的证书,服务端密钥交换消息。然后发送服务端hello完成消息,表示hello消息阶段已经结束,服务端等待客户端的返回消息。
3、客户端发送密钥交换消息,消息内容取决于协商出的密钥交换算法。如果客户端发送了证书消息,那么也应发送一个带数字签名的证书验证消息供服务端验证客户端的身份。接着客户端发送密码规格变更消息,然后客户端立即使用刚协商的算法和密钥,加密并发送握手结束消息。
4、服务端则回应密码规格变更消息,使用刚协商的算法和密钥,加密并发送握手结束消息。
而TLS的握手消息总结起来为3步:
1、和TLCP基本一样,通过hello消息协商并确定协议版本、会话ID、密码套件、压缩算法等。
2、服务端回复 Hello消息,包含选定的密码套件;发送证书给客户端;使用证书对应的私钥对握手消息签名,将结果发送给客户端;选用客户端提供的参数生成临时公钥,结合选定的参数计算出用于加密 HTTP 消息的共享密钥;服务端生成的临时公钥通过 KeyShare 消息发送给客户端;
3、客户端接收到消息后,使用证书公钥进行签名验证,获取服务器端的临时公钥,生成会话所需要的共享密钥 总结来看,TLCP会多发送一次密码规格变更消息,其他的貌似大差不差,可能差别在中间协定的密码有不同吧,毕竟TLCP都是SM4
0x05 wireshark抓包深入~分析
1、使用国密发包模拟器
项目地址:https://github.com/warm3snow/practical-crypto 下载好后,运行服务端并启用国密sslcd practical-crypto-master/tls/gmtls/
go run gmtls1_1.go
然后运行客户端,模拟访问服务端的过程
go build -o tlsclient tlsclient.go ---生成客户端文件
./tlsclient -h ----查看配置参数
./tlsclient -addr https://localhost:8443 -tlsVersion gmtls1.1 --请求服务端
能看到返回了hello,word! 用浏览器访问,此时能看到地址栏显示国密两个字,网页内容也是hello,world!
2、wireshrak抓包分析TLCP
使用wireshrak抓包,能够看到TLCP握手阶段的四个包第一个包Client hello,观察到客户端向服务端发送了协议版本:TLCP(0x0101)和客户端支持的密码套件,这里只有4个(项目作者解释为与测试程序用的包有关系,只放了4个,正常环境下都是12个)。
第二个包,这一个包括了Server hello、Certificate 、Server-key Exchange、Server hello done四个内容。
Server hello:这里可以看到服务端选择的密码套件ECC_SM4_CBC_SM3 和协议版本
Certificate:能看到服务端要返回的签名证书和加密证书。
签名证书 主要用于对用户信息进行签名,以确保信息的有效性和不可否认性。它通过使用私钥进行签名,公钥进行验证,从而确认发送方的身份。签名证书的功能是防伪造和防抵赖。即使私钥遗失,以前签名的数据仍然有效,因为验证方可以通过公钥验证签名的有效性。签名证书的私钥一般只有一份,安全性较高。 加密证书 主要用于对用户传送信息进行加密,以保证信息的保密性和完整性。它通过公钥加密,私钥解密的方式,确保信息在传输过程中不被未授权者获取。加密证书的功能是防偷窥。公钥加密、私钥解密的方式确保了信息的安全传输。然而,一旦私钥遗失,数据就无法还原,因此CA通常会备份加密证书以确保数据的可恢复性。
Server-key Exchange:一眼看这么少的内容,大概能知道不是那么重要的字段,存储的是密钥交换消息,用户客户端计算预主密钥的。Server hello done:结束hello,服务端等待客户端回应。
第三个包,包含了Client Key Exchange、Change Cipher Spec、Encrypted handshake Massage
Client Key Exchange:这是客户端密钥交换信息,携带的是加密后的预主密钥
Change Cipher Spec:空空如也,这是用于校验客户端是否是证书的合法拥有者的
Encrypted handshake Massage:也是没看到有啥有价值的,和TLS一样,告诉对方自己在整个握手过程中收到了什么数据,发送了什么数据,来保证中间没人篡改报文。
第四个包,包含Change Cipher Spec、Encrypted handshake Massage,和上述一样。
四条报文后,就是开始发送数据了
3、TLCP和TLS的对比
首先看抓到的包: 不同点:TLCP四次交互后握手完成;TLS三次交互后握手完成相同点:都是从Client Hello开始,经历Server Hello、Change Cipher Spec 再看看Client Hello和Server Hello包:
可以看到这一部分其实除了荷载内容上有些许不同,传输的字段、包结构基本是一致的。
0x06 总结
随着《网络安全法》、《密码法》等相关法律法规的出台,使用符合国家标准的加密技术成为了企业合规运营的必要条件,在未来可能会遇到越来越多的使用TLCP的系统。
文章来源:TIde安全团队
黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!
如侵权请私聊我们删文
END
原文始发于微信公众号(黑白之道):国密SSL系统抓包及TLCP分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论