domingo, 5 de diciembre de 2010

Simulando una llamada SIP con scapy

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 1

Obtener 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)