wireshark是一款抓包软件,在linux下底层使用的是tcpdump这个软件,可以从这里下载wireshark,因为我的系统是ubuntu,所以本文以ubuntu18.04为系统说明。

一.安装

ubuntu用户可以直接用apt安装:

liuxu:~$ sudo apt install wireshark

默认情况下,tcpdump的权限是root:root,普通用户运行wireshark无法调用tcpdump,会导致无法抓包。为了让普通用户也可以使用wireshark,所以把当前用户和tcpdump添加到wireshark用户组:

liuxu:~$ whoami
liuxu
liuxu:~$ sudo usermod -a -G wireshark liuxu
liuxu:~$ sudo chgrp wireshark /usr/sbin/tcpdump

然后从新登陆系统查看权限:

liuxu:~$ ls -al /usr/sbin/tcpdump
-rwxr-xr-x 1 root wireshark 1130096 4月   1  2018 /usr/sbin/tcpdump
liuxu:~$ groups
liuxu sudo wireshark

二.配置wireshark抓取ssl

首先看看未配置时抓的包:

第一张是Chrome浏览器发送的Client Hello,里面包含了Chrome支持的加密算法。

img1

第二张是服务器回复的Server Hello,里面包含了选定的加密算法,这里使用的是TLS_ECDHE-RSA-AES128-GCM-SHA256,后面配置需要注意它。

img2

接下来开始介绍抓取方法,目前有两种方法抓取https包,第一种很简单,配置一个变量,即可抓取所有https的网站。第二种对特定网站配置密钥抓取特定网站。

方法一:配置变量抓取所有https网站

首先编辑~/.profile文件,为什么编辑它而不是~/.bashrc?因为~/.profile中的变量可以用于所有软件,而~/.bashrc里的变量只能用在Terminal中,即Ctrl + Alt + T打开的终端。而通常我们打开Chrome浏览器是直接点击图标,而不是在Terminal运行google-chrome命令。

liuxu:~$ cat .profile
...
export SSLKEYLOGFILE=/tmp/wireshark_ssl.debug

我在最下面添加了一个SSLKEYLOGFILE变量,这样Chrome发现有它时,会把https会话的key写入到这个变量指定的文件。

然后配置wireshark,打开”Edit -> Preferences -> Protocols -> SSL”,配置”(Pre)-Master-Secret log filename”,把上面变量配置的文件路径填进去,这样wireshark就可以找到Chrome输出的key内容了:

img3

现在重新登陆系统,使~/.profile内容生效,这样Chrome就可以写入key了。打开wierkshark开始抓包,过滤条件填ssl,打开Chrome就可以解析https内容为https了。

这是没设置的,为未解密包,内容还是Application Data

img4

这是设置后的,可以看见http已解密出来:

img5

再看看/tmp/wireshark_ssl.debug内容:

liuxu:~$ head -n 5 /tmp/wireshark_ssl.debug 
CLIENT_RANDOM 098fd40ff23bd2386f1a931a76a4d5c17c38f5e42e4988c4882776c9c249da35 cd8a5c972e60171fe6aec3cf962683831e135258cfa46f5457c79788153072bdccd90986b6070a5b6ad513a234d11b13
CLIENT_RANDOM 93e1c53b665359f40c60c4243a17473c8757f53c44b49f72e3384687a0b83fbc b97a24522dcab319fdda6276f69039f7f592dc2bb83a8874561cc1addc2abfa16971e462c54773a6677cd9de462ee785
CLIENT_RANDOM 594f068f2ca457e41a7a49909bfbb947fb66ffd9607d26ff5e83fa65e983973d 185acc632d67465bdb1947014aa1e5b0d2a849c182bb75e64072dbe7cb80a7d73d084ce887e0724787c772b6be597460
CLIENT_RANDOM f5ebeecacb53a76c21282a29db09e419aa5c267aadc474c2091501576d5820d6 5f2b3787c36e50162de646db1c7bf7b75a78b3c72286c9cf7b677a08b6d26d1efee37416960acd01242c314001c31a93
CLIENT_RANDOM 27f68b10d655b5b897c645beca862e65c5112c9f2c46255f4b5ad6a2aef332f4 476aa25a5c9e880be3793657ff59be4749868924a6c1699ccb4fa809b7b0c4c1afc150f51e6e29d00209f7a69cf11528

方法二:配置密钥抓取特定域名

这个原理就很简单了,服务器https配置有证书和密钥,wireshark配置好这个密钥就可以解密了。

首先看看服务器配置:

server {
        ...
        ssl_certificate /etc/ssl/www.xxx.com.crt;
        ssl_certificate_key /etc/ssl/private.key;
        ...
}

看见密钥文件是/etc/ssl/private.key,把它下载到本地,看看内容:

liuxu:Downloads$ cat private.key
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAn0WiYItVW3e6hCyAZD177fuTDy0PxE8E7o723Ky1xDuhu1Jk
...
QHSp5dg6n24iQgo90gFOut5wD4gSziwr0RLswyI4Gciaub4Ebzc9

现在设置wireshark,打开”Edit -> Preferences -> Protocols -> SSL”,配置”RSA keys list”,点击”Edit…“,点击左下角”+”号添加配置:

img6

img7

“IP address”填写any,表示抓取所有ip。”Port”填443,表示抓取443端口,”Protocol”填http,表示是http流量,”Key File”选中下载下来的证书密钥key文件。最后点击”OK”保存即可。

现在有个问题,就如前面”Server Hello”返回的选中加密算法时提到的,如果加密算法名字中包含”ECDHE”,会使用”Diffie–Hellman”算法,导致wireshark无法抓取到session key,从而无法解密https,所以需要让Chrome不要使用这类方法。在”Client Hello”中,我们看见了Chrome支持的加密算法,所以只需要在启动Chrome时把所有代”ECDHE”的算法排除即可。

liuxu:~$ google-chrome --cipher-suite-blacklist=0xc02b,0xc02f,0xc02c,0xc030,0xcca9,0xcca8,0xc013,0xc014

现在打开wireshark开始抓ssl包,可以看见已经解密。需要注意一点,由于浏览器会有304缓存导致不会重新请求服务器,从而导致wireshark无法抓包,所以需要用Ctrl + F5强制刷新页面。

下图是没有设置的,内容还是Application Data

img8

下图是设置好的,内容已经解析成http请求,http header也在截图下方看见:

img9