Finger (protocolo)

Finger é um protocolo e comando de troca de informação sobre utilizadores. Descrito no RFC 742, permite aceder à informação sobre utilizadores de uma máquina remota. O RFC usado para implementar este trabalho foi o RFC 1288, escrito em Dezembro de 1991. Este RFC actualiza os RFCs 1196, 1194 e 742.

De uma forma genérica o funcionamento do Finger resume-se a efectuar uma conexão à porta 79 do servidor, e a realizar um pedido. O servidor envia a resposta de acordo com os dados do pedido.

Em técnicas de hackers, o protocolo Finger é usado pra capturar senhas de todos os usários de um sistema para que se possa ter acesso usuário root ao sistema sem a necessidade de quebrar a senha por força bruta. Se o pedido for feito em DotIn no sistema, será retornado um erro provocando a quebra do sistema: eis aí o principal motivo de tal protocolo ser quase inexistente na maioria das redes e sua porta protegida diretamente pelo firewall.

Os dados enviados são em formato ASCII com os códigos de CR e LF no final.

O buffer que recebe os resultados do Finger pode ser imediatamente impresso na tela sem necessidade de tratamento, uma vez que os dados já se encontram formatados.

Exemplo de implementação do cliente Finger editar

//  - 0 finger do ISEP
// para testar - server: gnu.org   users: karl, pot
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

#define BUFLEN 30000

main (int argc, char *argv[])
{
  struct sockaddr_in target;
  struct hostent *he;
  struct servent *sp;
  int sock, nread;
  char *tmp, buffer[BUFLEN];
  char server[100], user[20];
  int i;

  if (argc==1) {
      puts ("Sintaxe do Programa: ifinger [user] server\n");
      printf ("Servername: ");	
      fgets (server, BUFLEN, stdin);
      tmp = index (server, '\n');
      *tmp = '\0';
      printf ("Username: (ENTER=todos) ");
      fgets (user, 20, stdin);
      }
 if (argc==3) {
      strcpy (server,argv[2]);
      strcpy (user, argv[1]);
      strcat (user,"\r\n");
      }
 if (argc==2) {
      strcpy (server,argv[1]);
      strcpy (user, "\r\n");
      }


 if ((he = gethostbyname (server)) == NULL)
   {
     perror ("ERRO: nao encontra server");
     exit (1);
   }

 if ((sock = socket (AF_INET, SOCK_STREAM, 0)) == -1)
   {
     perror ("ERRO: nao criou socket");
     exit (1);
   }

 if ((sp = getservbyname ("finger", "tcp")) == NULL)
   {
     perror ("ERRO: nao encontra porta");
     exit (1);
   }

 memset (&target, 0, sizeof (target));
 target.sin_family = AF_INET;
//  target.sin_port = 79;
 target.sin_port = sp->s_port;
 target.sin_addr = *((struct in_addr *) he->h_addr);

 if (connect (sock, (struct sockaddr *) &target, sizeof (target)) < 0)
   {
     perror ("ERRO: na conexao");
     exit (1);
   }

 nread = strlen (user);

 nread = write (sock, user, nread);	
 nread = read (sock, buffer, BUFLEN);	

 printf ("Resultado: \n\n %s", buffer);	

 close (sock);
 exit(0);
}

Ver Também editar