k8s简介一个容器编排系统,例如当一个微服务在容器中运行,此时流量增加,该容器无法处理所有请求,那么可以让另一个容器为这个微服务启动以平衡两者流量。
k8s负责处理该解决方案,在需要时编排这些容器分析
minikube start来启动k8s可以用
kubectl get pods -n wareville来验证集群是否正在运行
呃,重开了好几次都是这样子没加载好,以下只有文字
连接到
pod1
kubectl exec -n wareville naughty-or-nice -it -- /bin/bash
查看
apache2访问日志1
cat /var/log/apache2/access.log
在最后一条日志可以看到请求
shelly.php并且在
/home/ubuntu/dfir_artefacts找到存储的访问日志pod_apache2_access.log而由于
pod是使用端口转发配置的,因此看不到用于连接实例的实际ip,而重启集群后webshell仍然存在,即其存在于pod本身的实际映像中,所以去调查dockerdocker ps拿到注册表容器id1
docker exec c398ebdec346 ls -al /var/log
查看发现并没有日志,然而
docker本身会为我们保留日志:1
docker logs c398ebdec346
已经被存储到
/home/ubuntu/dfir_artefacts/docker-registry-logs.log搜索
HEAD并限制在第一页(即ip)来查看与注册表建立的所有不同链接:1
cat docker-registry-logs.log | grep "HEAD" | cut -d ' ' -f 1
可以看到大多数连接由预期ip:
172.17.0.1发起,但也有连接来自10.10.130.253
那么找到来自该
ip的所有请求1
cat docker-registry-logs.log | grep "10.10.130.253"
注意到前几个请求:

用户代理是
docker,即是通过dockerCLI发出的拉取镜像请求考虑到他们能拉取镜像,那么也可能允许他们推送新镜像,将搜索范围缩小为
PATCH,其用于格恩星注册表中的docker镜像1
cat docker-registry-logs.log | grep "10.10.130.253" | grep "PATCH"
可以看到对镜像进行了恶意更新
那么回到
k8s环境来看看是如何泄露的凭据检查角色绑定,再细看一下
1
2kubectl get rolebindings -n wareville
kubectl describe rolebinding mayor-user-binding -n wareville
看到有一个角色
mayor-user与用户mayor-malware绑定1
kubectl describe role mayor-user -n wareville
再检查下张哥用户活动的审计日志
1
cat audit.log | grep --color=always '"user":{"username":"mayor-malware"' | grep --color=always '"resource"' | grep --color=always '"verb"'
看到试图读
secret但被403了,
随后开始监视集群中存在哪些角色

随后找到一个
job-runner的角色,发现该角色有秘密读取权限
那么攻击者开始尝试找到其角色绑定:

找到
job-runner-binding,发现该角色绑定到job-runner-sa的服务账户
现在攻击者知道服务账户有其所需权限,并用
kubectl get pods来列出在Wareville命名空间中运行的所有pod
随后找到了一个
morality-checker的pod,其运行时附加了job-runner-sa账户。即如果能访问该pod则能够获得秘密读取权限
然后发现在
k8s中实施了过于宽松的访问控制,导致攻击者命令执行来拿到morality-checker的shell访问权限
可以检索从
job-runner-sa服务账户捕获的审计日志:1
cat audit.log | grep --color=always '"user":{"username":"system:serviceaccount:wareville:job-runner-sa"' | grep --color=always '"resource"' | grep --color=always '"verb"'
最后用:
1
kubectl get secret pull-creds -n wareville -o jsonpath='{.data.\.dockerconfigjson}' | base64 --decode
确认攻击路径
1 | What is the name of the webshell that was used by Mayor Malware? |