早在2019年5月,我们就在此博客上报告了一次安全事件。自上次更新以来已经过去了很长时间,但在与执法部门协商后,我们现在可以提供更多详细信息,以了解发生的情况,发生的情况以及我们为解决导致事件发生的潜在问题而采取的措施。发生。

设置场景

在2019年5月12日世界标准时间00:00左右,社区的多个成员通知我们新用户帐户的特权意外升级。没有人认识的用户已经在Stack Exchange网络中的所有站点上获得了主持人和开发人员级别的访问权限。我们的立即反应是撤销特权并暂停该帐户,然后启动一个过程来识别和审核导致事件的操作。

最初发现后,我们发现特权升级只是冰山一角,而攻击实际上导致了我们的源代码泄露和184个用户的PII(电子邮件,真实姓名,IP地址)的无意泄露。堆栈交换网络(已通知所有人)。值得庆幸的是,没有泄漏任何数据库-既不公开(读取:Stack Exchange内容)也不对私有数据库(团队,人才或企业)进行泄漏。此外,没有证据表明可以直接访问我们的内部网络基础结构,并且攻击者从来没有任何时间可以访问Teams,Talent或Enterprise产品中的数据。

穿上攻击者的鞋子

为了了解特权升级和随后的源代码泄露是如何发生的,我们需要能够在攻击达到顶点之前跟踪攻击者对我们站点的访问。幸运的是,我们有一个数据库,其中包含到我们的公共访问属性的所有流量的日志,事实证明,这对于识别与攻击者相关的活动非常有用。使用已经升级的帐户标识符,我们能够使用IP地址和其他标识信息将流量与候选行集相关联。这总计超过75,000行数据,然后我们开始对其进行分类。基于该分类,我们能够进一步过滤出那些被认为“有趣”的行。再加上我们的客户支持团队提供的其他信息以及各种其他日志数据源,我们提出了一个事件时间表。这很详细,但是在这里是因为我们想引起攻击者了解我们的基础结构并逐渐将其特权级别逐步提升到可以泄露我们的源代码的程度。

时间线

2019年4月30日星期二

攻击者开始研究我们的基础结构,特别是构建/源代码控制系统的某些部分以及托管我们某些开发环境的Web服务器。

5月1日,星期三

攻击者继续探测我们的公共网络,并尝试访问Stack Exchange Chat中仅限员工的房间,尤其是我们的SRE房间。他们得到“访问被拒绝”。

此外,自称是我们企业客户之一的人员会提交支持请求,以获取源代码副本以进行审核。该请求被拒绝,因为我们不提供源代码,此外,该电子邮件也无法被验证为来自我们的一位客户。我们的支持团队已将其标记为进一步调查。

接下来,攻击者在一个设备上创建一个Stack Overflow团队,并将电子邮件邀请发送到另一个帐户,该邀请被另一台设备接受。 

5月2日,星期四

攻击者访问了许多与我们的Teams产品相关的Meta帖子,以及在stackoverflow.com上发布的与Enterprise相关的公开可用案例研究。

继上一个支持票之后又提出了另一张支持票,但是这次有一个实际客户的欺骗性电子邮件地址。详细信息显然来自上述案例研究。系统会自动将答复发送给客户(由于地址被欺骗),我们会很快收到通知,称它不是合法请求。

5月3日,星期五

支持请求被拒绝。攻击者将继续探索面向公众的基础架构,包括查看处理支持票的支持人员的用户资料。 

5月4日,星期六

攻击者访问URL尝试从我们的GitHub Enterprise实例下载包含Stack Overflow源代码的ZIP文件,但重定向到登录名。后来,我们发现在包含我们的一些开源代码的公共GitHub存储库中无意中引用了存储库URL。 

5月5日,星期日

这是忙碌的一天。攻击者首先对我们的开发环境进行进一步的探测,然后不久便向我们的开发层提出了登录请求,该请求能够绕过访问控制,从而限制使用访问密钥对那些用户的登录。攻击者能够成功登录到开发层。 

接下来,攻击者开始探索许多内部URL,我们后来发现这些内部URL已记录在企业支持门户中,但由于特权级别不足而无法访问其中的许多URL。

我们的开发人员级别经过配置,允许模拟所有用户以进行测试,并且攻击者最终找到了一个URL,该URL使他们可以将其特权级别提升为社区管理员(CM)。此访问级别是站点主持人可用访问的超集。 

在尝试访问此访问级别不允许的某些URL之后,他们使用帐户恢复来尝试恢复对开发者帐户的访问(再次是更高的特权级别),但无法拦截已发送的电子邮件。但是,开发人员上有一条路线可以向CM显示电子邮件内容,他们使用此路线来获取用于重置凭据的魔术链接。使用它,攻击者在开发环境中获得开发人员级别的特权。他们还可以在这里访问“站点设置”-设置(功能标志)的中央存储库,用于配置站点内的许多功能。

5月6日,星期一

另一忙碌的一天-攻击者恢复了对开发层的访问权限。当他们浏览并了解新发现的特权可以访问的内容时,他们还浏览产品以收集有关在Teams产品上工作的Stack员工的更多信息。此外,他们在生产中使用新创建的Teams实例在“安全”环境中尝试某些管理员级别的功能,并尝试在生产中使用模拟。模拟不会编译到生产二进制文件中,因此所有这些请求都将导致HTTP 404响应。

在花了一些时间调查开发人员上的URL之后,攻击者再次访问了站点设置,并偶然发现了一个包含具有对我们TeamCity实例的访问权限的服务帐户凭据的设置。从历史上看,它是用来从Stack Exchange Network的代码库中访问TeamCity REST API的,尽管很久以前删除了该功能,但凭据仍然有效。

攻击者使用凭据尝试登录TeamCity(当时可以从Internet进行访问)并被授予访问权限。该用户以前从未以交互方式登录,角色分配错误配置意味着该用户立即被授予了对构建服务器的管理特权。

花费大量时间来调查TeamCity-攻击者显然对产品不太熟悉,因此他们花时间在Stack Overflow上查找有关如何使用和配置它的问答。这种在Stack Exchange网络上查找事物(访问问题)的行为很常见,这使我们能够在未来几天内预测和了解攻击者的方法。

在浏览TeamCity时,攻击者能够下载包含我们企业产品的二进制文件和设置配置脚本的构建工件。从这里,他们浏览有关Stack Overflow的更多问题,包括配置IIS以及将数据从我们的Teams产品迁移到企业实例,以及与我们的Teams产品相关的许多其他问题。

对于今天的最后一幕,攻击者试图获得对我们数据中心内构建代理的访问权限,但由于需要VPN访问权限而无法连接。

5月7日,星期二

攻击者浏览与设置和配置Enterprise有关的问题,然后调查更多站点设置。

5月8日,星期三

攻击者立即登录TeamCity并继续浏览站点的管理部分。他们偶然发现了一个诊断部分,该部分允许浏览构建服务器的文件系统-这产生了由构建代理用来从GitHub Enterprise获取源代码的纯文本SSH密钥。在几分钟之内,它被用来克隆几个关键存储库(从TeamCity中配置的VCS根目录收集)。

逐步克隆的过程将持续一整天,并且攻击者会浏览有关.NET项目构建的Stack Overflow问题。在一天当中,他们设法使用我们的本地开发设置脚本(称为“ DevLocalSetup”)和与操作生产环境有关的Wiki。

后来,他们尝试使用Web界面和用于访问TeamCity的服务帐户凭据直接登录GitHub Enterprise。幸运的是,登录到我们的GitHub实例受2FA保护,并且该服务帐户不在允许其访问的相关AD组中。

5月9日,星期四

攻击者提取他们先前克隆的所有存储库的最新副本。

攻击者尝试使用用于访问TeamCity的服务帐户凭据使用基于Azure的VM连接到我们的VPN,但是由于不允许服务帐户以这种方式访问网络,因此登录尝试失败。

他们继续浏览Stack Overflow,以获取有关在IIS下构建和运行.NET应用程序以及在Azure环境中运行SQL脚本的详细信息。

5月10日,星期五

攻击者将提取他们先前克隆的所有存储库的最新副本,并浏览我们TeamCity构建中的配置设置。

他们继续查看有关IIS和.NET应用程序的堆栈溢出和服务器故障问题。

5月11日,星期六

在这一天,攻击者设法在Stack Exchange网络上提升其特权。攻击者再次拉出源代码的最新副本,并立即开始调查构建日志和配置。

攻击者从Azure VM中更改TeamCity中的Git用户名映射,使其看起来像生成服务帐户(SSH密钥映射到该帐户)是审核日志中的另一个帐户。然后,他们在TeamCity中创建一个项目,关闭该项目的版本设置(审核对Git的更改),并开始使用构建配置来配置该项目。

尝试了几种不同的构建。最初,他们尝试创建数据库副本,该副本用于从网络共享配置我们的本地环境,但无法上载到任何外部可访问的位置。之后,他们使用我们的某些内部NuGet软件包尝试相同的操作,但是此尝试也失败了。

上载失败后,他们在GitHub上创建了一个公共要点,其中包含在整个Stack Exchange网络中提升权限所需的SQL。经过几次尝试,他们能够构建一个生成版本,并将其作为对包含Stack Exchange Network数据的生产数据库的SQL迁移来执行。 

他们立即尝试通过删除内部版本和历史记录来清除攻击的任何证据。幸运的是,我们为TeamCity配置提供了一个“垃圾桶”,以后可以恢复这些构建,以了解每个构建所负责的攻击的各个方面。

5月12日,星期日

在执行SQL之后不久,社区就通知了我们奇怪的活动,我们的事件响应团队开始进行调查。

此时,我们还不知道攻击的程度,因此最初的补救措施着眼于特权和凭证的删除。进一步的调查使我们找到了在TeamCity上运行的版本以及被禁用的TeamCity帐户,该帐户立即被禁用,然后使TeamCity完全脱机。

一旦发现升级路径涉及开发人员和使用站点设置来获取凭据,我们便提交了删除这些路径的代码-特别是用于查看帐户恢复电子邮件的工具和用于破坏TeamCity服务帐户的站点设置。此外,所有受影响的帐户都已删除或重置了其凭据。在这一点上,认为最初的事件已得到处理,并在周一发送电子邮件以邀请辅助响应小组进行取证和进一步修复。

同时,攻击者尝试访问生产中的用户模拟(生产构建中不存在功能),还尝试访问TeamCity(现已脱机),但两次尝试均失败。但是,他们仍然能够提取源代码(目前我们还不知道他们可以访问Stack的源代码)。

5月13日,星期一

攻击者再次提取源代码。在这样做的同时,他们正在查看Stack Overflow上有关如何发布和使用NuGet软件包,如何构建.NET代码库以及如何在GitLab上删除存储库的问题。

他们尝试重复访问TeamCity,但它仍处于脱机状态。

二级响应小组开始工作。我们首先提取流量日志以了解发生了什么。鉴于攻击者有权访问开发人员,我们旋转了用于该环境的访问密钥,并开始旋转从站点设置或TeamCity暴露的所有机密。为了使我们能够对生产进行修复,将TeamCity服务置于联机状态,但是这次仅在防火墙内部。我们确定某些登录路由中缺少开发人员访问检查,从而使攻击者可以重播产品中的登录信息并成功获得对开发人员的访问权限-然后添加这些检查。此外,我们在站点设置上添加了对机密的只写访问权限,从而消除了使攻击者能够从此UI检索凭据的漏洞。我们还发现,存储在构建服务器中的许多机密未标记为机密(这会在UI中混淆它们),因此任何人都可以查看它们。这些将作为轮换过程的一部分进行适当更新。

同时,攻击者仍在提取源代码-此时,我们仍未意识到他们具有适用于GitHub的有效SSH密钥。他们一直在尝试访问TeamCity-我们可以看到这一点,因为流量仍在撞击我们的负载平衡器并降落在日志中。他们继续查看Stack Overflow问题,这次与以编程方式刷新许多Git仓库(惊奇!)和创建SQL数据库有关。

次要响应小组调查将持续到第二天。

1
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫

本文深入了解我们的2019年5月安全事件院长沃德酷学软件发布的原创文章
转载请注明地址:https://www.pupilshome.com/blogs/e41yupf6t3ksgmr.html