SIP 加密呼叫(TLS+SRTP)抓包后获取媒体内容备忘

解码sip tls

(该方法不适用于cipher suite是(EC)DHE的时候!!!, wireshark官方的解释:https://wiki.wireshark.org/TLS, 但是现在大部分的呼叫用的都是(EC)DHE, 哈哈哈, 译者注): SIP 加密呼叫(TLS+SRTP)抓包后获取媒体内容备忘_第1张图片

首先你需要拿到你自己服务器的私钥(private key), 将其保存到你的PC, 私钥看起来如下:

-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDXvcHGyQI7oUeQ
k1a38PMYoC9Eh+brPbOWtJh3UMkx/5jJ5AWyT4Isw2eOR94u2fsC0SZ3aqnPWQzO
...
JHAjJPm1zRGQFjGgVmDKPNrbQQQDf0ONDiOW7RcscYU4op8ou7U4o9q3Vxbscnru
BoiifdgCcKeYBnRIIFbxtLCR3Q==
-----END PRIVATE KEY-----

打开wireshark, 并点击Edit >> Preferences >> Protocols >> SSL >>Edit , 按照下图进行设置, 将早先储存私钥的文件作为key file导入。(下图SSL已经被wireshark废弃了,现在需要使用TLS,译者注)
SIP 加密呼叫(TLS+SRTP)抓包后获取媒体内容备忘_第2张图片
现在开始解析sip ssl信令, 这里值得注意的是整个SSL的握手过程必须被抓取, wireshark才能对其进行解码。SSL 握手过程如下:
figure2
每次client注册(需要将phone重启)都会发生SSL如上图的握手过程,现在整个呼叫流程应该已经可见了:
SIP 加密呼叫(TLS+SRTP)抓包后获取媒体内容备忘_第3张图片

获取对称加密的key以解码RTP流

用来加密RTP流的密钥可以在SIP 信令的SDP里找到。 主叫方的密钥可以在SIP INVITE消息里找到; 被叫方的密钥可以在SIP 200 OK消息里找到(这只是一般情况,有很多设备有delay offer机制,及INVITE中没有媒体能力参数, 而在ACK里面有, 这样的好处是不会提前暴漏自己的能力参数, 译者注)。如下图,用wireshark把SIP消息过滤出来可以更方便的看到关注的消息:
SIP 加密呼叫(TLS+SRTP)抓包后获取媒体内容备忘_第4张图片
举例来说, 呼叫方IP 是 10.2.4.38, 被叫方是10.7.172.186。在该教程中我们将只解密呼叫里的被叫方10.7.172.186 这一端。我们可以简单地展开SIP 200OK 消息的SDP, 如下图来获取密钥:
SIP 加密呼叫(TLS+SRTP)抓包后获取媒体内容备忘_第5张图片
现在我们已经有了key+salt的值可以用来解码, 我们需要把关心的RTP流分离出来。这里只是一个简单的, 只有一路RTP流的例子, 我们可以用wireshark轻松地将其过滤出来, 如下图:
SIP 加密呼叫(TLS+SRTP)抓包后获取媒体内容备忘_第6张图片
过滤出来的流可以按照File > Export Specified Packets的方式保存。这里需要确保只有罗列出来的包被导出,以“.pcap”而不是“.pcapng”的格式保存。
(由于wireshark无法解码(EC)DHE, 所以如果你的SIP server写了log的话,同样可以从log中得到key saly的值, 不过需要先做base64 decode,然后用xdd命令将crypto里面的值从二进制转换成十六进制输出。可以参考这个:https://www.rfc-editor.org/rfc/rfc4568, 译者注)SIP 加密呼叫(TLS+SRTP)抓包后获取媒体内容备忘_第7张图片

用rtp_decoder (cisco libsrtp)解密RTP stream

从github下载cisco/libsrtp project, 并按照其中的说明进行安装。

git clone https://github.com/cisco/libsrtp
cd libsrtp/
./configure
make
cd test/
./rtp_decoder -a -t 10 -e 256 -k 8681b9f3d9b7c545e8a5575720245c94cd0403fbd88d
1d1e562e856ca5b04b8c0f84ff838d97c40a867d6c9b663c * < ./srtp_single_stream.pcap | text2pcap -t "%M:%S." -u 10000,10000 - - > ./srtp_decrypted.pcap​
./rtp_decoder --help
Using libsrtp2 2.1.0-pre [0x2010000]
usage: ./rtp_decoder [-d <debug>]* [[-k][-b] <key> [-a][-e]]
or     ./rtp_decoder -l
where  -a use message authentication
       -e <key size> use encryption (use 128 or 256 for key size)
       -g Use AES-GCM mode (must be used with -e)
       -t <tag size> Tag size to use (in GCM mode use 8 or 16)
       -k <key>  sets the srtp master key given in hexadecimal
       -b <key>  sets the srtp master key given in base64
       -l list debug modules
       -f "" to filter only the desired SRTP packets
       -d <debug> turn on debugging for module <debug>
       -s "" to set both key and tag size based
          on RFC4568-style crypto suite specification​

还原媒体内容:

参考上一篇文章:https://blog.csdn.net/liuxingrui4p/article/details/131619773?spm=1001.2014.3001.5502

你可能感兴趣的:(媒体,sip,srtp)