Utiliser Portsentry pour bloquer les scans de ports

By KrustyHack / a couple of years ago

Portsentry

Portsentry est un programme qui a pour mission de détecter et bloquer (ou pas, selon la config) les scan de port (genre avec nmap). Il vous permet par exemple de vous envoyer un mail lors d’un scan suspicieux sur votre serveur. Ou alors il peut carrément bloquer l’attaquant via les iptables.

Installer Portsentry

Alors là, rien de bien compliqué:

╭─root@krustyhack ~ 
╰─➤ apt-get update && apt-get upgrade && apt-get install portsentry

portsentry_install

Et hop, ca installe et c’est fini ! Il ne reste plus qu’à configurer car pour l’instant Portsentry est un peu useless. 🙂

Configuration générale de Portsentry

Nous allons maintenant configurer notre outil pour pouvoir gérer correctement les scans venant de l’extérieur.

Choix des ports

Cette option est inutile si vous utilisez le mode avancé de détection (voir plus bas). Portsentry va alors maper automatiquement les ports.

Editer le fichier /etc/portsentry/portsentry.conf

#######################
# Port Configurations #
#######################
[...]
# Un-comment these if you are really anal:
#TCP_PORTS="1,7,9,11,15,70,79,80,109,110,111,119,138,139,143,512,513,514,515,540,635,1080,1524,2000,2001,4000,4001,5742,6000,6001,6667,12345,12346,20034,27665,30303,32771,32772,32773,32774,31337,40421,40425,49724,54320"
#UDP_PORTS="1,7,9,66,67,68,69,111,137,138,161,162,474,513,517,518,635,640,641,666,700,2049,31335,27444,34555,32770,32771,32772,32773,32774,31337,54321"
#
# Use these if you just want to be aware:
TCP_PORTS="1,11,15,79,111,119,143,540,635,1080,1524,2000,5742,6667,12345,12346,20034,27665,31337,32771,32772,32773,32774,40421,49724,54320"
UDP_PORTS="1,7,9,69,161,162,513,635,640,641,700,37444,34555,31335,32770,32771,32772,32773,32774,31337,54321"
#
# Use these for just bare-bones
#TCP_PORTS="1,11,15,110,111,143,540,635,1080,1524,2000,12345,12346,20034,32771,32772,32773,32774,49724,54320"
#UDP_PORTS="1,7,9,69,161,162,513,640,700,32770,32771,32772,32773,32774,31337,54321"

Paramétrer les fichiers annexes de configuration (whitelist, blacklist, etc…)

######################
# Configuration Files#
######################
#
# Hosts to ignore
IGNORE_FILE="/etc/portsentry/portsentry.ignore"
# Hosts that have been denied (running history)
HISTORY_FILE="/var/lib/portsentry/portsentry.history"
# Hosts that have been denied this session only (temporary until next restart)
BLOCKED_FILE="/var/lib/portsentry/portsentry.blocked"

Configurer la détection avancée

Là, j’ai laissé par défaut. Mais vous pouvez éditer à votre guise pour correspondre à vos besoins.

###########################################
# Advanced Stealth Scan Detection Options #
###########################################
[...]
ADVANCED_PORTS_TCP="1024"
ADVANCED_PORTS_UDP="1024"
[...]
ADVANCED_EXCLUDE_TCP="113,139"
ADVANCED_EXCLUDE_UDP="520,138,137,67"

Activer la résolution DNS

Pratique pour avoir un nom sur les ip.

##############################
# Misc. Configuration Options#
##############################
#
# DNS Name resolution - Setting this to "1" will turn on DNS lookups
# for attacking hosts. Setting it to "0" (or any other value) will shut
# it off.
RESOLVE_HOST = "1"

Paramétrer le mode réponse aux scans

Pour les tests, laissez à 0, cela évitera de vous bloquer vous-mêmes. Moi j’utilise le mode 2, qui permet de lancer des scripts externes lors d’une détection de scan car je ne veux pas les bloquer mais seulement lancer des scripts.

##################
# Ignore Options #
##################
[...]
# 0 = Do not block UDP/TCP scans.
# 1 = Block UDP/TCP scans.
# 2 = Run external command only (KILL_RUN_CMD)

BLOCK_UDP="2"
BLOCK_TCP="2"

Paramétrage du filtrage pour bloquer les ips

###################
# Dropping Routes:#
###################
[...]
# Newer versions of Linux support the reject flag now. This 
# is cleaner than the above option.
KILL_ROUTE="/sbin/route add -host $TARGET$ reject"

Configuration d’une commande externe

Comme on a activé le mode 2 de réponse, il nous faut paramétrer un script externe à appeler lors d’une détection de scan.

###################
# External Command#
###################
[...]
# The KILL_RUN_CMD_FIRST value should be set to "1" to force the command 
# to run *before* the blocking occurs and should be set to "0" to make the 
# command run *after* the blocking has occurred. 
#
KILL_RUN_CMD_FIRST = "1"
#
#
KILL_RUN_CMD="/etc/portsentry/commands/notify.sh $TARGET$ $PORT$ $MODE$"
# for examples see /usr/share/doc/portsentry/examples/

Avec le source de notify.sh qui me permet de recevoir un email lors d’un scan:

#!/bin/bash

sendemail_bin="/opt/send_mail"
mail_from="security@nicolashug.com"
mail_to="security@nicolashug.com"

# grep into /etc/services to check which port was scanned
MODE=${3/[sa]/}         # get rid of s and a
SERVICEINFO=`grep "[[:space:]]$2/$MODE" /etc/services`

# can we get some info about the attacker?
FINGERINFO=`/usr/sbin/safe_finger -l @$1 2>/dev/null`

cat <> /var/lib/portsentry/notify.log
PortSentry: $1 scanned $HOSTNAME:$2/$3
Someone @$1 scanned on host $HOSTNAME
the service (from /etc/services): 
$SERVICEINFO
additional information (from reverse finger):
$FINGERINFO
EOF

$sendemail_bin -f $mail_from \
        -t $mail_to \
        -u "[portsentry] - A scan has been spotted on `hostname --fqdn`" \
        -m "PortSentry: $1 scanned $HOSTNAME:$2/$3
Someone @$1 scanned on host $HOSTNAME
the service (from /etc/services): 
$SERVICEINFO
additional information (from reverse finger):
$FINGERINFO
        " > /dev/null 2>&1

Je log également les tentatives de scan, au cas où l’envoi de l’email aurait foiré.

Choix du temps de réaction

On peut choisir le nombre de connections à un port nécessaire pour déclencher Portsentry. Moi je le laisse à 0 pour qu’il réagisse immédiatement.

#####################
# Scan trigger value#
#####################
[...]
SCAN_TRIGGER="0"

Désactiver l’affichage de bannière

Pas la peine de provoquer notre attaquant, on désactive donc l’affichage de la bannière:

######################
# Port Banner Section#
######################
#
# Enter text in here you want displayed to a person tripping the PortSentry.
# I *don't* recommend taunting the person as this will aggravate them.
# Leave this commented out to disable the feature
#
# Stealth scan detection modes don't use this feature
#
#PORT_BANNER="** UNAUTHORIZED ACCESS PROHIBITED *** YOUR CONNECTION ATTEMPT HAS BEEN LOGGED."

Paramétrages supplémentaires

Editer le fichier /etc/default/portsentry pour activer le mode avancé de scan:

# /etc/default/portsentry
#
# This file is read by /etc/init.d/portsentry. See the portsentry.8
# manpage for details.
#
# The options in this file refer to commandline arguments (all in lowercase)
# of portsentry. Use only one tcp and udp mode at a time.
#
TCP_MODE="atcp"
UDP_MODE="audp"

Vous pouvez également éditer /etc/portsentry/portsentry.ignore.static pour autoriser des ips à scanner votre réseau (votre ip par exemple, déjà).

Test et activation de Portsentry

On peut enfin redémarrer le bordel:

╭─root@krustyhack ~ 
╰─➤ service portsentry restart
Stopping anti portscan daemon: portsentry.
Starting anti portscan daemon: portsentry in atcp & audp mode.

Puis tester:

╭─root@krustyhack ~ 
╰─➤ nmap -v -PN -p 0-2000,60000 TARGET

Et hop, on devrait, si tout se passe bien, recevoir un email pour nous notifier du scan ainsi qu’une entrée dans le log (spécifié dans mon .sh):

PortSentry: x.x.x.x scanned MONHOST:554/atcp
Someone @x.x.x.x scanned on host MONHOST
the service (from /etc/services): 
rtsp        554/tcp         # Real Time Stream Control Protocol
additional information (from reverse finger):

Comme on peut voir, le scan a parfaitement été détecté, niquel.

Leave a comment: