12 Июля, 2019

Сканнер портов написанный на Си

Денис Забияко
Использование:
./ihgps <-h host> [-l logfile] [-t n] - scan one host./ihgps <-f hostfile> [-l logfile] [-t n] - scan from listhost - сканируемый хост
logfile - файл, куда будут записываться результаты сканирования, если не указан - результаты сканирования направляются на стандартный вывод, т.е. на терминал.
n - таймаут в секундах. Если в течение n секунд не удается законнектиться на порт он считается закрытым, это происходит в том случаи, если данный порт закрыт файрволом. По умолчанию установлено 5 секунд. Если у вас слабый диалап ставьте больше, если запускаете на шелле с хорошим каналом - достаточно 1 секунды.
hostfile - сканирование из файла со списком хостов или ip, записанных в столбик - на каждой строчке по одному хосту.

/*
* IHG Port Scaner v1.2 bY Serega[Linux]
* mailto:linux@ihgroup.ru
* http://www.ihgroup.ru
*/

#include <ctype.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#define MAX 200 /* for fgets */
#define line fprintf(output, "-----------------------------
");

void time_out(int sig);
int sockfd;
int timeout=5; /* 5 sec - default */
unsigned long int ip_addr;
struct sockaddr_in server;
int cur_port;
FILE *output;
char *host, *in_file, *out_file;

show_banner(int port)
{
char buf[1024]="";
server.sin_port = htons(port);
cur_port = port;
if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
{
perror ("socket error");
exit (1);
}

alarm(timeout); /* connect timer */
signal(SIGALRM, (void *)&time_out);

if (connect (sockfd, (struct sockaddr*)&server, sizeof(server)) == 0)
{

if (port !=21 && port !=22 && port !=25 && port !=110 && port !=109 && port !=143)
fprintf(output, "[%d] OPEN :

", port);

else {
fprintf(output, "[%d] OPEN : ", port);
alarm(0); /* reset timer */
read (sockfd, buf, 1024);
fprintf(output, "%s
", buf);
}
} else close(sockfd);

close(sockfd);
}

usage(char *a)
{
logo();
fprintf(stderr, "usage: --->
%s <-h host> [-l logfile] [-t n] - scan one host
%s <-f hostfile> [-l logfile] [-t n] - scan from list

n - timeout in sec (default 5 sec)
logfile - file for logs (default stdout)
host - ip or hostname
hostfile - path to list
exaple:
[ser@r00t prog]$ %s -f list -l log -t 2
", a, a, a);
exit(1);
}

logo()
{
printf("-----------------------------
IHG Port Scaner v1.2 bY Serega[Linux]
mailto:linux@ihgroup.ru
www.ihgroup.ru
-----------------------------

");

}

fatal(char *c)
{
perror©;
exit(1);
}

void time_out (int sig)
{
fprintf(output, "[%d] FILTERED :

", cur_port);
close(sockfd);

}


get_host(char *file) /* get host from list (return hostname) */
{
FILE *list;
char buf[50];
if ((list=fopen(file, "r")) == NULL)
fatal(file);
while (fgets(buf, MAX, list) != NULL) {

if (out_file != NULL) output=fopen(out_file, "a+");
if(buf[strlen(buf)-1]=='
')
buf[strlen(buf)-1]=0;
if (resolv(buf) == 0) {
fprintf(output, "%s : Resource temporarily unavailable
", buf); /* fuck stderr */
line
continue;
}
fprintf(output, "Open ports on [%s]

", buf);
ports();
if (out_file != NULL) fclose(output);
}
exit(0);
}


ports()
{
show_banner(21);
show_banner(22);
show_banner(23);
show_banner(25);
show_banner(79);
show_banner(80);
show_banner(109);
show_banner(110);
show_banner(111);
show_banner(143);
show_banner(801);
line
}


resolv(char *ip)
{
struct hostent *h;
unsigned long int rv;
server.sin_family = AF_INET;
if ((h=gethostbyname(ip)) == NULL) return(0);

if(h!=NULL)
memcpy(&rv,h->h_addr,h->h_length);
else
rv=inet_addr(ip);
server.sin_addr.s_addr = rv;
}


main(int argc, char **argv)
{
int i;
if (argc < 3) usage(argv[0]);
for(i = 1; i <= argc; i++)
if(argv == NULL) { }
else if (!strcmp(argv, "-h") )
{
host=argv[i+1];
}
else if (!strcmp(argv, "-f") )
{
in_file=argv[i+1];
}
else if (!strcmp(argv, "-l") )
{
out_file=argv[i+1];
}
else if (!strcmp(argv, "-t") )
{
timeout=atoi(argv[i+1]);
}

if (host==NULL && in_file==NULL) usage(argv[0]);
if (host!=NULL && in_file!=NULL) usage(argv[0]);


if (out_file != NULL)
output=fopen(out_file, "a+");
else output=stdout;

if (host != NULL)
if (resolv(host) == 0) {
fprintf(output, "%s : Resource temporarily unavailable
", host);
line
exit(1);
} else {
fprintf(output, "Open ports on [%s]

", host);
ports();
exit(0);
}
if (in_file != NULL)
get_host(in_file);


}