Solr远程命令执行分析

Posted 雷神众测

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solr远程命令执行分析相关的知识,希望对你有一定的参考价值。

No.1

声明

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。


No.2

环境搭建

solr通过启动的时候加上-a参数,就可以使用额外的 JVM 参数(例如以 -X 开头的参数)启动 Solr,下面开启一下jdwp的远程调试。

solr start -p 8988 -f -a "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8988"


No.3

漏洞分析

可以看到这个 filter 的注释说的,也就说相关路径都会先发送到这个 SolrRequestFilter 进行处理。

选择在 SolrRequestFilter 的 dofilter 处下个断点,可以看到请求过来了。

Solr远程命令执行分析

这 dofilter 方法中,这里会先获取我们 web.xml 中的 excludePatterns 的路径进行正则比对。

Solr远程命令执行分析

代码继续下行,来到这里,跟进 getHttpSolrCall 方法。

Solr远程命令执行分析

在 getHttpSolrCall 方法中最后的处理结果是返回一个 HttpSolrCall 对象。

Solr远程命令执行分析

紧接着调用call方法,来到了 HttpSolrCall#call 中。

Solr远程命令执行分析

跟进 HttpSolrCall#call 中,一直往下走,代码来到了这里,根据 switch 进行选择,这里的 action 是 PROCESS ,所以自然进入 PROCESS 的 case 中进行处理,然后调用this.execute方法来处理 solrRsp 对象。

Solr远程命令执行分析

跟进 HttpSolrCall#execute 中,首先调用 getCore 方法获取 SolrCore 对象,然后调用 SolrCore#execute 方法。

Solr远程命令执行分析
Solr远程命令执行分析

跟进 SolrCore#execute 方法选择在 handler.handleRequest 处下一个断点,为什么会在这里下断点,因为从方法名称来看,这个名称大概会处理我们传入的 request 请求,这里由于我们请求的路径是/solr/test/config实际上是针对这个 config 进行操作,所以这里的handler对象是 SolrConfigHandler 。

Solr远程命令执行分析
Solr远程命令执行分析

代码继续下行,来到 RequestHandlerBase 类中,这个类调用this.handleRequestBody来处理。

Solr远程命令执行分析

而这个 handlerRequestBody 实际上是一个抽象类,也就是solr实际通过自己的路由分发,将不同url请求,转发到不同的 handler 进行处理,这是我的理解,可能存在偏差。

Solr远程命令执行分析

然后在 SolrConfigHandler#handleRequestBody 中就可以看到一些处理了,由于我们请求的数据类型是json,请求方式POST,所以自然会进入command.handlerPOST进行处理。

Solr远程命令执行分析

跟进command.handlerPOST,实际上可以看到this.handleCommands方法进行处理的时候overlay对象的值正是我们已经传入的。

Solr远程命令执行分析

继续跟进 SolrConfigHandler$command 的 handleCommands 方法,这里通过 SolrResourceLoader 类加载资源配置,然后调用 SolrResourceLoader#persistConfLocally 方法针对文件进行操作。

Solr远程命令执行分析

继续 SolrResourceLoader#persistConfLocally 方法可以看到,获取配置文件路径,写入内容,而写入部分的正是我们通过POST方式上传上来的数据。

Solr远程命令执行分析
Solr远程命令执行分析

第一阶段修改配置文件的调用栈如下所示:

persistConfLocally:900, SolrResourceLoader (org.apache.solr.core)
handleCommands:504, SolrConfigHandler$Command (org.apache.solr.handler)
handlePOST:345, SolrConfigHandler$Command (org.apache.solr.handler)
access$100:158, SolrConfigHandler$Command (org.apache.solr.handler)
handleRequestBody:136, SolrConfigHandler (org.apache.solr.handler)
handleRequest:199, RequestHandlerBase (org.apache.solr.handler)
execute:2551, SolrCore (org.apache.solr.core)
execute:711, HttpSolrCall (org.apache.solr.servlet)
call:516, HttpSolrCall (org.apache.solr.servlet)
doFilter:395, SolrDispatchFilter (org.apache.solr.servlet)
doFilter:341, SolrDispatchFilter (org.apache.solr.servlet)

当然第二阶段就是通过模版注入,远程代码执行,代码断点还是下到call.call位置。

Solr远程命令执行分析

跟进 HttpSolrCall#call 中,跟进下图代码中的this.getResponseWriter。

Solr远程命令执行分析

在HttpSolrCall#getResponseWriter,可以看到实际上循环来到了下图位置,调用的是 SolrCore#getQueryResponseWriter

Solr远程命令执行分析

而 SolrCore#getQueryResponseWriter 实际上是根据请求参数重的 wt 字段的值去获取reponseWriter 对象,payload中的参数是 velocity ,所以这里最后的返回对象是 VelocityResponseWriter。 

Solr远程命令执行分析
Solr远程命令执行分析

紧接着代码下行来到下图位置,我们看到 writeResponse 方法处理了我们刚刚的 VelocityResponseWriter对象。

Solr远程命令执行分析

继续跟进 HttpSolrCall#writeResponse ,代码调用了 writeQueryResponse 方法。

Solr远程命令执行分析

代码一路下行,会来到 VelocityResponseWriter#write 当中,然而刚开始时候,我只导入了solr-webapp目录下 WEB-INF  中的jar文件,然后就会出现下图中的情况,明明debug断点到了,但是无法打开查看源代码。后面深入看看才发现少导入了两个文件的jar,一个是 dist 目录中的 jar 文件,另一个是contrib/velocity/lib目录下的 Jar 文件。

Solr远程命令执行分析

继续愉快的debug,跟进 VelocityResponseWriter#write ,首先调用 createEngine 函数处理我们传入的 request 对象。

Solr远程命令执行分析

跟进 createEngine 函数,这里实例化 SolrParamResourceLoader 类来处理 request 对象。

Solr远程命令执行分析

这里有个疑问为啥 paramsResourceLoaderEnabled 是true,本质原因就在这之前HttpSolrCall#call方法中通过 getResponseWriter 方法,进一步来到 VelocityResponseWriter#init 方法获取到我们之前第一步修改配置文件的时候写入配置文件中的params.resource.loader.enabled和solr.resource.loader.enabled的结果,所以这里自然是true。

Solr远程命令执行分析
Solr远程命令执行分析

跟进 SolrParamResourceLoader 类,这里遍历循环我们payload中的数据,当 name 为 v.template ,我们在payload中的 v.template 的值是 custom ,所以这里实际上是生成了 custom.vm 的恶意 engine 。

Solr远程命令执行分析

代码回到 createEngine 方法中,这里自然 paramsResourceLoaderEnabled 是true,原因不在细说,上面所过了。

Solr远程命令执行分析

执行完这两个if之中的 SolrParamResourceLoader 和 SolrVelocityResourceLoader 操作之后,代码回到 VelocityResponseWriter#write 中,调用 VelocityResponseWriter#getTemplate 方法处理刚刚的engine对象,以及我们的request请求对象。

Solr远程命令执行分析

在 VelocityResponseWriter#getTemplate 方法中回根据我们提交的 v.template 参数获取我们构造的恶意 template 对象。

Solr远程命令执行分析

最后在调用我们构造好的恶意 template 的 merge 方法,达到命令模版注入的效果。

Solr远程命令执行分析

实际上模版进入到 template 的 merge 方法,然后及时一些AST解析过程。最后补上核心调用栈:

exec:347, Runtime (java.lang)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
doInvoke:506, UberspectImpl$VelMethodImpl (org.apache.velocity.util.introspection)
invoke:494, UberspectImpl$VelMethodImpl (org.apache.velocity.util.introspection)
execute:198, ASTMethod (org.apache.velocity.runtime.parser.node)
execute:304, ASTReference (org.apache.velocity.runtime.parser.node)
value:605, ASTReference (org.apache.velocity.runtime.parser.node)
value:72, ASTExpression (org.apache.velocity.runtime.parser.node)
render:235, ASTSetDirective (org.apache.velocity.runtime.parser.node)
render:377, SimpleNode (org.apache.velocity.runtime.parser.node)
merge:359, Template (org.apache.velocity)
merge:264, Template (org.apache.velocity)
write:166, VelocityResponseWriter (org.apache.solr.response)
writeQueryResponse:65, QueryResponseWriterUtil (org.apache.solr.response)
writeResponse:873, HttpSolrCall (org.apache.solr.servlet)
call:582, HttpSolrCall (org.apache.solr.servlet)
doFilter:423, SolrDispatchFilter (org.apache.solr.servlet)
doFilter:350, SolrDispatchFilter (org.apache.solr.servlet)


No.4

流程图

简单绘制一个流程图,方便自己后记

Solr远程命令执行分析


No.5

修复建议

从solr官方网站可以看出,这个插件实际上是一个可选项,这个漏洞本质还是配合solr未授权来达到rce的目的,所以实际上临时解决这个漏洞最优雅的方式应该是加上鉴权。

Solr远程命令执行分析

加上鉴权啥问题都没得。

Solr远程命令执行分析


No.6

招聘启事

雷神众测SRC运营(实习生)
————————

工作地点:杭州(总部)、广州、成都、上海、北京



雷神众测白帽运营(实习生)

————————

工作地点:杭州(总部)、广州、成都、上海、北京

【岗位职责】

1.准确了解白帽子爱好,发掘白帽子需求

2.负责各类周边、礼物的挑选与采购

3.对黑客文化有深刻认知

4.维护白帽关系


【任职要求】

1.具有良好的审美眼光

2.具备定制礼品礼物经验

3.较强的沟通以及协调能力

4.为人正直,具备良好的职业道德,能吃苦耐劳,具有良好的团队合作精神


【加分项】

1、具备美术功底、懂得设计美化等

2、有互联网运营经验


简历投递至 strategy@dbappsecurity.com.cn

设计师

————————

【职位描述】
负责设计公司日常宣传图片、软文等与设计相关工作,负责产品品牌设计。

【职位要求】
1、从事平面设计相关工作1年以上,熟悉印刷工艺;具有敏锐的观察力及审美能力,及优异的创意设计能力;有 VI 设计、广告设计、画册设计等专长;
2、有良好的美术功底,审美能力和创意,色彩感强;精通photoshop/illustrator/coreldrew/等设计制作软件;
3、有品牌传播、产品设计或新媒体视觉工作经历;

【关于岗位的其他信息】
企业名称:杭州安恒信息技术股份有限公司
办公地点:杭州市滨江区安恒大厦19楼
学历要求:本科及以上
工作年限:1年及以上,条件优秀者可放宽


简历投递至 strategy@dbappsecurity.com.cn

安全招聘
————————

公司:安恒信息
岗位:Web安全 安全研究员
部门:安服战略支援部
薪资:13-30K
工作年限:1年+
工作地点:杭州(总部)、广州、成都、上海、北京

工作环境:一座大厦,健身场所,医师,帅哥,美女,高级食堂…

【岗位职责】
1.定期面向部门、全公司技术分享;
2.前沿攻防技术研究、跟踪国内外安全领域的安全动态、漏洞披露并落地沉淀;
3.负责完成部门渗透测试、红蓝对抗业务;
4.负责自动化平台建设
5.负责针对常见WAF产品规则进行测试并落地bypass方案

【岗位要求】
1.至少1年安全领域工作经验;
2.熟悉HTTP协议相关技术
3.拥有大型产品、CMS、厂商漏洞挖掘案例;
4.熟练掌握php、java、asp.net代码审计基础(一种或多种)
5.精通Web Fuzz模糊测试漏洞挖掘技术
6.精通OWASP TOP 10安全漏洞原理并熟悉漏洞利用方法
7.有过独立分析漏洞的经验,熟悉各种Web调试技巧
8.熟悉常见编程语言中的至少一种(Asp.net、Python、php、java)

【加分项】
1.具备良好的英语文档阅读能力;
2.曾参加过技术沙龙担任嘉宾进行技术分享;
3.具有CISSP、CISA、CSSLP、ISO27001、ITIL、PMP、COBIT、Security+、CISP、OSCP等安全相关资质者;
4.具有大型SRC漏洞提交经验、获得年度表彰、大型CTF夺得名次者;
5.开发过安全相关的开源项目;
6.具备良好的人际沟通、协调能力、分析和解决问题的能力者优先;
7.个人技术博客;
8.在优质社区投稿过文章;


岗位:安全红队武器自动化攻城狮
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)

【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。

【岗位要求】
1.熟练使用Python、java、c/c++等至少一门语言作为主要开发语言;
2.熟练使用Django、flask 等常用web开发框架、以及熟练使用mysql、mongoDB、redis等数据存储方案;
3:熟悉域安全以及内网横向渗透、常见web等漏洞原理;
4.对安全技术有浓厚的兴趣及热情,有主观研究和学习的动力;
5.具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。

【加分项】
1.有高并发tcp服务、分布式等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。


PS:邮件主题中请注明工作意向城市,岗位要求可通过加分项弥补


简历投递至 strategy@dbappsecurity.com.cn

安全服务工程师/渗透测试工程师


工作地点:新疆


1、掌握渗透测试原理和渗透测试流程,具备2年以上渗透测试工作经验,能够独立完成渗透测试方案和测试报告;
2、熟悉风险评估、安全评估;
3、熟练掌握各类渗透工具,如Sqlmap、Burpsuite、AWVS、Appscan、Nmap、Metasploit、Kali等;
4、熟练掌握Web渗透手法,如SQL注入、XSS、文件上传等攻击技术;
5、至少熟悉一种编程语言(php/java/python),能够独立编写poc者优先;
6、具有良好的沟通能力和文档编写能力,动手能力强;
7、对工作有热情,耐心、责任心强,具备沟通能力和良好的团队意识;
8、加分项:有安全开发经验/可进行代码审计工作;
9、加分项:有安全和网络相关证书,如CISSP、CISA、CISP 、CCNP、CCIE等认证者;
岗位职责:
1、参与安全服务项目实施,其中包括渗透测试与安全评估,代码审计,安全培训,应急响应;
2、独立完成安全服务项目报告编写,输出安全服务实施报告;


简历投递至 strategy@dbappsecurity.com.cn

专注渗透测试技术

全球最新网络攻击技术


END


以上是关于Solr远程命令执行分析的主要内容,如果未能解决你的问题,请参考以下文章

[高危预警]Apche solr全版本XXE远程命令执行漏洞

Apache Solr 远程命令+XXE执行漏洞(CVE-2017-12629)

Apache Solr Velocity 注入远程命令执行漏洞 (CVE-2019-17558)

行业动态 | Apache Solr 远程命令执行漏洞复现

Apache Solr 远程命令执行漏洞(CVE-2019-0193)

漏洞风险提示|Apach Solr JMX配置默认开启导致远程命令执行漏洞