Este artigo não cita fontes confiáveis. (julho de 2019) |
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.
// - 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);
}