Мы — долго запрягаем, быстро ездим, и сильно тормозим.
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


K2el, 2007-01-17 в 15:54:19

Все делал по статье, но ничего не получилось :(.... помогите... вот ссылка где все описывал (IPFW настраивал по статьям этого сайта) http://linuxforum.ru/index.php?showtopic=31902
ЗЫ: не пишу на форуме этого сайта из-за того что не регистрируй он меня.... (пользователь не активен)

JD, 2007-02-22 в 21:58:47

Зачем так сложно?...
это нужно быть маньяком, чтобы ставить стенку, делать в ней дырки и таким образом ловить мудаков.

все гораздо проще делается.

после установки в файле portsentry.conf достаточно раскомментировать всего 3 строчки

# Un-comment these if you are really anal:
TCP_PORTS="1,7,9,...
UDP_PORTS="1,7,9,...
# FreeBSD
KILL_ROUTE="route add -net $TARGET$ -netmask 255.255.255.255 127.0.0.1 -blackhole"

и добавить в автозагрузку с ключами -tcp и -udp.

выбирать мудаков из списка может быть будет интересно только первую неделю, сама программа нежно выводит таких клиентов из списка допустимых к телу сервера. Для них сервер "как бы исчезает" из интернета.

lissyara, 2007-02-22 в 22:32:43

А реально - не очень интерсно оказалось...
На этой машине (прям на этой, где щас сайт) - до сих пор стоит - сканят тока проксю - 1080, 8080 и т.п...
Придёт письмо-два в день  - опять косоглазые прокси ищут - и всё...
Хоть бы кто на телнет ткнулся... Даже обидно :(((

selinia, 2007-03-09 в 15:41:09

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

а я сделала, пусть злится =))

JD, 2007-03-19 в 19:04:33

а что, у тебя телнет включен?
если интересно, поставь SHPOT
у меня стоит вместо ftp, так все пытаются халявный ftp обнаружить, книжки или музыку положить. в логах все типа такого..
USER anonymous
PASS Squid@
TYPE A
CWD pub
CWD warez
CWD database
CWD Crystal Reports 5.0
PASV

schizoid, 2007-04-11 в 23:32:14

1. KILL_ROUTE="/sbin/ipfw add 2 deny all from $TARGET$:255.255.255.255 to any"  - это ж все заблокированные ИП вешаются на один номер правила фаера, эт ниче? так и задуманно?

2. А после рестарта фаера, придется все эти ИП-шники руцями из хистори заносить в фаер? оно ж само не подхватывает? В логах видел, пить мол этот уже был, пропускаю...

JD, 2007-04-13 в 16:47:59

>А после рестарта фаера, придется все эти ИП-шники руцями >из хистори заносить в фаер? оно ж само не подхватывает? В >логах видел, пить мол этот уже был, пропускаю...

У меня последний рестарт был 500 дней назад...на текущий момент 39 паразитов в списке...
но даже, если раз в неделю, зачем руками?... Центурион ждет следующей попытки, а потом сам заносит в список, по-новой.

Иван, 2007-04-20 в 14:05:51

Немного недопонял

root     portsent 58212    3 udp4   *:*                   *:*

У меня висят на всех указанных в конфиге опртах такое, с разницей, что после udp4 идёт *:циферь порта и *:*

на что смотреть то?)

Гомен, за вопрос)

JD, 2007-05-03 в 12:10:33

> на что смотреть то?)
смотри логи...
или в случае, как я выше писал,
netstat -rn

fvl, 2007-05-22 в 6:05:52

проще помоему использовать таблицы, чем генерировать по правилу на каждого злодея

HOSTER, 2007-07-05 в 1:48:36

U menya vsyo paset !)) Kruto !)))

Batelli, 2007-09-03 в 1:14:21

А как бы его в автозагрузку добавить  ?

JD, 2007-09-11 в 17:24:52

#!/bin/sh
PORTSENTRY="/usr/local/bin/portsentry"

case "$1" in
 start)
        echo -n ' portsentry ('
        ${PORTSENTRY} -tcp > /dev/null && echo -n 'tcp'
        ${PORTSENTRY} -udp > /dev/null && echo -n ' udp'
        echo -n ')'
        ;;
 stop)
        killall `basename ${PORTSENTRY}`
        ;;
 *)
        echo "Usage: `basename $0` {start|stop}" >&2
        ;;
esac

sunTechnic, 2007-10-24 в 17:59:11

Я бы по KILL_ROUTE вызывал свой скрипт, в котором добавлял бы в таблицу IP урода, и запускал бы удаление этого IP через час или два.

artem, 2008-01-11 в 16:01:17

я так понял список хранится и после перезагрузки тоже
все мудаки скромно сидят в /etc/hosts.denny

artem, 2008-01-11 в 16:08:50

да еще. как было сказано выше если делать в конфиге через
KILL_ROUTE="route add -net $TARGET$ -netmask 255.255.255.255 127.0.0.1 -blackhole"
то смотреть netstat -rn
должно быть типа
33.33.33.33.32  127.0.0.1   UGSB
удаление route delete 33.33.33.33/32
в конфиге лучше прописать
HISTORY_FILE="/var/log/portsentry/portsentry.history"

Risk94, 2008-01-31 в 14:00:38

А зачем открывать кучу портов, если сканер получает бан сразу после первой попытки, тоесть, как только он попытается отсканить порт № 1 ?

serge, 2008-01-31 в 14:12:46

А если он со 2-го начнет сканить?

alt7, 2008-06-19 в 6:26:30

Почему когда в ipfw открываю полностью сервер:
allow ip from any to any
и потом провожу сканирование сервера из вне, то portsentry добавляет ip адрес компа который производит сканирование в ipfw правило.
В том случае если закрываю все порты кроме тех которые показаны в примере и нужных (vpn, ftp) для работы и снова провожу сканирование то portsentry ничего не регистрирует и не создает правило в ipfw.
Если добавляю в список слушаемых портов рабочие порты vpn и ftp то portsentry отрабатывает и добавляет правило с блокировкой сканирующего ip.
Как я понимаю рабочие порты не надо добавлять в список слушаемых, но тогда почему portsentry не отрабатывает. Что я делаю не так!

JD, 2008-06-20 в 1:29:08

Не отрабатывает потому что не видит... Проверь логи при загрузке вручную...
Адреса рабочих машин надо добавить в portsentry.ignore, тогда свои компьютеры не будут блокироваться.
И кстати, зачем закрывать порты, если они и так не используются системой?

alt7, 2008-06-20 в 3:56:32

Не просто мне не понятно почему когда я открываю конкретные порты, то portsentry не блокирует сканирующий комп. В том случае если я открываю вообще все порты, то portsentry блокирует сканирующий компьютер (добавляет правило в ipfw). ВОт поэтому мне и не понятно.

Hubbitus, 2008-09-03 в 16:02:02

Давно стоял он  меня на сервере, но ведь умер проект, давно уже не развивается совершенно...

Что можете про живые-то сказать? Ну те же snort и для Линукса psad?

gonzo111 (artem), 2008-11-21 в 18:18:02

хорошая весчч я добавил еще и 22,23 :) порты
(ssh на другом порту сидит)

>Hubbitus
А что сказать бери ставь и статью напишешь :-)

check_it, 2008-12-08 в 6:36:29

Не держит Advanced Stealth Mode detection для Фри, была вторая бета, но циска прибрала псионик к рукам :( Есть исходники беты 2 [url=http://www.sfr-fresh.com/unix/privat/portsentry-2.0b1.tar.gz] я вот стянул попробую слабать порт :)

check_it, 2008-12-08 в 7:27:50

Нифига ребята :( Оно хочет sys/netinet/ip_ether.h
ip_ether есть тока в openBSD - для фри не проканает
На досуге посмарю че там, но кажется не стоит :)

облом :(

risk94, 2009-06-11 в 21:17:38

чуток добавил скрипт отсылки уведомительного мыла об атаке:



whois ${hacker_IP} | grep '@' | awk '{ print $2 }' | {                      
   while read addr                                                                                                          
   do                                                                                                                      
      echo "Hackers or viruses are trying to scan my network! Award up! Attacked from: ${hacker_IP} [ `date +%d.%m.%Y` ]" | mail -s "Vneshniy tra" "$addr"
   done


теперь письмо получат еще и провайдеры хакера! ;)

risk94, 2009-06-11 в 21:22:22

}  - в конце прощелкал.

ufs, 2010-09-05 в 14:05:56

Опасная херовина, так можно и себя поблочить)

SysMan, 2010-09-29 в 16:06:00

Прикольно, почитал коментарии поулыбался, я таки игрался еще 1998 полосатом году, счас давно ушел на адаптивную защиту. Но портсентри до сих пор меня умиляет, скокома я их поставил в свое время, даже распределенную базу нон трастед ип держал, аналога ему к сожалению нету.
За сайт и статью спасибо lissyara, Приятно читать и смотреть на уровень. Делять меня хватает а вот писать статьи уже нет :-)

dasknix, 2011-02-06 в 3:01:44

> (сайт, к сожалению сдох - http://www.psionic.com/ )
http://sourceforge.net/projects/sentrytools/

Glafir, 2011-08-09 в 16:05:24

Всё путём! Всё работает! Вот только мой дебиан на 161 udp порту зарубил) Я вот не помню, что на дебу ставил, может подскажет кто? А то как-то не очень хорошо, что собственная машина банится!*ROFL*

ufs, 2011-09-14 в 1:15:39

Хахха, я же говорил, можно себя заблочить)

Glafir, 2011-10-03 в 15:22:49

Я вот вычитал, что portsentry может работать и в скрытом режиме. http://www.opennet.ru/docs/RUS/portsentry/portsentry4.html
Я на фри попробовал изменить флаги запуска, нифига не запускает, а то скрытая защита намного эффективнее открытой. Кстати, Лисяра, вот вам задачка - закрыться от такого скана:
nmap -PN IP-адрес_хоста.
Portsentry не видит этого скана, и nmap показывает много чего интересного.

Glafir, 2011-10-03 в 15:27:00

вот вычитал, что portsentry может работать и в скрытом режиме. http://www.opennet.ru/docs/RUS/portsentry/portsentry4.html
Я на фри попробовал изменить флаги запуска, нифига не запускает, а то скрытая защита намного эффективнее открытой.

На Ubuntu работает)))



 

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

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1819 секунд
Из них PHP: 59%; SQL: 41%; Число SQL-запросов: 77 шт.
Исходный размер: 53344; Сжатая: 12404