网页抓取解密(解密浏览器SSL流量的教程,移动端可用的抓包工具)
优采云 发布时间: 2022-04-01 14:04网页抓取解密(解密浏览器SSL流量的教程,移动端可用的抓包工具)
公司需要在移动端抓取经过SSL加密的HTTPS和WebSocket流量,使用WireShark中的Lua插件对私有协议进行解包统计。网上找到的大部分教程都是通过设置环境变量来解密浏览器SSL流量的教程。将浏览器握手过程中生成的ClientRandom和(Pre)MasterKey导出到Wireshark进行解密。很少涉及移动终端的SSL流量解密。通过对一些工具和OpenSSL的了解,有几种方法可以对移动端进行解密。SSL传输的流量记录在这里。
搭建代理服务器,信任移动终端上的伪服务器或代理证书。代理作为伪客户端与服务器握手,作为伪服务器与客户端握手,同时需要解决Sni等问题。原理在 MitmProxy 文档中有详细描述。见,事实上,大多数移动终端可用的数据包捕获工具,如 Fiddler、Charles 等。以这种方式实现。以这种方式可用的工具是 SSLsplit 和 MitmProxy。这两个工具都可以在代理和真实服务器、代理和客户端之间的握手过程中将MasterKey导出到一个文件中,实现与浏览器流量相同的解密方法。其中MitmProxy地址:,SSLsplit地址:。
对于您自己的移动应用程序,您可以在客户端调用 OpenSSL 握手时使用以下代码导出 ClientRandom 和 MasterKey:
/* * Generates a NSS key log format compatible string containing the client
* random and the master key, intended to be used to decrypt externally
* captured network traffic using tools like Wireshark.
*
* Only supports the CLIENT_RANDOM method (SSL 3.0 - TLS 1.2).
*
* https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format
*/
char* ssl_ssl_masterkey_to_str(SSL *ssl)
{
char *str = NULL;
int rv;
unsigned char *k, *r;
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
unsigned char kbuf[48], rbuf[32];
k = &kbuf[0];
r = &rbuf[0];
SSL_SESSION_get_master_key(SSL_get0_session(ssl), k, sizeof(kbuf));
SSL_get_client_random(ssl, r, sizeof(rbuf));
#else /* OPENSSL_VERSION_NUMBER < 0x10100000L */
k = ssl->session->master_key;
r = ssl->s3->client_random;
#endif /* OPENSSL_VERSION_NUMBER < 0x10100000L */
rv = asprintf(&str,
"CLIENT_RANDOM "
"XXXXXXXX"
"XXXXXXXX"
"XXXXXXXX"
"XXXXXXXX"
" "
"XXXXXXXX"
"XXXXXXXX"
"XXXXXXXX"
"XXXXXXXX"
"XXXXXXXX"
"XXXXXXXX"
"\n",
r[ 0], r[ 1], r[ 2], r[ 3], r[ 4], r[ 5], r[ 6], r[ 7],
r[ 8], r[ 9], r[10], r[11], r[12], r[13], r[14], r[15626232261],
r[16], r[17], r[18], r[19], r[20], r[21], r[22], r[23],
r[24], r[25], r[26], r[27], r[28], r[29], r[30], r[31],
k[ 0], k[ 1], k[ 2], k[ 3], k[ 4], k[ 5], k[ 6], k[ 7],
k[ 8], k[ 9], k[10], k[11], k[12], k[13], k[14], k[15626232261],
k[16], k[17], k[18], k[19], k[20], k[21], k[22], k[23],
k[24], k[25], k[26], k[27], k[28], k[29], k[30], k[31],
k[32], k[33], k[34], k[35], k[36], k[37], k[38], k[39],
k[40], k[41], k[42], k[43], k[44], k[45], k[46], k[47]);
return (rv < 0) ? NULL : str;
}
将其保存为文件并在 WireShark 中设置 SSLKEYLOGFILE。