什么是电子邮件跟踪链接和像素?

2021-06-10 03:53:40

这是一些电子邮件(时事通讯)提供商跟踪他们读者&#39所用技术的调查;活动。它试图解构跟踪链接和像素,并突出显示正在收集的数据。

在电子邮件 - Untracker开发期间发生了一些工作。其余部分发生作为本文的一部分。它涵盖了我个人遇到的邮件列表提供商:MailChimp,ConvelKit,Sublack和其他邮件零售商。

TL; DR:MailChimp和ConvertKit被成功分析。家庭企图和邮件必需逆向工程,只产生部分结果(请求援助!)。附录中还有一些额外的评论。

(更新2021-06-01:由于第一次发布,因此有一些新的发展。请参阅这篇文章的结尾。)

MailChimp的跟踪链接是HTTPS:// ??.us?.list-manage.com / track / click?u = ??& id = ??& e = ??并包含三个标识符:U,ID和E。

例如,以下是我收到的最近电子邮件时事通讯顶部的链接:

在同一电子邮件的底部附近,有类似的寻找(即相同的锚文本)链接:

MailChimp的链接很简单,没有惊喜。通过比较不同订阅者的链接和相同的发布的问题,可以推断出以下操作:

ID是每个问题唯一的链接ID。请注意,上面的两个链接点到相同的目标URL,但具有不同的ID值。

e是订户ID。在同一出版物的不同问题中,此数字保持不变。如果电子邮件发送到其他电子邮件地址,则会与其不同。

此外,MailChimp验证/需要所有三个ID。如果其中三个值中的任何一个不正确,则跟踪链接不起作用(即。返回除30x HTTP代码以外的其他内容)。

在这种情况下,ID似乎是发布或问题标识符(即,注意D184BDAE50在上面的目标URL中出现在UTM_CAMPAIGN和UTM_TERM变量中)。

ConventKit的跟踪链接是https://click.convertkit-mail.com/< a&gt ;/ < p> ;/ < c>有部分:A,B和C.

部分C立即突出出来,因为它看起来像Base64。让我们试图解码它。

是的,它是。 目标URL是Base64编码和嵌入在跟踪链接中作为C部分。 怎么样和b? 那里可能有一封电子邮件或订阅者ID。 在电子邮件中搜索文本K0U30RG2PDS6HQZW2VTL显示它在每个跟踪链接中。 但它也出现在标题中: 只留下B被破译。 我试图猜测B可能是什么的困扰。 然后,在突发发注地时,我尝试更改某些值和戳转换。 这是基线: 好的。 让我们在C部分中与Base64一起篡改。 我只会改变一个字母,看看会发生什么(我将最后一个m更改为m)。 呵呵? 即使第C部分base64 - 解码到https://long-water-221.ck.page/5842c54499,它仍然重定向到https://long-water-221.ck.page/5842c54493(注意最后一个字符是 不同的)。 有些不对。

我发现C无关紧要。 只要它至少为4个字符和有效的Base64,跟踪链接将重定向到正确的URL。 所以... C在跟踪链路中嵌入目标URL,但实际上没有使用它。 这意味着还必须使用其他东西来标识目的地URL。 嗯,只有b留下,所以它必须是b。 a是电子邮件ID。 Message-ID电子邮件标题对于每个电子邮件都应该是唯一的。 C是目标URL,但它实际上不是由ConvedKit使用来计算重定向。 由于A是唯一的,可能是ConvertKit使用它来了解哪些订阅者的点击。 它嵌入了A部分。 啊,这证实了A足以识别订户。

为什么嵌入目的地网址但不使用它?我的猜测是它是一个倒退措施。如果跟踪链接的服务器侧数据库已关闭,则ConvertKit可以拒绝使用C作为目标URL。

Suppl是我见过的最不友好和用户敌对的跟踪链接。这是一个单身沉重的斑点。这是一个例子:

起初,我以为斑斑可能是一个JWT,因为前几个字符看起来相似(所有JWT以Eyj开头......),但它不是。当我通过Base64解码器时,它仍然看起来像Gibberish。

因此,它不是Base64或它是Base64,具有自定义字母或其Base64编码二进制数据结构。

它真的看起来像Base64所以我尝试了自定义字母表。并且没有任何地方。

好吧,我不知道这些斑点是什么,但让我们看看我是否可以做一些侧面通道分析。

我注意到BLOB长度与目标URL的长度之间存在相关性。我重定向了随机选择链接,并注意到BLOB和URL的长度。并绘制了它们。

是的,有相关性。更长的URL导致更长的斑点。但它有点模糊,而不是完全决定性的。

如果它是base64(具有33%的开销),则URL中的每个额外字符都应将BLOB长度增加1.33个字符。

令人惊讶的是,它不是。图中的渐变大致为1. URL中的每个额外字符导致大致,椭圆字符。这是奇怪的。他们设法做基本64没有开销?我现在把它放在一边,看看我还能找到什么。

如果URL是空字符串,BLOB会有多大?这将是Y-entercept的值......图表显示为约360.零长度URL将以360个字符的斑点编码。换句话说,Blob中有大约360个其他非URL的字符。

在某些时候,我发现这些链接不是由邮件而不是MailGun生成的。 MailGun是一个出境电子邮件提供商,用于发送电子邮件。 MailGun是一个批发商,其客户,如家食,是零售商。

跟踪链接由MailGun实现。 MailGun跟踪并将数据发布到零售商。

通过幸福的巧合,我发现扣眼,我的电子邮件时事通讯提供商,也使用MailGun。所以我真的可以自己生成这些斑点,甚至可以插入我自己的明文。乐趣!

我的电子邮件通讯没有跟踪链接,因为我用buttondown禁用电子邮件跟踪。但是,要调查此问题,我暂时启用了电子邮件跟踪。例如:

但是Buttondown的Blobs比食得更短。 Y-Instcept大约是210. Buttondown的斑点有210个字符的非URL的东西。 (而家用有360.)

看电子邮件标题给出了线索​​。它默认用户定义的变量可以通过自定义x-mailgun变量标头传递给mailgun。

X-mailgun - 变量:{&#34;类别&#34 ;:&#34;邮政&#34;&#34;电子邮件_generated_at&#34 ;:&#34; 1619322434978&#34;&#34; is_freemail&#34 ;&#34;真实&#34;,&#34;出版物和#34 ;:&#34; 2252&#34 ;,&#34; post_autience&#34 ;:&#34;每个人和#34 ;,&#34 ; post_id&#34 ;:&#34; 35529220&#34 ;,&#34; pub_community_enabled&#34 ;:&#34;真&#34;&#34; user_id&#34 ;:&#34; 28653662&#34; ,&#34; post_type&#34 ;:&#34;时事通讯&#34 ;,&#34;子域&#34 ;:&#34; exponentiveview&#34; }

(顺便说一句,这是一个非常有趣的电子邮件标题。Supplat泄漏了它有多少作家,文章和订阅者。)

两个之间的长度差异? 163个字符。这对我来说足够接近,我可以说它占差异。

让我们回顾一下。单击跟踪链接时,我推测您发送到MailGun:

还有一些其他未知的东西,它正在卷起90个字符的其余部分。

用于跟踪链接点击的当前URL很长。提供一种方法来通过钻头缩短它们或许是一个自定义缩短的URL会有所帮助。

我们曾经做过一次,并面临着将永远支持的数据存储巨大的数据。我们谨避免实际这样做。

此对话表明MailGun最小化了在服务器端存储的跟踪数据量。哪种对我的猜测分享了一堆跟踪数据嵌入在(客户端)Blob中。

为了解决编码,我通过URL中的重复文本通过电子邮件发送了一个链接。假设它是Base64,我期望看到我可以用来迭代地解决编码的Blob中的重复字符。

添加?nonce = a将blob增加9个字符。正如预期的那样。然后长度得到了一点奇怪的。

添加19 A增加了4个字符的BLOB。添加另外10个并没有增加Blob。最后,增加了60个更大的Blob×7个字符。

猜猜发生了什么?压缩。所有额外的重复字符都被压缩。

请记住,当我说,使用base64时,我期望每个URL字符在1.33 blob字符中表示,但它实际上存储在1个blob字符中?压缩也会解释一下。

我怀疑blob是一个(json?)数据结构,它被压缩,然后是base64编码。

不幸的是,我没有足够的压缩算法足以让我能够识别正在使用哪种算法。这就是我得了的地方。

eJyNjL0OgzAQg5-GbKBcOAIZMrRQXgPl7ygShKpN1dcvoA4dkezBlj97jc5CDWzSggvglcDdyAsoUMq277oOhbreBLQZchvimEws3Lqwu3YKFDlFHBvHq5q7WoVgSKETEoUnNut7So9XVl4y0W_6w7fEnvpXwHY9Lmaaj-OkS6iDNEQ5J0k5-mBz6wPlpkJHjTJGQcXsO6U1-vUTh7Czw-TPgcf61PQLUtRVuw#的base64译码到:00000000:789C 8d8c bd0e 8330 1083 2817 919b 0e00 X ...... 0 ....(... 00000010:864c AD14 1780 f97b CA04 A12A 9375 75CB .L ..... {... *。UU.00000020:E803 8764 7B30 658F DEE3 7390 835B 34A0 ... D {0E ... S .. [4.00000030:82F8 2570 3772 02CA 1432 ADBB EE83 A16E ..%P7R ... 2 ..... N00000040:B781 2D06 5C86 F8A6 130B 372E AC2E DD82 ..-。\ ..... 7 ..... 00000050:850E 5147 06F1 EAE6 AED6 A158 1228 44C4 ..qg ....... x。(D.00000060:A149 CDBA DED2 A3D5 D597 8CB4 5BAC 3B7C .I .......... [。; | 00000070:49EF A57C 0763 D2E6 69A8 CE91 2EA2 0CD1 I .. | .c..i ....... 00000080:10E4 9D24 E660 73EB 03E5 A642 478D 3246 ... $。“BG”2F00000090:41C5 EC3B A535 BD44 E1EC 2CF0 4CF8 1C7F a ..; 5.d ..,。l ... 000000a0:ad4f 40b5 2d45 5bb0 0a .o @ .-

也许在将来的一点上,我会尝试解决压缩算法是什么。然后我最终可以解码Blob并报告其中未知的90个字符是什么。

此Blob使用与跟踪链接相同的编码,因此我不知道它是什么。

不满足MailGun的跟踪像素,Subspl插入其自己的跟踪像素。这是对的,Suppl Creadletters有两个跟踪像素。附加像素如下所示:

&lt; IMG SRC =&#34; HTTPS:?//mailgun.substack.com/api/v1/email/open标记= eyJtIjoiPDIwMjEwNDI1MDM0NzExLjEuNTFiZTJjNmYwMmI5NWU2NWYxODQ4MDczNzViMDE2NjlAc3Vic3RhY2sxLmV4cG9uZW50aWFsdmlldy5jbz4iLCJ1IjoyODY1MzY2MiwiciI6InVzZXJuYW1lQGdtYWlsLmNvbSIsImQiOiJzdWJzdGFjazEuZXhwb25lbnRpYWx2aWV3LmNvIiwicCI6MzU1MjkyMjAsInMiOjIyNTIsImMiOiJwb3N0IiwiZiI6dHJ1ZSwiaWF0IjoxNjE5MzIyNDM1LCJpc3MiOiJwdWItMCIsInN1YiI6ImVvIiwiYWxnIjoiSFMyNTYifQ.vAYcwftZOlLog -1- ieICCkPBko6HEXFr42wa7Ooao6M&#34; alt =&#34;&#34;宽度=&#34; 1&#34;高度=&#34; 1&#34;边境=&#34; 0&#34; STYLE =&#34;高度:1px!重要;宽度:1px!重要;边界宽:0!重要; MARIGG-TOP:0!重要; MARIG-BOLTER:0!重要; MARIN-RIGHT:0!重要;边缘 - 左:0!重要;填充 - 顶部:0!重要;填充 - 底部:0!重要;填充 - 右:0!重要;重要;填充 - 左:0!重要;&#34; /&gt;

{&#34; m&#34; :&#34;&lt; 20210425034711.1.51be2c6f02b95e65f184807375b01669@substack1.expon entiveview.co>&#34 ;,#34; :28653662,&#34; R&#34; :&#34; [email protected]" ;,&#34; D&#34; :&#34; supplack1.exponentiveview.co&#34 ;,&#34; p&#34; :35529220,&#34; s&#34; :2252,&#34; C&#34; :&#34;帖子&#34 ;,&#34; f&#34; :真实,&#34; IAT&#34; :1619322435,&#34; ISS&#34; :&#34; PUB-0&#34 ;,&#34; sub&#34; :&#34; eo&#34 ;,&#34; alg&#34; :&#34; HS256&#34;}

很明显,发生电子邮件跟踪,但实际收集的数据是什么?

幸运的是,Mailgun的文档给了我们一个线索。打开跟踪电子邮件时,单击跟踪链接时,它将事件发布到零售商。这是事件中的一个例子。

{&#34;事件&#34; :&#34;打开&#34;或者&#34;点击&#34;,&#34; id&#34; :&#34; g5zmz2yss6oxz2c8xb2tqg&#34;&#34;时间戳&#34; :1377075564.094891,&#34;日志级别&#34; :&#34;信息&#34 ;,#34;收件人&#34; :&#34;收件人@ example.com" ;,&#34;地理定位&#34; :{&#34;国家&#34; :&#34;美国&#34 ;,#34;地区&#34; :&#34; tx&#34 ;,&#34;城市&#34; :&#34;奥斯汀&#34; },&#34;标签&#34; :[],&#34; url&#34; :&#34; http://example.com/signup",//只有在&#34;点击&#34;活动&#34; IP&#34; :&#34; 123.123.123.321&#34 ;,&#34;运动&#34; :[],&#34;用户 - 变量&#34; :{},&#34;客户信息&#34; :{&#34;客户型&#34; :&#34;浏览器&#34 ;,&#34;客户端 - 操作系统&#34; :&#34; Linux&#34 ;,&#34;设备类型&#34; :&#34;桌面&#34 ;,&#34;客户名称&#34; :&#34;铬&#34 ;,&#34;用户代理商和#34; :&#34; Mozilla / 5.0(X11; Linux I686)AppleWebkit / 537.36(如壁虎)Ubuntu Chromium / 28.0.1500.71 Chrome / 28.0.1500.71 Safari / 537.36&#34; },&#34;消息&#34; :{&#34;标题&#34; :{&#34;消息-ID&#34; :&#34; [email protected]" }},}

浏览器(可用于推断您正在使用的设备和操作系统)

虽然这个例子是用于MailGun,但我们应该期望像MailChimp和ConvertKit这样的其他提供商做类似的事情。

我希望你找到了这篇文章的信息。不幸的是,我无法完全解码Mailgun的跟踪链接(我可以用压缩专家的一些帮助)。也许如果我在未来有时间,我可以重新审视它。

(我在下面有一些评论,但它们有点偏离主题。随意跳过它。)

找出跟踪链接的目标URL的简单方法是使用WGet:

在目标URL嵌入到跟踪链路中的那些情况下,可以避免通过解码目的地URL并直接导航到它来跟踪跟踪。对于ConvertKit,这是真的,对于像词场等邮件零售商来说,可能是真的(当我最终锻炼解码时)。

这是一个功能,如果有足够的需求,我可以添加到电子邮件Untracker。

众所周知,MailChimp实现分片(账户分布在不同的数据中心,即US1至US9)。碎片可能是为什么他们的链接需要MailChimp帐户ID - 因此服务器知道哪些分片用于查询目标URL。

ConvertKit不使用分片。 他们的跟踪链接全部存储在一个地方。 但是,实现了100%全局数据库的正常运行时间很难,因此有一个倒退方法(即,如果数据库已关闭,则从c中获取目标URL。 mailgun采取不同的aproach。 它根本不会在数据库中存储跟踪链接。 相反,数据嵌入在客户端的跟踪链接的BLOB中,并在单击时发送到服务器。 这是一种更可扩展的技术,因为它不需要访问单个故障(即,数据库)。 缺点是斑点非常长,用户不友好。 在一个非常有用的Reddit用户的帮助下,MailGun / SublAck Blob已被破译。 它是zlib压缩,然后编码base64url。 当我有时间时,我会跟进这个未来的博客帖子。 如果您想通知,请订阅。