http抓包实战 pdf_实战 Wireshark https 抓包 2, 再抓 Moka 蹭 OurATS 的小尾巴

在昨天的文章 实战 Wireshark https 抓包,抓住 Moka 蹭 OurATS 的小尾巴 里,我们通过 chromium-browser 的 SSLKEYLOGFILE 环境变量特性,实现了 Wireshark https 抓包。

今天到百度上一搜,Moka 蹭 OurATS 的广告还在,趁着机会,我们换个方式,再抓一次。

原理介绍

在昨天的文章里,我们之所以能成功地看到 https 的加密流量,是因为 chromium-browser 为我们生成了 SSLKEYLOGFILE 。

如果不用 chromium-browser 而是我们自己写的程序,或者使用的是别人已经编译好的程序,能否实现 https 抓包呢?

本文介绍的方法仅适用于运行的程序需要动态链接 libssl.so,也就是使用 OpenSSL 开发的程序。本文参考了 stackexchange 上的一个问题的答案。

https://security.stackexchange.com/questions/80158/extract-pre-master-keys-from-an-openssl-application​security.stackexchange.com

怎么确定一个程序动态链接了 libssl.so 呢?以本文用到的示例 curl 和 php 为例:

hgy@hgy:~$ ldd /usr/bin/curl | grep libssl
	libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007fb270415000)
hgy@hgy:~$ ldd /usr/bin/php | grep libssl
	libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007f69c4ffd000)

可以看到,curl 和 php 都是动态链接了 libssl.so 的。

OpenSSL 1.1.1 之后,可以简单地在程序里调用 SSL_CTX_set_keylog_callback 通过 callback 函数生成所需要 SSLKEYLOGFILE 。

OpenSSL 1.1.1 之前,要麻烦一些。

但问题是,像 curl 和 php 都是已经编译好的程序,难道要修改源码再自己编译吗?

不需要。

简单地说,我们可以自己写一个类库,包装下 libssl.so 的关键 API,然后通过 LD_PRELOAD 顶替掉正常的 libssl.so API。在我们自己实现的方法里,加上提取 keylog 的逻辑,然后调用真正的 OpenSSL 函数,让程序还能正常运行。

stackexchange 的答案里,提供了一个实现好了的程序 sslkeylog.c,下载链接如下:

https://git.lekensteyn.nl/peter/wireshark-notes/plain/src/sslkeylog.c

我们将其保存到 /tmp/sslkeylog.c,然后编译

gcc /tmp/sslkeylog.c -shared -o /tmp/libsslkeylog.so -fPIC -ldl

怎么使用呢?其实和 chromium-browser 差不多。

SSLKEYLOGFILE

好了,原理介绍到此。是时间动手试试了。

实战第一步:确定 URL

https://www.baidu.com/s?wd=ourats

实战第二步:curl命令和php脚本准备

  1. 命令行使用 curl 访问上述 URL
'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/83.0.4103.61 Chrome/83.0.4103.61 Safari/537.36' 

注意 User-Agent header 头是必须要加的,如果不加获取不到真正的搜索结果页,即使加了,也有可能会出现图片验证码页面,总之我们命令执行完了之后,打开 /tmp/a.html 看一眼,如果显示一个“Found”链接,点开是图片验证码,那就验证一下,再次执行此命令应该就没事了。

2. 写个 php 脚本访问上述 URL

<?

保存为 /tmp/a.php, 然后执行

php /tmp/a.php

同 curl 一样,不是每次执行都能成功获取到搜索结果页面,多试几次。

实战第三步:配置 Wireshark

和昨天的文章一样,这里不再多述。

实战第四步:CURL

  1. 打开 Wireshark,开始监控网络数据包
  2. 执行如下命令
SSLKEYLOGFILE=/tmp/a.log LD_PRELOAD=/tmp/libsslkeylog.so curl -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/83.0.4103.61 Chrome/83.0.4103.61 Safari/537.36' 'https://www.baidu.com/s?wd=ourats'> /tmp/a.html

我们可以通过返回页面的大小判断是图片验证页面还是搜索结果页面,如果是图片验证页面,那就打开 /tmp/a.html 正常验证,再执行此命令。

3. 停止 Wireshark 抓包。

v2-7d602e31a683feda9430ca7fff45a74b_b.gif

4. 由于使用的是 curl,所以我们这次抓的包就少多了,很容易就找到了 http 请求和返回的数据。右击 Follow - HTTP Stream,过滤出 61.135.169.125:443 发送给我们的数据,并将编码设为 UTF-8,然后另存为 /tmp/a.html 。

5. 浏览器打开 /tmp/a.html,可以看到这次 OurATS 的官网在第一条,Moka 蹭 OurATS 的广告排到了第三条上。

这个操作的动图在前台始终显示不了,点下边链接查看。

https://www.ourats.com/baidu-moka-ourats/curl-wireshark-find.gif​www.ourats.com

实战第五步:PHP

和第四步流程是一样的,只不过运行的命令变成了

SSLKEYLOGFILE=/tmp/a.log LD_PRELOAD=/tmp/libsslkeylog.so php /tmp/a.php

v2-f327f8177c5f7d66039de31249e47e30_b.gif

但这次抓取的数据包里 Wireshark 只显示出了 http 请求,没有显示返回数据。右击 Follow - HTTP Stream 也得不到返回数据。不过 右击 Follow - TLS Stream,在这里,看到了 http 返回。具体什么原因,还不清楚。

这个操作的动图有11M,也超出了知乎上传图片的限制大小。点击下方链接查看。

https://www.ourats.com/baidu-moka-ourats/php-wireshark-find.gif​www.ourats.com

这次 Moka 蹭 OurATS 的广告又排到了第一条上。

小结

本文通过 LD_PRELOAD libsslkeylog.so 的方法展示了如何抓取 curl 和 php file get contents 产生的 https 数据包。此方法的适应性比昨天文章里的 chromium-browser 方法要广很多,只要动态链接了 libssl.so 的程序都可以,所以其实不限于 https,imaps、pops 也可以。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值