通过滥用SSL / TLS绕过Web应用程序防火墙

介绍

在最近几年中,Web Security已成为IT安全领域的一个非常重要的主题。Web提供的优势导致非常关键的服务被开发为Web应用程序。他们的Web应用程序安全性的业务需求也发生了很大变化,除了良好的开发标准外,还增加了另一层安全性。Web应用程序防火墙是L7防火墙,用于检查Web流量并“尝试”防范攻击。在这篇博文中,我将解释一个有趣的绕过向量,我最近在WAF的部署审计中发现了这个向量。

“脆弱性”的原因

最近我被分配到一家公司进行WAF的部署测试。我不会出于显而易见的原因来命名公司和产品,但原则保持不变。部署的体系结构是这样的:

 Blocked-request.png

waf-general-arch.png

在我获得所需信息后,我开始寻找绕过它的不同方法。我被允许访问WAF用于不同的测试,除了我发现绕过它的其他方法,一个有趣的方法是滥用SSL密码。我第一次登录WAF时,Unsupported SSL Ciphers警报很快就引起了我注意。一旦我看到警报描述,我就开始在产品文档中挖掘更多内容并设法找到所有支持的SSL密码,但在继续之前我想快速解释一下SSL连接是如何工作的。

SSL握手由3个主要阶段组成:

ClientHello / ServerHello阶段。

握手始于发送ClientHello消息的客户端。此消息包含服务器所需的所有信息,例如各种密码套件和支持的SSL / TLS版本。收到连接后,服务器将使用ServerHello消息进行响应,该消息包含客户端所需的类似信息。服务器还返回将使用的密码套件和SSL版本。

证书交换

初始化连接后,服务器需要向客户端证明其身份。服务器将SSL证书发送到客户端,客户端检查它是否信任证书并继续连接。

密钥交换

现在建立了安全隧道,服务器和客户端交换密钥,该密钥将用于加密和解密数据。

攻击的想法

突然出现在我脑海中的想法是: What if I use an "unsupported" SSL Cipher to initialize the connection to the WebServer which supports that cipher, the WAF would not be able to identify the attack because it can't view the data.

所以我开始挖掘并找到了WAF供应商的文档,从那里我提取了所有支持的SSL密码。如下所示。

在SSLv3

SSL_RSA_WITH_NULL_MD5
SSL_RSA_WITH_NULL_SHA
SSL_RSA_WITH_RC4_128_MD5
SSL_RSA_WITH_RC4_128_SHA
SSL_RSA_WITH_DES_CBC_SHA
SSL_RSA_WITH_3DES_EDE_CBC_SHA
SSL_RSA_EXPORT_WITH_RC4_40_MD5
SSL_RSA_EXPORT_WITH_DES40_CBC_SHA 

TLS / 1.0-1.2

TLS_RSA_WITH_NULL_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_EXPORT1024_WITH_RC4_56_MD5
TLS_RSA_EXPORT1024_WITH_RC4_56_SHA
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_RC4_128_MD5 = { 0x000x04 }
TLS_RSA_WITH_RC4_128_SHA = { 0x000x05 }
TLS_RSA_WITH_DES_CBC_SHA = { 0x000x09 } 

下一步是确定Web服务器支持的SSL密码。

有许多方法可以识别支持的密码,但我使用sslscan它是因为它易于安装并提供了大量详细信息。

pwn@thinkpad:~$ sudo apt install sslscan 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  sslscan
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 26,7 kB of archives.
After this operation, 81,9 kB of additional disk space will be used.
Get:1 http://al.archive.ubuntu.com/ubuntu bionic/universe amd64 sslscan amd64 1.11.5-rbsec-1.1 [26,7 kB]
Fetched 26,7 kB in 0s (73,8 kB/s) Selecting previously unselected package sslscan. (Reading database ... 177002 files and directories currently installed.) Preparing to unpack .../sslscan_1.11.5-rbsec-1.1_amd64.deb ...
Unpacking sslscan (1.11.5-rbsec-1.1) ...
Processing triggers for man-db (2.8.3-2) ...
Setting up sslscan (1.11.5-rbsec-1.1) ...
pwn@thinkpad:~$ sslscan http://target/ | grep Accept 

上面的命令将列出来自Web服务器的所有受支持的SSL / TLS版本和密码。

比较sslscan和产品文档的结果,我能够识别Web应用程序防火墙中不支持但Web服务器支持的一些密码。

Accepted TLSv1 256 bits ECDHE-RSA-AES256-SHA

密码在Web服务器上支持,但不在WAF上

为了测试我的理论,我创建了一个WAF规则,如果请求的路径是/ ssl-cipher-test,它会阻止请求。

访问路径将成功阻止连接。

阻止请求

Blocked-request.png

利用这种“绕过”的快速方法是指定客户端密码,只留下绕过防火墙的密码。

您可以--ciphers在curl上使用命令指定密码,在本例中我指定了ECDHE-RSA-AES256-SHA。

pwn@thinkpad:~$ curl --ciphers ECDHE-RSA-AES256-SHA https://waf-test.lab.local/ssl-cipher-test
<html lang=en>
  <title>HELLO </title>
  <p>Bypass worked</p>
pwn@thinkpad:~$  

正如我们从上面的响应中看到的那样,Web应用程序防火墙被成功绕过了。

结束语

在发布此博客帖子之前,我的主要计划是创建一个扫描程序来扫描所有支持的密码,找到一个应该绕过防火墙,然后启动代理监听器以使用该密码转发所有请求。

由于这将需要我没有的大量时间,我决定发布博客帖子并激励某人根据这项研究创造一些东西。

参考

https://security.stackexchange.com/questions/67931/why-cant-i-decrypt-ssl-traffic-with-the-clients-private-key-only

https://www.owasp.org/index.php/TLS_Cipher_String_Cheat_Sheet

CURL密码文档

发表评论 / Comment

用心评论~

金玉良言 / Appraise
奶糖味的代言LV 2
2018-09-09 16:06
可以可以 [F14]