Utilização da técnica de Port Knocking para negação de acesso indevido e ocultação de portas TCP / UPD em servidores Linux Diego Pereira do Nascimento Curso de Especialização em Redes e Segurança de Sistemas Pontifícia Universidade Católica do Paraná Curitiba, janeiro de 2013 Resumo Este artigo tem como objetivo demonstrar a utilização da técnica de Port Knocking em servidores Linux, para bloqueio de diversas formas de ameaça presentes na rede, como Port Scans, Banner Grabbing, Vulnerability Scanning, Brute Forces, Worms, ataques DoS e DdoS, etc. Para demonstração da técnica, será montada uma rede virtual com um servidor Linux que implemente Port Knocking. Feito isto, serão realizados diversos testes, no sentido de tentar obter informações de portas, versões e vulnerabilidades do servidor Linux, a partir de um computador client. O artigo irá descrever os resultados obtidos e apresentar os resultados dos testes. 1 Introdução Com o crescente aumento da utilização de transações online, cresce também o número de ameaças online, como o risco de vazamento de informações confidenciais, risco de comprometimento da integridade das informações, indisponibilidade, Worms de rede, 0-day exploits e diversas outra formas de comprometimento da rede. Grande parte das informações de enviroment de servidores podem ser obtidas de forma muito simples, através do uso de técnicas de Port Scans, Banner Grabbing, Vulnerability Scanning. Através do uso destas técnicas é possível obter informações importantes e planejar ataques utilizando-se de brute forces, exploits.
Com o intuito de proteger o sistema contra port scans e outros tipos de técnicas de probing surgiu a implementação de Port Knocking em servidores *NIX, que possibilita o bloqueio de portas TCP/UDP para o acesso a serviços críticos do sistema (SSH, Telnet, etc) e previne o comprometimento do servidor contra ameaças já citadas, além de ameaças automatizadas como Worms e Bot Nets. 2 O que é o Port Knocking O Port Knocking é um método que permite abrir portas em um firewall externamente através da execução de uma tentativa de conexão em uma sequência de portas pré determinada, permitindo a implementação de segurança pela obscuridade. Após a sequência de tentativas de conexão nas portas corretas é recebida pelo daemon de Port Knocking, o firewall abre de forma dinâmica as portas determinadas pela regra de Port Knocking, de forma a permitir o computador cliente a conectar no computador servidor, nas portas especificadas pela regra. Exemplo: o computador cliente envia uma sequência de tentativas de acesso (knock) nas portas 4464, 9873, 9873, 1235, nesta ordem, fazendo com que a porta 22 (SSH) seja liberada para acesso remoto. Existe, no entanto uma variante de implementação de Port Knocking, chamada Single Packet Authorization, onde apenas uma tentativa de acesso, ou knock, é nececessária, sendo este pacote encriptado [1]. O objetivo principal de se usar Port Knocking, consiste em prevenir o scanning do servidor por vulnerabilidades que possam ser exploradas por um atacante, utilizando-se de um port scan (como o aplicativo nmap), pois se o atacante não conhecer a sequência correta de portas, irá enxergar as portas protegidas como se estivessem fechadas pelo firewall. Esta técnica pode ser implementada através da configuração de um daemon que verifique os logs de firewall e modifique suas regras de acesso quando observar que uma determinada sequência de portas foi acessada. 2.1 Como funciona O funcionamento do Port Knocking pode ser melhor entendido observando-se a sequência de imagens que segue abaixo. Na imagem da Figura 1, pode-se observar que o cliente A não consegue se conectar à aplicação da porta n e o cliente B não consegue estabelecer uma conexão com nenhuma porta. Na Figura 2 é demonstrado um client enviando
Figura 1 Figura 2 Figura 3 Figura 4 uma sequência de portas ao servidor. Como esta sequência de portas já é conhecida pelo servidor de Port Knocking, a porta n é liberada pelo firewall para acesso pelo client, conforme demonstrado na Figura 3. Desta forma, após a porta ser liberada, o client procede normalmente com a conexão, de acordo com o exibido na Figura 4 [2]. 2.2 Vantagens x Desvantagens Abaixo serão apresentados as vantagens e desvantagens da implementação da técnica de Port Knocking em um servidor: Inibir o uso de ferramentas de Port Scan Inibir Brute Forces em serviços de gerência (SSH, Telnet) Logs de acesso menores e mais significativos (devido ao menor número de acessos diretos à porta) Inibir infecção por worms de rede Evitar bots de scans de vulnerabilidades 0-day Necessidade de configurar cada aplicação cliente para usar Port Knocking Se o daemon do Port knocking trava, o sistema fica inacessível (embora algumas implementações de PK possuam mecanismos para remediar este problema) Delay para iniciar uma nova conexão, dependendo das configs do Port Knoking (embora o delay seja de apenas alguns milessegundos, já inviabilizaria a utilização em aplicações real-time) Sequência de portas pode ser obtida através de um ataque de man-in-the-middle (necessário utilizar SPA) Sequência de portas pode ser descoberta através de um ataque de brute force (necessário utilizar SPA)
Desencorajar um ataque ao servidor, devido ao trabalho extra para burlar o Port Knocking Fácil implementação no servidor Não é possível detectar que existe um daemon de Port Knocking rodando no servidor Diminuição geral do nível de segurança do sistema, de acordo com a teoria de Risk Compensation [2] É necessário que não existam barreiras entre o client e o servidor de Port Knocking [5] Trabalhoso modificar a sequência de portas (requer modificar todos os clients) O envio da sequência de portas pode ser criptografado, permitindo proteger a implementação de ataques de man-inthe-middle e brute force 2.3 Single Packet Autorization (SPA) Single Packet Authorization (SPA) é uma variante de port knocking que possui basicamente o mesmo objetivo, porém um mecanismo de trasmissão bastante diferente. No SPA, o knock é chamado de Authorization Packet (AP) que é encapsulado em um único pacote. Esta característica, garante certas vantagens que não estão presentes com o uso do port knocking tradicional, tais quais, eliminação de problemas de entrega de pacotes fora de ordem. O SPA simplifica e torna mais seguro o processo ao realizar o encapsulamento de todas as informações necessárias em um único pacote, tipicamente UPD ou ICMPs. Devido ao aumento na complexidade de implementação, esta técnica não será abordada no trabalho [6]. 3 O cenário Para mostrar o funcionamento da implementação de Port Knocking, consideremos um servidor Linux com as seguintes características: Endereço IP: 192.168.11.148 / Hostname: ubuntu-server / Sistema Operacional: Ubuntu 12.04 / Servidor SSH: OpenSSH 5.9 / Firewall: iptables 1.4.12 / Daemon de Port Knocking: knockd 0.5 / nmap 6.25
Neste servidor será configurado um Firewall iptables implementando um daemon de Port Knocking chamado knockd para a porta de SSH (22). A escolha do knockd foi realizada baseada em sua simplicidade de configuração e por estar embutida na maioria das distros atuais, porém existem muitos outros daemons, como Fwknop, Tariq, PortknockO, etc, e clients como KnockKnock, WebKnock, It s me, etc. 3.1 Configuração do ambiente Abaixo serão apresentados os passos realizados para a configuração de um daemon de Port Knocking no ambiente já mencionado. 3.1.1 Configuração do daemon do knockd (/etc/knockd.conf) Abaixo o conteúdo do arquivo de configuração do daemon de Port Knocking, knockd: root@ubuntu:/# cat /etc/knockd.conf [options]! logfile = /var/log/knockd.log [openssh]! sequence = 7000,8000,9000! seq_timeout = 5! command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT! tcpflags = syn [closessh]! sequence = 9000,8000,7000! seq_timeout = 5! command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT! tcpflags = syn Como pode-se observar acima, a sequência de portas definida para abrir a porta 22 no firewall é a: 7000, 8000, 9000. Para fechar o acesso à porta 22, a sequência é a: 9000, 8000, 7000. Após realizado os ajustes na configuração, foi iniciado o daemon do knockd com o comando sudo service knockd start. 3.1.2 Configuração do firewall iptables Após configurado e inicializado o knockd, o iptables foi configurado para não mais aceitar conexões de qualquer origem na porta 22, com o seguinte comando:
# /sbin/iptables -A INPUT -p tcp --dport ssh -j REJECT É importante observar que se faz necessário usar o target REJECT, pois se usarmos o DROP, os programas de Port Scan detectam que a porta está protegida pelo firewall (filtered) e isto seria indesejado pois daria uma pista para o atacante de que existe um firewall filtrando os pacotes. Usando o target REJECT, a porta 22 é detectada como fechada (closed). 3.2 Abrindo portas no firewall Após configurado e ativado o knockd, para acessar a porta 22 se faz necessário enviar ao servidor a sequência de knocks correta, de forma que o acesso à porta desejada seja liberado pelo knockd no servidor. Para este fim, existe um programa client chamado knock que facilita o envio de knocks ao servidor. Porém, o uso deste programa não é obrigatório, visto que o knock pode ser realizado também de outras formas, como via programa Telnet. O uso do programa knock é demonstrado abaixo:./knock 192.168.11.148 7000 8000 9000 Este comando irá abrir o acesso à porta 22 no firewall a partir do IP do computador onde o comando foi executado. 3.2.2 Teste de acesso à porta 22 via Telnet Resultado do comando Telnet antes da ativação do daemon knockd: $ telnet 192.168.11.148 22 Trying 192.168.11.148... Connected to ubuntu-server. Escape character is '^]'. SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1 É possível observar que o acesso é realizado normalmente e conseguimos inclusive obter a versão do pacote do SSH instalado no servidor. Resultado do comando Telnet após a ativação do daemon knockd:
$ telnet 192.168.11.148 22 Trying 192.168.11.148... telnet: connect to address 192.168.11.148: Operation timed out out no Telnet. Neste caso, o acesso não é possível pois a porta está fechada, causando erro de time 3.3 Análise dos logs do sistema O seguinte log é apresentado no arquivo /var/log/knockd.log após o recebimento de uma sequência de knock válida: [2012-12-09 22:30] 192.168.11.144: openssh: Stage 1 [2012-12-09 22:30] 192.168.11.144: openssh: Stage 2 [2012-12-09 22:30] 192.168.11.144: openssh: Stage 3 [2012-12-09 22:30] 192.168.11.144: openssh: OPEN SESAME [2012-12-09 22:30] openssh: running command: /sbin/iptables -I INPUT -s 192.168.11.144 -p tcp --dport 22 -j ACCEPT Como pode-se observar no log, após o recebimento da sequência de 3 portas, identificadas no log por Stage 1, 2 e 3, é realizada a execução do comando definido no arquivo de configuração: /sbin/iptables -I INPUT -s 192.168.11.144 -p tcp --dport 22 -j ACCEPT, que faz com que a porta 22 seja aberta para o IP de origem do comando da sequência de portas correta (7000, 8000 e 9000, nesta ordem). Para demonstrar melhor, abaixo é exibida a tabela de regras do iptables após o envio da sequência de Port Knocking pelo computador client: # iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- MacBook-Diego anywhere tcp dpt:ssh DROP tcp -- anywhere anywhere tcp dpt:ssh Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
É possível perceber que foi criada uma regra com target ACCEPT na chain INPUT, tendo como source o computador que realizou o envio da sequência (MacBook-Diego). Abaixo o log encontrado em /var/log/knockd.log quando a porta é fechada novamente (timeout). [2013-01-13 07:45] 192.168.11.144: closessh: Stage 1 [2013-01-13 07:45] 192.168.11.144: closessh: sequence timeout (stage 1) 3.4 Banner Grabbing e Port Scans Resultado da varredura do nmap antes de ativar o knockd: $ sudo nmap -sv 192.168.11.148 Starting Nmap 6.25 ( http://nmap.org ) at 2012-12-09 22:29 BRST Nmap scan report for Ubuntu-Server (192.168.11.148) Host is up (0.0012s latency). Not shown: 997 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 5.9p1 Debian 5ubuntu1 (Ubuntu Linux; protocol 2.0) 5555/tcp open http Apache httpd 2.2.22 ((Ubuntu)) 9876/tcp open http Apache httpd 2.2.22 ((Ubuntu)) Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel É possível detectar a porta 22 (SSH) como aberta e inclusive obter informações de versão detalhadas do serviço de SSH (OpenSSH 5.9p1 Debian 5ubuntu1), o que poderia facilitar para um invasor, que pode usar alguma vulnerabilidade conhecida desta versão para realizar um ataque ao servidor. Abaixo, o resultado da varredura do nmap no servidor após a ativação do knockd: $ sudo nmap -sv 192.168.11.148 Starting Nmap 6.25 ( http://nmap.org ) at 2013-01-13 15:21 BRST Nmap scan report for Ubuntu-Server (192.168.11.148) Host is up (0.0011s latency). Not shown: 998 closed ports PORT STATE SERVICE VERSION 5555/tcp open http Apache httpd 2.2.22 ((Ubuntu)) 9876/tcp open http Apache httpd 2.2.22 ((Ubuntu))
Como pode-se observar, não é mais possível detectar a porta 22, pois, a não ser que você conheça a sequência de portas, ela sempre será detectada como fechada. 3.5 Brute-force e DoS Com a utilização de ferramentas de brute-force (hydra) e DoS (t50) o resultado foi similar ao obtido nos testes já mencionados, sendo que todos os pacotes destinados à porta 22 são simplesmente ignorados pelo firewall caso o IP de origem dos pacotes não conheça a sequência de knock e consequentemente não tenha aberto antecipadamente a porta 22 para acesso remoto. Portanto, os milhares de pacotes enviados em um ataque de DoS não surtem nenhum efeito no servidor alvo, nem mesmo afetando o desempenho de forma perceptível. Abaixo um exemplo de como seria um ataque de brute-force ao servidor caso não estivesse protegido pela técnica de PK: # hydra -l diego -P /tmp/wordlist.txt -t12 192.168.11.148 ssh Hydra v7.3 (c)2012 by van Hauser/THC & David Maciejak - for legal purposes only Hydra (http://www.thc.org/thc-hydra) starting at 2013-01-06 20:01:38 [DATA] 12 tasks, 1 server, 11000002 login tries (l:1/p:11000002), ~916666 tries per task [DATA] attacking service ssh on port 22 [22][ssh] host: 192.168.11.148 login: diego password: eureka1 [STATUS] attack finished for 192.168.11.148 (waiting for children to finish) 1 of 1 target successfuly completed, 1 valid password found Hydra (http://www.thc.org/thc-hydra) finished at 2013-01-06 21:02:10 5 Conclusão Com o presente trabalho, concluí que é possível implementar uma camada extra de segurança em servidores linux, com o uso de Port Knocking de forma rápida e simples. A implementação da técnica pode prevenir a exposição do servidor contra muitas ameaças como Worms, Brute forces, redes zumbis realizando scans por servidores vulneráveis, ataques de DoS e DDoS, exploits 0-day, obtenção de informações de versão de pacotes e sistema operacional, visto que é inútil se o atacante não conseguir estabelecer uma conexão com o servidor, por não conhecer a sequência de knock. O aumento do uso de recursos de hardware após a implementação da técnica é imperceptível, porém um contra observado foi a implementação do lado do client, que exige que comandos sejam executados, de forma que a porta seja aberta no servidor (para cada serviço, seria necessário existir uma rotina de abertura
de portas). Outra particularidade do uso da técnica é que os knocks são dependentes de um caminho livre até o servidor final, ou seja, em uma grande rede, os firewalls no caminho precisariam permitir o acesso a estas portas de knock, além de estarem abertos a interceptação por um ataque de man-in-the-middle. Todavia, isto poderia ser prevenido com o uso de SPA (Single Packet Authorization), que emprega técnicas de encriptação para o envio dos knocks. Baseado em todos os fatos apresentados anteriormente e apesar de o presente trabalho ter utilizado uma implementação mais simples de Port Knocking, concluo que é viável implementar a técnica em grandes redes de computadores. Acredito que os benefícios apresentados superam as desvantagens e a segurança e disponibilidade do sistema aumentam consideravelmente, justificando seu uso. Porém é importante frisar que a técnica de Port Knocking não é infalível e muito menos uma forma definitiva de proteção, pois um atacante determinado a quebrar o sistema, provavelmente irá conseguir burlar o daemon de Port Knock através de brute force (apesar de existirem meios de tornar isto bastante difícil) ou outra técnica e por este motivo, não deve substituir outras formas de manutenção da segurança, como atualização periódica do sistema operacional, patches de segurança, firewall, IDS, IPS, etc. Bibliografia [1] http://en.wikipedia.org/wiki/port_knocking [2] http://www.portknocking.org/ [3] Wikipedia. Risk Compensation. Disponível em http://en.wikipedia.org/wiki/ Risk_compensation. Acessado em 30/10/12. [4] http://www.zeroflux.org/projects/knock [5] http://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/port-knocking.html [6] http://www.securitygeneration.com/wp-content/uploads/2010/05/an-analysis-of-port- Knocking-and-Single-Packet-Authorization-Sebastien-Jeanquier.pdf