www.lissyara.su —> статьи —> FreeBSD —> Security —> PortSentry

PortSentry - средство противодействия сканированию портов

Автор: lissyara.


    Достали всякие малолетние придурки, сканящие порты да радостно брутфорсящие ssh... Ну правда достали. Порылся в инете нашёл пару решений. Самым толковым, на мой взгляд, оказалось PortSentry (сайт, к сожалению сдох - http://www.psionic.com/ ). Правда, в портах, оно водится.
/usr/home/lissyara/>cd /usr/ports
/usr/ports/>make search name='PortSentry'
Port: portsentry-1.1
Path: /usr/ports/security/portsentry
Info: Port scan detection and active defense
Maint: ports@FreeBSD.org
B-deps:
R-deps:
WWW:

/usr/ports/>cd /usr/ports/security/portsentry
/usr/ports/security/portsentry/>make && make install && make clean

После установки идём править конфиги:

/usr/ports/security/portsentry/>cd /usr/local/etc/
/usr/local/etc/>ls | grep portsentry
portsentry.conf.default
portsentry.ignore.default
/usr/local/etc/>
/usr/local/etc/>cp portsentry.conf.default portsentry.conf
/usr/local/etc/>cp portsentry.ignore.default portsentry.ignore
/usr/local/etc/>

Приводим конфиг программы - /usr/local/etc/portsentry.conf - к такому виду:

# TCP-порты которые должен слушать PortSentry - тут нельзя указывать
# порты, которые заняты приложениями - тока свободные. Проверить,
# что занято можно примерно так:
# sockstat | grep udp | grep -v 127.0.0.1 | awk '{print $6}' | sort | uniq -c
# или так, для tcp:
# sockstat | grep tcp | grep -v 127.0.0.1 | awk '{print $6}' | sort | uniq -c
TCP_PORTS="1,11,15,23,79,81,111,119,540,635,1080,1524,2000,5742,6667,8080,8085"
# UDP-порты для прослушивания
UDP_PORTS="1,7,9,69,513,635,640,641,700"

# Верхний порт диапазона, если используется метод
# Advanced Stealth Scan Detection Options - но я его не юзаю,
# по причине, что снаружи можно подключаться тока к
# ограниченному списку портов - поэтому слушать весь
# диапазон от 1 до 1024 просто бесполезно....
ADVANCED_PORTS_TCP="1024"
ADVANCED_PORTS_UDP="1024"
# порты исключаемые из прослушивания при работе в Адванцед моде
ADVANCED_EXCLUDE_TCP="113,139"
ADVANCED_EXCLUDE_UDP="520,138,137,67"

# Список игнорируемых хостов (как бы они себя не вели,
# и какие б действия не предпринимали, к ним не будут
# применяться меры противодействия)
IGNORE_FILE="/usr/local/etc/portsentry.ignore"
# Список хостов, которые были внесены в блэклист
# (история работы программы)
HISTORY_FILE="/usr/local/etc/portsentry.history"
# строка по которой строится имя файла куда писать
# заблокированные хосты
BLOCKED_FILE="/usr/local/etc/portsentry.blocked"

# резольвить IP хостов в имена, или нет. Рекомендуется не
# резольвить - лишняя нагрузка на сервер...
RESOLVE_HOST = "1"

# Какие телодвижения предпринимать при обнаружении сканирования:
# 0 = ничё не делать - некатит, такая опция :)
# 1 = заблокировать хост и запустить внешнюю команду
# 2 = только запустить внешнюю команду
BLOCK_UDP="1"
BLOCK_TCP="1"

# команда на блокирование хоста. я использую IPFW поэтому им и блокирую.
# а вообще рекомендую посмотреть пример конфига, котороый идёт с программой
# там есть и другие варианы, в частностью с помощью роутинга...
KILL_ROUTE="/sbin/ipfw add 2 deny all from $TARGET$:255.255.255.255 to any"

# Если поставить 1 то вначале запускается KILL_RUN_CMD а потом
# уже KILL_ROUTE, ну и наоборот если 0
KILL_RUN_CMD_FIRST = "0"
# Внешняя команда выполняемая при обнаружении сканирования портов,
# я написал скриптик, шлющий мне письмо...
KILL_RUN_CMD="/usr/script/work/scan_port_mail.sh $TARGET$ $PORT$"


# Сколько портов будет позволено отсканить прежде чем будет выполнено
# действие. 0 - реагирует сразу после первого же порта, 1 - на втором,
# 2 - на третьем, 3 - ....
SCAN_TRIGGER="0"

# Какой `баннер` вешать на порты слушаемые PortSentry. Вообще, это делать не
# рекомендуется, т.к. может разозлить нападающего...
#PORT_BANNER="*** YOUR CONNECTION ATTEMPT HAS BEEN LOGGED..."

И файл со списком игнорируемых хостов и сетей - /usr/local/etc/portsentry.ignore:

# Файл с игнорируемыми хостами для PortSentry
# Забиваются либо хосты, либо сеть/маска
# по одному на строчку.

127.0.0.1/32
0.0.0.0
192.168.20.0/24

Затем создаём директорию, где хранится указанный в конфиге скрипт

/usr/local/etc/>mkdir -p /usr/script/work/
/usr/local/etc/>cd /usr/script/work/
/usr/script/work/>touch scan_port_mail.sh
/usr/script/work/>chmod +x scan_port_mail.sh

Ну и пишем сам скрипт:

#!/bin/sh -xv
# оповещение по почте о попытках сканирования хостов

# вводим переменные:
main_e_mail="admin@lissyara.su"
attak_date="`date +%Y-%m-%d`"
attak_time="`date +%H:%M:%S`"
local_mashine="`uname -n`"

# достаём хост с которого сканили
hacker_IP=$1
scanned_port=$2

# определяем DNS-имя мудака
hacker_DNS=`host ${hacker_IP} | awk '{print $5}'`

# стругаем себе письмо
echo " какой-то придурок пытался сканить порты.
Имя машины: ${local_mashine}
Отсканеные порты: ${scanned_port}

Данные кулхацкера:
IP: ${hacker_IP}
DNS: ${hacker_DNS}

=======
Мудак заблокирован.
" | mail -s port_scanned_on_${local_mashine} ${main_e_mail}

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

# для сканируемых портов правила. Для TCP разбиты на
# две группы по причине, что ipfw не позволяет перечислять
# больше 10 портов за раз.
${FwCMD} add allow tcp from any to ${IpOut} \
1,11,15,23,79,81,111,119,540,635 via ${LanOut}
${FwCMD} add allow tcp from any to ${IpOut} \
1080,1524,2000,5742,6667,8080,8085 via ${LanOut}
${FwCMD} add allow udp from any to ${IpOut} \
1,7,9,69,513,635,640,641,700 via ${LanOut}

Перезапускаем файрволл командой:
/etc/>sh rc.firewall &

Запускаем PortSentry:
/usr/local/etc/>/usr/local/etc/rc.d/portsentry.sh start
portsentry (tcp udp)
/usr/local/etc/>

Сморим открытые порты:

/usr/local/etc/>sockstat | grep ports
root portsent 439 0 udp4 *:1 *:*
root portsent 439 1 udp4 *:7 *:*
root portsent 439 2 udp4 *:9 *:*
root portsent 439 3 udp4 *:69 *:*
root portsent 439 4 udp4 *:513 *:*
root portsent 439 5 udp4 *:635 *:*
root portsent 439 6 udp4 *:640 *:*
root portsent 439 7 udp4 *:641 *:*
root portsent 439 8 udp4 *:700 *:*
root portsent 437 0 tcp4 *:1 *:*
root portsent 437 1 tcp4 *:11 *:*
root portsent 437 2 tcp4 *:15 *:*
root portsent 437 3 tcp4 *:23 *:*
root portsent 437 4 tcp4 *:79 *:*
root portsent 437 5 tcp4 *:81 *:*
root portsent 437 6 tcp4 *:111 *:*
root portsent 437 7 tcp4 *:119 *:*
root portsent 437 8 tcp4 *:540 *:*
root portsent 437 9 tcp4 *:635 *:*
root portsent 437 10 tcp4 *:1080 *:*
root portsent 437 11 tcp4 *:1524 *:*
root portsent 437 12 tcp4 *:2000 *:*
root portsent 437 13 tcp4 *:5742 *:*
root portsent 437 14 tcp4 *:6667 *:*
root portsent 437 15 tcp4 *:8080 *:*
root portsent 437 16 tcp4 *:8085 *:*
/usr/local/etc/>

Ну и всё. Если есть возможность пробуем снаружи, если нету, то изнутри, предвартельно убрав свою сеть из списка игнорируемых (на крайний случай с локалхоста, убрав его из этого списка, и презапустив прогу), и наблюдаем в /var/log/messages такие сообщения:
Feb 20 12:17:52 bsd-411 portsentry[288]: adminalert: PortSentry is now active and listening.
Feb 20 12:19:02 bsd-411 portsentry[286]: attackalert: Connect from host: 192.168.20.254/192.168.20.254 to TCP port: 1
Feb 20 12:19:02 bsd-411 portsentry[286]: attackalert: Host 192.168.20.254 has been blocked via dropped route using command: "/sbin/ipfw add 1 deny all from 192.168.20.254:255.255.255.255 to any"
Feb 20 12:19:02 mail2 portsentry[286]: attackalert: External command run for host: 192.168.20.254 using command: "/usr/script/work/scan_port_mail.sh 192.168.20.254 1"

Правила в файрволле так и будут висеть до перезагрузки или перезапуска файрволла. При этом если их убрать, но программу не перезапустить, то снова для этого хоста правило не добавится:
Feb 20 12:19:55 bsd-411 portsentry[286]: attackalert: Connect from host: 192.168.20.254/192.168.20.254 to TCP port: 1
Feb 20 12:19:55 bsd-411 portsentry[286]: attackalert: Host: 192.168.20.254 is already blocked. Ignoring

Советую внимательно сверить списки открытых портов и слушаемых portSentry, наличие таких строк
sockstat | grep "*.*"
root portsent 58212 3 udp4 *:* *:*

говорит о вашей попытке повесить прослушку на занятый порт.



размещено: 2006-02-20,
последнее обновление: 2006-02-24,
автор: lissyara

оценить статью:




Реклама на Бегуне Стать партнером

ЯндексДирект

подписка

    вверх      
Статистика сайта
Сейчас на сайте находится: 11 чел.
За последние 30 мин было: 78 человек
За сегодня было
22147 показов,
3043 уникальных IP
 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK


авто

Время генерации страницы 0.134 секунд
Из них PHP: 45%; SQL: 55%; Число SQL-запросов: 76 шт.
Исходный размер: 80860; Сжатая: 18289