wireshark是一款抓包软件,在linux下底层使用的是tcpdump
这个软件,可以从这里下载wireshark,因为我的系统是ubuntu,所以本文以ubuntu18.04
为系统说明。
一.安装
ubuntu用户可以直接用apt安装:
1
liuxu:~$ sudo apt install wireshark
默认情况下,tcpdump
的权限是root:root
,普通用户运行wireshark无法调用tcpdump
,会导致无法抓包。为了让普通用户也可以使用wireshark,所以把当前用户和tcpdump
添加到wireshark
用户组:
1
2
3
4
liuxu:~$ whoami
liuxu
liuxu:~$ sudo usermod -a -G wireshark liuxu
liuxu:~$ sudo chgrp wireshark /usr/sbin/tcpdump
然后从新登陆系统查看权限:
1
2
3
4
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支持的加密算法。
第二张是服务器回复的Server Hello
,里面包含了选定的加密算法,这里使用的是TLS_ECDHE-RSA-AES128-GCM-SHA256
,后面配置需要注意它。
接下来开始介绍抓取方法,目前有两种方法抓取https包,第一种很简单,配置一个变量,即可抓取所有https的网站。第二种对特定网站配置密钥抓取特定网站。
方法一:配置变量抓取所有https网站
首先编辑~/.profile
文件,为什么编辑它而不是~/.bashrc
?因为~/.profile
中的变量可以用于所有软件,而~/.bashrc
里的变量只能用在Terminal
中,即Ctrl + Alt + T
打开的终端。而通常我们打开Chrome浏览器是直接点击图标,而不是在Terminal
运行google-chrome
命令。
1
2
3
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内容了:
现在重新登陆系统,使~/.profile
内容生效,这样Chrome就可以写入key了。打开wierkshark开始抓包,过滤条件填ssl
,打开Chrome就可以解析https内容为https了。
这是没设置的,为未解密包,内容还是Application Data
:
这是设置后的,可以看见http已解密出来:
再看看/tmp/wireshark_ssl.debug
内容:
1
2
3
4
5
6
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配置好这个密钥就可以解密了。
首先看看服务器配置:
1
2
3
4
5
6
server {
...
ssl_certificate /etc/ssl/www.xxx.com.crt;
ssl_certificate_key /etc/ssl/private.key;
...
}
看见密钥文件是/etc/ssl/private.key
,把它下载到本地,看看内容:
1
2
3
4
5
liuxu:Downloads$ cat private.key
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAn0WiYItVW3e6hCyAZD177fuTDy0PxE8E7o723Ky1xDuhu1Jk
...
QHSp5dg6n24iQgo90gFOut5wD4gSziwr0RLswyI4Gciaub4Ebzc9
现在设置wireshark,打开”Edit -> Preferences -> Protocols -> SSL”,配置”RSA keys list”,点击”Edit…“,点击左下角”+”号添加配置:
“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”的算法排除即可。
1
liuxu:~$ google-chrome --cipher-suite-blacklist=0xc02b,0xc02f,0xc02c,0xc030,0xcca9,0xcca8,0xc013,0xc014
现在打开wireshark开始抓ssl
包,可以看见已经解密。需要注意一点,由于浏览器会有304缓存导致不会重新请求服务器,从而导致wireshark无法抓包,所以需要用Ctrl + F5
强制刷新页面。
下图是没有设置的,内容还是Application Data
:
下图是设置好的,内容已经解析成http
请求,http header也在截图下方看见: