从外网寻找侵入对方系统的登陆凭证

作为一个红队成员,找到最初的攻击点可能很麻烦,需要耗费大量的资源。在上本书中,我们尝试过伪造受害者的身份验证页面、购买非常相似的域名来对目标实施钓鱼,以及编写自定义的恶意软件等不同的方法。

有时候,我告诉我的红队队员要保持简单的思想。很多时候,那些令人称赞的高级手段,反而不如一些简单低级的方法管用,最简单的方法往往是最有效的。

最基本的技术之一就是暴力破解密码。但是,作为红队的一员,我们必须考虑如何巧妙地做到这一点。随着公司的发展,公司使用了更多的应用程序和技术工具。对于攻击者来说,这无疑为他们拓宽了进攻的大门。当公司开始暴露在互联网上时,我们看到公司需要对电子邮件(如 Office 365或 OWA)、通信工具(如 Lync、XMPP、WebEx)、协作工具(如 JIRA、Slack、Hipchat、Huddle)和其他外部服务(如 Jenkins、CMS 站点、支持站点)进行身份验证。这些就是我们的目标突破口。

我们试图攻击这些服务器和服务的原因是,我们需要寻找能对受害者的 LDAP 或 AD 这些基础设施进行身份验证的工具。这可以通过 ADFS 方式、单点登录(SSO)方式或者直接使用 AD 域认证等不同的方式来完成。我们需要找到一些可以利用的公共凭证,以便继续进行下一步的攻击。在信息收集阶段,我们发现并识别了大量的电子邮箱地址和用户名帐号,我们将对这些获取到的信息进行一种叫“密码喷洒”(Password Spraying)的攻击。我们将针对所有不同的应用程序,尝试猜测基本密码,正如我们在现实世界的 APT 活动中看到的那样( US-CERT 文章:http://bit.ly/2qyB9rb )。

译者注:“密码喷洒攻击”(Password Spray Attack)并不等同于“密码爆破攻击”(Brute Force Attack)。事实上,这两种攻击是相反的。
在密码爆破攻击中,黑客选择一个易受攻击的 ID 并一个接一个地输入密码,希望有一些密码可以让他们进入。基本上,密码爆破是用多个密码尝试破解同一个 ID。而密码喷洒攻击,是用一个密码来尝试多个用户 ID,以便至少有一个用户 ID 被泄露。对于密码喷洒攻击,黑客使用社交工程或其他网络钓鱼方法收集多个用户 ID。通常情况下,至少有一个用户使用简单的密码,如12345678甚至是 p@ssw0rd。
在密码喷洒攻击中,黑客会为他或她收集的所有用户 ID 应用精心构造的密码。因此,密码喷洒攻击可以定义为将相同的密码应用于组织中的多个用户帐户,目的是安全的对其中一个帐户进行未授权访问。
暴力破解的问题在于,在使用不同密码进行一定次数的尝试后,系统可能会被锁定。为了避免这种情况,产生了收集用户 ID 并将可能的密码应用于它们的想法。使用密码喷洒攻击时,黑客也会采取一些预防措施。例如,如果他们尝试将 password1应用于所有用户帐户,则在完成第一轮后,他们不会立即开始将 password2应用于这些帐户。他们将在黑客攻击中留出至少30分钟的时间。
参考资料:Password Spray Attack Definition and Defending yourself

那么,为什么要针对不同的外部服务进行身份验证呢?这是因为:

  • 有些身份验证程序不会记录从外部服务尝试验证的次数。
  • 虽然我们通常看到电子邮件或 VPN 系统要求双因素验证(2FA),但面向外部的即时通讯系统可能不需要。
  • 密码重用的可能性非常高。
  • 有的时候,当使用 AD 账户多次重复登录失败时,外部系统并不会将此账户锁定。 ​

有很多工具可以实现密码喷洒攻击,但是,我们只关注其中的几个。第一个是来自 Spiderlabs 的名为 Spray 的工具。尽管 Spray 使用起来有点复杂,但我非常喜欢它所支持的一些服务。例如,它支持 SMB、OWA 和 Lync(Microsoft Chat)。

要使用 Spray,你需要指定以下几个参数:

  1. spray.sh -owa <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <Domain>

正如你将在下面的示例中看到的那样,我们使用 Spray 对 cyberspacekittens 上的一个 OWA 邮件服务器(该服务器现在已经下线了)进行密码破解,当它使用密码 Spring2018与用户名 peter 尝试进行配对时,成功的登进了系统。

我经常遇到的一个问题是,应该使用哪个密码进行尝试?因为在锁定帐号之前,只能不停的多次尝试密码。事实上这个问题没有正确答案,使用哪个密码非常依赖于这家公司的密码设置规定。我们过去可以使用一些简单密码进行尝试,比如“Password123”,因为总有一些人会因为图方便而使用简单密码。但随着人们安全意识的提高,现在现在越来越少人使用这种密码了,因而成功率也就变低了。现在的话,我们一般结合使用以下规则的一条到多条来构建我们的尝试密码:

  • 月份和年份的数字组合。
  • 当地的球队和球员的数字编号组合。
  • 查看一些以前泄露出来的数据,找一些有没有目标公司的用户资料泄露,因为相同公司的用户可能会使用类似的密码。
  • 公司名称+年份/编号/特殊的字符 (如!,$,#,@)

编好了密码之后,我们就可以24小时不间断缓慢地运行我们的账号破解程序,慢是为了避免触发任何帐号锁定。请记住,我们仅仅匹配成功一个账号就可以进入大门了!

从外网寻找侵入对方系统的登陆凭证 - 图1
此图是使用 Curl 对 OWA 进行身份认证的快速脚本

配置 Spray 非常简单,而且其配置文件可以很容易地给其他类似程序参考使用。你需要做的是捕获登录密码时的 POST 请求(可以在 Burp Suite 中完成),复制所有请求数据,并将其保存到文件中。对于任何将要被破解的字段,你需要提供字符串“sprayuser”和“spraypassword”。

例如,在我们的例子中,post-request.txt 文件如下所示:

  1. POST /owa/auth.owa HTTP/1.1
  2. Host: mail.cyberspacekittens.com
  3. User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0
  4. Accept: text/htmlapplication/xhtml+xmlapplication/xml;q=0.9,*/*;q=0.8
  5. Accept-Language: en-US,en;q=0.5
  6. Accept-Encoding: gzip, deflate
  7. Referer: https://mail.cyberspacekittens.com/owa/auth/logon.aspx?replaceCurrent=1&url=https%3a%2f%2fmail.cyberspacekittens.com%2fowa%2f
  8. Cookie: ClientId=VCSJKT0FKWJDYJZIXQ; PrivateComputer=true; PBack=0
  9. Connection: close
  10. Upgrade-Insecure-Requests: 1
  11. Content-Type: application/x-www-form-urlencoded
  12. Content-Length: 131
  13. destination=https%3A%2F%2Fcyberspacekittens.com%2Fowa%2F&flags=4&forcedownlevel=0

译者注:最后一个 destination 字段的内容本书的英文版本貌似显示不全,至少是我拿到的英文版本 PDF 显示不全。我只是简单的复制自 PDF,读者注意一下。

如前所述,spray.sh 的另一个好处是它还支持 SMB 和 Lync。另一种具备这个特性的工具称为 Ruler,这个工具还可以对密码喷洒攻击得到的结果进行进一步处理。Ruler 是 Sensepost 安全团队编写的一个工具,它允许你通过 MAPI/HTTP 或 RPC/HTTP 协议与 Exchange 服务器交互。虽然我们主要讨论使用 Ruler 来进行密码破解/信息收集,但是这个工具也支持一些持久性漏洞利用攻击,我们将略微提及这点。

我们可以用的 Ruler 的第一个功能类似于 Spray,它通过对用户名和密码进行匹配来进行账号的破解。Ruler 将载入用户名列表和密码,并尝试查找登陆凭证。它将自动寻找 Exchange 服务器的关键配置并尝试查找登陆凭证。

运行 Ruler:

  1. ruler --domain cyberspacekittens.com brute --users ./users.txt --passwords ./passwords.txt

从外网寻找侵入对方系统的登陆凭证 - 图2

一旦我们找到了一个密码,我们就可以使用 Ruler 来获取 Office 365的全局地址列表(GAL)中的所有用户,以查找更多的电子邮件地址及其所属的电子邮件组。

从外网寻找侵入对方系统的登陆凭证 - 图3

我们继续将获取的这些电子邮件地址通过上面提及的那些密码破解工具来进行破解的尝试,从而获得更多的身份凭证——这就和滚雪球一样。不过,Ruler 的主要用途是,一旦你有了身份凭证,你就可以利用 Office/Outlook 的一些功能来在受害者的电子邮件帐户上创建规则和表单。这里有一篇来自 SensePost 安全团队的文章 outlook-forms-shells,介绍了他们是怎样利用这些功能来执行包含 Empire payload 的宏文件的。

如果你决定不使用 Outlook 表单,或者该功能已经被禁用,我们的思路还可以回到对电子邮件的攻击。这可能会让你感到有点邪恶,因为你将使用这些普通用户的账号登录并阅读他们的所有电子邮件。当我们兴奋的阅读某个用户的电子邮件时,我们会想要和某个他似乎有点信任(但又不算好朋友)的人进行对话。既然已经有了信任的基础,我们就可以利用这个机会给他发送恶意软件。通常,我们会篡改一次会话,在里面夹带附件(如 Office 文件/可执行文件),然后重新发给他们,不过这次附件包含了我们的恶意 payload。在受信任的内网连接和电子邮件之中传递恶意软件,成功掩护了我们的身份,并使这次行动获得成功。

本书始终强调的一点是,整个攻击行动的目的是为了测试蓝队的威胁检测工具和应急响应流程的效率。我们行动的目标非常明确,就是观察他们是否能够有所警觉。又或者像法医解剖那样,仔细复盘行动中发生的一切。对于本节的实验设计,我的想法是验证公司是否能够确定有人正在窃取用户们的电子邮件。所以,我们要做的是使用 Python 脚本来获取所有被破坏的电子邮件。在许多情况下,这可能是千兆字节的数据!

高级选修实验

一个很好的练习是:攻击不同类型的的身份验证服务并对其进行密码尝试。尝试构建一个密码喷洒(Password Spraying)工具,用于测试针对 XMPP 服务、常见第三方 SaaS 工具和其他常见协议的身份验证。最好是在多个 VPS 服务器中执行此操作,所有 VPS 服务器都由一个主服务器控制。