Security Engineering Brazil
Abril, 2020
Version 01
Autor:
Thiago Mourao, SE and Cyber Security Evangelist
Revisão:
Contents
Objetivo
Limitações e Requisitos
Topologia
Scripts
Passo-a-Passo
Objetivo
Configurar o Acesso Remoto para responder pelo link não padrão de Internet (link secundário).
Como configuração padrão, quando os primeiros pacotes chegarem através do link de internet não padrão (link secundário), o gateway verificará sua tabela de roteamento e responderá esses pacotes usando a rota padrão, ou seja, o gateway responderá estes pacotes através da interface cuja qual a rota padrão está configurada e, em muitos casos, estes pacotes serão bloqueados pelo próximo salto devido a inspeção Stateful Inspection (SYN-ACK sem SYN) ou devido ao filtro de roteamento de entrada (Ingress Routing Filter) que verificará que a origem não pertence a essa rota/rede.
OBS: Em alguns casos, essa configuração pode funcionar se o ISP do link primário não realizar Stateful Inspection ou o ISP não tiver um filtro de roteamento de entrada para bloquear ataques de spoofing e/ou Negação de Serviço (DoS/DDoS).
Limitações e Requisitos
- Eu usei rota estática neste exemplo ao em vez de PBR que poderia ser muito mais granular
- Eu usei uma ferramenta escrita encima do recurso cprid_util criado pelo @HeikoAnkenbrand (HeikoAnkenbrand) no artigo que ele escreveu aqui na comunidade do CheckMates chamado “GAIA - Easy execute CLI commands from management on gateways” (https://community.checkpoint.com/t5/Enterprise-Appliances-and-Gaia/GAIA-Easy-execute-CLI-commands-fr...) para executar comandos nos gateways a partir da gerência (SMS)
- Para este PoC, assumimos que você já configurou um gateway com 2 (dois) links da Internet, onde o primeiro é a rota padrão e o segundo é um link de backup
- Para este PoC, assumimos que você já configurou a VPN para acesso remoto (IPsec ou Mobile Access) para responder com o IP do link secundário de Internet
Topologia
Em nosso laboratório, estamos usando o GloudGuard VE (Virtual Edition) na R80.40 tanto no Security Gateway quanto na Manager e o VMware Workstation 12 como plataforma de virtualização.
Ambiente Virtual:
- 1 x Check Point Gateway R80.40
- 1 x Check Point Manager R80.40
- 1 x Microsoft Windows Server 2012 R2
- 1 x Windows 7 Ultimate
- 4 x Roteadores Virtuais (VyOS)
Ambiente Físico do Hospedeiro:
- 1 x Notebook (Windows Professional) with VMWare Workstation 12
NAT:
- Nesta topologia, o roteador RT_301 está executando o NAT de origem DE: 192.168.250.1 PARA: 200.251.0.1
Scripts
FirstTimeSetup.sh
Este script irá preparar o ambiente pela primeira vez (First Time Wizard).
#!/bin/bash -f source /opt/CPshrd-R80.40/tmp/.CPprofile.sh #Script Directory EXECDIR="/home/admin/VPNSecondaryLink" #User that will Execute the Scripts and Cron Job EXECUSER="admin"
echo "First time setup" echo "Creating all files and Gaia configuration"
echo "Creating Directories" mkdir $EXECDIR mkdir $EXECDIR/log mkdir $EXECDIR/tmp
echo "Creating Files" touch $EXECDIR/CronJob_VPNSecondaryLinkCleanUp.sh touch $EXECDIR/VPNSecondaryLinkCleanUp.sh touch $EXECDIR/VPNSecondaryLink_alert.sh touch $EXECDIR/log/CronJob_VPNSecondaryLinkCleanUp.sh.log touch /var/log/VPNSecondaryLink_alert.log
echo "Creating Symbolic Links" ln -s /var/log/VPNSecondaryLink_alert.log $EXECDIR/log/VPNSecondaryLink_alert.log ln -s $EXECDIR/VPNSecondaryLink_alert.sh $FWDIR/bin/VPNSecondaryLink_alert
echo "Copying Scripts to $EXECDIR" cp ./CronJob_VPNSecondaryLinkCleanUp.sh $EXECDIR/CronJob_VPNSecondaryLinkCleanUp.sh cp ./VPNSecondaryLink_alert.sh $EXECDIR/VPNSecondaryLink_alert.sh
echo "Changing Owner and Group" chown $EXECUSER:bin $EXECDIR/CronJob_VPNSecondaryLinkCleanUp.sh chown $EXECUSER:bin $EXECDIR/VPNSecondaryLink_alert.sh chown $EXECUSER:bin $FWDIR/bin/VPNSecondaryLink_alert.sh
echo " Changing Permission" chmod 760 $EXECDIR/CronJob_VPNSecondaryLinkCleanUp.sh chmod 760 $EXECDIR/VPNSecondaryLink_alert.sh chmod 760 $FWDIR/bin/VPNSecondaryLink_alert.sh
echo "Lock Database Override" clish -c "lock database override" echo "Adding Daily Based Recurrence for CronJob_VPNSecondaryLinkCleanUp at Cron Job to 2:00am" clish -c 'add cron job VPNSecondaryLinkCleanUp command "/home/admin/VPNSecondaryLink/CronJob_VPNSecondaryLinkCleanUp.sh >> /home/admin/VPNSecondaryLink/log/CronJob_VPNSecondaryLinkCleanUp.sh.log 2>&1" recurrence daily time 2:00' echo "Saving clish configuration" clish -c "save config"
|
VPNSecondaryLink_alert.sh
Este script será chamado pelo campo "Track" da regra, irá analisar a saída (log output) e irá criar a rota estática com base no IP de origem do tráfego que bateu na regra
#!/bin/bash -f source /opt/CPshrd-R80.40/tmp/.CPprofile.sh #Script Directory DIR="/home/admin/VPNSecondaryLink" #User that will Execute the Scripts and Cron Job EXECUSER="admin"
#Jump to Script Directory cd $FWDIR/bin
#Global Variable gateway_ip="10.0.50.100" secondary_gw="200.200.0.102" raw_pbr_error=0 error_msg1="Error: Object Name pattern founded on multiple Host Objects" error_msg2="Error: Static Route alreded configure" error_msg3="Error: Rule Name do not match" error_msg4="Error: Object not found on management Database" error_msg5="Error: Route Already Inserted on CleanUp Script"
echo "#### Executing VPNSecondaryLink_alert at $(date -u) ####" [ $raw_pbr_error -gt 0 ] || {
echo "Reading input from rule" read input #echo "Troubleshooting enabled" #echo $input > $DIR/tmp/VPNSecondaryLink_alert_tr.log echo "Parsing Source Object Name" echo "Checking if Source is using Object Name" raw_src_name=$(echo $input | sed -n 's/.* src: \(.*\); dst: .*/\1/p') #echo "variavel raw_src_name=$raw_src_name" echo "Checking if Source is using IP" raw_src_ip=$(echo "$input" | grep -o -P '.{0,5}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' | grep src | sed -n 's/^src: \(.*\)/\1/p' ) #echo "variavel raw_src_ip=$raw_src_ip" firstocteto=$(echo "$raw_src_ip" | sed -n 's/\(^[[:digit:]]*\)\..*\..*\..*/\1/p') #echo "variavel firstocteto=$firstocteto" if [ -z $firstocteto ] || [ $firstocteto -gt 223 ]; then echo "Cannot match with IP parsing... Trying to find IP on Management Object Database" raw_src_ip=$(mgmt_cli -r true show objects limit 2 offset 0 order.1.ASC "name" in.1 "name" in.2 "$raw_src_name" order.2.DESC "objId" type "host" --format json | jq '.objects[]."ipv4-address"') if [ -z $raw_src_ip ] ; then echo $error_msg4; raw_pbr_error=1; exit 1; elif [ $(echo "$raw_src_ip" | wc -l) -gt 1 ] ; then echo $error_msg1; raw_pbr_error=1; exit 1; else echo "IP Founded" raw_src_ip=$(echo "$raw_src_ip"| tr -d \"); echo "Source IP: $raw_src_ip" fi else echo "IP has no object in Database, using IP from Log" echo "Source IP: $raw_src_ip" fi echo "Parsing Destination Object Name" raw_dst_ip=$eth1 echo "Destination IP: $raw_dst_ip" echo "Check if Route already exist" if [ $(/usr/local/bin/g_cli 10.0.50.100 show configuration static-route | grep "$raw_src_ip" | wc -l) -gt 0 ] ; then echo $error_msg2; raw_pbr_error=1; exit 0; else touch $DIR/VPNSecondaryLinkCleanUp.sh chmod +x $DIR/VPNSecondaryLinkCleanUp.sh echo "Creating Routing for $raw_src_ip/32" /usr/local/bin/g_cli $gateway_ip "set static-route $raw_src_ip/32 nexthop gateway address $secondary_gw on" echo "Checking file VPNSecondaryLinkCleanUp.sh" if [ $(cat /tmp/VPNSecondaryLinkCleanUp.sh | grep $raw_src_ip | wc -l ) -gt 0 ] ; then echo $error_msg5; raw_pbr_error=1; exit 1; else echo "Adding new route to VPNSecondaryLinkCleanUp.sh" echo "/usr/local/bin/g_cli $gateway_ip set static-route $raw_src_ip/32 off" >> $DIR/VPNSecondaryLinkCleanUp.sh fi fi echo "#### End of Execution of VPNSecondaryLink_alert at $(date -u) ####" echo -e '\n\n' exit 1; }
|
CronJob_VPNSecondaryLinkCleanUp.sh
Esse script será chamado pelo "Job", chamado VPNSecondaryLinkCleanUp do Crontab para fazer backup do VPNSecondaryLinkCleanUp.sh atual para salvar esta informação para fins de histórico e executar o VPNSecondaryLinkCleanUp.sh atual para limpar a tabela de roteamento ao menos 1 vez por dia.
#!/bin/bash -f source /opt/CPshrd-R80.40/tmp/.CPprofile.sh #Script Directory DIR="/home/admin/VPNSecondaryLink" #User that will Execute the Scripts and Cron Job EXECUSER="admin"
#Jump to Script Directory cd $DIR touch $DIR/VPNSecondaryLinkCleanUp.sh if [ $(cat $DIR/VPNSecondaryLinkCleanUp.sh | wc -l ) -gt 0 ] ; then echo "Coping old VPNSecondaryLinkCleanUp to TMP Diretory for historical purpose" cp $DIR/VPNSecondaryLinkCleanUp.sh $DIR/tmp/VPNSecondaryLinkCleanUp-$(date +%s).txt echo "Executing VPNSecondaryLinkCleanUp.sh to CleanUp Routes" $DIR/VPNSecondaryLinkCleanUp.sh echo "Erasing Old VPNSecondaryLinkCleanUp.sh" > $DIR/VPNSecondaryLinkCleanUp.sh else echo "Current VPNSecondaryLinkCleanUp.sh is already empty. No routes to be cleaned" fi
|
Passo-a-Passo
- Copie os 3 (três) scripts para o Servidor de Gerência (SMS)
- Altere a permissão de execução do script “FirstTimeSetup.sh”
- Execute o script “FirstTimeSetup.sh”
- Verifique se o CRON JOB foi criado
- Create an Access Control Rule with the following pattern:
From: ANY
To: IP_da_Interface_do_link_de_backup/secundário_da_Internet (No nosso caso: 200.200.0.100)
Services: HTTP and HTTPS
Action: Permit
Track: Log / Alert:User Alert 1
- Verifique os parâmetros dos comandos de alerta (Alert Commands) em Global Properties → Log and Alert → Alerts:
- Selecione “Send user Defined alert no. 1 to SmartView Monitor”
- Selecione “Run UserDefined script”
- Configure o parâmetro para invocar o script: VPNSecondaryLink_alert >> /var/log/VPNSecondaryLink_alert.log 2>&1
- Criando uma VPN no Cliente Remoto usando IP da interface não padrão (Ex .: Eth1 - 200.200.0.100)
- Verificando se o Cliente Remoto se conectou com êxito e obteve um IP reservado do "Office Mode"
- Verificando o Acesso ao Recurso Interno (Ex.: Ubuntu Server 01)
OBS 1: Eu criei esta página para verificar o IP de origem do cliente
OBS 2: Esta é o servidor "Ubuntu Server 01" e seu IP privado é 10.100.0.101
- Verificando no arquivo "VPNSecondaryLink_alert.log" para ver se os scripts executaram como o esperado e/ou identificar possíveis erros na execução
OBS: Existe um link simbólico $EXECDIR/log/VPNSecondaryLink_alert.log. O arquivo original foi criado em /var/log/VPNSecondaryLink_alert.log
- Verificando o comportamento da VPN
Você pode ver na saída do comando fw monitor que o Cliente VPN começou a enviar pacotes para 200.200.0.100 que chegaram na interface Eth1 e o gateway Gw-01 responde esses pacotes através da interface Eth0. Devido à inspeção Stateful Inspection no roteador RT_101, os pacotes foram descartados e nunca chegaram ao cliente VPN.
Depois, após a execução do script e a rota estática ser inserida, os pacotes do gateway Gw-01 para o IP 200.250.0.1 começaram a ser roteados pela interface Eth1.
After respond to TCP 80 (HTTP), then visitor mode could be reached and site were created on VPN Client.
- Checking the new routing on gateway
- Running the Clean Up Scrip (CronJob_VPNSecondaryLinkCleanUp.sh)