专栏首页FreeBufGsuite邮件发送功能中的SMTP注入漏洞分析

Gsuite邮件发送功能中的SMTP注入漏洞分析

本文讲述了作者通过Gsuite邮件发送功能,可构造后缀为@google.com的任意发件人身份,实现SMTP注入,漏洞获得了谷歌$3133.7的奖励。

Gsuite是谷歌旗下的一款整合协同办公软件,它可以用来管理组织机构内部账户,允许管理员对内部账户进行权限划分、应用程序访问控制、通讯录查看以及邮件头应用等操作。

其中,Gsuite的邮件头应用功能引起了我的兴趣,如今的电子邮件头中包含了一些可以“利用”的SMTP协议信息,它算是一种古老的通信协议了,几乎每个接触互联网的人都会使用到它。这里的“利用”指的是我们可以从中发现一些有用信息,从而做一些尝试性的欺骗测试。谷歌这种大厂其实也难免犯错,这不,我就发现了Gsuite的邮件配置存在漏洞,攻击者可以利用该漏洞伪造谷歌服务器的发送邮件。

SMTP协议背景

本质上来说,如果可以建立连接到某个SMTP服务器的接口,就能按相应步骤向任意邮件地址发送电子邮件了,这里更重要的是,可以以任意发件人身份进行邮件发送。所以,这种情况下会引发一系列的混乱问题,因为作为收件人来说,他邮件内的发件人身份完全是不可信的。

通常,我们可以从以下几条简单的SMTP命令来了解SMTP协议:

1、‘MAIL FROM’: 发件人身份(发件人邮箱地址),再强调一下, 这里可以是任意地址,如queen@yesIReallyAmTheQueen.com; 2、‘RCPT TO’: 收件人邮箱地址; 3、‘DATA’: 邮件内容。

就这些,没有cc(转发),没有bcc(私密发送)和subject(主题)等头信息,它们都是后续的内容了。那现在如何来利用呢?我们可以把一些额外的头信息放到上述的邮件内容字段(DATA)里,比如,在DATA的开头部分中加入任意的头信息,只要发件人和收件人可以解析理解都行,按RFC定义来讲,每个头信息都新占一行,头名(header)和值之间以冒号分隔。如以下简单的例子:

SMTP FROM:
admin@google.com
SMTP TO:
Victim@gmail.com
DATA:
bcc: attacker@gmail.com

Send me all your money!!

伪造发件人身份

显然,如果上述问题得不到解决,且随着时间的推移,基于SMTP的身份和内容验证措施推出,那么电子邮件就不会是一个很好的交流工具了。在此,我们不展开讨论其安全机制。但是,我们要记住的是,在如今的邮件协议中,验证发件人身份的就仅只是“自称是谁就是谁”的DNS域名验证(DNS domain validation)。所以,如果我拥有‘google.com’网站,就可以设置一个域名服务记录,配置所有的SMTP服务器发自‘google.com’的邮件为安全可信邮件,其它发件都是垃圾邮件。也就是说,如果可以伪造(Spoof)谷歌服务器的发件,那么其可信度也就非常之高了。

回到Gsuite

有了上述思路,我们就来测试一下Gsuite的邮件功能。如果你登录admin.google.com,转到Apps -> G Suite -> Settings for Gmail->Advanced settings->Routing下,就能在其中添加进出邮件的“邮件路由设置”规则,其中一个可选项就是为所有邮件配置一条“自定义头”:

基于上述的测试构想,我们可以假设其所谓的“自定义头”是添加到SMTP协议的‘DATA’内容中去的,所以,如果能在其中添加进任意头信息,那么也就能操控邮件内容了。

然而,实际情况并非如此,Gsuite中的自定义头有一个“X-”前导,因此貌似我们不能完全控制头名称,但是,等等!前面我们说过,按照RFC规则惯例,每个头信息都是新占一行的。如果我们可以插入一个新行作为头名称的下一个部份呢?那么下一行到底是新的头,还是我们可以控制的呢?

然而,经测试证明,这种方法不可行。谷歌不允许在头信息中包含换行符。但是,我又注意到一个地方,那就是在“自定义头”的下方存在一个选项:Prepend custom subject,即为每封邮件添加“自定义主题”的选项。前述我们说过,SMTP中并不包含‘subject’ 这一项,它只是‘DATA’内容中的一个头信息。

为此,来看看这个“自定义主题”能否作为利用点。发送邮件时,打开代理工具,往其中的‘subject’中插入新行 (‘\r\n’),抓包看流量:

请求出去后,没返回任何错误提示!我立即向我的其它Gmail发送了一封测试邮件,然后从中收到的内容如下:

惊到我了!也就是说我们构造的Payload成功了,其中插入的Payload字符:we\r\nnewlinew\r\nnewlinell,被谷歌邮件服务端解析成了多行了!由于每一个头信息占一行,所以subject之后的Payload:we\r\nnewlinew\r\nnewlinell被推到了后续显示,成为了这里的邮件内容(email body)。这就是一种典型的SMTP注入啊!

接下来,我构造了一个更有意思的Payload,再次对其中的subject设置做了手脚,这一次,我包含进行了邮件发件人的from头信息,即:

再一次成功了!Gmail把它解析成了发件人为admin@google.com的邮件:

就这样,我可以伪造任意后缀为@google.com的发件人身份!

漏洞上报和处理进程

2020.1.5 附带Payload报送谷歌 2020.1.13 谷歌接受漏洞 2020.1.15 我发送包含admin@google.com的有效POC详细技术信息给谷歌 2020.2.11 谷歌发放赏金$3133.7

参考来源:https://www.ehpus.com/post/smtp-injection-in-gsuite

本文分享自微信公众号 - FreeBuf(freebuf),作者:clouds

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 两封发票主题攻击邮件分析

    3月6日上午,邮箱连续收到两封以税务发票“Tax Invoice”为主题的邮件,全部是英文信息,接收时间分别是早上8:27和9:15,附件是windows系统....

    FB客服
  • 关于钓鱼邮件的学习笔记

    所以事前我们需要准备一个钓鱼网站,为了能让钓鱼网站在公网访问,还需要一个VPS,若想获得更好的伪装效果,还需要一个用于伪装的域名。VPS和域名都到手后,还可以搭...

    FB客服
  • 企业邮件安全防护实践

    邮件系统作为一种有效的内外部工作沟通平台,在企业内得到广泛使用。同时,广告邮件、垃圾邮件、钓鱼邮件等问题就成了企业邮件安全头号难题。所以我们的企业安全人员以往更...

    FB客服
  • Zabbix配置邮件报警a 原

    上面详细介绍了如何使用zabbix email形式发送报警,个人认为唯一的缺点就是报警内容太不够人性化了。所以下面介绍zabbix第二种常用的报警方式,自定义脚...

    拓荒者
  • python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上(详解)

      本篇文章与前边没有多大关联,就是对前边有关发邮件的总结和梳理。在写脚本时,放到后台运行,想知道执行情况,会通过邮件、SMS(短信)、飞信、微信等方式通知管理...

    北京-宏哥
  • vs2010 mvc3

    asp.net mvc确实是好东西,VS2010在升级sp1的前提下只能最多安装mvc3.

    py3study
  • Python发送邮件基础知识与代码讲解!

    在前一段时间的文章中,我们主要讲解Python与Word/Excel/PPT等Office软件的相关操作,现在我们将继续分享如何用Python与更多的办公软件交...

    刘早起
  • 如何验证 Email 地址:SMTP 协议入门教程

    Email 是最常用的用户识别手段。 开发者常常需要验证邮箱的真实性。一般的方法是,注册时向该邮箱发出一封验证邮件,要求用户点击邮件里面的链接。 ? 但是很多时...

    ruanyf
  • 腾讯云Terraform应用指南(三)

    本文将衔接《腾讯云Terraform应用指南(二)》,继续对Terraform中的指令给出详细的使用指南,让用户全面了解Terraform的每一个可用操作,助力...

    生态产品团队
  • CentOS7下安装.NET Core SDK 2.0

    KenTalk

扫码关注云+社区

领取腾讯云代金券