[Barrando Portscans com PortSentry passo a passo - receita]

Estatisticas demonstram que a primeira acao de um cracker contra um servidor especifico eh o portscan, a
partir de onde o mesmo obtera um mapa de "acesso garantido" por onde comecara suas acoes...
Existem diversas maneiras de se evitar portscans e diversos aplicativos. Nesse cenario em especial
utilizaremos o excelente programa PortSentry do projeto "Abacus" de Craig Rowland num Linux Box com
ipchains instalado como opcao de administracao de regras do firewall do kernel...
Cabe dizer que Portsentry eh um programa amplamente configuravel, com diversas opcoes e cenarios, porem
nao entrarei em detalhes nesse artigo, apenas apresentarei um modo de utiliza-lo de forma simples... Vale
lembrar tbem que o portsentry nao eh eficaz em caso de Stealth Portscans (apesar de ter implementado
Advanced Portscan), os falsos alarmes sao muitos nesse caso, mas por "escutar" diversas portas ele da a
falsa "impressao" ao portscan de que todas as portas estao acessiveis...

1) Download:
	Baixe o source de http://www.psionic.com/tools/portsentry-1.0.tar.gz

2) Compilando:

	2.1) Descompactando:
		
		# tar zxvf portsentry-1.0.tar.gz

	2.2) Pre compilacao:
	
		- Edite o arquivo portsentry_config.h e Makefile:
			
			Como default o programa sera instalado no diretorio
			/usr/local/psionic/portsentry, caso queira escolher um outro
			diretorio para instalacao, basta mudar a linha:
			
			#define CONFIG_FILE "/usr/local/psionic/portsentry/portsentry.conf"
			
			e no arquivo Makefile mude a linha:

			INSTALLDIR = /usr/local/psionic
					e
			CHILDDIR = /portsentry

				O programa sera instalado em INSTALLDIR/CHILDDIR
		
		- Edite o arquivo portsentry.conf (q sera copiado para seu INSTALLDIR/CHILDDIR):

			- TCP_PORTS e UDP_PORTS indicam, separadas por virgulas, as portas que o programa
			ficara aguardando conexoes (ouvindo) :).Caso nao tenha certeza do que fazer, 
  			simplesmente descomente as 2 linhas abaixo de
				
				# Use these if you just want to be aware:	
			
			e tudo estara ok :)
			Fique alerto para nao manter as portas 31337 e 12345, 12346 caso seu
			roteador ou firewall da rede ja as tiver negadas, apenas para nao se abarrotar de
			regras devido a sweepings q nem sempre indicam PORTSCANS, mas apenas alguem
			procurando por aquele trojan em especial pela sua rede e que na verdade ja esta
			negado de qualquer forma, e nossa meta eh detectar PORTSCANS! :)
			
			
			- Tenha certeza de indicar corretamente o PATH para sua instalacao do portsentry
			(caso tenha mudado a default) em:
				 
                                 IGNORE_FILE : Contera a lista (linha a linha) de IPs e Networks q
					       deverao ser ignorados em caso de portscan... Tenha a
                                               certeza de manter 127.0.0.1 e 0.0.0.0 nesse arquivo...

				 HISTORY_FILE : Contera o historico de ips bloqueados 

				 BLOCKED_FILE : Contera lista dos atuais ips bloqueados e que serao
						ignorados num proximo portscan (ja q JA estarao
						bloqueados).

			- Nesse exemplo/caso iremos fazer com que o Portsentry bloqueie atraves
                          do ipchains o IP source do portscan e execute um script qualquer, caso voce
                          apenas deseje ser notificado via email atraves de um script e que o IP nao seja
                          bloqueado, deve deixar BLOCK_UDP e BLOCK_TCP com valor 2:
				
				BLOCK_UDP="2"
				BLOCK_TCP="2"

			  O q fara que apenas seu KILL_RUN_CMD (falaremos ja ja) seja executado...

			- Como esse exemplo/caso foi baseado utilizando-se ipchains como forma de
                          bloqueio, descomente a linha :
				
				#KILL_ROUTE="/sbin/ipchains -I input -s $TARGET$ -j DENY -l"
			
			  Os logs gerados pelo -l do ipchains no caso de um portscan sao um exagero,
                          e como (nesse caso) seremos notificados via email voce pode decidir ou nao usar
                          o -l (dependendo do nivel de debugging que voce vai querer para analise do
                          portscan)...

			- Como utilizamos (nesse caso) o firewall do proprio kernel como forma de
			  bloqueio, pode-se manter comentada a sessao TCP Wrappers...

			- External Command (KILL_RUN_CMD): Eh justamente aqui que atribuiremos o comando
                          que sera rodado apos o IP source do portscan ser bloqueado pelo firewall, como
                          ex. escrevi um script muito simples (*) que enviara um email ao responsavel
                          pela maquina com o IP source assim que o portscan ocorrer, nesse caso vc pode
                          fazer seu proprio script, eu por ex. uso um que me manda um DigiMemo atraves
			  do celular, sao inumeras as possibilidades, apenas evite as retaliatorias, pois 
			  falsos alarmes ocorrem... No nosso caso salve o script como mail.sh, atribua
			  permissao de execucao para o mesmo e atribua:

				KILL_RUN_CMD="/usr/local/psionic/portsentry/mail.sh $TARGET$"

			- SCAN_TRIGGER : Atribua valor 1 para evitar falsos alarmes, eh o numero de
                          conexoes permitidas antes que alguma acao seja feita...

	2.3) Compilacao:

		# make; make install 

3) Executando:	

	A partir do diretorio instalado (default: /usr/local/psionic/portsentry):
		
		"Stealth" (mais sensivel e mais passivel de alarmes falsos):
		# ./portsentry -stcp ; ./portsentry -sudp  
				
				ou
		
		Basico:
		# ./portsentry -tcp ; ./portsentry -udp


	A opcao -atcp e -audp (Advanced) nao recomendo pelo numero de falsos alarmes decorrentes...



(*)
----- Cut Here ----			
#!/bin/sh
# Simples script para alerta via email do Portsentry
# Por Renato Murilo Langona [renato@linuxsecurity.com.br]

RESP=email@do.responsavel
FROM=$1 # Ta ta ta, ja sei :P
FROMRES=`nslookup $FROM | grep Name | cut -b 6-60`
DATE=`date`
echo "Portscan de $FROM < - > $FROMRES" | mail -s "[ATK-> $FROM - $DATE <-]" $RESP
---- Cut Here ----


Autor: Renato Murilo Langona (SuidBit/BEAVISII) [renato@linuxsecurity.com.br]
Ultima atualizacao: [Fri Jan 12 16:30:39 BRST 2000]