ПРОСТЕЙШИЙ СКАНЕР

изучаем исходник scan.c

Спецвыпуск Xakep, номер #023, стр. 023-052-1


Рваный нерв

Ну что стоит настоящему хакеру быстренько налабать программку простейшего сканера портов? Лень? Ну вот и нам тоже ЛЕНЬ! Поэтому как настоящие разленившиеся раздолбаи мы заходим по адресу: http://cs.baylor.edu/~donahoo/NIUNet/portscan.html и качаем оттуда файл scan.c с готовым сканером. Еще нам понадобиться файл listofports.dat с описанием портов (брать там же).

КАК ЗАПУСТИТЬ ПРОСТЕЙШИЙ СКАНЕР?

Мы откомпилили эту программу под Linux с ядром 2.4Х. Для этого надо набрать:

> gcc –o ./scan ./scan.c

После компиляции получившемуся бинарнику надо выставить атрибуты запускаемого файла:

> chmod +x ./scan

После этого можно запускать сканер, для этого укажи айпишник или доменное имя жертвы:

> ./scan 127.0.0.1

Таким образом, мы просканили самих себя. Сканер выдал нам порты, которые были открыты в нашей системе. А для того, чтобы посканить доменное имя плохого хоста можно запустить сканер так:

> ./Scan www.plohoy_host.ru

Вот и все, что нужно начинающему юниксойду, чтобы скомпелить и испытать свой сканер. Три строчки и ты можешь чувствовать себя богом!

МАЛЕНЬКИЙ БАГ!

Куда бы мы девались без багов? В коде этой программы был маленький баг: вместо файла listofports.dat программа обращается к файлу listoports.dat. Это легко лечится, если переименовать файл с описанием портов, удалив букву "f". Либо можно изменить код программы, добавив профуканное "f" в имя файла.

КАК РАБОТАЕТ ПРОСТЕЙШИЙ СКАНЕР?

Простейший сканер засасывает в себя айпишник жертвы и поочередно пытается открыть все порты из списка. Список портов находится в файле listofports.dat. Если порт открывается, то сканер выводит описание этого порта, которое тоже берет из списка портов. Порт, который удалось открыть сканер выводит на экран.

Можно задать программе доменное имя в виде www.plohoy_host.ru, тогда программа перед подключением запросит айпишник жертвы у сервера DNS.

Чтобы программа была, как можно меньше в ней использованы указатели. Чтобы лучше вникнуть в суть этой программы тебе придется разобраться с указателями. С помощью указателей мы записываем содержимое файла со списком портов в память в виде дерева. С помощью тех же указателей мы достаем нужные номера портов и описание к ним.

Указатель указывает на место в дереве, где лежит нужная информация, в этом вся его особенность. То есть нам не приходиться заморачиваться с перебором массивов и переменными, мы просто двигаем указатель по дереву.

ЛИСТИНГ ФАЙЛА SCAN.C с подробными комментариями.

/* Подключаем необходимые библиотеки */

#include <stdio.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <errno.h>

#include <unistd.h>

#include <signal.h>

#include <string.h>

#include <netdb.h>

#define MARK '/'

/* Вот так с места в карьер мы начинаем главную функцию программы. Во время запуска программы ты можешь передать цифры целого типа, или строку символьного типа. */

void main(int argc, char *argv[])

{

/* Объявление переменных, используемых в сканировании портов */

int probeport = 0;

struct hostent *host;

Содержание  Вперед на стр. 023-052-2