Port scanner

Hav0c

Power Member
Eu ontem estava um bocado aborrecido, por isso tentei criar um port scanner em perl. Depois, decidi fazer um em C, mas por alguma razão, so consigo apanhar apenas a primeira porta na versão em C.
Aqui estão os códigos:

ipscan.pl
Código:
#!/usr/bin/perl

use IO::Socket;

if(@ARGV != 1){
    print "Hav0c\'s ports scanner\nUsage: $0 [host]\n";
    exit 1;
}
for($i = 0; $i <= 65535; ++$i){
    $host = IO::Socket::INET->new(PeerAddr=>$ARGV[0],PeerPort=>$i,proto=>'tcp') and print "Port $i is open\n";
}
exit;
A versão em C:
Código:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

int main(int argc,char *argv[])
{
    int sock, port;
    struct sockaddr_in host;
    struct hostent *server;
    if(argc != 2){
        printf("Hav0c\'s port scanner\nUsage: %s [host address]\n",argv[0]);
        return 1;
    }
    if((sock = socket(AF_INET,SOCK_STREAM,0)) == -1){
        perror("Error creating socket");
        return 1;
    }
    if((server=gethostbyname(argv[1])) == NULL){
        perror("Error resolving host");
        return 1;
    }
    for(port = 0; port <= 65535; port++){
        host.sin_family = AF_INET;
        host.sin_port = htons(port);
        host.sin_addr = *((struct in_addr *)server->h_addr);
        if(connect(sock,(struct sockaddr *)&host,sizeof(host)) != -1){
            printf("Port %d is open\n",port);
            continue;
        }
    }
    return 0;
}
O quê que se passa com esse codigo?
 
apanhas a primeira porta aberta, ou para na primeira porta que pesquisa ?

Não terás de fechar o socket primeiro ?

So apanho a primeira (nem sequer está programado para apanhar uma porta especifica, apenas todas as portas abertas entre 0 e 65535).

Mas vou experimentar criar uma função que abre e fecha o socket cada vez que uma porta é encontrada. Alias, agora que penso nisso, vejo que me esqueci de fechar o socket no final do código.
 
agora criei este novo codigo, mas quando vou executa-lo obtenho o seguinte:
havoc@latency:~/Desktop/port scanner$ ./compiled localhost
Error resolving host: Too many open files
Error creating socket: Too many open files

aqui está o codigo:
Código:
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>

int ipscan(int port, char *IP[])
{
    int sock;
    struct sockaddr_in address;
    struct hostent *host;
    if((sock = socket(AF_INET,SOCK_STREAM,0)) == -1){
        perror("Error creating socket");
        return 2;
    }
    if((host = gethostbyname(IP)) == NULL){
        perror("Error resolving host");
        return 2;
    }
    address.sin_family = AF_INET;
    address.sin_port = htons(port);
    address.sin_addr = *((struct in_addr*)host->h_addr);
    if(connect(sock,(struct sockaddr*)&address,sizeof(address)) == -1){
        return 1;
    }else{
        return 0;
    }
    close(sock);
}

int main(int argc, char *argv[])
{
    int i;
    if(argc != 2){
        printf("Usage: %s [host]\n",argv[0]);
        return 1;
    }
    for(i = 0;i <= 65535; i++){
        if(ipscan(i,argv[1]) == 0){
            printf("Port %d is open\n",i);
        }
        else if(ipscan(i,argv[1]) == 2){
            break;
            return 1;
        }
    }
    return 0;
}
 
ok, finalmente consegui resolver o problema :) :

Código:
#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>

int ipscan(int port, char *IP)
{
    int sock;
    struct sockaddr_in serv_addr;
    struct hostent *host;
    sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock == -1){
        perror("Error creating socket");
        return 1;
    }
    if((host=gethostbyname(IP)) == NULL){
        perror("Error resolving host");
        return 1;
    }
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(port);
    serv_addr.sin_addr = *((struct in_addr*)host->h_addr);
    if(connect(sock,(struct sockaddr_in *)&serv_addr,sizeof(serv_addr)) == -1){
        close(sock);
        return 2;
    }else{
        close(sock);
        return 0;
    }
}

int main(int argc,char *argv[])
{
    int i;
    if(argc != 2){
        printf("Hav0c\'s port scanner\nUsage: %s (host IP]\n",argv[0]);
        return 1;
    }
    for(i = 0; i <= 65535; i++){
        if(ipscan(i,argv[1]) == 0){
            printf("Port %d is open\n",i);
        }
        else if(ipscan(i,argv[1]) == 1){
            break;
        }
    }
    return 0;
}

[edit]: Ja agora, desculpem por fazer estes posts todos
 
Back
Topo