Dead Packets

24/05/2010

Análise de sessões do ScreenOS via CLI

Filed under: dicas e truques,ScreenOs — drak @ 6:25 PM

Continuando o post anterior sobre análise de sessões em firewalls Netscreen/Juniper, uma vez que nós já conseguimos filtrar apenas o que é importante do log de sessões agora basta organizar, o jeito elegante de fazer isso seria juntar os dois scripts em apenas um só que fizesse as duas funções porém como eu não tenho habilidade nenhuma em perl mas quero conseguir analizar isto HOJE, segue o shell script que eu criei para organizar as informações obtidas com o parser anterior.

Para usar o nss_analyzer.sh basta rodar ele e dar como argumento o arquivo de sessões “cru”, o script nse2csv.pl deve estar na mesma pasta. Você pode indicar um segundo argumento para definir o número de “TOP” itens irão aparecer, por padrão são exibidos os 10 TOP de cada categoria.

Um item importante que deixei de lado nestes scripts foi o número do protocolo, mas se algum dia eu realmente precisar a modificação é bem trivial.

nss_analyzer.sh

#!/bin/sh
# Analise de IPs
sample=$1
top=$2
: ${top:="10"}

#ORIGEM
echo "TOP $top IPs de ORIGEM"
cat $sample | nse2csv.pl | cut -d"," -f1 | sort | uniq -c | sort -nr | head -n$top
echo

#DESTINO
echo "TOP $top IPs de DESTINO"
cat $sample | nse2csv.pl | cut -d"," -f2 | sort | uniq -c | sort -nr | head -n$top
echo

#PORTA
echo "TOP $top Portas de DESTINO"
cat $sample | nse2csv.pl | cut -d"," -f3 | sort | uniq -c | sort -nr | head -n$top
echo

#FLUXOS
echo "TOP $top Fluxos"
cat $sample | nse2csv.pl | sort | uniq -c | sort -nr | head -n$top
Anúncios

16/05/2010

Parser para log de sessões do ScreenOS

Filed under: ScreenOs,troubleshooting — drak @ 2:04 PM

Uma parte do meu trabalho é atuar no tratamento de incidentes e, para dispositivos como firewalls, a análise de sessões geralmente dá uma ótima idéia do que está ocorrendo no momento do problema. Em firewalls Netscreen o comando “get session” realiza o dump da tabela de sessões do firewall, um trecho desse tipo de log pode ser visto abaixo:

id 407322/s**,vsys 0,flag 00000040/4000/0003,policy 70,time 1, dip 0 module 03773,1Bot
 if 45(nspflag 800805):172.18.6.11/6->10.253.22.4/47959,1,00093d1447ad,sess token 21,vlan 30,tun 0,vsd 0,route 103774,1Bot
 if 9(nspflag 800804):172.18.6.11/6<-10.253.22.4/47959,1,001882fb38b2,sess token 25,vlan 11,tun 0,vsd 0,route 523775,1Bot

id 47596/s**,vsys 0,flag 14000000/0000/0001,policy 50,time 22, dip 0 module 0
 if 5(nspflag 4801):192.168.1.150/51218->97.125.239.85/47804,17,000000000000,sess token 3,vlan 0,tun 0,vsd 0,route 0
 if 0(nspflag 4800):200.200.200.16/51218<-97.125.239.85/47804,17,000000000000,sess token 4,vlan 0,tun 0,vsd 0,route 0

Como vocês podem imaginar a informação acima não é facilmente interpretada se temos algumas centenas ou milhares de sessões estabelecidas, para resolver este problema temos algumas alternativas, uma delas é gravar a saída do comando e realizar o upload do arquivo para a ferramente online da Juniper conhecida como Firewall Session Analyzer (necessário login), outra opção é realizar alguns malabarismos com um script na saída padrão do comando para tornar estes dados utilizáveis numa análise via CLI do Linux.

Abaixo segue o primeiro programa que irá ajudar na tarefa de analisar a saída do comando “get session” pela CLI, eu porcamente escrevi este programa (tenho zero de experiência em Perl) me baseando nos parsers utilizados no projeto Afterglow.

nse2csv.pl

#!/usr/bin/perl
use strict vars;

my $output=$ARGV[0] || "full";
my $DEBUG=0;
our ($sip,$sport,$dip,$dport);

while (<STDIN>) {
        chomp;
        my $input = $_;
        if ($input =~ /(.*):(\d+\.\d+\.\d+\.\d+)\/?(\d*)->(\d+\.\d+\.\d+\.\d+)\/?(\d*)/) {
                $input = "$1|$2|$3|$4|$5";
        } else {
                $DEBUG && print STDERR "ERROR: $input\n";
                next;
        }

        my @fields = split ('\|',$input);

        $sip = $fields[1];
        $sport = $fields[2];
        $dip = $fields[3];
        $dport = $fields[4];

        if ($output eq "full") {
                print "$sip,$dip,$dport\n";
        } else {
                my @tokens = split / /,$output;
                print ${shift(@tokens)};
                for my $token (@tokens) {
                        if (!defined($$token)) {
                                $DEBUG && print STDERR "$token is not a known field\n";
                                #exit;
                        } else {
                                print ','.$$token;
                        }
                }
                print "\n";
        }
}

Este programinha em perl deve ser utilizado com a seguinte sintaxe:

cat ARQUIVO_LOG_SESSOES.log > nse2cvs.pl

Como saída teremos, nesta ordem: SOURCE IP, DESTINATION IP, DESTINATION PORT.

Futuramente irei postar a segunda parte deste artigo, com outro script que efetua a análise dos dados gerados com o nse2csv.pl

Referências
Afterglow – Parsers
Learning Perl

03/05/2010

VPN Site-to-Site – Route mode

Filed under: juniper,ScreenOs — drak @ 7:54 PM

Uma das tecnologias que mais demandam tempo de configuração e testes em conjunto é a VPN, no ScreenOS existem duas metodologias de criação de VPN site-to-site, por rota e por policy. Basicamente por policy a configuração é mais simples e não demanda criação de interfaces de túnel ou roteamento, por rota a VPN e a regra de acesso são independentes, o que permite mais flexibilidade em alguns cenários.

Abaixo segue um procedimento completo de criação de VPN site-to-site por rota, onde a rede local é 172.30.0.0/16 e as redes remotas são 192.168.0.0/24 e 10.0.0.0/16, nota-se que é necessário criar apenas um gateway porém dois túneis VPN, isso ocorre porque até a versão 6.2 não é possível colocar múltiplos proxy-id na mesma configuração de VPN, uma característica implementada a partir da versão 6.3.

É esperado um conhecimento teórico das VPNs para entender a configuração abaixo, nela deixei explícito os proposals utilizados na fase 1 (isakmp) e fase 2 (ipsec).

# Criação das interfaces tunel
set interface "tunnel.1" zone "Untrust"
set interface tunnel.1 ip unnumbered interface ethernet0/0
set interface "tunnel.2" zone "Untrust"
set interface tunnel.2 ip unnumbered interface ethernet0/0

# Fase 1
set ike p1-proposal "pre-g2-3des-sha-86400" preshare group2 esp 3des sha-1 second 86400
set ike gateway "gw_IP_PEER_REMOTO" address 200.200.200.200 Main outgoing-interface "ethernet0/0" preshare shared_secret_muito_complexo! proposal "pre-g2-3des-sha-86400"

# Fase 2
set ike p2-proposal "g2-esp-3des-md5-28800" group2 esp 3des md5 second 28800

set vpn "vpn_10.0.0.0/16" gateway "gw_IP_PEER_REMOTO" replay tunnel idletime 0 proposal "g2-esp-3des-md5-28800"
set vpn "vpn_10.0.0.0/16" id 0x1 bind interface tunnel.1
set vpn "vpn_10.0.0.0/16" proxy-id local-ip 172.30.0.0/16 remote-ip 10.0.0.0/16 "ANY"

set vpn "vpn_192.168.0.0/24" gateway "gw_IP_PEER_REMOTO" replay tunnel idletime 0 proposal "g2-esp-3des-md5-28800"
set vpn "vpn_192.168.0.0/24" id 0x2 bind interface tunnel.2
set vpn "vpn_192.168.0.0/24" proxy-id local-ip 172.30.0.0/16 remote-ip 192.168.0.0/24 "ANY"

# Definição de rotas e policy
set route 10.0.0.0/16 interface tun.1
set route 192.168.0.0/24 interface tun.2

set address "Trust" "172.30.0.0/16" 172.30.0.0/16
set address "Untrust" "10.0.0.0/16" 10.0.0.0/16
set address "Untrust" "192.168.0.0/24" 192.168.0.0/24

# Note que a policy não precisa estar com os mesmos objetos que o proxy-id, ou seja, na policy você pode realizar o controle de acesso e liberar somente alguns serviços, mesmo que a VPN esteja fechando com a permissão de trafegar ANY por ela.

set policy id 40 from "Trust" to "Untrust" "172.30.0.0/16" "10.0.0.0/16" "ANY" permit log
set policy id 40
set dst-address "192.168.0.0/24"
exit

set policy id 41 from "Untrust" to "Trust" "10.0.0.0/16" "172.30.00.0/16" "ANY" permit log
set policy id 41
set src-address "192.168.0.0/24"
exit

# Comandos para diagnóstico
# Verificação de Fase 1
get ike cookie

# Verificação de Fase 2
get sa

Referências
Juniper Forum
Configuring or Troubleshooting a Juniper Firewall VPN – NetScreen devices

01/05/2010

CCNA Security Lab Notes

Filed under: certificação,cisco — drak @ 10:23 AM

Recentemente passei na prova 640-553 (IINS) e obtive a certificação CCNA Security, deixo registrado aqui uma trilha do que estudei na forma de comandos utilizados durante o estudo para a prova, apenas lembrando que esses notes são apenas um GUIA para o estudo teórico, o que é mais cobrado na prova é o ASDM e os conceitos portanto não utilize isto aqui como única referência ou você vai se dar mal.

Como recursos de estudo utilizei:

CCNA Security Official Exam Certification Guide
– CCNA Security Lab Manual
– CBT Nuggets Cisco CCNA Security – Exam-Pack 640-553: IINS
– Simulações no GNS3

! CCNA Security Lab Notes

security passwords min-length 10
enable secret hardtoguesspass

! Configuracao console
line con 0
password ciscocon
exec-timeout 5 0
login
logg syn

! Configuracao telnet
line vty 0 4
password ciscovtypass
exec-timeout 5 0
login

! Criptografa as senhas que estao em plain-text
service password-encryption

banner motd $get off$

username admin secret hardpassadmin priv 15

! Melhorias no login
login block-for 60 attempts 2 within 30
login on-sucess log
login on-failure log every 2

! Preparacao para ssh
ip domain-name security.lab

! Limpa e gera chaves RSA para acesso ssh
crypto key zeroize rsa
crypto key generate rsa general-keys modulus 1024

! Ajusta configuracao de SSH
ip ssh time-out 90
ip ssh authentication-retries 2

! Configura SSH ao inves de telnet
line vty 0 4
priv level 15
login local
transport input ssh
exit

! Views
aaa new-model
exit
enable view

parser view TECH
secret techpass
commands exec include all show
commands exec include all config terminal

enable view TECH
sh parser view

! Boot resilience
sh flash
secure boot-image
secure boot-config
sh secure bootset
sh flash

! NTP
ntp master 3
ntp server 10.1.1.1
ntp update-calendar
sh ntp associations

! Logs
logging 10.0.0.1
logging trap critical
logging userinfo

! SNMP
snmp-server community secretSNMP ro

! Inicia lockdown generico
auto secure

! AAA
aaa new-model
aaa authentication login default local none
aaa authentication enable default enable
aaa authentication login TELNET_LINE local
line vty 0 4
login authentication TELNET_LINE
debug aaa authentication
aaa authentication login default group radius none
radius-server host 10.1.1.1 key chaveSECRETA auth-port 1645 acct-port 1646
aaa accounting exec default start-stop tacacs+

! ACL
ip access-list NOME_DA_ACL
	15 permit tcp 10.0.0.0 0.0.0.255 192.168.0.0 0.0.255.255 eq http

! CBAC - Classic firewall
ip inspect NOME_DA_REGRA telnet
ip inspect NOME_DA_REGRA realaudio
ip inspect autosec inspect out

sh ip inspect all

! Restricao em telnet e snmp com ACLs
access-list 50 permit 192.168.1.0 0.0.0.255
line vty 0 4
access-class 50 in

snmp-server community secretSNMP ro 50

! Stateful rudimentar
ip access-list extended INTERNET_FILTER
permit tcp any any established

! Reorganiza ACLs
ip access-list resequence INTERNET FILTER 5 10

! L2 Security
spanning-tree vlan 1 priority 0

! Protecao contra VLAN Hopping
int f0/0
switchport mode trunk
switchport trunk native vlan 99
switchport nonegotiate
storm-control broadcast level 50
sh int f0/0 trunk
sh int f0/0 switchport

! Protecao contra CAM Overflow
int f0/5
switchport mode access
spanning-tree portfast
spanning-tree bpduguard enable
sh spanning-tree int f0/5 detail
spanning-tree guard root
shut
switchport port-security
switchport port-security maximum 2
switchport port-security violation shutdown
switchport port-security mac-address aaaa.bbbb.cccc
switchport port-security mac-address sticky
switchport port-security aging time 120
no shut
sh port-security int f0/5

! Desabilita portas nao utilizadas
int range f0/2 - 4
shut

! Utilizacao de VLANs
vlan 20
name users
int f0/5 - 10
switchport access vlan 20

! SPAN Port - Monitora trafego
monitor session 1 source interface f0/5 both
monitor session 1 destination interface f0/5
sh monitor session 1

! VPN site-to-site

! Fase 1
crypto isakmp enable
crypto isakmp policy 10
crypto isakmp key cisco123 address 10.1.1.1
authentication pre-share
encryption aes 256
hash sha
group 5
lifetime 3600
sh crypto isakmp policy

! Fase 2
crypto ipsec transform-set 50 esp-aes 256 esp-sha-hmac
crypto ipsec security-association lifetime seconds 1800
! Proxy ID
access-list 101 permit ip 192.168.1.0 0.0.0.255 192.168.3.0 0.0.0.255

crypto map NOME_DO_CMAP 10 ipsec-isakmp
match address 101
set peer 10.1.1.1
set pfs group 5
set transform-set 50

int f0/0
crypto map NOME_DO_CMAP

sh crypto ipsec transform-set
sh crypto map
sh crypto isakmp sa
sh crypto ipsec sa

Blog no WordPress.com.