Protegiendo nuestro gateway sip, parte 2

Como ya he comentado en otras ocasiones, la mayoría de ataques a pbx SIP abiertas a internet, están realizados por software tipo sipVicious y similares.

Si tenemos la posibilidad de usar un firewall con inspección a layer 7, podemos filtrar los User-Agent, tal y como expliqué en la entrada anterior.

Ahora, supongamos que tenemos un mikrotik, con RouterOS 6.x…


/ip firewall layer7-protocol
add name=sip regexp="^.+(sundayddr).*\$"
add name=sip1 regexp="^.+(sipsak).*\$"
add name=sip2 regexp="^.+(sipvicious).*\$"
add name=sip3 regexp="^.+(friendly-scanner).*\$"
add name=sip4 regexp="^.+(iWar).*\$"
add name=sip5 regexp="^.+(sip-scan).*\$"
add name=sip6 regexp="^.+(Ozeki).*\$"
add name=sip8 regexp="^.+(sip-cli).*\$"
add name=sip7 regexp="^.+(VaxSIPUserAgent).*\$"
add name=sip9 regexp="^.+(sipcli).*\$"

/ip firewall filter
add action=fasttrack-connection chain=forward connection-state=established,related
add chain=forward connection-state=established,related
add action=drop chain=forward connection-state=invalid
add action=drop chain=forward comment=voip_sundayddr_deny dst-address-list=AUTH layer7-protocol=sip
add action=drop chain=forward comment=voip_sipsak_deny dst-address-list=AUTH layer7-protocol=sip1
add action=drop chain=forward comment=voip_sipvicious_deny dst-address-list=AUTH layer7-protocol=sip2
add action=drop chain=forward comment=voip_friendly-scanner_deny dst-address-list=AUTH layer7-protocol=sip3
add action=drop chain=forward comment=voip_iWar_deny dst-address-list=AUTH layer7-protocol=sip4
add action=drop chain=forward comment=voip_sip-scan_deny dst-address-list=AUTH layer7-protocol=sip5
add action=drop chain=forward comment=voip_Ozeki_deny dst-address-list=AUTH layer7-protocol=sip6
add action=drop chain=forward comment=voip_VaxSIPUserAgent_deny dst-address-list=AUTH layer7-protocol=sip7
add action=drop chain=forward comment=voip_sip-cli_deny dst-address-list=AUTH layer7-protocol=sip8
add action=drop chain=forward comment=voip_sipcli_deny dst-address-list=AUTH layer7-protocol=sip9

hay que tener activado el connection Tracking activado.

enjoy 😉

VoIP jazztel ftth y asterisk pjsip

En esta ocasión, registraremos nuestro servicio de VoIP de fibra Jazztel en nuestro asterisk.

Requisitos:

1º) Capturar el proceso de register del router de jazztel contra sus SBC. Para ello, mediante un hub colocado entre el router y la ONT, colocaremos nuestro pc capturando el paquete deseado.

En las capturas, deberás ver un paquete tal que:


Via: SIP/2.0/UDP x.x.x.x:5060;branch=asdfgsdfgsdfgsdfgsd
To:
From: ;tag=d2derwerqwer19-f45ffrr
Call-ID: xxxxxxxxxxx-xxxxxxxxx@x.x.x.x
CSeq: 46360 REGISTER
Contact:
Authorization: Digest username="misuperusuario007@ims.jazztel.net",realm="ims.jazztel.net",nonce="elsuperNonce",uri="sip:ims.jazztel.net",response="idRespuestaasfasdfasdfwererer",algorithm=MD5,cnonce="sdferelcenoncd",qop=auth,nc=00000001
Expires: 3600
Max-Forwards: 70
Supported: 100rel
User-Agent: ZXHN H218N/V2.0.0_JAZZT7
Content-Length: 0

En vez de las ‘x’, saldrán tus valores xDDD; no preguntes

2º) HTTPBrute, que nos servirá para sacar el password con el paquete SIP.

Pantallazo

Rellena cada casilla con lo que toca…. es bastante clarito todo. Le das a crack y calculate y te esperas unas horas (en mi caso)

3º) Asterisk 12 o 13 con pjSip. Yo en mi caso tengo una 12 con poca ram y cpu.

La versión 12 o 13 tiene su razón bastante obvia…… Para poder hacer una llamada, tienes que tener activada la opción 100rel…. en el chan_sip de asterisk, esta opción no está, pero en pjsip si, así que ya sabéis.

El user-agent, debe ser igual al que os proponga el router.

4º) Configuración del pjsip.conf

[global]
user_agent=ZXHN H298N/V1.1.4_JAZZT15

[endpoint]
100rel=yes --> Importante definir el endpoint con el 100rel=yes
sdp_session=ZXHN H298N/V1.1.4_JAZZT15

[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0
local_net=192.168.0.0/16 --> tu red local
local_net=127.0.0.1/32

[Jazztel]
type=registration
transport=transport-udp
outbound_auth=Jazztel
server_uri=sip:212.106.212.22:5060
client_uri=sip:+349xxxxxxxx@ims.jazztel.net --> tu número de teléfono con el +34
retry_interval=60
expiration=3600
support_path=yes

[Jazztel]
type=auth
auth_type=userpass
password=PasswordQueHayasCalculado
username=tuUsuari0DeJazttel@ims.jazztel.net
realm=ims.jazztel.net

[Jazztel]
type=aor
contact=sip:ip.del.sbc.jazztel:5060

[Jazztel]
type=endpoint
transport=transport-udp
context=Tu_Contexto_De_Llamadas_Entrantes
disallow=all
allow=alaw
allow=ulaw
allow=gsm
allow=g729
outbound_auth=Jazztel
aors=Jazztel
from_user=+349xxxxxxxx --> tu número de teléfono de jazztel
from_domain=ims.jazztel.net
aors=Jazztel
direct_media=no

[Jazztel]
type=identify
endpoint=Jazztel
match=ip.del.sbc.de.jazztel

Y a partir de aquí…. enjoy your VoIP FTTH Service 😉

Añadiendo seguridad con IPTABLES

Otra entrada que es un apunte.

Estos días, por cuestiones técnicas y de un proyecto donde estoy colaborando, he tenido que unir mi debian / asterisk a un grupo, mediante el software vpn TINC.

La instalación del tinc es sencilla y funciona muy bien, pero mi máquina es completamente accesible desde el otro extremo de la red. No es que no me fie, pero no suelo dejar mis equipos expuestos al exterior; manias personales.

Bien, tras analizar los puertos que debo dejar abiertos, me hice una lista:

– permitir tráfico SIP/UDP (5060 udp) – abierto
– permitir tráfico RTP VoIP (udp 10000 .. 20000) – abierto
– permitir openLdap (en local) – abierto
– permitir SSH en mi redLocal (TCP 22)
– permitir MySQL en mi redLocal (TCP 3306)
– permitir TINC (655 tcp /udp)
– permitir www (80 tcp)
– permitir dundi (4520 tcp/udp)
– permitir tftp (udp 69)
– permitir syslog (udp 514)
– permitir icmp echo-reply
– permitir icmp unracheable
– permitir icmp echo-request
– permitir icmp unracheable
– permitir SMB en red Local

Una vez tenemos las reglas, vaciamos las reglas ip tables :

# iptables -F
# iptables -X

Y ahora hacemos un copy&paste de las reglas en la consola, quedando tal que:

# permitimos tráfico de loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# permitimos tipos de icmp
iptables -A INPUT -i eth1 -p icmp –icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -i eth1 -p icmp –icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -i eth1 -p icmp –icmp-type echo-reply -j ACCEPT
iptables -A INPUT -i eth1 -p icmp –icmp-type echo-request -j ACCEPT
# permitimos icmp en interface PLN /tinc
iptables -A INPUT -i pln -p icmp –icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -i pln -p icmp –icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -i pln -p icmp –icmp-type echo-reply -j ACCEPT
iptables -A INPUT -i pln -p icmp –icmp-type echo-request -j ACCEPT
# reglas
#### reglas dundi ###
iptables -A INPUT -p udp -m udp –dport 4520 -j ACCEPT
iptables -A INPUT -p tcp –dport 4520 -j ACCEPT
# reglas sip, iax, rtp #
iptables -A INPUT -p udp -m udp –dport 5060 -j ACCEPT
iptables -A INPUT -p udp -m udp –dport 4569 -j ACCEPT
iptables -A INPUT -p udp -m udp –dport 10000:20000 -j ACCEPT
# reglas syslog #
iptables -A INPUT -p udp -m udp –dport 514 -j ACCEPT
# reglas tftp #
iptables -A INPUT -p udp -m udp –dport 69 -j ACCEPT
# reglas tinc #
iptables -A INPUT -p udp -m udp –dport 655 -j ACCEPT
iptables -A INPUT -p tcp –dport 655 -j ACCEPT
# reglas trafico www #
iptables -A INPUT -p tcp –dport 80 -j ACCEPT
# reglas ssh #
iptables -A INPUT -p tcp –dport 22 -s 192.168.2.0/24 -j ACCEPT
iptables -A INPUT -p tcp –dport 22 -s 127.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp –dport 22 -j DROP
# reglas mysql
iptables -A INPUT -p tcp –dport 3306 -s 192.168.2.0/24 -j ACCEPT
# reglas ldap
iptables -A INPUT -p tcp –dport 389 -s 192.168.2.0/24 -j ACCEPT
# reglas SMB
iptables -A INPUT -p udp –dport 137 -s 192.168.2.0/24 -j ACCEPT
iptables -A INPUT -p udp –dport 138 -s 192.168.2.0/24 -j ACCEPT
iptables -A INPUT -p tcp –dport 139 -s 192.168.2.0/24 -j ACCEPT
iptables -A INPUT -p tcp –dport 445 -s 192.168.2.0/24 -j ACCEPT
iptables -A INPUT -p udp –dport 445 -s 192.168.2.0/24 -j ACCEPT
# el resto, rechazamos
iptables -A INPUT -j REJECT

Y con esto, añadimos un granito más de seguridad en nuestra red.

NATear rango de puertos en un router cisco

Como ya sabréis, para hacer NAT por puertos en un router cisco, hay que añadir una línea por cada uno de ellos, del tipo:

ip nat inside source static tcp 192.168.2.3 8080 X.X.X.X 8080 route-map nonat extendable

Aquí estamos NATeando el puerto 8080 a la máquina 192.168.2.3 de nuestra red, donde X.X.X.X es la ip pública nuestra.

Pero el problema es, si queremos NATear un rango entero de puertos…. por ejemplo…. publicamos nuestro servidor de VoIP y necesitamos del 10000 al 20000 UDP para el media y el 5060 UDP para el signaling.

La pesadilla puede ser tremenda…. aunque no es necesario para la voIP los 10000 puertos, pero hacer un rango de 10 o 20, es poco elegante, más si nuestro router ya tiene más nats hechos, con lo que la config se puede volver muuuuy larga.

hace unos días, leyendo documentación de cisco por otros temas, veo el NAT ROTARY, siendo la definición de cisco:

Destination Address Rotary Translation
A dynamic form of destination translation can be configured for some outside-to-inside traffic. Once a mapping is set up, a destination address matching one of those on an access list will be replaced with an address from a rotary pool. Allocation is done in a round-robin basis, performed only when a new connection is opened from the outside to the inside. All non-TCP traffic is passed untranslated (unless other translations are in effect).

Y vemos la palabra mágica:

Destination address matching one of those on an access list

Vamos a investigar un poco:

Primero, hacemos el access-list para los puertos de nuestro VoIP server:

ip access-list extended voip
permit udp any any eq 5060
permit udp any any range 10000 20000

Y ahora el nat con el access-list, contra la ip 192.168.2.5, que será nuestro VoIP Server:

ip nat pool ASTERISK 192.168.2.5 192.168.2.5 netmask 255.255.255.0 type rotary

Finalmente, la destinación del NAT con la ACL:

ip nat inside destination list voip pool ASTERISK

Y ahora, enjoy the nat!!!, hasta que llegue el IPv6.