SHARE

Existem muitos scanners de portas disponíveis na internet. O NMAP é um bom scanner de portas, mas se você quiser fazer o seu próprio scanner (para fins educacionais, quem sabe?) mas não sabe como, logo abaixo temos um código em C para criar o seu próprio scanner de portas  e começar a partir daí a modificação e implementação de novas funções. De forma alguma o objetivo aqui é reinventar a roda, mas sim fomentar uma caminha de estudos afim de buscar um maior entendimento e profundidade de conhecimento sobre protocolos de rede.

O scanner de portas vai trabalhar tentando estabelecer uma conexão com cada porta que será indicada para escanear. Ele vai dizer apenas se a porta está aberta ou fechada, não irá informar se a porta está oculta.

A execução se resume a um “aperto de mão” (handshake) de 3 vias, entre dois hosts usando o máximo de tempo necessário para concluir o trabalho.

Local system ----> sends tcp syn packet -----> Remote system
Local system <---- replies with a syn+ack packet <----- Remote system
Local system ----> sends ack packet -----> Remote system

Existem diferentes cenários de port scanning, um deles é conhecido como “tcp syn port scanning”, que estabelece um handshake de 3 vias completo.

Abaixo, encontra-se o código para implementar a conexão TCP com o host de destino a ser escaneado.

/*
    Port scanner code in c
*/
#include "stdio.h"
#include "sys/socket.h"
#include "errno.h"
#include "netdb.h"
#include "string.h"
#include "stdlib.h"
#define MAX_INT 32767
int main(int argc , char **argv)
{
  struct hostent *host;
  int err, i , sock ,start , end;
  char hostname[MAX_INT];
  struct sockaddr_in sa;
  char port 
  //Get the hostname to scan
  printf("Enter hostname or IP : ");
  gets(hostname);
     
  //Get start port number
  printf("\nEnter start port number : ");
  //To Handle the Input
  int data;
  data = scanf("{c099edf605f8dfb42c24e5cce1017fa15302bbf1f3554bee2dc387b049b553c5}d",&start);
  if(start == EOF){
  printf("Invalid Port Number");
  exit();
  }     
  //Get end port number
  printf("Enter end port number : ");
  int data2 = scanf("{c099edf605f8dfb42c24e5cce1017fa15302bbf1f3554bee2dc387b049b553c5}d" , &end);
  if(data2 == EOF){
  printf("Invaid Port Number");
  exit();
  }
  //Initialise the sockaddr_in structure
  strncpy((char*)&sa , "" , sizeof sa);
  sa.sin_family = AF_INET;
     
  //direct ip address, use it
  if(isdigit(hostname[0])){
    printf("Doing inet_addr...");
    sa.sin_addr.s_addr = inet_addr(hostname);
    printf("Done\n");
  }
  //Resolve hostname to ip address
  else if( (host = gethostbyname(hostname)) != 0){
   printf("Doing gethostbyname...");
   strncpy((char*)&sa.sin_addr , (char*)host->h_addr , sizeof sa.sin_addr);
   printf("Done\n");
  }
    else{
      herror(hostname);
      exit(2);
    }
     
  //Start the port scan loop
  printf("Starting the portscan loop : \n");
  for( i = start ; i <= end ; i++) 
  {
      //Fill in the port number
      sa.sin_port = htons(i);
      //Create a socket of type internet
      sock = socket(AF_INET , SOCK_STREAM , 0);
       
      //Check whether socket created fine or not
      if(sock < 0) 
      {
          perror("\nSocket");
          exit(1);
      }
      //Connect using that socket and sockaddr structure
      err = connect(sock , (struct sockaddr*)&sa , sizeof sa);
       
      //not connected
      if( err < 0 )
      {
          //printf("{c099edf605f8dfb42c24e5cce1017fa15302bbf1f3554bee2dc387b049b553c5}s {c099edf605f8dfb42c24e5cce1017fa15302bbf1f3554bee2dc387b049b553c5}-5d {c099edf605f8dfb42c24e5cce1017fa15302bbf1f3554bee2dc387b049b553c5}s\r" , hostname , i, strerror(errno));
          fflush(stdout);
      }
      //connected
      else
      {
          printf("{c099edf605f8dfb42c24e5cce1017fa15302bbf1f3554bee2dc387b049b553c5}-5d open\n",  i);
      }
      close(sock);
  }
     
  printf("\r");
  fflush(stdout);
  return(0);
}

Como rodar o programa:

Primeiro, compile o código usando o gcc. É simples.
# gcc portscanner.c
Agora rode o programa e informe os dados necessários:
# ./a.out
Informe o hostname ou IP : google.com
Informe o número da porta inicial : 75
Informe o número da porta final: 85
Doing gethostbyname…Done
Starting the portscan loop :
80 open
#

O programa acima escaneou o host informado (no caso, google.com), da porta 75 até a porta 85, e achou apenas a porta 80 aberta, que é a porta do serviço de webserver.

Postagem traduzida daqui.

Deixe seu comentário