解码sip tls
(该方法不适用于cipher suite是(EC)DHE的时候!!!, wireshark官方的解释:https://wiki.wireshark.org/TLS, 但是现在大部分的呼叫用的都是(EC)DHE, 哈哈哈, 译者注):
首先你需要拿到你自己服务器的私钥(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 ssl信令, 这里值得注意的是整个SSL的握手过程必须被抓取, wireshark才能对其进行解码。SSL 握手过程如下:
每次client注册(需要将phone重启)都会发生SSL如上图的握手过程,现在整个呼叫流程应该已经可见了:
获取对称加密的key以解码RTP流
用来加密RTP流的密钥可以在SIP 信令的SDP里找到。 主叫方的密钥可以在SIP INVITE消息里找到; 被叫方的密钥可以在SIP 200 OK消息里找到(这只是一般情况,有很多设备有delay offer机制,及INVITE中没有媒体能力参数, 而在ACK里面有, 这样的好处是不会提前暴漏自己的能力参数, 译者注)。如下图,用wireshark把SIP消息过滤出来可以更方便的看到关注的消息:
举例来说, 呼叫方IP 是 10.2.4.38, 被叫方是10.7.172.186。在该教程中我们将只解密呼叫里的被叫方10.7.172.186 这一端。我们可以简单地展开SIP 200OK 消息的SDP, 如下图来获取密钥:
现在我们已经有了key+salt的值可以用来解码, 我们需要把关心的RTP流分离出来。这里只是一个简单的, 只有一路RTP流的例子, 我们可以用wireshark轻松地将其过滤出来, 如下图:
过滤出来的流可以按照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, 译者注)
用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 "<pcap filter>" to filter only the desired SRTP packets
-d <debug> turn on debugging for module <debug>
-s "<srtp-crypto-suite>" 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