IPS - Intrusion Prevention System / Bloqueio de Port Scanning

O IPS também é um mecanismo de defesa que impede que o atacante execute seu port scanning com sucesso, colocando seu ip em uma lista de bloqueio. Para isso, vamos utilizar o portcentry. Ele vai simular algumas portas falsas na nossa máquina e misturar com as portas originais, assim que o atacante fizer um scan em uma dessas portas falsas, o sistema já dispara uma ação para realizar o bloqueio.

sudo apt install portsentry

O portsentry fica localizado em /etc/portsentry. Se utilizarmos o netstat para ver as portas abertas, teremos apenas duas (antes de utilizar o portsentry).

┌──(user㉿kali)-[~/Desktop]
└─$ netstat -nlpt
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::80                   :::*                    LISTEN      -                   
tcp6       0      0 :::22                   :::*                    LISTEN      -                   

Quando startamos o serviço, podemos perceber que ele irá gerar as portas falsas.

┌──(user㉿kali)-[~/Desktop]
└─$ netstat -nlpt           
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:1080            0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:12345           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:12346           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:635             0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:49724           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:540             0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:1               0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:20034           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:32771           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:32772           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:40421           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:32773           0.0.0.0:*               LISTEN      -                              
tcp        0      0 0.0.0.0:1524            0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:119             0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::80                   :::*                    LISTEN      -                   
tcp6       0      0 :::22                   :::*                    LISTEN      - 

No portsentry.conf há um parte em que você pode fazer o bloqueio de porta TCP e UDP, basta passar o valor de "1".

BLOCK_UDP="0"
BLOCK_TCP="0"

Por agora, vamos deixar como 0 para vermos alguns detalhes.

Outras configurações que vamos fazer, é comentar essa linha. Essa configuração basicamente adiciona uma regra de bloqueio de rota do IP que está atacando.

#KILL_ROUTE="/sbin/route add -host $TARGET$ reject"

Ao invés de usar essa regra, vamos utilizar a do iptables. Que vai adicionar uma regra de DROP para o alvo. Nesse caso vamos descomentar a linha.

KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP

Pronto, configurações finalizadas.

Quando fazemos um scan para detectar qual é o tipo de serviço que está rodando em determinada porta, ele retorna "tcpwrapped" para aquelas portas que o portsentry subiu como portas falsas. As demais que realmente estavam abertas, a resposta vem normalmente dizendo qual o tipo de serviço.

┌──(user㉿kali)-[/etc/portsentry]
└─$ sudo nmap -sV -Pn 192.168.2.134
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2021-07-07 17:15 EDT
Nmap scan report for 192.168.2.134
Host is up (0.0000030s latency).
Not shown: 983 closed ports
PORT      STATE SERVICE    VERSION
1/tcp     open  tcpwrapped
22/tcp    open  ssh        OpenSSH 8.4p1 Debian 5 (protocol 2.0)
79/tcp    open  tcpwrapped
80/tcp    open  http       Apache httpd 2.4.46 ((Debian))
111/tcp   open  tcpwrapped
119/tcp   open  tcpwrapped
143/tcp   open  tcpwrapped
1080/tcp  open  tcpwrapped
1524/tcp  open  tcpwrapped
2000/tcp  open  tcpwrapped
6667/tcp  open  tcpwrapped
12345/tcp open  tcpwrapped
31337/tcp open  tcpwrapped
32771/tcp open  tcpwrapped
32772/tcp open  tcpwrapped
32773/tcp open  tcpwrapped
32774/tcp open  tcpwrapped
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Quando o nmap retorna com esse "tcpwrapped", é muito provável que tenha um firewall ou algum IPS bloqueando esse serviço (o alvo estabeleceu o 3WH, só que depois ele bloqueou o acesso, ou enviou um RST de volta, etc). Esse detalhe é muito importante, por isso não foi habilitado ainda para bloqueio, para que pudéssemos ver como que é retornado caso acontecer isso.

Agora, vamos setar as configurações para bloquear.

BLOCK_UDP="1"
BLOCK_TCP="1"

Precisamos reiniciar o portsentry apĂłs isso.

Ao fazer o scan, percebemos que não há resposta alguma, e nosso IP foi colocado em uma lista de bloqueio.

┌──(user㉿kali)-[/etc/portsentry]
└─$ cat /etc/hosts.deny
# /etc/hosts.deny: list of hosts that are _not_ allowed to access the system.
#                  See the manual pages hosts_access(5) and hosts_options(5).
#
# Example:    ALL: some.host.name, .some.domain
#             ALL EXCEPT in.fingerd: other.host.name, .other.domain
#
# If you're going to protect the portmapper use the name "rpcbind" for the
# daemon name. See rpcbind(8) and rpc.mountd(8) for further information.
#
# The PARANOID wildcard matches any host whose name does not match its
# address.
#
# You may wish to enable this to ensure any programs that don't
# validate looked up hostnames still leave understandable logs. In past
# versions of Debian this has been the default.
# ALL: PARANOID

ALL: 192.168.2.107 : DENY
                                                                                                                                                                                                                                             
┌──(user㉿kali)-[/etc/portsentry]
└─$ sudo iptables -nL        
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  192.168.2.107        0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Porém, precisamos de saber um detalhe. Para isso, vamos apagar o nosso IP da lista de bloqueio e resetar as regras do iptables com o comando iptables -F. O que acontece é que quando fazemos um Syn Scan, mesmo com esse bloqueio, ele retorna as portas. Para isso não ocorrer, precisamos setar uma outra configuração no portsentry.

Primeiramente precisamos parar o serviço do portsentry com service portsentry stop. Vamos localizar onde está o binário do portsentry com whereis portsentry. Vamos direto onde está o binário dele para aplicar uma outra configuração.

/usr/sbin/portsentry

Esse -stcp Ă© justamente para evitar scans "sealth", ele nĂŁo aguarda o 3WH ser concluĂ­do para dropar. Executamos entĂŁo

/usr/sbin/portsentry -stcp

Pronto, agora está bloqueando Syn Scan.

Last updated