对于“证书认证中间人攻击漏洞”的验证

本文揭示了Internet Explorer在SSL实现中存在的设计漏洞,该漏洞允许远程攻击者进行中间人攻击。文章详细介绍了SSL证书的签发过程及验证机制,并通过实例展示了如何利用此漏洞生成任意域名的有效证书。
2006-8-24 一、 背景 Internet Explorer的SSL实现存在问题,远程攻击者可以利用这个漏洞进行中间人攻击。 在通常情况下,WEB站点的管理员通过SSL进行通信加密,要实现加密通信,管理员需要生成证书并由CA证书授权中心签发,该WEB站点的URL会保存在证书的识别名小节中的CN(公用名)字段中。 CA会验证管理员是否合法拥有的CN字段中的URL,签发证书并返回证书。假定管理员尝试对www.thoughtcrime.org进行加密,就有如下的证书签发过程: [CERT - Issuer: VeriSign / Subject: VeriSign] -> [CERT - Issuer: VeriSign / Subject: www.thoughtcrime.org] 当WEB浏览器接收到这个证书时,必须验证CN字段是否与它刚连接的那个域名匹配,并且是否是由一个了已知的CA证书签名,这种情况下攻击者不可能使用合法的CN名和合法的签名来替代证书,所以不存在中间人攻击。 但是有些情况下,为了方便会使用本地授权,因此这种情况下www.thoughtcrime.org会从本地授权中获得如下的证书链结构: [Issuer: VeriSign / Subject: VeriSign] -> [Issuer: VeriSign / Subject: Intermediate CA] -> [Issuer: Intermediate CA / Subject: www.thoughtcrime.org] 当WEB浏览器接收到此信息时,它必须验证分支证书的CN字段是否与它刚连接的那个域名匹配,以及该证书是否是由中间CA所签发,并且中间CA签发的证书是否由已知CA证书签发。最后,WEB浏览器还应该检查所有中间证书是否有合法的CA Basic Constraints,也就是说这些分支证书是否有合法授权进行证书签发。 但Internet Explorer存在设计漏洞,没有检查CA Basic Constraints信息,这样,具有任意域一个名合法CA签发证书的攻击者可以生成任意其他域名的合法CA证书。 假设攻击者是www.thoughtcrime.org的合法管理者,他可以首先可以生成一合法证书并从VeriSign中请求签名: [CERT - Issuer: VeriSign / Subject: VeriSign] -> [CERT - Issuer: VeriSign / Subject: www.thoughtcrime.org] 然后为任意域如(www.amazon.com)生成一证书,并使用自己的证书进行签名: [CERT - Issuer: VeriSign / Subject: VeriSign] -> [CERT - Issuer: VeriSign / Subject: www.thoughtcrime.org] -> [CERT - Issuer: www.thoughtcrime.org / Subject: www.amazon.com] 由于IE不会检查www.thoughtcrime.org的Basic Constraints信息,IE就会按照这个证书链合法接收www.amazon.com域。 任何人拥有任何CA签发的证书(和相应的私钥)可以欺骗任何用户。 http://www.microsoft.com/technet/security/bulletin/MS02-050.mspx 二、 准备工作 1. 签发根CA n openssl genrsa -des3 -out myrootca.key 1024 n openssl req -new -key myrootca.key -out myrootca.req n openssl x509 -req -days 7305 -extfile rootca.conf -signkey myrootca.key -in myrootca.req -out myrootca.crt 2. 签发中级CA n openssl genrsa -out subca.key 1024 n openssl req -new -key subca.key -out subca.req n openssl x509 -req -days 3650 -sha1 -extfile subca.conf -CA myrootca.crt -CAkey myrootca.key -CAserial myrootca.srl -CAcreateserial -in subca.req -out subca.crt 三、 流程一:使用子CA签发服务器证书 1. 使用IIS产生一个证书请求名为certreq.csr 2. 使用中级CA签发一个服务器证书 openssl x509 -req -days 3650 -sha1 -extfile server.conf -CA subca.crt -CAkey subca.key -CAserial subca.srl -CAcreateserial -in certreq.txt -out serverbysubca.crt 3. 安装服务器证书到IIS 4. 正常建立SSL连接 四、 流程二:使用根CA签发的服务器证书签发下级服务器证书 1. 使用根CA签发一个服务器证书 openssl x509 -req -days 3650 -sha1 -extfile server.conf -CA myrootca.crt -CAkey myrootca.key -CAserial myrootca.srl -CAcreateserial -in myhost.req -out myhost.crt 2. 使用IIS产生一个证书请求名为certreqsub.txt 3. 使用服务器证书签发一个下级服务器证书 openssl x509 -req -days 3650 -sha1 -extfile server.conf -CA myhost.crt -CAkey myhost.key -CAserial myhost.srl -CAcreateserial -in certreqsub.txt -out serverbyhost.crt 4. 安装到服务器证书到IIS,能够启动SSL,但是无法验证 5. 在IE里面导入根CA签发的服务器证书到“中级证书颁发机构” 结果直接察看证书显示为: 此时,IIS的SSL无法建立。 五、 结论 此漏洞现于2002年,对于安装了补丁的系统就不存在这样的漏洞。 六、 附录A 签发证书的扩展项 1. 根CA :rootca.conf basicConstraints = CA:true keyUsage = keyCertSign, cRLSign 2. 子CA:subca.conf basicConstraints = CA:true,pathlen:0 keyUsage = keyCertSign, cRLSign nsCertType = sslCA, emailCA, objCA 3. 服务器SSL证书:server.conf basicConstraints = CA:false keyUsage=digitalSignature,keyEncipherment,dataEncipherment, keyAgreement nsCertType = server extendedKeyUsage = serverAuth, msSGC, nsSGC 七、 附录B 已现的SSL漏洞 1. 当IE通过点击图像或者在帧>中连接到一个服务器时,IE只检查SSL证书是否是由可信的根服务商提供的,而没有验证证书有效期以及其他内容。(MS00-039) 2. 在同一个IE会话中,一旦成功的建立了SSL连接,对于新的SSL连接,IE将不再对证书进行任何的检查。(MS00-039) 3. 证书认证中间人攻击漏洞:IE不检查中间证书是否有合法的CA Basic Constraints,任何人拥有任何CA签发的证书(和相应的私钥)可以签发下级证书来欺骗任何用户。(MS02-050) Certificate Validation Flaw Could Enable Identity Spoofing (Q328145) 4. SSL漏洞 CAN-2004-0120 风险级别 高 微软安全套接层(Microsoft Secure Sockets Layer)函数库提供对安全通讯协议的支持,这些协议包括Transport Layer Security 1.0 (TLS 1.0), Secure Sockets Layer 3.0 (SSL 3.0),Secure Sockets Layer 2.0 (SSL 2.0), 和Private Communication Technology 1.0 (PCT 1.0)协议。windows的SSL函数库没有有效检查输入的数据,恶意的攻击者可以构造特殊的SSL请求,这些请求可能导致win2000和winxp的SSL函数库停止响应,而在win2003中可能会导致系统重新启动。(MS04-011) 八、 附录C 打了补丁的浏览器报错信息
TLS双向认证在正常情况下可以有效抵御中间人攻击,但在特定条件下仍存在一定风险。 ### 抵御中间人攻击的原理 TLS双向认证要求客户端和服务器双方都验证对方的证书。在握手过程中,客户端和服务器会交换证书,并且通过验证证书的颁发机构(CA)、有效期、签名等信息来确认对方的身份。如果存在中间人试图拦截并篡改通信,由于中间人无法提供有效的证书,双方在验证证书时就会发现异常,从而中断连接,因此能有效防止中间人攻击[^1]。 ### 存在风险的情况 1. **CA证书被攻破**:如果认证机构(CA)的私钥被泄露或攻破,中间人可以利用该CA签发的伪造证书欺骗客户端和服务器。由于客户端和服务器通常信任CA签发的证书,所以可能会错误地接受伪造证书,从而使中间人攻击得逞。 2. **客户端或服务器配置不当**:如果客户端或服务器没有正确配置证书验证机制,例如忽略证书的某些验证步骤(如跳过证书有效期检查、不验证证书链等),就可能会接受伪造的证书,给中间人攻击留下可乘之机。 3. **软件漏洞**:TLS协议实现的软件(如浏览器、服务器软件等)可能存在漏洞中间人可以利用这些漏洞绕过证书验证机制,进行中间人攻击。 ### 代码示例(Python使用`ssl`模块进行TLS双向认证) ```python import socket import ssl # 服务器端配置 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', 8443)) server_socket.listen(1) context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) context.load_cert_chain(certfile='server.crt', keyfile='server.key') context.load_verify_locations(cafile='client.crt') context.verify_mode = ssl.CERT_REQUIRED while True: conn, addr = server_socket.accept() try: secure_conn = context.wrap_socket(conn, server_side=True) data = secure_conn.recv(1024) print(f"Received: {data.decode()}") secure_conn.sendall(b"Hello, client!") except ssl.SSLError as e: print(f"SSL error: {e}") finally: conn.close() # 客户端配置 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(('localhost', 8443)) client_context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH) client_context.load_cert_chain(certfile='client.crt', keyfile='client.key') client_context.load_verify_locations(cafile='server.crt') client_context.verify_mode = ssl.CERT_REQUIRED secure_client_socket = client_context.wrap_socket(client_socket, server_hostname='localhost') secure_client_socket.sendall(b"Hello, server!") data = secure_client_socket.recv(1024) print(f"Received from server: {data.decode()}") secure_client_socket.close() client_socket.close() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值