渗透测试实战:巧用Google Dorks进行子域名枚举与漏洞挖掘

本文是一篇详细的漏洞赏金实战报告,作者分享了他如何通过细致侦察,利用Google高级搜索语法发现目标资产的隐藏子域名,进而识别并成功利用一个API端点漏洞,获取了本应受限的敏感信息,最终获得了1500美元赏金。

Akwaaba!前辈们。我将快速讲述我从一个项目获得的1500美元赏金的最新经历。在我深入之前,POST-based XSS(基于POST请求的跨站脚本攻击)仍然可以被利用来获得赏金。2000美元的Android内容提供程序(Content Provider)漏洞,而这与Burp Suite无关。

‼️ 免责声明:出于保密考虑,我已在这篇报告中更改了应用程序的具体细节。即使显示的截图也来自另一个类似的、没有漏洞赏金计划的应用程序——它们仅用于说明。此外,所有提到的API端点都已修改,以避免泄露实际的程序信息。

该项目

我最近收到了一个私人邀请,参与一个包含两个主要资产的项目:app.target.comapi.target.com。该项目提供了一套用于登录应用程序的凭证,注册功能被禁用。

根据我初步的检查,该平台似乎专注于文档和秘密信息管理。一个有趣的功能是能够创建团队并将其他用户添加到这些团队中。虽然我可以看到其他用户创建的团队名称,但无法看到诸如成员或权限等额外详细信息。

漏洞

经过一番深入的侦察,我发现了隐藏的功能,这些功能暴露了其他用户团队的敏感信息。这包括成员姓名、角色、电子邮件地址、UUID、特别备注,甚至私钥。

在探索应用程序时,我注意到一个功能,允许你创建一个秘密项目并与单个用户或整个团队分享。在这个过程中,应用程序会显示团队名称及其UUID,即使是你不属于的团队——这是预期的行为。在后台,应用程序会调用以下API端点来仅获取团队名称:

1
2
3
GET /api/v1/<workspace-UUID>/teams
Host: api.target.com
Authorization: Bearer ey...

当然,遵循REST框架的标准,我们可以尝试通过附加它们的UUID或将其作为参数来检索特定团队的信息。在这种情况下,将其附加在路径中是有效的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
====Request====
GET /api/v1/<workspace-UUID>/teams/<team-UUID>
Host: api.target.com
Authorization: Bearer ey...

====Response====
HTTP 200 OK
Server: Apache
{
  "status": "success",
  "data": {
    "teams": [
      {
        "name": "First Team",
        "uuid": "a3f9c2e4-7b8d-4d1a-9f2e-1c3b5a6d8e9f"
      },
      {
        "name": "Another User's Team"
        "uuid": "b7d4e8f1-2c3a-4e9b-8d7f-5a6c9b3e2f1d"
      },
      {
        "name": "Internal Team",
        "uuid": "c9e1f3a7-6d8b-4f2c-9a1e-3b5d7e8f2c4a"
      }
    ]
  }
}

在尝试对团队UUID之后的部分进行模糊测试以发现更多端点后,我的任何字典都没有返回有用的结果。由于主应用程序上的注册功能被禁用,我将重点转向查看是否存在UAT、Staging、Test或Demo环境。这些环境通常启用了注册功能,并且可以提供额外的攻击面。

侦察以识别相关资产

我不喜欢进行子域名模糊测试;我在这方面很不在行。因此,我更喜欢被动地手动枚举它们。我的第一步是使用Shodan通过共享的SSL证书来查找相关域名(我在之前的OTP泄漏文章中解释过这种技术)。不幸的是,这没有返回任何有用的信息。接下来,我转向了Google dorks(Google高级搜索语法)。用于查找任何站点的子域名的最简单dork是:

1
site:"*.target.com"

但多年来,我注意到Google dorks一些有趣的地方。不久前,我尝试在查询中添加多个星号(),结果Google返回了当我只使用单个时没有显示的域名。

例如,使用这样的dork:

1
site:*.*.target.com

给了我新的结果,包括更深层次的子域名,例如:

1
2
internal.help.target.com
dev.partner.target.com

你可以继续添加更多的星号来发现更多嵌套的子域名(子子域名)。这是一个简单的技巧,通常能揭示基础枚举遗漏的资产。

1
site:"*.*.target.com"

由于我的目标是发现STAGING、UAT、TEST、PREPROD或DEV环境,我改进了我的Google dorks来定位这些关键词。这些环境通常具有较弱的安全控制,甚至可能允许注册,这使得它们对于进一步测试很有价值。

1
2
3
4
5
6
7
8
site:"*stg*.target.com"
site:"*-stg.target.*"
site:"*stg-*.target.com"
site:"*uat*.target.*"
site:"*.dev*.target.*"
site:"preprod.*.target.*"
site:"*.target.*" inurl:"staging"
site:"*.target.*" inurl:"uat"

(你可以尝试使用uat、stg、stage、dev、test等词来组合你自己的搜索语法。)

在优化我的dorks时,我偶然发现了两个staging子域名。其中一个结果是一个React应用的管理员staging环境,它看起来几乎与我正在测试的主要目标应用程序完全相同。关键区别?这个staging版本有一个“注册”按钮,而生产应用不允许注册。

管理员Staging环境揭示更多信息

我迅速在管理员staging界面上注册了账户。大部分功能都是坏的,应用程序中包含测试数据,比如虚拟团队和用户。尽管如此,我注意到一些有趣的事情:管理员有能力管理工作区中的所有团队。

当你选择一个特定的团队时,应用程序会发起三个API请求来获取该团队的详细信息:

1
2
3
/api/v1/<workspace-UUID>/teams/<team-UUID>/
/api/v1/<workspace-UUID>/teams/<team-UUID>/cyqxqz-test/members
/api/v1/<workspace-UUID>/teams/<team-UUID>/cyqxqz-test/secrets

漏洞利用

我简单地在目标应用程序中重放了这些API端点,但失败了。因此,我决定从端点中移除测试部分,然后成功了,我能够检索到团队成员列表(其中包含详细的用户信息),以及加密的密文形式的secrets。

1
2
/api/v1/<workspace-UUID>/teams/<team-UUID>/cyqxqz/members
/api/v1/<workspace-UUID>/teams/<team-UUID>/cyqxqz/secrets

影响与支付

由于该平台设计用于共享文档和秘密,除非明确标记为公开,否则其他用户的任何信息或活动都应保密。这个漏洞使我能够通过一个本应只限于管理员的API端点访问敏感数据。

那么,我负责任地报告了这个问题,并因此获得了1500美元的赏金。

嘿嘿……再见。 Marsh先生

感谢阅读,如果您有任何问题,可以在X(原Twitter)上通过@tinopreter私信我。在LinkedIn上与我联系:Clement Osei-Somuah。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计