2021看雪SDC议题回顾 | Make Deep Exploit RCE Attack Popular
2021-10-31 19:00:04 Author: mp.weixin.qq.com(查看原文) 阅读量:178 收藏

RCE 攻击是每一位安全研究员的追求,也是业内研究分析绕不开的技术点,遗憾的是目前网上公开的方法论大都未抓住其技术疼点,仅仅满足诸如弹计算器,反弹shell。
安恒水滴实验室的安全研究员孙成心先生在此基础上做了大量研究,从自身红队视角出发,对RCE漏洞所带来的进一步危害及其深度利用,RCE利用的规范化和流程化,做出了里程碑式意义的开源工作!
下面就让我们来回顾2021看雪第五届安全开发者峰会Make Deep Exploit RCE Attack Popular 此议题的精彩内容。

演讲嘉宾

【孙成心-安恒水滴实验室安全研究员

孙成心:安恒水滴实验室安全研究员。

近些年一直专注Java漏洞安全,CodeQL漏洞分析、审计。擅长漏洞深度利用,CodeQL分析研究Nday,擅长研究漏洞的深度利用,赋能红队。

演讲内容

以下为速记全文:

先做个自我介绍,我是安恒水滴实验室的安全研究员,主要做的方向是Java安全和静态代码分析这一块。今天给大家带来的演题目是《Make Deep Exploit RCE Attack Popular 》,总共分为以下五个部分。

01

前言

时下随着网络安全的不断发展,RCE已经成为了流行词。RCE 攻击也是每一个安全研究员的追求,但其实到目前为止RCE很多公开手段仅限于弹计算器或者反弹shell之类的。

RCE Code OR Command(代码还是命令)Exploit?

我们假设一个场景,当红队攻击队队员发现某某目标存在某个组件、框架并发现可能存在某RCE漏洞。如果这个漏洞很熟悉,当然就直接攻击,但如果是最新漏洞、或者是不熟悉的漏洞。

此时大多数人员都可能采取GitHub、Google、百度三步走策略,但往往发现搜索引擎给出的漏洞复现、漏洞分析文章大多数都是以弹计算器、反弹shell、DNSLOG等操作。而这些操作往往在现如今的蓝队的防御和应急水平下是能够很快的发现,这些操作往往是不可采取的。

我们能做什么呢?新时代下,当然还不能是DNSLOG、弹计算器、反弹shell操作。RCE漏洞攻击一直以来都是红队最喜欢的攻击手段之一,其特点能够执行任意代码。往往部分安全研究员其工作特性不参与红蓝对抗,从而没有时间、兴趣研究进一步深度利用。

在新时代下,随着蓝军防守能力不断提高显然这些操作是无法满足红队视角下的需求。但与此同时RCE漏洞利用其漏洞利用难度一直也是居高不下,并且RCE漏洞利用方式花样百出,不同RCE漏洞存在不同漏洞利用方式。而红队队员不可能所有的RCE漏洞都复现过、有了解过,或者说是漏洞进一步深度利用过。

ysoserial是一款知名的漏洞利用工具,其包含目前主流的绝大数的漏洞利用Gadget,但绝大数的漏洞利用Gadget都是以执行命令为主,这使得大多数人将RCE漏洞的危害从"任意代码执行”降级为了“任意命令执行”。

02

漏洞案例分析

SpringBootVulExploit是一个对SpringBoot漏洞利用checklist,包含了目前SpringBoot绝大数漏洞利用方式,也是目前红队对SpringBoot的checklist。

checklist一共给出了(目前)给出十二种RCE漏洞利用方法,对其归纳分类。大致可以分为三类,第一类JNDI注入攻击类型、重启类型以及其他类型。

JNDI注入类型都是可以采用JNDI注入攻击方法,重启类型都是要将web服务重启启动才能触发漏洞。其他类型是一些杂项,每一种的RCE漏洞利用都是不同的漏洞利用方式。

站在红队视角下,如果遇到SpringBoot漏洞,显然没有一套规范的漏洞利用方案,显然无法做到漏洞快速利用的目的。要对每一种漏洞利用方式从能够复现、到深度漏洞利用是一个很漫长的过程,这个过程可能是一个星期、甚至是一个月。

如何规范一套漏洞快速利用的方案呢?这里我认为存在三个痛点:

(1)漏洞利用规范化:一套规范的漏洞利用模式,从漏洞发现、漏洞复现、漏洞利用的规范

(2)漏洞利用流程化:用一套流程,将漏洞利用规范的每一个细节变成一套流程

(3)漏洞利用简易化:将漏洞深度利用难度简易化,让每一个人用尽可能少的时间学习漏洞利用

Checklist归类后一共有三类,如果将其中两类转化成另一类的话,那么将大大减少漏洞利用难度。第一类就包含了三种均是采用JNDI方式,采用JNDI的优点:通用性比较强、利用成本低。缺点要求目标出网。如果我们把所有的类型都转换成JNDI注入的方式,那么将大大减少我们的漏洞利用的难度。

JNDI的特点,可以获取实例类、执行任意恶意代码。事先安全研究员可以将漏洞利用的代码写好,实现一次编写循环使用,即使是不懂代码的人都能实现漏洞利用。

如果针对JNDI来构造一个RCE漏洞利用框架,那么其实分为三者的关系:客户端、服务端以及目标。

客户端是红队队员,服务器端是架设的恶意服务,目标是攻击对象。第0步,攻击之前确认服务端服务启动且能访问。第一步,发送恶意请求,第二步目标会发生lookup请求,第三步服务器端返回恶意类,最后客户端确认漏洞利用成功。

03

JNDI注入——“误区”

这张图在很多的JNDI分析文章频繁出现,这张图表示JNDI在各个版本的修复情况,实际上这很容易造成了一个误区。

JNDI的数据其实有两种,一种是反序列化数据,一种是引用对象。Java中的LDAP在属性值中存储相关的Java对象,可以存储如上两种对象,而相关的问题就是出现在这部分上。

在JNDI发起的Lookup后,最终会有解码操作。首先会进行判断,三种情况三种处理。如果是序列化数据上面的条件限制就失效了,这是一个很少人关注的点。

测试使用JDK9.0.4,也能弹出计算器。完美绕过“限制”。

前面我们提到Ysoserial这款工具,其中生成的代码就限制了只能使用runtime执行命令。其实我们只需要将gadget生成命令的函数进行修改就能实现执行任意代码的效果。

修改templates函数,首先做一个判断,判断输入命令是否是class文件。然后直接读取文件字节码,插入templates的字段bytecodes中即可。需要注意的是类文件的类需要继承AbstractTranslet,并复写两个抽象方法。下面是一个弹出计算器的示例代码。

04

实战化——Spring Boot

根据JNDI的漏洞利用框架解决方案思维,就可以解决SpringBoot漏洞利用难的问题。对其payload进行改造就能满足实现RCE漏洞利用的条件,这是logback JNDI RCE的改造后的Payload。

SpEL表达式在很多框架中的使用了,迄今为止也爆出了很多框架存在SpEL表达式注入,当然这里也包含springboot框架。对SpEL表达式注入的Payload修改就实现使用JNDI方式达到漏洞利用的目的。

CVE-2021-26084Atlassian confluence rce是前段时间比较火的漏洞,其漏洞本质是OGNL表达式注入,这里也可以对其payload修改发现是可以采用JNDI注入的方式实现漏洞利用的目的。当然只能要是OGNL表达式注入就能使用这个payload,不仅限制于confluencerce漏洞利用。

SpringBootExploit是上述情况研究下的产物,解决了RCE漏洞利用难、漏洞利用繁琐的问题,实现了一键getshell。JNDIExploit是对应的服务端,配合SpringBootExploit使用。

RCE本意是执行任意代码,执行任意代码就能获取任意恶意类,获取恶意类就能进行更多可操作性。上面表格列举的漏洞都能根据框架进行改造实现执行任意代码的目的。

05

CodeQL探索Gadget

上面我们都是直接用InitialContext类进行直接调用Lookup方法,但在JdbcRowSetImpl也是能间接调用lookup方法。JdbcRowSetImpl这个类是fastjson低于1.2.48版本RCE漏洞的payload被广泛流传的,其原理是setAutoCommit的时候会判断是否存在连接,然后调用connect函数。在connet函数里面会用InitialContext.lookup方法触发漏洞。

1、首先Context和InitialContext的基础之上找到其“替代”类(相似类),作用相似功能相似但名字不一样,包名不一样。

2、在第一步基础上进一步找到其类的使用类(例如JdbcRowSetImpI)。

3、筛选第二步的类,如果满足需求就是一个新的JNDI漏洞触发类,甚至可能是一个新gadget。

使用CodeQL根据前面的三步走策略,编写QL规则,经过测试41项目发现满足条件项目如下。

可以发现spring framework项目,结果中包含CVE-2017-8045中的漏洞触发类。

log4j组件是一个日志组件,应用非常广泛。大多数JavaWeb日志都使用了。使用CodeQL编写规则复现,发现其中存在触发JNDI漏洞的类。

在如何高效地捡漏反序列化漏洞利用链文章中提及到一个新的JNDI触发漏洞类,ReistryImpl_Stub类。

试想如果有足够多的接口,就能采用三步走策略收集到足够多的组件的漏洞利用类,该计划就因此孕育而生。

  • shiro550漏洞原理将rememberMe的cookie值直接进行base64解码,然后AES解密之后直接将序列化数据进行反序列化触发漏洞。

  • 目前最主流shiro550漏洞利用Gadget是使用shiro1.2.4自身自带的CommonsBeanutils组件反序列化Gadget。

  • CommonsBeanutils组件反序列化漏洞目前主流是使用Ysoserial工具中的Gadget以及p牛提出的Gadget。

shiro框架依赖CommonsBeanutils,采用相同的分析步骤,通过编写CodeQL规则可以挖掘依赖CommonsBeanutils组件更多漏洞利用gadget。

我的演讲到此结束了,谢谢大家!

注意:点击阅读原文即可获得本次峰会演讲完整PPT!其它议题演讲PPT经讲师同意后会陆续放出!
- End -

公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]

求分享

求点赞

求在看

“阅读原文查看议题完整PPT吧!

文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458401181&idx=1&sn=46564e3062a14d7e5dc205f1cff340e2&chksm=b18f091786f88001a5e422cc5057f670a013ff2a954e58b30fde298eed23afb61f7b6b99bf61#rd
如有侵权请联系:admin#unsafe.sh