PDA

Просмотр полной версии : Пишем примитивный сканер портов


Весёлый Молочник
18.05.2008, 15:18
TCP сканирование подключением.

Самый простой и старый способ проверить открыт порт или нет. Мы с вами напишем простой сканер на С для Linux.

При таком способе сканирования сканер проводит полностью процедуру подключения (handshake) SYN, SYN/ACK и ACK. Для выполнения такого соединения существует функция connect() и возвращает 0 если соединение выполнено успешно, т.е. порт открыт.

Если это так то мы вызываем функцию getservbyport() которая возвращается информацию о службе, работающей на данном порту.

Функция getservbyport() возвращает структуру типа servent, в которой поле s_name содержит официльное имя службы. Если эта функция вернёт , значит она не смогла определить службу работающюю на этом порту. Тогда мы выводим напротив номера порта (unknown).

В первом аргументе вводим адрес сканируемого хоста, во втором с какого порта начинать сканирование в третьем до какого порта сканировать.

Компилируем стандартным образом:
#gcc tcpscan.c -o tcpscan

anton@anton-laptop:~$ ./tcpscan smilex.8-12.ru 80 80
Running scan…
Open: 80 (www)

Вот сам исходник сканера.

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>

int main(int argc, char *argv[])
{
int sd;
struct hostent* hp;
struct sockaddr_in servaddr;
struct servent *srvport;
int port, portlow, porthigh;

if (argc != 4) {
fprintf(stderr, “Usage: %s <address> <portlow> <porthigh>\n”, argv[0]);
exit(-1);
}

hp = gethostbyname(argv[1]);
if (hp == NULL) {
herror(”gethostbyname() failed”);
exit(-1);
}

portlow = atoi(argv[2]);
porthigh = atoi(argv[3]);

fprintf(stderr, “Running scan…\n”);

for (port = portlow; port <= porthigh; port++)
{
if ( (sd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
perror(”socket() failed”);
exit(-1);
}

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
servaddr.sin_addr = *((struct in_addr *)hp->h_addr);

if (connect(sd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == 0) {
srvport = getservbyport(htons(port), “tcp”);
if (srvport == NULL)
printf(”Open: %d (unknown)\n”, port);
else
printf(”Open: %d (%s)\n”, port, srvport->s_name);
fflush(stdout);
}
close(sd);
}
printf(”\n”);

return 0;
}

Скачать можно с моего репозитория svn://it.icmp.ru:5557/milkyway
Там помимо этого храниться исходники Linux и видео плеер на Java.

Обсудить здесь (http://linux.ya1.ru/forum/index.php?topic=41.0).

Весёлый Молочник
18.05.2008, 20:33
Программа для сканирования открытых портов на удалённой машине. Зачем это надо?
Ммм... попробую аналогию провести, перед атакой не плохо отправить разведчиков посмотреть где враг и что там и как. Это и есть разведчик.

lsmod
19.05.2008, 00:46
aptitude install nmap
man nmap

Весёлый Молочник
19.05.2008, 11:44
nmap пишут професионалы и уже не один год. =)
Вот посмотри его исходники, что нибудь понимаешь? Сомневаюсь, для этого как раз и тот сканер для расширения кругозора и для того, что бы понять сам принцип работы.

lsmod
19.05.2008, 13:39
Мой пост был репликой на ваш вот этот:
Программа для сканирования открытых портов на удалённой машине.Зачем это надо?
Ммм... попробую аналогию провести, перед атакой не плохо отправить разведчиков посмотреть где враг и что там и как. Это и есть разведчик.
Если есть необходимость именно просканировать порты, то лучше использовать проверенный и качественный инструментарий, nmap, например.

Относительно программирования я не говорил ничего, соответственно.

P.S. nmap это, скорее, инструмент администратора сети, а не взломщика... точнее - как молоток: можно гвозди забивать, можно головы проламывать, зависит от человека. Но инструмент очень полезный, полезно сканировать время от времени и порты на своём компьютере.

Весёлый Молочник
19.05.2008, 14:48
Я ответил на другой пост, его сейчас удалили. Ламер спрашивал что это такое. Я ответил образно.

kilabot
19.05.2008, 22:49
Ламер спрашивал что это такое.

Ламер. Что ж так грубо? Вежливее надо быть друг к другу.

Весёлый Молочник
19.05.2008, 23:49
Ламер это не оскарбление, просто констатация факта. Значит человек в этой области ничего не понимает, но в другой области может и даст фору мне и любому другому.

Pandemonium
20.05.2008, 02:58
Весёлый Молочник, а зачем такое публиковать здесь?

Весёлый Молочник
20.05.2008, 10:21
Мало ли, может кому интересно.

kilabot
20.05.2008, 10:52
Весёлый Молочник, а зачем такое публиковать здесь?

Согласен
Мало ли, может кому интересно.
Ведь у тебя же есть свой сайт (http://linux.ya1.ru/).

Весёлый Молочник
20.05.2008, 13:56
Вот лишь бы поспорить, делать больше нечего? В правилах запрещено? Хочу и публикую. А если аргументировано то здесь людей больше обитает вот и всё.

kilabot
20.05.2008, 13:57
Вот лишь бы поспорить, делать больше нечего? В правилах запрещено? Хочу и публикую. А если аргументировано то здесь людей больше обитает вот и всё.

Извини, не обижайся.