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

postimages/926/5358/full/354954.jpg

SYN- сканирование

В прошлый раз мы использовали сканирование с полной процедурой установления соединения. (handshake)

Сейчас мы с вами реализуем так называемое скрытное (stealth) сканирование. А по научному TCP- сканирование с помощью сообщений SYN (TCP SYN scan), сканирование с незавершённым открытием сеанса (half-open scanning), т.к. при данном типе сканирования полное TCP-соединение не устанавливается.
Вместо этого на исследуемый порт отправляется только сообщение SYN. Получение в ответ сообщения SYN/ACK означает, что данный порт, находиться в режиме ожидания запросов, то есть открыт. Получив ответ, наш сканер отправляет сканируемой машине сообщение RST/ACK (сбросить соединение).
А скрытым (stealth) это сканирование называют потому, что многие системы не регистрируют в системном журнале, такой метод сканирования.

Вводная часть закончилась, теперь рассмотрим принцип реализации. В данном случае функция connect() нам не подходит, т.к. выполняет полную процедуру установки соединения. Поэтому нам ничего другого не остаётся как самим заполнить TCP- заголовок.
IP-заголовок заполнять не будем, пусть это за нас сделает IP-подсистема.
Для расчёта контрольной суммы в TCP-заголовке задействуется псевдозаголовок.
В псевдозаголовке надо заполнить поле IP-адреса источника (unsigned int source_adress). Чтобы не требовать от пользователя указывать локальный IP-адрес, мы определяем его программно с помощью следующего кода:

#define DEVICE “eth0″
struct ifreq *ifr;
struct sockaddr_in source;


Этот код определяет IP-адрес только на интерфейсе eth0. Так что если используются другие интерфейсы, например, ppp0, le0, lo0 и пр. придётся переписать эту часть. А вообще по правильному нужно получить список всех интерфейсов с помощью ioctl() с параметром SIOCGIFCONF.


В заголовке отправляемого TCP-пакета мы устанавливаем флаг SYN (tcp_hdr.syn = 1), а в принимаемом пакете проверяем флаги SYN и ACK (tcphdr->syn == 1 && tcphdr->ack == 1). Если оба флага установлены, значит данный порт открыт. Для того, чтобы отделять пакеты, предназначенные для нашего процесса, мы заносим в поле номера потра отправителя TCP-заголовка отправляемого пакета PID текущего процесса (tcp_hdr.source = getpid()). В принимаемом пакете мы проверяем это значение (tcphdr->dest == getpid()). Проверяем порт номера получателя, а не отправителя.

Исходник слишком большой, можете скачать его у меня в репозитории с 9 ревизии или на http://linux.ya1.ru
  • просмотров: ~2616
  • рейтинг: ?

Комментарии (3)

Вы - anonymous, войти ?

можно использовать bbcode-теги
[b]жирный текст[/b]
[i]курсив[/i]
[u]underline[/u]
[s]зачеркнутый текст[/s]
[size=20px]размер шрифта[/size]
всякие изменения текста
[left][/left]
[right][/right]
[center][/center]
позиционирование элементов: картинки, текст и т.д
[url][/url]
[email][/email]
внутри тега [url] помещайте ссылки, а внутри [email] адрес электронной почты;
так же [url] можно использовать в виде:
[url=http://example.com]пример[/url],
[url=http://test.ru][img]http://flickr.com/givemeimg.png[/img][/url]
[code][/code]
[quote][/quote]
внутри тега [code] можно помещать программный код (подстветка попытается включиться автоматически); для выделения цитат используйте [quote]
также можно напрямую указать язык [code=cpp]int i;[/code]
[list][/list]
создаем списки, каждый элемент пишется после [*].

Можно указывать маркер - [list=marker].
возможные маркеры 1(decimal), i(lower-roman), I(upper-roman), a(lower-alpha), A(upper-alpha). Примеры:

[list][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[list=1][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[list=A][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[table][/table]
оформляем таблицу, используя внутренние теги [tr] и [td].
[tr] - строка, [td] - поле в строке,
[table=100%] - можно задавать ширину в процентах, по-умолчанию ширина 100%
[td=2] - можно задавать сколько столбцов входит в это поле. Пример:

[table=50%][tr][td]столбец 1[/td][td]столбец 2[/td][/tr][tr][td]значение 1[/td][td]значение 2[/td][/tr][tr][td=2]сразу 2 столбца[/td][/tr][/table]
[img][/img]
тег для вставки фото или картинок, мы любим картинки. Примеры использования:

[img]http://ya.ru/logo.png[/img],
[img=100x100px]http://ya.ru/logo.png[/img]
[img=fullimg.url]thumbimg.url[/img],
Пожалуйста загружайте картинки на наш сайт, либо вставляйте с бекбоновских ресурсов.
[video][/video]
Проигрывает видео, внутрь вставляем ссылки на видео, поддерживается Play.Ykt.Ru(нужно вставить ссылку на страницу с видео) и tv.ykt.ru(нужно вставить ссылку на адрес файла)