{"id":107,"date":"2022-03-31T15:31:33","date_gmt":"2022-03-31T18:31:33","guid":{"rendered":"http:\/\/marcius.pro\/?p=107"},"modified":"2022-04-01T18:06:47","modified_gmt":"2022-04-01T21:06:47","slug":"port-knocking-no-pfsense-usando-wazuh","status":"publish","type":"post","link":"http:\/\/marcius.pro\/index.php\/2022\/03\/31\/port-knocking-no-pfsense-usando-wazuh\/","title":{"rendered":"Port Knocking no pfSense usando Wazuh"},"content":{"rendered":"\n
O cen\u00e1rio \u00e9 o seguinte:<\/p>\n\n\n\n
A t\u00e9cnica de Port Knocking consiste em estabelecer 3 ou mais portas aleat\u00f3rias que, se “tocadas” (ou seja, se “brevemente conectadas”) por um IP na sequ\u00eancia correta, far\u00e1 com que um script seja executado para liberar outra porta para o IP de origem desses toques. Mais informa\u00e7\u00f5es sobre essa t\u00e9cnica voc\u00ea encontra aqui<\/a>.<\/p>\n\n\n\n Nesse artigo a inten\u00e7\u00e3o \u00e9 liberar o acesso ao pfSense, na porta “wan” dele, somente para um espec\u00edfico IP de origem quando esse conseguir tocar em 3 portas configuradas como “combina\u00e7\u00e3o de portas para libera\u00e7\u00e3o de conex\u00e3o”, e na sequ\u00eancia correta. Aqui descreverei a libera\u00e7\u00e3o das portas 80\/TCP e 22\/TCP, por\u00e9m s\u00f3 uma delas poder\u00e1 ser liberada para um IP de origem enquanto n\u00e3o expirar essa libera\u00e7\u00e3o.<\/p>\n\n\n\n Essa libera\u00e7\u00e3o externa para acessar o pfSense possibilitar\u00e1 o administrador de redes a configurar remotamente o gateway de uma LAN, pois possibilitar\u00e1 acesso tanto via SSH quanto ao webadmin do pfSense. Como essas portas ser\u00e3o liberadas somente se o Port Knocking for acertado, evita-se diversos tipos de ataques a esse gateway, como o de for\u00e7a bruta, por exemplo. No caso desse artigo utilizei a porta 80, por\u00e9m \u00e9 sempre recomendado ativar o HTTPS do pfSense e desativar o acesso HTTP, para maior seguran\u00e7a ainda mais quando se est\u00e1 acessando-o da internet.<\/p>\n\n\n\n Caso n\u00e3o tenha o acesso SSH ao servidor do pfSense habilitado, fa\u00e7a-o indo no menu System -> Advanced -><\/em> marque a op\u00e7\u00e3o “Enable Secure Shell<\/em>” e depois salve.<\/p>\n\n\n\n Configure o agente do Wazuh no pfSense para ler e encaminhar o conte\u00fado do log \/var\/log\/filter.log<\/em>. Abra o arquivo \/var\/ossec\/etc\/ossec.conf<\/em> no pfSense e, depois do \u00faltimo <\/localfile><\/em> , adicione:<\/p>\n\n\n\n Reinicie o agent:<\/p>\n\n\n\n Esse script ser\u00e1 o respons\u00e1vel por verificar a sequ\u00eancia de portas tocadas, criar a regra de firewall para liberar acesso a porta solicitada caso a sequ\u00eancia de toques esteja correta, e tamb\u00e9m para excluir essa regra ap\u00f3s um per\u00edodo pr\u00e9-determinado a ser configurado no active-response do wazuh-manager.<\/p>\n\n\n\n Crie o arquivo \/var\/ossec\/active-response\/bin\/portknocking.sh<\/em> com o seguinte conte\u00fado:<\/p>\n\n\n\n D\u00ea permiss\u00e3o de execu\u00e7\u00e3o para o script:<\/p>\n\n\n\n Agora vamos criar as regras no pfSense para as portas que, quando tocadas na sequ\u00eancia correta, liberar\u00e3o as portas do servi\u00e7o SSH e a do HTTP. Essas regras ser\u00e3o de bloqueio, pois o que queremos \u00e9 apenas logar os toques nelas.<\/p>\n\n\n\n Escolhi a sequ\u00eancia de portas 1111<\/strong>, 1000<\/strong> e 2000<\/strong>, para liberar a porta 22\/TCP<\/strong>, e as portas 11<\/strong>, 52<\/strong> e 40<\/strong> para liberar a porta 80\/TCP<\/strong>. Todas com o protocolo TCP.<\/p>\n\n\n\n \u00c9 recomendado usar, no m\u00ednimo, 3 portas e que n\u00e3o sejam sequ\u00eanciais (por exemplo: 1000, 1001 e 1002) para cada libera\u00e7\u00e3o pois, em casos de descoberta da primeira por um atacante, as demais seriam meio \u00f3bvias de adivinhar. Tamb\u00e9m \u00e9 necess\u00e1rio marcar a op\u00e7\u00e3o de logar essas regras, para que os toques sejam registrados no \/var\/log\/filter.log<\/em>.<\/p>\n\n\n\n Caso queira criar mais do que 3 portas de toques, basta cri\u00e1-la(s) no pfSense. O script reconhece automaticamente quantas portas s\u00e3o necess\u00e1rias nessa t\u00e9cnica.<\/p>\n\n\n\n Na descri\u00e7\u00e3o de cada regra h\u00e1 um padr\u00e3o extremamente importante<\/strong> para que o script funcione corretamente. Sempre escreva “Port Knocking (n\u00famero da regra no wazuh)<\/em>” pois o script ir\u00e1 procurar nesse campo as portas correspondentes ao Port Knocking em quest\u00e3o. Cada regra no wazuh (que ser\u00e3o criadas mais tarde) corresponde a uma libera\u00e7\u00e3o.<\/p>\n\n\n\n Crie todas as regras tal como a que foi criada na imagem acima, para cada uma das 6 portas (1111<\/strong>, 1000<\/strong>, 2000<\/strong> com a descri\u00e7\u00e3o “Port Knocking 100001<\/em>” e 11<\/strong>, 52<\/strong> e 40<\/strong> com a descri\u00e7\u00e3o “Port Knocking 100002<\/em>“), ficando a tabela de regras WAN assim:<\/p>\n\n\n\n Aqui voc\u00ea tamb\u00e9m define a ordem em que as portas devem ser tocadas. Ent\u00e3o ap\u00f3s a cria\u00e7\u00e3o das regras, coloque-as na ordem em que elas devem ser tocadas. Mesmo que os toques acertem as 3 portas, se n\u00e3o forem tocadas na ordem correta o script n\u00e3o ir\u00e1 liberar a porta do servi\u00e7o solicitado.<\/p>\n\n\n\n No exemplo acima n\u00e3o h\u00e1 outras regras al\u00e9m das desse artigo, mas se houvessem o script iria ignor\u00e1-las automaticamente para evitar que uma conex\u00e3o leg\u00edtima interfira na verifica\u00e7\u00e3o dos toques.<\/p>\n\n\n\n No servidor Debian crie as seguintes regras no arquivo \/var\/ossec\/etc\/rules\/local_rules.xml<\/em>:<\/p>\n\n\n\n Acima foram criadas duas regras, uma para cada libera\u00e7\u00e3o (SSH e HTTP). Elas ser\u00e3o ativadas quando a \u00faltima porta, da sequ\u00eancia correspondente ao servi\u00e7o a ser liberado, for tocada pois assim significa que todas as anteriores necess\u00e1rias j\u00e1 foram acessadas e, portanto, j\u00e1 logadas para serem lidas pelo script. Note que o n\u00famero de cada regra (dentro de <rule id=”<\/em>) corresponde a descri\u00e7\u00e3o das regras criadas no pfSense anteriormente.<\/p>\n\n\n\n Acrescente o comando e o active-response a seguir no arquivo \/var\/ossec\/etc\/ossec.conf<\/em>, logo ap\u00f3s o \u00faltimo <\/command><\/em>:<\/p>\n\n\n\n Veja que em <extra_args><\/extra_args><\/em> h\u00e1 informa\u00e7\u00f5es importantes (separadas por v\u00edrgula) que precisam ser passadas ao portknocking.sh<\/em>, que s\u00e3o:<\/p>\n\n\n\n A ordem em que essas informa\u00e7\u00f5es s\u00e3o colocadas \u00e9 vital para o correto funcionamento do script de libera\u00e7\u00e3o.<\/p>\n\n\n\n Al\u00e9m disso, outra configura\u00e7\u00e3o muito importante \u00e9 quanto ao tempo em que a regra de libera\u00e7\u00e3o de conex\u00e3o ao servi\u00e7o ficar\u00e1 ativa. Dentro da tag <timeout><\/timeout><\/em> voc\u00ea estipula esse tempo em segundos.<\/p>\n\n\n\n Reinicie o wazuh-manager:<\/p>\n\n\n\n Se o pfSense foi rec\u00e9m instalado, os hor\u00e1rios no \/var\/log\/filter.log<\/em> estar\u00e3o diferentes da data do sistema operacional, gerando erro no script. Pra resolver, basta reiniciar o pfSense.<\/p>\n\n\n\n Lembrando que a regra de libera\u00e7\u00e3o criada ap\u00f3s a sequ\u00eancia correta de toques nas portas do Port Knocking s\u00f3 \u00e9 vis\u00edvel pelo comando pfctl<\/em>, portanto n\u00e3o aparecer\u00e1 no painel administrativo do pfSense, j\u00e1 que ela n\u00e3o foi criada via easyrules<\/em> (porque atrav\u00e9s desse comando n\u00e3o \u00e9 poss\u00edvel remover uma regra criada, por isso tive que usar o pfctl<\/em>).<\/p>\n\n\n\n Quando o active-response do Wazuh \u00e9 ativado para um determinado IP de origem, esse mesmo IP n\u00e3o consegue ativar outro active-response enquanto o primeiro ainda estiver ativo. Como o script \u00e9 executado no pfSense, o mesmo n\u00e3o tem como avisar o Wazuh quando, por exemplo, uma sequ\u00eancia de portas forem tocadas na ordem errada, e assim evitar a execu\u00e7\u00e3o do active-response. Ele \u00e9 executado quando a \u00faltima porta da sequ\u00eancia \u00e9 tocada, mesmo que ela esteja errada, e ficar\u00e1 ativo at\u00e9 o seu timeout expirar. Portanto, caso erre a sequ\u00eancia uma vez, deve-se esperar o tempo configurado em que a libera\u00e7\u00e3o estivesse ativa, para ent\u00e3o fazer uma nova tentativa (tags <timeout><\/timeout><\/em> no \/var\/ossec\/etc\/ossec.conf<\/em> na se\u00e7\u00e3o do <active-response><\/active-response><\/em>).<\/p>\n\n\n\n Por causa dessa limita\u00e7\u00e3o, recomenda-se um timeout pequeno, de uns 5 minutos, s\u00f3 para fazer uma manuten\u00e7\u00e3o r\u00e1pida remotamente. Caso precise de mais tempo, o recomendado \u00e9 criar uma regra diretamente no pfSense liberando a conex\u00e3o para o seu IP de origem.<\/p>\n\n\n\n Por conta do que foi dito acima, tamb\u00e9m n\u00e3o \u00e9 poss\u00edvel liberar as portas 22\/TCP e 80\/TCP ao mesmo tempo via Port Knocking. Quando uma for ativada, deve-se esperar o timeout dela passar para fazer o Port Knocking na outra.<\/p>\n\n\n\n De um sistema linux, instale o curl<\/em> e d\u00ea o seguinte comando (certifique-se que esse linux alcance a interface WAN do pfSense):<\/p>\n\n\n\n Para verificar se a regra de libera\u00e7\u00e3o da porta do SSH foi criada com sucesso via pfctl<\/em>, execute o comando no shell do pfSense:<\/p>\n\n\n\n Por exemplo, se o IP 10.0.0.182<\/strong> pediu libera\u00e7\u00e3o da porta 22<\/strong> do protocolo TCP<\/strong>, o comando acima ficar\u00e1:<\/p>\n\n\n\n No Windows, pode-se usar o PowerShell com o comando Test-NetConnection. Exemplo para a libera\u00e7\u00e3o da porta 22\/TCP desse artigo:<\/p>\n\n\n\n Port Knocking \u00e9 uma t\u00e9cnica que insere uma camada a mais de seguran\u00e7a para o acesso externo a sua rede. Com ele podemos evitar ataques de for\u00e7a bruta, por exemplo, e at\u00e9 ataques a aplicativos web em vulnerabilidades ainda n\u00e3o corrigidas. N\u00e3o deixando uma porta sempre aberta para qualquer IP de origem bloqueia a detec\u00e7\u00e3o delas por escaneadores.<\/p>\n\n\n\n Se um administrador de rede est\u00e1 em uma situa\u00e7\u00e3o em que n\u00e3o pode realizar uma conex\u00e3o VPN a sua rede, ele poder\u00e1 acessar o roteador se lembrar das 3 (ou mais) portas que devem ser tocadas antes da libera\u00e7\u00e3o de uma porta para um servi\u00e7o administrativo desse roteador, e assim poder\u00e1 criar outras regras para uma outra conex\u00e3o, entre outras manuten\u00e7\u00f5es poss\u00edveis. O fato dessa porta administrativa ser liberada apenas para o IP de origem que efetuou os toques do Port Knocking, e com tempo dessa libera\u00e7\u00e3o ser pr\u00e9-determinado, torna essa t\u00e9cnica excelente para que o seu firewall seja mais eficaz.<\/p>\n\n\n\n Em casos onde \u00e9 poss\u00edvel estabelecer uma VPN, o Port Knocking tamb\u00e9m \u00e9 \u00fatil pois poder\u00e1 proteger a porta de conex\u00e3o desse servi\u00e7o. N\u00e3o haveria necessidade de deixar essa porta sempre aberta para conex\u00f5es. Nesse caso \u00e9 recomendado criar um script, no lado do cliente, com os 3 (ou mais) toques j\u00e1 configurados para que se possa colocar um tempo maior de libera\u00e7\u00e3o (timeout) sem temer errar a sequ\u00eancia de portas, o que faria com que a porta do servi\u00e7o solicitado ficasse inacess\u00edvel pelo mesmo per\u00edodo em que estaria liberada. Geralmente uma VPN \u00e9 necess\u00e1ria para per\u00edodos maiores de uso, por isso o timeout maior, nesse caso. Lembrando que o timeout vale para todos os active-response referente ao IP de origem.<\/p>\n\n\n\n O Wazuh tem a capacidade de enviar e-mails de alertas para o administrador quando uma regra \u00e9 acionada, mediante configura\u00e7\u00e3o nela. Ou seja, \u00e9 poss\u00edvel monitorar os acessos por Port Knocking, bastando apenas configurar as regras no Wazuh referente a essa t\u00e9cnica para que enviem e-mails sempre que ativadas.<\/p>\n\n\n\n <\/p>\n\n\n\n Fontes:<\/p> https:\/\/documentation.wazuh.com\/current\/user-manual\/capabilities\/active-response\/custom-active-response.html<\/a> Esconda portas importantes no seu pfSense e abra elas especificamente para o seu IP externo atrav\u00e9s de toques de conex\u00f5es em 3 ou mais portas bloqueadas, com uma sequ\u00eancia secreta.<\/p>\n","protected":false},"author":1,"featured_media":109,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[],"yoast_head":"\n..::| Enviando registros ao wazuh-manager<\/h2>\n\n\n\n
<localfile>\n <log_format>syslog<\/log_format>\n <location>\/var\/log\/filter.log<\/location>\n<\/localfile><\/code><\/pre>\n\n\n\n
\/usr\/local\/etc\/rc.d\/wazuh-agent restart<\/code><\/pre>\n\n\n\n
..::| Script portknocking.sh<\/h2>\n\n\n\n
#!\/bin\/sh\n# Script para liberar porta atraves da tecnica port knocking\n# Expect: srcip\n# Author: Marcius da C. Silveira\n# Last modified: Apr 1, 2022\n# Publicado: https:\/\/marcius.pro\n\n\nACAO=$1\nUSUARIO=$2\nIP=$3\nREGRA=$5 # Regra no wazuh referente a esse port knocking especifico\nINTWAN=`echo $9 | cut -d ',' -f1` # Nome da interface de rede da porta wan que sera acessada externamente para liberacao da ${PORT} configurada abaixo\nTABWAN=`echo $9 | cut -d ',' -f2` # Nome que o pfsense da a interface de rede da porta wan configurada em ${INTWAN}\nPROTO=`echo $9 | cut -d ',' -f3` # Protocolo que sera liberado apos a sequencia de portas serem tocadas\nPORT=`echo $9 | cut -d ',' -f4` # Porta que sera liberada no port knocking\nTIMEOUT=`echo $9 | cut -d ',' -f5` # Tempo de espera entre o toque na primeira porta do port knocking e a ultima da sequencia, se passar desse valor em segundos a operacao nao se realizara\nEXTRAIGNOREPORTS=`echo $9 | cut -d ',' -f6 ` # Portas a serem ignoradas tambem\nARLOG=\/var\/ossec\/logs\/active-responses.log\n\n# logando as atividades desse script\necho \"`date` $0 $1 $2 $3 $4 $5 $9\" >> ${ARLOG}\n\n# Adicionar ou remover IP\n# Adicionando\nif [ ${ACAO} == \"add\" ]; then\n\n # Separando as entradas no log de filtragem do pfSense referente ao IP que esta acessando esse sistema\n LOGFILTERORIGINAL=\/var\/log\/filter.log\n LOGFILTER=\/tmp\/conexoes_${IP}_${PORT}_${PROTO}\n cat ${LOGFILTERORIGINAL} | grep \",\"${IP}\",\" > ${LOGFILTER}\n\n # Se foram encontradas conexoes desse IP no log de filtragem, executa esse script\n if [ `wc -l ${LOGFILTER} | awk '{print $1}'` -gt 0 ]; then\n\n # Portas do port knocking, na sequencia que devem ser tocadas\n PORTASK=\"`\/usr\/local\/bin\/xmllint --xpath \"pfsense\/filter\/rule[starts-with(descr, 'Port Knocking ${REGRA}') and interface = '${TABWAN}']\" \/conf\/config.xml | grep \"<port>\" | grep -v ^$ | cut -d \">\" -f 2 | cut -d \"<\" -f1 | tr \"\\n\" \"|\" | sed 's\/.$\/\/'`\"\n\n # Portas que serao ignoradas na contagem, tiradas das regras na tab ${TABWAN}.\n # A intencao aqui e evitar que conexoes legitimas sejam consideradas erros de sequencia de toque no port knocking desse script.\n IGNOREPORTS=\"`\/usr\/local\/bin\/xmllint --xpath \"pfsense\/filter\/rule[interface = '${TABWAN}']\/destination\/port\" \/conf\/config.xml | cut -d \">\" -f2 | cut -d \"<\" -f1 | tr \"\\n\" \"|\" | sed 's\/.$\/\/'`\"\n\n # Removendo as portas do port knocking das portas encontradas na tab ${TABWAN} caso haja outras\n QTDIGNOREPORTS=`echo $IGNOREPORTS | tr \"|\" \" \" | wc -w | sed 's\/ \/\/g'`\n QTDPORTASK=`echo $PORTASK | tr \"|\" \" \" | wc -w | sed 's\/ \/\/g'`\n if [ ${QTDIGNOREPORTS} != ${QTDPORTASK} ]; then\n while [ ${QTDIGNOREPORTS} != 0 ]\n do\n QTDPRTSK=${QTDPORTASK}\n while [ ${QTDPRTSK} != 0 ]\n do\n IPORT=`echo $IGNOREPORTS | cut -d \"|\" -f${QTDIGNOREPORTS}`\n KPORT=`echo $PORTASK | cut -d \"|\" -f${QTDPRTSK}`\n if [ ! -z ${IPORT} ]; then\n if [ ${IPORT} = ${KPORT} ]; then\n IGNOREPORTS=`echo $IGNOREPORTS | sed 's\/^\/|\/' | sed 's\/$\/|\/' | sed \"s\/|${IPORT}|\/|\/\" | sed 's\/|$\/\/' | sed 's\/||\/|\/' | sed 's\/^|\/\/'`\n fi\n fi\n QTDPRTSK=$((QTDPRTSK-1))\n done\n QTDIGNOREPORTS=$((QTDIGNOREPORTS-1))\n done\n fi\n\n # Adicionando a porta que sera aberta pelo port knocking e as ${EXTRAIGNOREPORTS} a variavel de portas a serem ignoradas\n QTDEXTRAIGNOREPORTS=`echo ${EXTRAIGNOREPORTS} | tr \"|\" \" \" | wc -w | sed 's\/ \/\/g'`\n while [ ${QTDEXTRAIGNOREPORTS} != 0 ]; do\n EIPORT=`echo ${EXTRAIGNOREPORTS} | cut -d \"|\" -f${QTDEXTRAIGNOREPORTS}`\n if [ ${EIPORT} == ${PORT} ]; then\n EXTRAIGNOREPORTS=`echo ${EXTRAIGNOREPORTS} | sed \"s\/${EIPORT}\/\/\"`\n fi\n QTDEXTRAIGNOREPORTS=$((QTDEXTRAIGNOREPORTS-1))\n done\n if [ ${QTDIGNOREPORTS} != ${QTDPORTASK} ]; then\n IGNOREPORTS=`echo -n ${IGNOREPORTS} | sed 's\/^|\/\/' ; echo \"|\"${PORT}\"|\"${EXTRAIGNOREPORTS} | sed 's\/||\/|\/' | sed 's\/|$\/\/'`\n else\n IGNOREPORTS=`echo -n ${IGNOREPORTS} | echo ${PORT}\"|\"${EXTRAIGNOREPORTS} | sed 's\/||\/|\/' | sed 's\/|$\/\/'`\n fi\n\n # Coletando informacoes do registro mais recente de conexao na primeira porta da sequencia do port knocking\n PRIMEIRAPORTAK=`echo ${PORTASK} | awk -F \"|\" '{print $1}'`\n REGPRIMEIRAPORTAK=`cat $LOGFILTER | grep -n ${IP} | grep \",${PRIMEIRAPORTAK},\" | tail -1 | sed 's\/:\/ \/' | cut -d \" \" -f1-4`\n LINHAPRIMEIRAPORTAK=`echo ${REGPRIMEIRAPORTAK} | awk '{print $1}'`\n\n # Analisando se o tempo entre o toque na primeira porta da sequencia e a ultima esta dentro de ${TIMEOUT} segundos\n TSATUAL=`date +%s`\n TSTIMEOUT=`echo \"${TSATUAL} - ${TIMEOUT}\" | bc`\n TZANO=`date +%Z\" \"%Y`\n DATAPRIMEIRAPORTAK=`echo ${REGPRIMEIRAPORTAK} | awk -v tzano=\"${TZANO}\" '{print $2\" \"$3\" \"$4\" \"tzano}'`\n TSPRIMEIRAPORTAK=`echo ${DATAPRIMEIRAPORTAK} | awk '{system(\"date -jf \\\"%a %b %d %t %z %Y\\\" \\\"Mon \"$1\" \"$2\" \"$3\" \"$4\" \"$5\"\\\" \\\"+%s\\\"\")}'`\n # Diferenca em segundos do momento em que esse script esta rodando e o toque na primeira porta da sequencia\n # Lembrando que esse script so sera executado quando a ultima porta da sequencia do port knocking for tocada\n DIFTS=`echo ${TSATUAL} - ${TSPRIMEIRAPORTAK} | bc `\n\n # Separando a parte do log desde o ultimo toque dado na primeira porta da sequencia ate o final do mesmo\n TOTALLINHASLOG=`cat $LOGFILTER | wc -l | awk '{print $1}'`\n LINHASATEPRIMEIRAPORTAK=`echo \"(\"${TOTALLINHASLOG} - ${LINHAPRIMEIRAPORTAK}\") + 1\" | bc`\n QTDPORTAS=`cat $LOGFILTER | grep $IP | tail -${LINHASATEPRIMEIRAPORTAK} | cut -d \",\" -f 22 | egrep -vw $IGNOREPORTS | sort | uniq | wc -l`\n # Coletando as portas acessadas.\n PORTASACESSADAS=`cat $LOGFILTER | grep $IP | tail -${LINHASATEPRIMEIRAPORTAK} | cut -d \",\" -f 22 | egrep -vw $IGNOREPORTS | awk -v RS=\"[ \\n]+\" '!n[$0]++' | sed 's\/ \/\/'`\n\n # Checando sequencia de portas acessadas\n if [ ${QTDPORTAS} -eq ${QTDPORTASK} -a ${DIFTS} -le ${TIMEOUT} ]; then\n while [ ${QTDPORTAS} != 0 ]; do\n if [ `echo ${PORTASACESSADAS} | cut -d \" \" -f${QTDPORTAS}` = `echo ${PORTASK} | cut -d \"|\" -f${QTDPORTASK}` ]; then\n RESULTCHECK=1\n QTDPORTAS=$((QTDPORTAS-1))\n QTDPORTASK=$((QTDPORTASK-1))\n else\n echo \"`date` Sequencia invalida de portas acessadas\" >> ${ARLOG}\n RESULTCHECK=0\n QTDPORTAS=0\n QTDPORTASK=0\n fi\n done\n if [ ${RESULTCHECK} == 1 ]; then\n echo \"pass in quick on ${INTWAN} proto ${PROTO} from ${IP} to port ${PORT}\" | pfctl -a \"userrules\/${IP}_${PORT}_${PROTO}\" -f -\n echo \"`date` Liberacao da porta ${PORT}\/${PROTO} para o IP ${IP} ativada!\" >> ${ARLOG}\n fi\n\n elif [ ${DIFTS} -gt ${TIMEOUT} ]; then\n echo \"`date` Primeira porta (${PRIMEIRAPORTAK}) foi acessada a mais de ${TIMEOUT} segundos. Operacao nao realizada.\" >> ${ARLOG}\n else\n echo \"`date` Sequencia invalida de portas acessadas\" >> ${ARLOG}\n fi\n\n else\n echo \"`date` Sem registros de conexoes desse IP ${IP}. Nada a fazer\" >> ${ARLOG}\n fi\n\n# Removendo ${IP}\nelif [ ${ACAO} == \"delete\" ]; then\n pfctl -a \"userrules\/${IP}_${PORT}_${PROTO}\" -F rules\n if [ $? = 0 ]; then\n echo \"`date` IP ${IP} removido com sucesso!\" >> ${ARLOG}\n else\n echo \"Erro ao remover o IP ${IP}\" >> ${ARLOG}\n fi\nelse\n echo \"`date` Operacao invalida\" >> ${ARLOG}\nfi\n<\/code><\/pre>\n\n\n\n
chmod +x \/var\/ossec\/active-response\/bin\/portknocking.sh<\/code><\/pre>\n\n\n\n
..::| Portas para libera\u00e7\u00e3o de conex\u00e3o<\/h2>\n\n\n\n
<rule id=\"100001\" level=\"5\">\n <if_sid>87701<\/if_sid>\n <dstport>2000<\/dstport>\n <description>Port knocking da porta SSH padrao<\/description>\n <\/rule>\n\n <rule id=\"100002\" level=\"5\">\n <if_sid>87701<\/if_sid>\n <dstport>40<\/dstport>\n <description>Port knocking da porta HTTP padrao<\/description>\n <\/rule><\/code><\/pre>\n\n\n\n
<command>\n <name>portknocking-ssh<\/name>\n <executable>portknocking.sh<\/executable>\n <!-- Adicione as seguintes informacoes separadas por virgula: nome da interface no SO, nome da interface wan no pfsense, protocolo, porta que sera liberada,\n tempo (em segundos) entre os toques das portas, portas extras a ignorar (separadas por pipe |) -->\n <extra_args>em0,wan,tcp,22,120,22|80<\/extra_args>\n <timeout_allowed>yes<\/timeout_allowed>\n <\/command>\n\n <command>\n <name>portknocking-http<\/name>\n <executable>portknocking.sh<\/executable>\n <!-- Adicione as seguintes informacoes separadas por virgula: nome da interface no SO, nome da interface wan no pfsense, protocolo, porta que sera liberada,\n tempo (em segundos) entre os toques das portas, portas extras a ignorar (separadas por pipe |) -->\n <extra_args>em0,wan,tcp,80,120,80|22<\/extra_args>\n <timeout_allowed>yes<\/timeout_allowed>\n <\/command>\n\n <active-response>\n <command>portknocking-ssh<\/command>\n <location>defined-agent<\/location>\n <agent_id>002<\/agent_id>\n <rules_id>100001<\/rules_id>\n <disabled>no<\/disabled>\n <timeout>60<\/timeout>\n <\/active-response>\n\n <active-response>\n <command>portknocking-http<\/command>\n <location>defined-agent<\/location>\n <agent_id>002<\/agent_id>\n <rules_id>100002<\/rules_id>\n <disabled>no<\/disabled>\n <timeout>60<\/timeout>\n <\/active-response>\n<\/code><\/pre>\n\n\n\n
<\/figure>\n\n\n\n
<\/figure>\n\n\n\n
<\/figure>\n\n\n\n
systemctl restart wazuh-manager<\/code><\/pre>\n\n\n\n
..::| Limita\u00e7\u00f5es<\/h2>\n\n\n\n
..::| Testes<\/h2>\n\n\n\n
curl --connect-timeout 1 http:\/\/10.0.0.200:1111 ; curl --connect-timeout 1 http:\/\/10.0.0.200:1000 ; curl --connect-timeout 1 http:\/\/10.0.0.200:2000 ; ssh root@10.0.0.200<\/code><\/pre>\n\n\n\n
pfctl -a \"userrules\/IP_PORTA_PROTOCOLO\" -sr<\/code><\/pre>\n\n\n\n
pfctl -a \"userrules\/10.0.0.182_22_tcp\" -sr<\/code><\/pre>\n\n\n\n
<\/figure>\n\n\n\n
Test-NetConnection -Port 1111 10.0.0.200\nTest-NetConnection -Port 1000 10.0.0.200\nTest-NetConnection -Port 2000 10.0.0.200<\/code><\/pre>\n\n\n\n
..::| Conclus\u00e3o<\/h2>\n\n\n\n
https:\/\/forum.netgate.com\/topic\/147951\/create-firewall-rules-by-script\/4<\/a>
https:\/\/www.openbsd.org\/faq\/pf\/anchors.html<\/a>
http:\/\/woshub.com\/checking-tcp-port-response-using-powershell\/<\/a><\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"