Сканирование портов является одним из самых распространенных и простых
способов узнать, какая операционная система установлена на компьютере,
какие службы
запущены в данный момент и получить другую информацию о компьютере,
подключенном к Internet , которая может быть использована для взлома и
проникновения.
Существует много программ для обнаружения сканирования портов. Но обнаружения
не достаточно. "Должна последовать адекватная реакция"(с)В.В.Путин.
"Адекватная реакция" может заключаться в отправке в сторону сканирующего
тебя человека неправильного фрагментированного пакета, ответного сканирования
портов, установки на него firewall'а и т.д. Также желательно, чтоб
он получил недостоверную информацию об открытых портах на твоем компьютере.
Все это и
многое другое позволяет делать прекрасная программа Psionic
Software Portsentry.
Основные возможности Portsentry:
обнаруживает
практически все известные виды сканирования Unix-машин: TCP connect(),
SYN/half-open, Null, XMAS и т.д.
в реальном времени блокирует хост
сканировщика посредством установленного на атакуемом компьютере firewall'а
(для Linux 2.2.x - ipchains),
команду запуска которого можно
задать в файле конфигурации.
записывает в логи посредством
syslogd информацию об атаке.
вызывает любую указанную
тобой в файле конфигурации программу, в ответ на сканирование или подключение
к защищенному portsentry порту,
параметрами программы могут являтся
IP-адрес атакующего хоста и атакуемый порт.
Portsentry в исходниках можно бесплатно скачать на сайте Psionic
Software. На момент написания данной статьи последней версией программы
была 1.0.
Скачать можно здесь.
После того, как скачаешь, распакуй сохраненный файл.
tar xfz portsentry-1.0.tar.gz
В текущем каталоге появится директория portsentry-1.0. Она должна содержать
следующие файлы:
CHANGES - история изменений программы от версии к версии
CREDITS - файл с благодарностями всем кто помог в создании или тестировании
программы
LICENSE - лицензия
Makefile - без комментариев...:)
README.COMPAT - список операционных систем на которых тестировалась
работа программы
README.install - инструкция по установке и настройке
README.methods - описание различных методов защиты портов
README.stealth - описание обнаруживаемых методов Stealth-сканирования
ignore.csh - скрипт для автоматического создания файла portsenry.ignore
- для компьютеров, не имеющих постоянного IP-адреса, может быть включен,
например,
в файл /etc/ppp/ip-up
portsentry.c - часть исходника программы
portsentry.conf - файл конфигурации
portsentry.h - часть исходника программы
portsentry.ignore - файл с IP-адресами компьютеров, чье подключение
к закрытым портам не должно блокироваться. По умолчанию содержит 127.0.0.1
и 0.0.0.0
portsentry_config.h - часть исходника программы, содержащая различные
опции конфигурации
portsentry_io.c - часть исходника программы
portsentry_io.h - часть исходника программы
portsentry_tcpip.h - часть исходника программы
portsentry_util.c - часть исходника программы
portsentry_util.h - часть исходника программы
Первым делом загляни в portsentry_config.h. В нем содержатся пути к
файлам конфигурации и другие параметры работы.
/* Путь к конфигурационному файлу. Если ты изменил его - не забудь сделать
то же самое в Makefile */
#define CONFIG_FILE "/usr/local/psionic/portsentry/portsentry.conf"
/* Путь к файлу hosts.deny для tcpwrapper'а. Обычно он находится в
/etc */
#define WRAPPER_HOSTS_DENY "/etc/hosts.deny"
/* Устанавливает тип логов для syslogd*/
#define SYSLOG_FACILITY LOG_DAEMON
/* Устанавливает уровень значимости логов syslogd*/
#define SYSLOG_LEVEL LOG_NOTICE
/* Максимальное количество запоминаемых для проверки повторного подключения
хостов */
#define MAXSTATE 50
Какие типы и уровни значимости логов бывают, можно посмотреть, набрав
man 3 syslog. CONFIG_FILE можно изменить на что-нибудь типа
/etc/portsentry.conf. Но лучше оставь как есть, так как придется также
менять и Makefile, в котором указано, что файл конфигурации и файл программы
копируется в один и тот же каталог. Проверь, есть ли у тебя в /etc
файл hosts.deny. В большинстве дистрибутивов он там и находится. Если в
другом
месте - измени значение WRAPPER_HOSTS_DENY. Поподробнее о hosts.deny
можно почитать, набрав man hosts.deny. Значение MAXSTATE
зависит только от того, как часто ты перегружаешь свой компьютер, так
как данные о подключавшихся хостах уничтожаются при каждой загрузке программы.
После того, как закончишь с portsentry_config.h, можно будет изменить
Makefile. Менять здесь можно только INSTALLDIR и CHILDDIR,
остальное лучше оставить неизменным. По умолчанию INSTALLDIR равен
/usr/local/psionic, а CHILDDIR - /portsenry. Таким образом программа
и файлы конфигураций будут копироватся в /usr/local/psionic/portsentry.
Теперь можешь смело набрать:
make linux
для того, чтоб откомпилировать программу под Linux. Если компиляция
прошла нормально, можно набрать:
make install
из-под root'а для установки Portsentry.
Если ты не менял путь для установки, то у тебя в /usr/local должен появится
каталог psionic, в котором есть директория portsentry, содержащая
три файла: portsentry - сама программа, portsentry.conf и portsentry.ignore.
Теперь ты можешь настроить работу Portsentry по своему усмотрению. Файл
portsentry.conf содержит директивы конфигурации следующего формата:
ОПЦИЯ="значение"
Опции поддерживаются такие:
TCP_PORTS
Здесь через запятую перечисляются
TCP-порты, которые проверяются Portsentry. При подключении к ним, Portsentry
записывает в информацию об
этом в логи, затем выполняет команду,
заданную пользователем, после этого блокирует хост посредством ipchains.
Опция используется при работе в
режиме Classic
и Enhanced Stealth
Scan Detection Mode. Желательно всегда оставлять порт 1 открытым, т.к.
большинство сканировщиков портов начинают
проверять с 1 и далее. Это способствует
более быстрому обнаружению сканирования. TCP-порты, открытые другими программами
(25 при загруженном
sendmail, 80 при загруженном httpd
и т.д.) в этот список включатся не должны.
TCP_PORTS="1,11,15,79,111,119,143,540,635"
UDP_PORTS
То же что и TCP_PORTS, но для
UDP-портов.
UDP_PORTS="1,7,9,69,161,162,513,635,640,641"
ADVANCED_PORTS_TCP
Значение этой опции определяет
верхнюю границу множества TCP-портов, которые проверяются Portsentry при
работе в режиме Advanced
Stealth Scan
Detection
Mode. Нижней границей является 1, т.е. при значении ADVANCED_PORTS_TCP
равное 1024 проверяется подключение к любому порту в
промежутке от 1 до 1024.
ADVANCED_PORTS_TCP="1023"
ADVANCED_PORTS_UDP
То же, что и ADVANCED_PORTS_TCP,
но для UDP-портов.
ADVANCED_PORTS_UDP="1023"
ADVANCED_EXCLUDE_TCP
TCP-порты, которые исключаются
из промежутка 1..ADVANCED_PORTS_TCP, т.е. из списка портов, предназначенных
для проверки. Здесь обязательно нужно
перечислить TCP-порты, открытые
работающими программами.
ADVANCED_EXCLUDE_TCP="23,25,80,110,113,139"
ADVANCED_EXCLUDE_UDP
То же, что и ADVANCED_EXCLUDE_TCP,
но для UDP-портов.
ADVANCED_EXCLUDE_UDP="520,138,137,67"
IGNORE_FILE
Имя и путь к файлу с IP-адресами
хостов, которые не блокируются при подключении к порту, проверяемому Portsentry.
IGNORE_FILE="/usr/local/psionic/portsentry/portsentry.ignore"
HISTORY_FILE
Имя и путь к файлу с историей
работы Portsentry. В файл записывается время блокирования, имя и IP хоста,
атакованный порт, протокол (TCP или
UDP). Файл не создается заново
при каждом запуске.
HISTORY_FILE="/usr/local/psionic/portsentry/portsentry.history"
BLOCKED_FILE
Строка, из которой формируется
имя и путь к файлам, куда записывается информация о блокированных хостах.
Имя файла формируется так
BLOCKED_FILE.РЕЖИМ_РАБОТЫ, где
режим работы может быть tcp,
udp, stcp,
sudp, atcp,
audp, т.е.
если BLOCKED_FILE равен
/usr/local/psionic/portsentry/portsentry.blocked,
а режим работы audp,
то имя файла будет
/usr/local/psionic/portsentry/portsentry.blocked.audp.
BLOCKED_FILE="/usr/local/psionic/portsentry/portsentry.blocked"
BLOCK_TCP
Эта опция в зависимости от значения,
задает ответную реакцию Portsentry на сканирование портов: 0 - не блокировать
хост, не запускать заданную
пользователем команду, 1 - блокировать
хост и запустить команду, 2 - только запустить заданную команду. Команда
задается при помощи опции
KILL_RUN_CMD.
BLOCK_TCP="1"
BLOCK_UDP
То же, что и BLOCK_TCP, но для
UDP.
BLOCK_UDP="1"
KILL_ROUTE
Эта опция задает команду, которую
надо выполнить для блокирования атакующего хоста, установив на него firewall
или удалив его сетку из таблицы
роутинга. Для указания IP-адреса
используется переменная $TARGET$. Переменная $PORT$ используется для указания
порта, к которому было подключение.
KILL_ROUTE="/sbin/ipchains -I input -s $TARGET$ -j DENY -l"
KILL_HOSTS_DENY
Эта опция задает строку, которая
вписывается в /etc/hosts.deny, для блокирования доступа к сервисам, запускаемым
через inetd.
KILL_HOSTS_DENY="ALL: $TARGET$"
KILL_RUN_CMD
С помощью этой опции можно определить
команду, запускаемую до блокирования хоста. Можно поставить туда отправку
e-mail'а администратору или запуск
нюка в сторону сканировщика.:)
KILL_RUN_CMD="teardrop 192.168.0.1 $TARGET$ -s $PORT$ -t 139 -n 5000"
SCAN_TRIGGER
Данная опция задает количество
разрешенных подключений к проверяемым Portsentry портам одного и того же
хоста, прежде, чем Portsentry
начнет действовать. 0 определяет
немедленную реакцию.
SCAN_TRIGGER="0"
PORT_BANNER
Задает сообщение, которое будет
выводится при подключении к проверяемому Portsentry порту. Автор Portsentry
Craig H. Rowland в инструкции
по установке пишет, что не рекомендует
вставлять туда какое либо сообщение, т.к. это может разозлить или раззадорить
сканировщика и подтолкнуть его
к дальнейшим действиям. Решать
тебе...:)
PORT_BANNER="** UNAUTHORIZED ACCESS
PROHIBITED *** YOUR CONNECTION ATTEMPT HAS BEEN LOGGED. GO AWAY."
Пример portsentry.conf:
TCP_PORTS="1,11,15,79,111,119,143,540,635,1080,1524,2000,5742,6667,12345,12346"
UDP_PORTS="1,7,9,69,161,162,513,635,640,641,700,32770,32771,32772,32773,32774"
ADVANCED_PORTS_TCP="1023"
ADVANCED_PORTS_UDP="1023"
ADVANCED_EXCLUDE_TCP="23,25,80,110,113,139"
ADVANCED_EXCLUDE_UDP="520,138,137,67"
IGNORE_FILE="/usr/local/psionic/portsentry/portsentry.ignore"
HISTORY_FILE="/usr/local/psionic/portsentry/portsentry.history"
BLOCKED_FILE="/usr/local/psionic/portsentry/portsentry.blocked"
BLOCK_UDP="1"
BLOCK_TCP="1"
KILL_ROUTE="/sbin/ipchains -I input -s $TARGET$ -j DENY -l"
KILL_HOSTS_DENY="ALL: $TARGET$"
KILL_RUN_CMD="echo Ports Scaning from $TARGET$ on $PORT$ | mail root"
SCAN_TRIGGER="0"
В файле portsentry.ignore ты должен перечислить IP-адреса компьютеров,
которые не должны быть блокированы программой при подключении к проверяемому
порту. По умолчанию, там содержится два IP-адреса: 127.0.0.1 и 0.0.0.0.
Запуск
Portsentry можно запускать в трех режимах для каждого протокола. Режимы
работу задаются в командной строке при вызове Portsentry. Одновременно
можно задать только один режим работы для одного протокола.
Classic
При работе в этом режиме Portsentry
открывает порты, указанные в TCP_PORTS или UDP_PORTS и ждет соединениния.
При попытке подключится
к такому порту происходит блокировка
удаленного хоста. В данном режиме работы Portsentry не реагирует на Stealth-сканирование.
Данный режим
работы задается опциями командной
строки: -tcp - для TCP-портов и -udp - для UDP-портов.
Enhanced Stealth Scan Detection
Этот режим используется для проверки
перечисленных в TCP_PORTS или UDP_PORTS портов на предмет подключения или
сканирования. Удобен тем,
что выявляет практически все виды
Stealth-сканирования, а не только сканирование подключением. Порты, в отличие
от режима Classic не держит
открытыми, поэтому сканировщик
получает достоверную информацию об открытых портах. Задается опциями командной
строки: -stcp - для TCP-портов и
-sudp - для UDP-портов.
Advanced Stealth Scan Detection
Этот режим используется для проверки
всех портов в промежутке от 1 до ADVANCED_PORT_TCP (для TCP) или ADVANCED_PORT_UDP
(для UDP).
Порты, открытые другими программами
и перечисленные в ADVANCED_EXLUDE_TCP(для TCP) или ADVANCED_EXCLUDE_UDP(для
UDP) исключаются
из проверки. Любой хост, попытавшийся
подключится к порту в этом промежутке, тут же блокируется. Самый удобный
для использования метод, т.к.
реакция на сканирование или подключение
у этого метода самая быстрая, а также Portsentry в этом режиме использует
меньше процессорного
времени, чем в других. Задается
опциями командной строки: -atcp - для TCP-портов и -audp - для UDP-портов.
Таким образом Portsentry может запускатся в следующих режимах:
/usr/local/psionic/portsentry/portsentry -tcp
Classic Mode для TCP-портов
/usr/local/psionic/portsentry/portsentry -udp
Classic Mode для UDP-портов
/usr/local/psionic/portsentry/portsentry -stcp
Enhanced Stealth Scan Detection
для TCP-портов
/usr/local/psionic/portsentry/portsentry -sudp
Enhanced Stealth Scan Detection
для UDP-портов
/usr/local/psionic/portsentry/portsentry -atcp
Advanced Stealth Scan Detection
для TCP-портов
/usr/local/psionic/portsentry/portsentry -audp
Advanced Stealth Scan Detection
для UDP-портов
Ты можешь добавить вызов Portsentry в /etc/rc.d/rc.local или создать
для него отдельный скрипт запуска в /etc/rc.d/init.d/. Можно
запускать его только при подключении к Internet, добавив вызов в /etc/ppp/ip-up,
а при отключении - выгружать, добавив что-нибудь типа killall
-9 portsentry в /etc/ppp/ip-down.
Заключение
Установка и настройка, как и использование Portsentry очень просты.
Но расположение файлов не совсем удачное, на мой взгляд. Я немного изменил
исходники, изменил Makefile, создал SysV Init - скрипт для запуска.
Теперь файлы portsentry.conf и portsentry.ignore копируются в /etc, сама
программа в /usr/sbin, а файлы portsentry.history и portsentry.blocked.*
создаются в /var/log/portsentry. В /etc/rc.d/init.d
создается скрипт запуска portsentry. Этот вариант Portsentry можно
скачать здесь. Там также
есть RPM и SRPM.
(c)Ерижоков А.А., 2000.
Использование данного документа разрешено только с согласия автора
и с указанием первоисточника: DH's Linux
Site