diff --git a/.gitignore b/.gitignore
index 8d12fbb76..9e7a262f7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -34,3 +34,4 @@ Temporary Items
book
book/*
hacktricks-preprocessor.log
+hacktricks-preprocessor-error.log
diff --git a/hacktricks-preprocessor.py b/hacktricks-preprocessor.py
index 0077da80f..af5949449 100644
--- a/hacktricks-preprocessor.py
+++ b/hacktricks-preprocessor.py
@@ -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"""{title}"""
@@ -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
diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md
index 57e2d45ef..6019e9a10 100644
--- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md
+++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md
@@ -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`
diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md
index 6d5cebaf6..0ce1c38d4 100644
--- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md
+++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md
@@ -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 --resource-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 --resource-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 `/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 "/api/publish?type=zip" --data-binary "@./app.zip" -u ' [!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:
@@ -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:/:ref:refs/heads/`.
> [!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