SIPp generadora de tráfico y pruebas de rendimiento para el protocolo SIP
SIPp generadora de tráfico y pruebas de rendimiento para el protocolo SIP
SIPp es una herramienta de código abierto generadora de tráfico y pruebas de rendimiento para el protocolo SIP (Session Initiation Protocol), muy utilizada en auditorías de seguridad sobre telefonía VoIP. En Kali Linux permite simular clientes y servidores SIP (UAC y UAS), inyectar llamadas, realizar pruebas de carga y evaluar la resistencia de centrales IP-PBX (como Asterisk o FreePBX) ante inundaciones de tráfico o peticiones maliciosas.
Instalación en Kali Linux
Aunque en algunas versiones viene disponible en los repositorios, puedes instalarlo ejecutando:
Bash
sudo apt update && sudo apt install sipp -y
Usos principales en VoIP Pentesting
- Simulación de Clientes/Servidores (UAC/UAS): Emula teléfonos o centrales para enviar y recibir llamadas de prueba.
- Pruebas de Carga y Rendimiento (Stress Testing): Evalúa cuántas llamadas simultáneas o peticiones por segundo (CPS) puede procesar un servidor SIP antes de colapsar.
- Fuzzing y Validación de Escenarios: Ejecuta flujos XML personalizados para probar vulnerabilidades en la pila SIP del objetivo.
Modos de uso y comandos básicos
- Modo Servidor (UAS - User Agent Server):Espera llamadas entrantes para responder de forma automática según el flujo por defecto.Bash
sipp -sn uas - Modo Cliente (UAC - User Agent Client):Genera tráfico hacia una IP o PBX objetivo enviando peticiones
INVITE.Bashsipp <IP_OBJETIVO> -sn uac -r 10 -rp 1000 -m 100-sn uac: Utiliza el escenario integrado por defecto para cliente.-r 10 -rp 1000: Envía 10 llamadas cada 1000 ms (1 segundo).-m 100: Detiene la prueba tras procesar 100 llamadas en total.
- Inyección de Audio (RTP Echo / Media):Envía un archivo pcap codificado para simular tráfico de voz real durante la llamada:Bash
sipp <IP_OBJETIVO> -sn uac_pcap -s <EXTENSION>
Flujos personalizados mediante XML
SIPp permite volcar sus escenarios por defecto a un archivo editable para crear escenarios complejos de auditoría:
Bash
# Volcar el escenario estándar UAC a un archivo XML
sipp -sd uac > escenario_custom.xml
# Ejecutar SIPp cargando el escenario modificado
sipp <IP_OBJETIVO> -sf escenario_custom.xml
Un escenario en SIPp se define mediante un archivo XML estructurado en secuencia. Cada mensaje enviado (
<send>) y recibido (<recv>) modela el flujo exacto de la señalización SIP.Ejemplo de Escenario XML (Cliente UAC)
El siguiente archivo define una llamada simple (
INVITE $\rightarrow$ 100 Trying / 180 Ringing / 200 OK $\rightarrow$ ACK $\rightarrow$ pausa de conversación $\rightarrow$ BYE $\rightarrow$ 200 OK):XML
<?xml version="1.0" encoding="ISO-8859-1" ?>
<scenario name="Llamada Basica UAC">
<!-- 1. Enviar petición INVITE -->
<send retrans="500">
<![CDATA[
INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: "Tester" <sip:sipp@[local_ip]:[local_port]>;tag=[pid]SIPpTag00[call_number]
To: <sip:[service]@[remote_ip]:[remote_port]>
Call-ID: [call_id]
CSeq: 1 INVITE
Contact: sip:sipp@[local_ip]:[local_port]
Max-Forwards: 70
Subject: Auditoria de Carga
Content-Type: application/sdp
Content-Length: [len]
v=0
o=user1 53655765 235368797 IN IP[media_ip_type] [local_ip]
s=-
c=IN IP[media_ip_type] [local_ip]
t=0 0
m=audio [media_port] RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
]]>
</send>
<!-- 2. Esperar respuestas provisionales (Opcional/Ignorable) -->
<recv response="100" optional="true">
</recv>
<recv response="180" optional="true">
</recv>
<!-- 3. Esperar 200 OK final del servidor -->
<recv response="200" rtd="true">
</recv>
<!-- 4. Enviar confirmación ACK -->
<send>
<![CDATA[
ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: "Tester" <sip:sipp@[local_ip]:[local_port]>;tag=[pid]SIPpTag00[call_number]
To: <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]
Call-ID: [call_id]
CSeq: 1 ACK
Max-Forwards: 70
Content-Length: 0
]]>
</send>
<!-- 5. Pausa para simular la duración de la llamada (5 segundos) -->
<pause milliseconds="5000"/>
<!-- 6. Enviar petición BYE para colgar -->
<send retrans="500">
<![CDATA[
BYE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: "Tester" <sip:sipp@[local_ip]:[local_port]>;tag=[pid]SIPpTag00[call_number]
To: <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]
Call-ID: [call_id]
CSeq: 2 BYE
Max-Forwards: 70
Content-Length: 0
]]>
</send>
<!-- 7. Esperar 200 OK del BYE -->
<recv response="200">
</recv>
<!-- Definición del tiempo de respuesta (Response Time Duration) -->
<ResponseTimeRepartition value="10, 20, 30, 40, 50, 100, 200, 500, 1000"/>
<CallLengthRepartition value="10, 50, 100, 500, 1000, 5000, 10000"/>
</scenario>
Explicación de los Campos y Variables Principales
1. Etiquetas de Control XML
<send>/<recv>: Delimitan el envío de peticiones/respuestas o la recepción esperada.retrans="500": Define el intervalo de retransmisión en milisegundos si no se recibe respuesta en transporte UDP.optional="true": Permite que el escenario continúe si el mensaje especificado no llega (por ejemplo, si el servidor no envía un180 Ringing).<pause milliseconds="X"/>: Introduce un retardo entre pasos, útil para simular la duración del flujo RTP o retardo entre transacciones.
2. Variables dinámicas reservadas de SIPp
| Variable | Descripción |
[remote_ip] / [remote_port] | IP y puerto del objetivo pasados por línea de comandos. |
[local_ip] / [local_port] | IP y puerto local desde donde SIPp genera el tráfico. |
[service] | Extensión o usuario destino especificado con el parámetro -s al ejecutar SIPp. |
[call_id] | Identificador único autogenerado para cada llamada. |
[call_number] | Número secuencial interno de la llamada actual. |
[branch] | Cadena única generada para la transacción en el encabezado Via. |
[len] | Calcula y reemplaza automáticamente la longitud exacta del cuerpo de la petición (por ejemplo, el bloque SDP). |
[peer_tag_param] | Extrae automáticamente la etiqueta tag devuelta por el servidor en la respuesta 200 OK para incluirla en el ACK y BYE. |
Cómo Modificar el XML para Diferentes Pruebas de Seguridad
- Ataques de Fuzzing o Inyección de Encabezados:Puedes añadir encabezados maliciosos o extremadamente largos dentro del bloque
<![CDATA[ ... ]]>para evaluar cómo reacciona el parser SIP de la PBX:HTTPCustom-Header: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - Inyección de Archivos CSV (Inyección de Usuarios/Credenciales):SIPp permite cargar archivos CSV de datos dinámicos usando la opción
-inf datos.csv. Dentro del XML puedes referenciar columnas con[field0],[field1], etc., permitiendo probar autenticación o fuerza bruta sobre múltiples usuarios:XMLFrom: <sip:[field0]@[local_ip]:[local_port]> - Ejecución del Escenario:Una vez editado y guardado como
mi_escenario.xml, se ejecuta indicando la extensión a probar (-s) y el archivo (-sf):Bashsipp 192.168.1.100 -sf mi_escenario.xml -s 101 -m 1
Para autenticar llamadas en SIPp mediante SIP Digest (Challenge-Response 401/407) y reutilizar múltiples usuarios/contraseñas, se combina un archivo de datos CSV (
-inf) con un escenario XML que capture la cabecera WWW-Authenticate o Proxy-Authenticate e inyecte la respuesta usando la palabra clave [authentication].1. Creación del Archivo CSV (usuarios.csv)
El archivo CSV define los datos dinámicos. La primera línea le indica a SIPp el orden de asignación de las columnas (
SEQUENTIAL o RANDOM).Crea un archivo llamado
usuarios.csv:Fragmento de código
SEQUENTIAL
101;password123;domain.com
102;password456;domain.com
103;password789;domain.com
[field0]: Nombre de usuario / Extensión (101)[field1]: Contraseña en texto plano (password123)[field2]: Dominio o Realm SIP (domain.com)
2. Escenario XML con Autenticación (uac_auth.xml)
El flujo autenticado requiere dos intentos:
- Enviar el primer
INVITEsin credenciales. - Recibir una respuesta
401 Unauthorizedo407 Proxy Authentication Required. - Enviar un
ACKpara cerrar esa transacción fallida. - Enviar un segundo
INVITEque incluya la cabeceraAuthorization:calculada con[authentication].
XML
<?xml version="1.0" encoding="ISO-8859-1" ?>
<scenario name="UAC con Autenticacion SIP Digest">
<!-- 1. Primer INVITE sin credenciales -->
<send retrans="500">
<![CDATA[
INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: <sip:[field0]@[remote_ip]>;tag=[pid]SIPpTag00[call_number]
To: <sip:[service]@[remote_ip]:[remote_port]>
Call-ID: [call_id]
CSeq: 1 INVITE
Contact: sip:[field0]@[local_ip]:[local_port]
Max-Forwards: 70
Subject: Prueba Autenticada
Content-Type: application/sdp
Content-Length: [len]
v=0
o=[field0] 53655765 235368797 IN IP[media_ip_type] [local_ip]
s=-
c=IN IP[media_ip_type] [local_ip]
t=0 0
m=audio [media_port] RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
]]>
</send>
<recv response="100" optional="true">
</recv>
<!-- 2. Recibir 401/407 y guardar el challenge del servidor -->
<recv response="401" auth="true">
</recv>
<!-- 3. Responder con ACK obligatorio al 401 -->
<send>
<![CDATA[
ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: <sip:[field0]@[remote_ip]>;tag=[pid]SIPpTag00[call_number]
To: <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]
Call-ID: [call_id]
CSeq: 1 ACK
Max-Forwards: 70
Content-Length: 0
]]>
</send>
<!-- 4. Segundo INVITE incluyendo el calculo del Digest -->
<send retrans="500">
<![CDATA[
INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: <sip:[field0]@[remote_ip]>;tag=[pid]SIPpTag00[call_number]
To: <sip:[service]@[remote_ip]:[remote_port]>
Call-ID: [call_id]
CSeq: 2 INVITE
Contact: sip:[field0]@[local_ip]:[local_port]
[authentication username=[field0] password=[field1]]
Max-Forwards: 70
Subject: Prueba Autenticada
Content-Type: application/sdp
Content-Length: [len]
v=0
o=[field0] 53655765 235368797 IN IP[media_ip_type] [local_ip]
s=-
c=IN IP[media_ip_type] [local_ip]
t=0 0
m=audio [media_port] RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
]]>
</send>
<recv response="100" optional="true">
</recv>
<recv response="180" optional="true">
</recv>
<!-- 5. Recibir 200 OK del segundo INVITE -->
<recv response="200" rtd="true">
</recv>
<!-- 6. Confirmar con ACK final -->
<send>
<![CDATA[
ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: <sip:[field0]@[remote_ip]>;tag=[pid]SIPpTag00[call_number]
To: <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]
Call-ID: [call_id]
CSeq: 2 ACK
Max-Forwards: 70
Content-Length: 0
]]>
</send>
<pause milliseconds="3000"/>
<!-- 7. Colgar la llamada con BYE -->
<send retrans="500">
<![CDATA[
BYE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: <sip:[field0]@[remote_ip]>;tag=[pid]SIPpTag00[call_number]
To: <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]
Call-ID: [call_id]
CSeq: 3 BYE
Max-Forwards: 70
Content-Length: 0
]]>
</send>
<recv response="200">
</recv>
</scenario>
3. Puntos clave de la autenticación
auth="true": Colocado en el<recv response="401">oresponse="407". Obliga a SIPp a guardar los parámetros del desafío HTTP Digest (como elnonce,realm, yqop).[authentication username=[field0] password=[field1]]: Genera automáticamente la cabeceraAuthorization: Digest ...utilizando el MD5/SHA256 correspondiente según lo especificado en el challenge recibido y los campos del CSV.
4. Comando de ejecución en Kali Linux
Para ejecutar la prueba asociando el archivo XML y el CSV:
Bash
sipp 192.168.1.100:5060 \
-sf uac_auth.xml \
-inf usuarios.csv \
-s 200 \
-m 3 \
-l 1 \
-r 1
Parámetros utilizados:
-sf uac_auth.xml: Especifica el archivo de escenario XML.-inf usuarios.csv: Carga el archivo CSV con las credenciales.-s 200: Define la extensión de destino (Service / Called party).-m 3: Realiza 3 llamadas en total (una por cada línea del CSV si está en modoSEQUENTIAL).-l 1: Limita a 1 llamada simultánea.-r 1: Tasa de 1 llamada por segundo.
Cuando una entidad intermedia (como un Proxy SIP, SBC o balanceador de carga) intercepta la llamada y requiere autenticación, responde con un código 407 Proxy Authentication Required en lugar del 401 Unauthorized que envía directamente el endpoint de destino (UAS / Registrar).
Para adaptar SIPp a este escenario solo se deben realizar dos cambios específicos en el XML:
1. Modificaciones requeridas en el archivo XML
- Capturar la respuesta 407: Cambia la respuesta esperada en el nodo
<recv>y mantén el atributoauth="true"para que SIPp almacene el nonce y el realm del proxy. - Especificar el tipo de autenticación: En la etiqueta
[authentication], agrega el atributotype="proxy". De lo contrario, SIPp generará por defecto una cabeceraAuthorization:en lugar deProxy-Authorization:.
Fragmento del código ajustado:
XML
<!-- 1. Primer INVITE sin credenciales (Igual que antes) -->
<!-- 2. Recibir 407 en lugar de 401 y guardar el challenge del Proxy -->
<recv response="407" auth="true">
</recv>
<!-- 3. Responder con ACK obligatorio al 407 -->
<send>
<![CDATA[
ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: <sip:[field0]@[remote_ip]>;tag=[pid]SIPpTag00[call_number]
To: <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]
Call-ID: [call_id]
CSeq: 1 ACK
Max-Forwards: 70
Content-Length: 0
]]>
</send>
<!-- 4. Segundo INVITE especificando type="proxy" -->
<send retrans="500">
<![CDATA[
INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: <sip:[field0]@[remote_ip]>;tag=[pid]SIPpTag00[call_number]
To: <sip:[service]@[remote_ip]:[remote_port]>
Call-ID: [call_id]
CSeq: 2 INVITE
Contact: sip:[field0]@[local_ip]:[local_port]
[authentication type="proxy" username=[field0] password=[field1]]
Max-Forwards: 70
Subject: Prueba Autenticada con Proxy
Content-Type: application/sdp
Content-Length: [len]
v=0
o=[field0] 53655765 235368797 IN IP[media_ip_type] [local_ip]
s=-
c=IN IP[media_ip_type] [local_ip]
t=0 0
m=audio [media_port] RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
]]>
</send>
Comparativa de encabezados generados
| Escenario | Código devuelto | Atributo en XML | Cabecera inyectada en el segundo INVITE |
| End-to-End | 401 Unauthorized | [authentication username=... password=...] | Authorization: Digest username="..." ... |
| Proxy / SBC | 407 Proxy Authentication Required | [authentication type="proxy" username=... password=...] | Proxy-Authorization: Digest username="..." ... |
Nota para escenarios complejos (Doble Autenticación): Si la infraestructura requiere autenticarse tanto ante un Proxy (407) como ante el servidor final (401), deberás concatenar dos flujos<recv>/<send>consecutivos en el archivo XML, usandotype="proxy"para la primera respuesta y el valor por defecto para la segunda.
En entornos empresariales donde las llamadas atraviesan un Session Border Controller (SBC) o Proxy SIP antes de alcanzar la centralita IP (UAS/Registrar), es habitual que el cliente deba autenticarse dos veces consecutivas: primero ante el Proxy (
407) y después ante el servidor final (401).El flujo completo consta de 3 intentos de INVITE dentro del mismo escenario XML:
INVITE 1(sin credenciales) $\rightarrow$ Servidor devuelve407 Proxy Authentication Required.INVITE 2(conProxy-Authorization) $\rightarrow$ Servidor devuelve401 Unauthorized.INVITE 3(conProxy-Authorization+Authorization) $\rightarrow$ Servidor devuelve200 OK.
Escenario XML Completo (uac_double_auth.xml)
XML
<?xml version="1.0" encoding="ISO-8859-1" ?>
<scenario name="UAC con Doble Autenticacion (407 Proxy + 401 UAS)">
<!-- ============================================================= -->
<!-- PASO 1: Primer INVITE sin ninguna credencial -->
<!-- ============================================================= -->
<send retrans="500">
<![CDATA[
INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: <sip:[field0]@[remote_ip]>;tag=[pid]SIPpTag00[call_number]
To: <sip:[service]@[remote_ip]:[remote_port]>
Call-ID: [call_id]
CSeq: 1 INVITE
Contact: sip:[field0]@[local_ip]:[local_port]
Max-Forwards: 70
Subject: Prueba Doble Autenticacion
Content-Type: application/sdp
Content-Length: [len]
v=0
o=[field0] 53655765 235368797 IN IP[media_ip_type] [local_ip]
s=-
c=IN IP[media_ip_type] [local_ip]
t=0 0
m=audio [media_port] RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
]]>
</send>
<recv response="100" optional="true">
</recv>
<!-- Capturar el desafio 407 del Proxy SIP -->
<recv response="407" auth="true">
</recv>
<!-- ACK obligatorio al 407 -->
<send>
<![CDATA[
ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: <sip:[field0]@[remote_ip]>;tag=[pid]SIPpTag00[call_number]
To: <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]
Call-ID: [call_id]
CSeq: 1 ACK
Max-Forwards: 70
Content-Length: 0
]]>
</send>
<!-- ============================================================= -->
<!-- PASO 2: Segundo INVITE con credenciales del Proxy (407) -->
<!-- ============================================================= -->
<send retrans="500">
<![CDATA[
INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: <sip:[field0]@[remote_ip]>;tag=[pid]SIPpTag00[call_number]
To: <sip:[service]@[remote_ip]:[remote_port]>
Call-ID: [call_id]
CSeq: 2 INVITE
Contact: sip:[field0]@[local_ip]:[local_port]
[authentication type="proxy" username=[field0] password=[field1]]
Max-Forwards: 70
Subject: Prueba Doble Autenticacion
Content-Type: application/sdp
Content-Length: [len]
v=0
o=[field0] 53655765 235368797 IN IP[media_ip_type] [local_ip]
s=-
c=IN IP[media_ip_type] [local_ip]
t=0 0
m=audio [media_port] RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
]]>
</send>
<recv response="100" optional="true">
</recv>
<!-- Capturar el desafio 401 del UAS / PBX final -->
<recv response="401" auth="true">
</recv>
<!-- ACK obligatorio al 401 -->
<send>
<![CDATA[
ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: <sip:[field0]@[remote_ip]>;tag=[pid]SIPpTag00[call_number]
To: <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]
Call-ID: [call_id]
CSeq: 2 ACK
Max-Forwards: 70
Content-Length: 0
]]>
</send>
<!-- ============================================================= -->
<!-- PASO 3: Tercer INVITE con ambas credenciales (Proxy + UAS) -->
<!-- ============================================================= -->
<send retrans="500">
<![CDATA[
INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: <sip:[field0]@[remote_ip]>;tag=[pid]SIPpTag00[call_number]
To: <sip:[service]@[remote_ip]:[remote_port]>
Call-ID: [call_id]
CSeq: 3 INVITE
Contact: sip:[field0]@[local_ip]:[local_port]
[authentication type="proxy" username=[field0] password=[field1]]
[authentication username=[field0] password=[field1]]
Max-Forwards: 70
Subject: Prueba Doble Autenticacion
Content-Type: application/sdp
Content-Length: [len]
v=0
o=[field0] 53655765 235368797 IN IP[media_ip_type] [local_ip]
s=-
c=IN IP[media_ip_type] [local_ip]
t=0 0
m=audio [media_port] RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
]]>
</send>
<recv response="100" optional="true">
</recv>
<recv response="180" optional="true">
</recv>
<!-- Recibir 200 OK final tras superar ambas autenticaciones -->
<recv response="200" rtd="true">
</recv>
<!-- Confirmacion ACK de la llamada establecida -->
<send>
<![CDATA[
ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: <sip:[field0]@[remote_ip]>;tag=[pid]SIPpTag00[call_number]
To: <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]
Call-ID: [call_id]
CSeq: 3 ACK
Max-Forwards: 70
Content-Length: 0
]]>
</send>
<!-- Duracion de la llamada (3 segundos) -->
<pause milliseconds="3000"/>
<!-- Finalizacion de la llamada -->
<send retrans="500">
<![CDATA[
BYE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From: <sip:[field0]@[remote_ip]>;tag=[pid]SIPpTag00[call_number]
To: <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]
Call-ID: [call_id]
CSeq: 4 BYE
Max-Forwards: 70
Content-Length: 0
]]>
</send>
<recv response="200">
</recv>
</scenario>
Detalles técnicos clave
- Inyección en el Paso 3:En el tercer
INVITEse incluyen dos líneas de autenticación seguidas:[authentication type="proxy" username=[field0] password=[field1]]$\rightarrow$ Genera la cabeceraProxy-Authorization:.[authentication username=[field0] password=[field1]]$\rightarrow$ Genera la cabeceraAuthorization:.
- Diferentes usuarios/claves por capa:Si las credenciales del Proxy y de la PBX difieren, se pueden asignar columnas independientes en el CSV (ej.
[field1]para la clave del proxy y[field2]para la clave del UAS). - Incremento del CSeq:Cada nuevo
INVITEincrementa la secuencia del comando (CSeq: 1 INVITE,CSeq: 2 INVITE,CSeq: 3 INVITE), garantizando que la pila SIP de los dispositivos procese correctamente la retransmisión con credenciales.