用户在浏览互联网时,都会或多或少的留下「行为日志」,我们通过有意识的区分和筛选「行为日志」,就能分析出目标用户的阅读与否。

!!! WANRING 作者声明 !!!

本文在渗透案例中提供的方法可能带有攻击性,仅供安全研究与探讨之用,请勿用作非法用途。

0. TL;DR

用户在浏览互联网时,都会或多或少的留下「行为日志」,我们通过有意识的区分和筛选「行为日志」,就能分析出目标用户的阅读与否。
本文通过用户打开邮件中的第三方图片,并分析这张图片的请求日志来逆向推断邮件是否被打开阅读。同时在了解了原理以及流程后做出对应的防范措施。

1. 前言

这个标题的问题源于一个生活的小细节,也就是我的一个好友最近要申请博士,但是有急于想知道教授有没有看到「套瓷」邮件,所以有了这篇文章。

我们用户在浏览邮件时,往往内容不单单只有文字,还有一些图片文件。虽然对用户无感,但是实际上,用户在互联网上做的任何操作,都会被记录下来,也就是所谓的「用户行为日志」,至于是被谁记录的,大概可以理解为,从你的电脑到目标位置所经过的每一个节点,都有被记录的可能(网络服务提供商、操作系统、邮件软件、邮件服务商或目标站点等等)。

而我们可以通过用逆向的方法思考一下,如果在整个邮件发送过程中加入一个可以自由操纵的节点,那么就能够截获到目标用户有没有打开邮件。

2. 原理

简单来说就是,我们可以在发送的邮件中,插入一张自定义的照片,然后每次接收者打开邮件,就会加载图片,这个时候,储存图片的服务器就会记录这次访问的时间、地点、客户端类型。

3. 流程解释

null

  1. 教授收到了一封邮件,并决定打开读一读;
  2. 软件会自动向邮件服务器请求邮件的具体内容;
  3. 如果这份邮件里包含了一段文本以及一张我们插入第三方图片,此时会分别请求文本以及图片;
  4. 具体的文本内容会从邮件服务器中获取得到;
  5. 第三方图片,则会直接访问图片地址并返回图片,同时服务器会记载每次请求的客户端信息日志。

我们的具体操作关键就是在第五步,通过查看这个「客户端信息日志」来确定图片是否以及何时被加载,来反向推算出邮件是否被读过。

4. 实现方案

显而易见,要实现上述第五步的操作,就需要拥有一个可以「放置图片而且能够查看访问日志」的服务器。我们有以下几种方法来实现:

  1. 拥有一个服务器/vps,通过搭建nginx服务器查看access_log来实现
    • 优点:自己掌握服务器,实时知道日志信息
    • 缺点:偏向技术类,对于非开发人员有实现难度。我会在系列下一篇文章通过「docker一键部署nginx」教程来详解讲解
  2. 使用云储存服务商,例如七牛、又拍云,提供的易用服务,快速实现上述功能。
    • 优点:对于非技术类人员来说较为友好,同时提供可视化界面
    • 缺点:服务器不在自己手里,日志的生成有延时,七牛只能看7小时前的

5. 使用七牛云实现

1.首先我们确定最终收到的邮件样式如下,我们把小心机藏在了最后模拟的「联系方式」图片中。

null

2.我们打开七牛的「管理控制台」,并添加一个「对象储存」。

  • 此处我们省略注册过程,如果你需要注册的话,可以考虑点击我这个邀请链接,好像双方都有优惠活动。

null

null

3.创建成功后自动进入该储存空间的页面,可以看到右侧有一个「域名」,这就是外界访问这个空间文件的域名,同时注意到,这种测试域名的使用是有限制的,总结一下:

  • 只能用30天,30天后这个域名就失效了,过往发出去的邮件里的图片在30天后,收件人就彻底看不见了
  • 这个域名一天被访问的流量总和不能超过10G。(空间只有一张图片10M,图片在今天被访问100次,则空间本日的流量为1000M)
    null

4.进入「内容管理」,上传图片,并获取这张图片的「外链」。

形如以下样式:

http://pihggo7u2.bkt.clouddn.com/banner_mini.png

null

5.进入「空间设置」,开启「空间日志」并保存设置。这是最为关键的一步,如果忘记打开,就会前功尽废了。

null

6.把这张外链图片添加到我们的邮件中,请注意,是以链接图片的形式添加,而不是上传本地的照片。只有对方是通过链接访问我们的图片,才有可能被记录到浏览。

null

7.发送后,静待七牛的「访问日志」生成,他会以文件的形式储存在和你照片的同一个文件夹,是以「_log/空间名字/年/月-日-时-分-秒」的命名形式存在,通过添加右边的「...」进行下载,实际上是一个txt文件,我们用任意一种文本编辑软件打开就可以看到。

null

8.打开后,我来介绍一下,日志的组成。

null

9.那我们就可以通过定期的分析日志,就能知道,哪一个时间这个邮件被访问过了。

我们怎么知道是哪个老师/用户访问了我们的邮件呢?

很显然,上面的情况只能知道,图片被浏览过,邮件被打开阅读了,但是如果同一个邮件发给多个人,如何区分是谁访问呢?
答案是很难,不是说不行,可以通过日志的客户端类型来分析,但是相当不可靠。

所以更好的方案是,针对每一个接收者,我们特意为他设置一个图片文件(图片内容可以是一样的),这样我们就能通过日志里的「被访问文件名」来对应,是哪一封邮件被打开了。

null

null

6. 能够知道访问用户的具体地域吗?

可以,但是不一定可靠。
我们在日志文件中,能够拿到访问用户的IP地址,我们去IP地址库中填入这个IP地址就能知道用户的地域情况。

null

但是为什么说不可靠呢?

  • 因为google这种大型邮件提供商早就为了用户隐私做足了保护,他们会使用google自己的服务器代用户访问照片,然后中转展示给用户,所以日志记录得可能只是google服务器的地址,而不是真的用户地址。
  • 因为一些分发或者CDN的原因,地址记录的可能只是中间中转节点的IP而非目标用户的地址。

7. 这种骚操作的可靠率有多少?

这个我也不能确切的告诉你,因为有一些邮件软件会默认拦截第三方图片的加载导致实际上看了但是日志没有记录的情况。
亲身经历的话,之前一直用的是收费「又拍云」,所以帮朋友实现方案也在「又拍云」上面做的,上面朋友的套瓷邮件倒是每天都有浏览记录,但是这位朋友还没有收到回信哈哈,还是需要继续奋斗呀。

8. 防范措施

在了解整个实例的渗透过程后,我们可以更为清晰的了解到,其实用户的隐私是非常脆弱的,作为一个少数派,也需要学会进一步加强自己的隐私保护。下面会针对渗透的要点做出几个防范建议:

减少/禁用访问邮件中的第三方图片

这个措施是为了阻断渗透中最为关键的「原理第五步」(通过嵌入一个渗透者能够获取访问记录的第三方图片来进行渗透)来阻止整个渗透过程。
当我们禁用访问邮件中的第三方图片,那么就是第三方图片的服务器无法知道我们到底有没有看过邮件(因为没有访问图片也就服务器没有记录访问日志)。

那么加载第三方图片的功能默认是开启的,我们可以在各自的邮件软件或者网页版的设置中关闭。

以下可以展示一下几个笔者常用软件的设置:

  • Gmail的「设置」-「常规」-「图片」
    null
  • MacOS原生邮件应用的「通用设置」-「查看」

    null

  • MacOS的Unibox的「设置」-「高级」-「载入HTML中的图片」

    null

很遗憾的是,在我写这篇文章的时候,并没有找到QQ邮件/网易邮箱有设置能让用户屏蔽第三方图片加载的功能,所以读者需要知道这一点并减少打开一些陌生邮件。

使用邮件服务商的代理来浏览第三方图片

如果需要附带图片,请求发信人把图片附在邮件附件上是一个比较可靠的选择的。而当你不得不需要打开第三方图片,又不希望别人通过IP找到你的具体位置时,可以选用Google邮箱的网页版。

Google邮箱不得不说,已经处处尽可能为用户的隐私着想,他们邮箱是默认开启加载第三方图片的,但是并不是由用户的浏览器来访问,而是用Google自己的中转服务器加载并呈现给用户,那么渗透者即使知道了图片被打开也无法通过IP确认用户的确切地理位置。但是全程用户是无感的,这种费力不讨好的事,目前根据我的个人观察,也只有财大气粗的Google有做,其他的邮箱服务提供商并没有跟进。

null

Ps.多说几句

  • 这个系列的下一章节会介绍,渗透者通过自己的服务器或者vps来构建类似服务,通过细节的呈现,欢迎讨论出更为行之有效的防范措施。
  • 实际上这种应用,还有一些更骚的操作,比如插入「透明照片」、「照片实际上是一个302跳转链接」等等,但是涉及到一些web技术以及安全的技术,有机会会进行一些介绍
  • 首发作者的blog,同步发表在「少数派」上。
10
0