Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/

This commit is contained in:
Translator
2025-01-06 17:12:11 +00:00
parent a5d87e1ac5
commit 23a88b05e4
5 changed files with 49 additions and 32 deletions

1
.gitignore vendored
View File

@@ -34,3 +34,4 @@ Temporary Items
book
book/*
hacktricks-preprocessor.log
hacktricks-preprocessor-error.log

View File

@@ -7,7 +7,14 @@ from os import path
from urllib.request import urlopen, Request
logger = logging.getLogger(__name__)
logging.basicConfig(filename='hacktricks-preprocessor.log', filemode='w', encoding='utf-8', level=logging.DEBUG)
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler(filename='hacktricks-preprocessor.log', mode='w', encoding='utf-8')
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
handler2 = logging.FileHandler(filename='hacktricks-preprocessor-error.log', mode='w', encoding='utf-8')
handler2.setLevel(logging.ERROR)
logger.addHandler(handler2)
def findtitle(search ,obj, key, path=(),):
@@ -45,19 +52,29 @@ def ref(matchobj):
try:
if href.endswith("/"):
href = href+"README.md" # Fix if ref points to a folder
chapter, _path = findtitle(href, book, "source_path")
logger.debug(f'Recursive title search result: {chapter["name"]}')
title = chapter['name']
if "#" in href:
chapter, _path = findtitle(href.split("#")[0], book, "source_path")
title = " ".join(href.split("#")[1].split("-")).title()
logger.debug(f'Ref has # using title: {title}')
else:
chapter, _path = findtitle(href, book, "source_path")
logger.debug(f'Recursive title search result: {chapter["name"]}')
title = chapter['name']
except Exception as e:
try:
dir = path.dirname(current_chapter['source_path'])
logger.debug(f'Error getting chapter title: {href} trying with relative path {path.normpath(path.join(dir,href))}')
chapter, _path = findtitle(path.normpath(path.join(dir,href)), book, "source_path")
logger.debug(f'Recursive title search result: {chapter["name"]}')
title = chapter['name']
if "#" in href:
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
title = " ".join(href.split("#")[1].split("-")).title()
logger.debug(f'Ref has # using title: {title}')
else:
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
title = chapter["name"]
logger.debug(f'Recursive title search result: {chapter["name"]}')
except Exception as e:
logger.debug(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
print(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
logger.debug(e)
logger.error(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
sys.exit(1)
@@ -85,13 +102,11 @@ def files(matchobj):
except Exception as e:
logger.debug(e)
logger.debug(f'Error searching file: {href}')
print(f'Error searching file: {href}')
logger.error(f'Error searching file: {href}')
sys.exit(1)
if title=="":
logger.debug(f'Error searching file: {href}')
print(f'Error searching file: {href}')
logger.error(f'Error searching file: {href}')
sys.exit(1)
template = f"""<a class="content_ref" href="/files/{href}"><span class="content_ref_label">{title}</span></a>"""
@@ -134,10 +149,11 @@ if __name__ == '__main__':
for chapter in iterate_chapters(book['sections']):
logger.debug(f"Chapter: {chapter['path']}")
current_chapter = chapter
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
# regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n#]*(?:#(.*))?)(?:\n)?{{[\s]*#endref[\s]*}}'
new_content = re.sub(regex, ref, chapter['content'])
regex = r'{{[\s]*#file[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endfile[\s]*}}'
new_content = re.sub(regex, files, chapter['content'])
new_content = re.sub(regex, files, new_content)
new_content = add_read_time(new_content)
chapter['content'] = new_content

View File

@@ -60,7 +60,7 @@ Portanto, se você tiver as permissões listadas sobre esses arquivos, há um ve
Siga a descrição na seção *Abusing Terraform State Files* da página *Terraform Security* para código de exploit diretamente utilizável:
{{#ref}}
terraform-security.md#abusing-terraform-state-files
pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files
{{#endref}}
### `s3:PutBucketPolicy`

View File

@@ -7,7 +7,7 @@
Para mais informações sobre os serviços de aplicativo do Azure, consulte:
{{#ref}}
../az-services/az-app-service.md
../az-services/az-app-services.md
{{#endref}}
### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read
@@ -19,7 +19,7 @@ Essas permissões permitem obter um **SSH shell** dentro de um aplicativo web. E
# Direct option
az webapp ssh --name <name> --resource-group <res-group>
```
- **Criar túnel e então conectar ao SSH**:
- **Criar túnel e depois conectar ao SSH**:
```bash
az webapp create-remote-connection --name <name> --resource-group <res-group>
@@ -129,7 +129,7 @@ Então, você pode usar essas credenciais para **acessar as plataformas SCM e FT
Lembre-se de que para acessar a plataforma SCM pela **web, você precisa acessar `<SCM-URL>/BasicAuth`**.
> [!WARNING]
> Note que cada usuário pode configurar suas próprias credenciais chamando o comando anterior, mas se o usuário não tiver permissões suficientes para acessar o SCM ou FTP, as credenciais não funcionarão.
> Note que todo usuário pode configurar suas próprias credenciais chamando o comando anterior, mas se o usuário não tiver permissões suficientes para acessar o SCM ou FTP, as credenciais não funcionarão.
- Se você ver que essas credenciais estão **REDACTED**, é porque você **precisa habilitar a opção de autenticação básica do SCM** e para isso você precisa da segunda permissão (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`):
```bash
@@ -163,7 +163,7 @@ curl -X POST "<SMC-URL>/api/publish?type=zip" --data-binary "@./app.zip" -u '<us
```
### Webjobs: Microsoft.Web/sites/publish/Action | Credenciais do SCM
A permissão do Azure mencionada permite realizar várias ações interessantes que também podem ser executadas com as credenciais do SCM:
A permissão do Azure mencionada permite realizar várias ações interessantes que também podem ser realizadas com as credenciais do SCM:
- Ler logs de **Webjobs**:
```bash

View File

@@ -12,10 +12,10 @@
### Planos Diferentes
- **Flex Consumption Plan**: Oferece **escalonamento dinâmico e orientado a eventos** com preços pay-as-you-go, adicionando ou removendo instâncias de função com base na demanda. Suporta **rede virtual** e **instâncias pré-provisionadas** para reduzir inícios a frio, tornando-o adequado para **cargas de trabalho variáveis** que não requerem suporte a contêineres.
- **Traditional Consumption Plan**: A opção sem servidor padrão, onde você **paga apenas pelos recursos de computação quando as funções são executadas**. Ele escala automaticamente com base nos eventos recebidos e inclui **otimizações de início a frio**, mas não suporta implantações de contêiner. Ideal para **cargas de trabalho intermitentes** que requerem escalonamento automático.
- **Traditional Consumption Plan**: A opção sem servidor padrão, onde você **paga apenas pelos recursos de computação quando as funções são executadas**. Escala automaticamente com base em eventos recebidos e inclui **otimizações de início a frio**, mas não suporta implantações de contêiner. Ideal para **cargas de trabalho intermitentes** que requerem escalonamento automático.
- **Premium Plan**: Projetado para **desempenho consistente**, com **trabalhadores pré-aquecidos** para eliminar inícios a frio. Oferece **tempos de execução estendidos, rede virtual** e suporta **imagens personalizadas do Linux**, tornando-o perfeito para **aplicações críticas** que necessitam de alto desempenho e recursos avançados.
- **Dedicated Plan**: Executa em máquinas virtuais dedicadas com **faturamento previsível** e suporta escalonamento manual ou automático. Permite executar várias apps no mesmo plano, fornece **isolamento de computação** e garante **acesso seguro à rede** via App Service Environments, tornando-o ideal para **aplicações de longa duração** que necessitam de alocação consistente de recursos.
- **Container Apps**: Permite implantar **function apps containerizadas** em um ambiente gerenciado, ao lado de microsserviços e APIs. Suporta bibliotecas personalizadas, migração de aplicativos legados e **processamento GPU**, eliminando a necessidade de gerenciamento de clusters Kubernetes. Ideal para **aplicações escaláveis e orientadas a eventos**.
- **Container Apps**: Permite implantar **function apps containerizadas** em um ambiente gerenciado, juntamente com microsserviços e APIs. Suporta bibliotecas personalizadas, migração de aplicativos legados e **processamento GPU**, eliminando a necessidade de gerenciamento de clusters Kubernetes. Ideal para **aplicações escaláveis e orientadas a eventos**.
### **Buckets de Armazenamento**
@@ -48,7 +48,7 @@ Usando um gatilho HTTP:
Essas variáveis de ambiente ou parâmetros de configuração também controlam como a Função executa o código, por exemplo, se **`WEBSITE_RUN_FROM_PACKAGE`** existir, isso indicará a URL onde o código da aplicação está localizado.
### **Sandbox da Função**
### **Function Sandbox**
Dentro do sandbox linux, o código-fonte está localizado em **`/home/site/wwwroot`** no arquivo **`function_app.py`** (se python for usado) o usuário que executa o código é **`app`** (sem permissões sudo).
@@ -56,16 +56,16 @@ Em uma função **Windows** usando NodeJS, o código estava localizado em **`C:\
### **Identidades Gerenciadas & Metadados**
Assim como [**VMs**](vms/), Functions podem ter **Identidades Gerenciadas** de 2 tipos: Atribuídas pelo sistema e Atribuídas pelo usuário.
Assim como [**VMs**](vms/index.html), Functions podem ter **Identidades Gerenciadas** de 2 tipos: Atribuídas pelo sistema e Atribuídas pelo usuário.
A **atribuição pelo sistema** será uma identidade gerenciada que **apenas a função** que a possui atribuída poderá usar, enquanto as **identidades gerenciadas atribuídas pelo usuário** são identidades gerenciadas que **qualquer outro serviço Azure poderá usar**.
A **atribuição pelo sistema** será uma identidade gerenciada que **apenas a função** que a possui atribuída poderá usar, enquanto as identidades gerenciadas **atribuidas pelo usuário** são identidades gerenciadas que **qualquer outro serviço Azure poderá usar**.
> [!NOTE]
> Assim como em [**VMs**](vms/), Functions podem ter **1 identidade gerenciada atribuída pelo sistema** e **várias atribuídas pelo usuário**, portanto, é sempre importante tentar encontrar todas elas se você comprometer a função, pois pode ser capaz de elevar privilégios para várias identidades gerenciadas a partir de apenas uma Função.
> Assim como em [**VMs**](vms/index.html), Functions podem ter **1 identidade gerenciada atribuída pelo sistema** e **várias atribuídas pelo usuário**, portanto, é sempre importante tentar encontrar todas elas se você comprometer a função, pois você pode ser capaz de elevar privilégios para várias identidades gerenciadas a partir de apenas uma Função.
>
> Se uma identidade gerenciada pelo sistema não for usada, mas uma ou mais identidades gerenciadas pelo usuário estiverem anexadas a uma função, por padrão você não poderá obter nenhum token.
É possível usar os [**scripts PEASS**](https://github.com/peass-ng/PEASS-ng) para obter tokens da identidade gerenciada padrão a partir do endpoint de metadados. Ou você pode obtê-los **manualmente** conforme explicado em:
É possível usar os [**scripts PEASS**](https://github.com/peass-ng/PEASS-ng) para obter tokens da identidade gerenciada padrão a partir do endpoint de metadados. Ou você pode obtê-los **manualmente** como explicado em:
{% embed url="https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#azure-vm" %}
@@ -79,8 +79,8 @@ Note que você precisa descobrir uma maneira de **verificar todas as Identidades
Ao criar um endpoint dentro de uma função usando um **gatilho HTTP**, é possível indicar o **nível de autorização da chave de acesso** necessário para acionar a função. Três opções estão disponíveis:
- **ANONYMOUS**: **Todos** podem acessar a função pela URL.
- **FUNCTION**: O endpoint é acessível apenas a usuários usando uma **chave de função, host ou mestre**.
- **ADMIN**: O endpoint é acessível apenas a usuários com uma **chave mestre**.
- **FUNCTION**: O endpoint é acessível apenas para usuários usando uma **chave de função, host ou mestre**.
- **ADMIN**: O endpoint é acessível apenas para usuários com uma **chave mestre**.
**Tipo de chaves:**
@@ -99,12 +99,12 @@ Ao criar um endpoint dentro de uma função usando um **gatilho HTTP**, é poss
Assim como nos App Services, Functions também suportam autenticação básica para conectar ao **SCM** e **FTP** para implantar código usando um **nome de usuário e senha em uma URL** fornecida pelo Azure. Mais informações sobre isso em:
{{#ref}}
az-app-service.md
az-app-services.md
{{#endref}}
### Implantações Baseadas em Github
Quando uma função é gerada a partir de um repositório Github, o console da web do Azure permite **criar automaticamente um Workflow do Github em um repositório específico**, de modo que sempre que este repositório for atualizado, o código da função seja atualizado. Na verdade, o yaml da ação do Github para uma função python se parece com isso:
Quando uma função é gerada a partir de um repositório Github, o console web do Azure permite **criar automaticamente um Workflow do Github em um repositório específico**, de modo que sempre que este repositório for atualizado, o código da função seja atualizado. Na verdade, o yaml da Ação do Github para uma função em python se parece com isso:
<details>
@@ -195,7 +195,7 @@ package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
Além disso, uma **Identidade Gerenciada** também é criada para que a Ação do Github do repositório possa fazer login no Azure com ela. Isso é feito gerando uma credencial Federada sobre a **Identidade Gerenciada**, permitindo o **Emissor** `https://token.actions.githubusercontent.com` e o **Identificador do Sujeito** `repo:<org-name>/<repo-name>:ref:refs/heads/<branch-name>`.
> [!CAUTION]
> Portanto, qualquer pessoa que comprometer esse repositório poderá comprometer a função e as Identidades Gerenciadas associadas a ela.
> Portanto, qualquer pessoa que comprometer esse repositório poderá comprometer a função e as Identidades Gerenciadas anexadas a ela.
### Implantações Baseadas em Contêiner