diff --git a/book.toml b/book.toml index e3330d5e6..f20e2d2a2 100644 --- a/book.toml +++ b/book.toml @@ -22,6 +22,7 @@ after = ["links"] [preprocessor.hacktricks] command = "python3 ./hacktricks-preprocessor.py" +env = "prod" [output.html] additional-css = ["theme/pagetoc.css", "theme/tabs.css"] diff --git a/hacktricks-preprocessor.py b/hacktricks-preprocessor.py index 37f549101..8e67ab77b 100644 --- a/hacktricks-preprocessor.py +++ b/hacktricks-preprocessor.py @@ -30,14 +30,16 @@ def ref(matchobj): href = matchobj.groups(0)[0].strip() title = href if href.startswith("http://") or href.startswith("https://"): - # pass - try: - raw_html = str(urlopen(Request(href, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0'})).read()) - match = re.search('(.*?)', raw_html) - title = match.group(1) if match else href - except Exception as e: - logger.debug(f'Error opening URL {href}: {e}') - pass #nDont stop on broken link + if context['config']['preprocessor']['hacktricks']['env'] == 'dev': + pass + else: + try: + raw_html = str(urlopen(Request(href, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0'})).read()) + match = re.search('(.*?)', raw_html) + title = match.group(1) if match else href + except Exception as e: + logger.debug(f'Error opening URL {href}: {e}') + pass #nDont stop on broken link else: try: if href.endswith("/"): diff --git a/src/pentesting-cloud/kubernetes-security/kubernetes-pivoting-to-clouds.md b/src/pentesting-cloud/kubernetes-security/kubernetes-pivoting-to-clouds.md index 35ded2cad..765bfcbc4 100644 --- a/src/pentesting-cloud/kubernetes-security/kubernetes-pivoting-to-clouds.md +++ b/src/pentesting-cloud/kubernetes-security/kubernetes-pivoting-to-clouds.md @@ -17,7 +17,7 @@ Une façon courante de donner **accès à une application kubernetes à GCP** es - Définir la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS pointant vers le chemin où se trouve le json. > [!WARNING] -> Par conséquent, en tant qu'**attaquant**, si vous compromettez un conteneur à l'intérieur d'un pod, vous devez vérifier cette **var** **env** et les **fichiers** **json** avec les identifiants GCP. +> Par conséquent, en tant qu'**attaquant**, si vous compromettez un conteneur à l'intérieur d'un pod, vous devez vérifier cette **variable** **env** et les **fichiers** **json** avec les identifiants GCP. ### Lier le json GSA au secret KSA @@ -46,7 +46,7 @@ iam.gke.io/gcp-service-account= Avec l'Identité de Charge de Travail, nous pouvons configurer un [compte de service Kubernetes](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/) pour agir en tant que [compte de service Google](https://cloud.google.com/iam/docs/understanding-service-accounts). Les pods s'exécutant avec le compte de service Kubernetes s'authentifieront automatiquement en tant que compte de service Google lors de l'accès aux API Google Cloud. -La **première série d'étapes** pour activer ce comportement est de **définir l'Identité de Charge de Travail dans GCP** ([**étapes**](https://medium.com/zeotap-customer-intelligence-unleashed/gke-workload-identity-a-secure-way-for-gke-applications-to-access-gcp-services-f880f4e74e8c)) et de créer le SA GCP que vous souhaitez que k8s imite. +La **première série d'étapes** pour activer ce comportement est d'**activer l'Identité de Charge de Travail dans GCP** ([**étapes**](https://medium.com/zeotap-customer-intelligence-unleashed/gke-workload-identity-a-secure-way-for-gke-applications-to-access-gcp-services-f880f4e74e8c)) et de créer le SA GCP que vous souhaitez que k8s imite. - **Activer l'Identité de Charge de Travail** sur un nouveau cluster ```bash @@ -141,7 +141,7 @@ done | grep -B 1 "gcp-service-account" ### Kiam & Kube2IAM (rôle IAM pour les Pods) -Une manière (dépassée) de donner des rôles IAM aux Pods est d'utiliser un [**Kiam**](https://github.com/uswitch/kiam) ou un [**Kube2IAM**](https://github.com/jtblin/kube2iam) **serveur.** Fondamentalement, vous devrez exécuter un **daemonset** dans votre cluster avec un **type de rôle IAM privilégié**. Ce daemonset sera celui qui donnera accès aux rôles IAM aux pods qui en ont besoin. +Une manière (dépassée) de donner des rôles IAM aux Pods est d'utiliser un [**Kiam**](https://github.com/uswitch/kiam) ou un [**Kube2IAM**](https://github.com/jtblin/kube2iam) **serveur.** En gros, vous devrez exécuter un **daemonset** dans votre cluster avec une **sorte de rôle IAM privilégié**. Ce daemonset sera celui qui donnera accès aux rôles IAM aux pods qui en ont besoin. Tout d'abord, vous devez configurer **quels rôles peuvent être accessibles à l'intérieur de l'espace de noms**, et vous le faites avec une annotation à l'intérieur de l'objet d'espace de noms : ```yaml:Kiam @@ -234,9 +234,9 @@ aws sts assume-role-with-web-identity --role-arn arn:aws:iam::123456789098:role/ ../aws-security/aws-basic-information/aws-federation-abuse.md {{#endref}} -### Trouver des Pods et des SAs avec des Rôles IAM dans le Cluster +### Trouver des Pods et des Comptes de Service avec des Rôles IAM dans le Cluster -Ceci est un script pour facilement **itérer sur tous les pods et définitions de sas** **cherchant** cette **annotation** : +Ceci est un script pour facilement **itérer sur tous les pods et définitions de comptes de service** **cherchant** cette **annotation** : ```bash for ns in `kubectl get namespaces -o custom-columns=NAME:.metadata.name | grep -v NAME`; do for pod in `kubectl get pods -n "$ns" -o custom-columns=NAME:.metadata.name | grep -v NAME`; do @@ -255,15 +255,15 @@ done | grep -B 1 "amazonaws.com" ``` ### Rôle IAM du nœud -La section précédente portait sur la manière de voler des rôles IAM avec des pods, mais notez qu'un **nœud du** cluster K8s va être une **instance dans le cloud**. Cela signifie que le nœud est très probablement **susceptible d'avoir un nouveau rôle IAM que vous pouvez voler** (_notez que généralement tous les nœuds d'un cluster K8s auront le même rôle IAM, donc cela peut ne pas valoir la peine d'essayer de vérifier chaque nœud_). +La section précédente portait sur la manière de voler des rôles IAM avec des pods, mais notez qu'un **nœud du** cluster K8s va être une **instance à l'intérieur du cloud**. Cela signifie que le nœud a de fortes chances d'**avoir un nouveau rôle IAM que vous pouvez voler** (_notez que généralement tous les nœuds d'un cluster K8s auront le même rôle IAM, donc cela peut ne pas valoir la peine d'essayer de vérifier chaque nœud_). -Cependant, il y a une exigence importante pour accéder au point de terminaison des métadonnées depuis le nœud, vous devez être dans le nœud (session ssh ?) ou au moins avoir le même réseau : +Il y a cependant une exigence importante pour accéder au point de terminaison des métadonnées depuis le nœud, vous devez être dans le nœud (session ssh ?) ou au moins avoir le même réseau : ```bash kubectl run NodeIAMStealer --restart=Never -ti --rm --image lol --overrides '{"spec":{"hostNetwork": true, "containers":[{"name":"1","image":"alpine","stdin": true,"tty":true,"imagePullPolicy":"IfNotPresent"}]}}' ``` ### Voler le jeton de rôle IAM -Auparavant, nous avons discuté de la manière de **lier des rôles IAM aux Pods** ou même de **s'échapper vers le nœud pour voler le rôle IAM** auquel l'instance est attachée. +Auparavant, nous avons discuté de la façon de **lier des rôles IAM aux Pods** ou même de **s'échapper vers le nœud pour voler le rôle IAM** que l'instance a attaché à elle. Vous pouvez utiliser le script suivant pour **voler** vos nouvelles **informations d'identification de rôle IAM** durement acquises : ```bash diff --git a/theme/book.js b/theme/book.js index 1c8d77287..b11674b5a 100644 --- a/theme/book.js +++ b/theme/book.js @@ -590,6 +590,62 @@ function playground_text(playground, hidden = true) { }); })(); + + +(function menubarLanguage() { + var menubarLanguageToggleButton = document.getElementById('menubar-languages-toggle'); + var menubarLanguagePopup = document.getElementById('menubar-languages-popup'); + var languageButtons = menubarLanguagePopup.querySelectorAll('.menu-bar-link'); + + function showLanguage() { + menubarLanguagePopup.style.display = 'flex'; + menubarLanguageToggleButton.setAttribute('aria-expanded', true); + } + + function hideLanguage() { + menubarLanguagePopup.style.display = 'none'; + menubarLanguageToggleButton.setAttribute('aria-expanded', false); + menubarLanguageToggleButton.focus(); + } + + menubarLanguageToggleButton.addEventListener('click', function () { + if (menubarLanguagePopup.style.display === 'flex') { + hideLanguage(); + } else { + showLanguage(); + } + }); + + menubarLanguagePopup.addEventListener('focusout', function(e) { + // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below) + if (!!e.relatedTarget && !menubarLanguageToggleButton.contains(e.relatedTarget) && !menubarLanguagePopup.contains(e.relatedTarget)) { + hideLanguage(); + } + }); + + // Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang/mdBook/issues/628 + document.addEventListener('click', function(e) { + if (menubarLanguagePopup.style.display === 'block' && !menubarLanguageToggleButton.contains(e.target) && !menubarLanguagePopup.contains(e.target)) { + hideLanguage(); + } + }); + + languageButtons.forEach((btn) => { + btn.addEventListener('click', function(e) { + const regex = /(?:(?:\/)+(?[a-z]{2}(?=\/|$)))?(?(?:\/)*.*)?/g + var match = regex.exec(window.location.pathname) + + var path = match.groups.path + console.log(`Path: ${path} ${typeof path}`) + + const lang = match.groups.lang + console.log(`Lang: ${lang}`) + + window.location = `/${e.target.id}${path}${window.location.hash}` + }); + }) +})(); + (function chapterNavigation() { document.addEventListener('keydown', function (e) { if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } diff --git a/theme/css/chrome.css b/theme/css/chrome.css index 8cbda7c69..17e541163 100644 --- a/theme/css/chrome.css +++ b/theme/css/chrome.css @@ -83,6 +83,13 @@ body.sidebar-visible #menu-bar { } } +.right-buttons .icons { + display: flex; + flex-direction: row; + flex-wrap: wrap; + column-gap: 0.5rem; +} + .icon-button { border: none; background: var(--bg); @@ -138,11 +145,13 @@ body.sidebar-visible #menu-bar { } /* Collapse Menu Popup */ - +#menubar-collapse-toggle { + position: relative; +} #menubar-collapse-popup { position: absolute; - right: 30px; - top: var(--menu-bar-height); + right: 0px; + top: 35px; z-index: 105; border-radius: 5px; font-size: 14px; @@ -172,6 +181,44 @@ body.sidebar-visible #menu-bar { background-color: var(--theme-hover); } +/* Languages Menu Popup */ +#menubar-languages-toggle { + position: relative; +} + +#menubar-languages-popup { + position: absolute; + right: 0px; + top: 35px; + z-index: 105; + border-radius: 5px; + font-size: 14px; + color: var(--fg); + background: var(--bg); + border: 1px solid var(--table-border-color); + margin: 0; + padding: 0px; + display: none; + flex-direction: column; + max-height: 300px; + width: 150px; + overflow: scroll; +} +#menubar-languages-popup .menu-bar-link { + border: 0; + margin: 0; + padding: 8px 20px; + line-height: 25px; + white-space: nowrap; + text-align: start; + cursor: pointer; + color: inherit; + background: inherit; + font-size: inherit; +} +#menubar-languages-popup .menu-bar-link:hover { + background-color: var(--theme-hover); +} .left-buttons { display: flex; diff --git a/theme/index.hbs b/theme/index.hbs index 049bc3ea7..419bb6e7a 100644 --- a/theme/index.hbs +++ b/theme/index.hbs @@ -144,34 +144,60 @@