k8s
简介一个容器编排系统,例如当一个微服务在容器中运行,此时流量增加,该容器无法处理所有请求,那么可以让另一个容器为这个微服务启动以平衡两者流量。
k8s
负责处理该解决方案,在需要时编排这些容器分析
minikube start
来启动k8s
可以用
kubectl get pods -n wareville
来验证集群是否正在运行呃,重开了好几次都是这样子没加载好,以下只有文字
连接到
pod
1
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
本身的实际映像中,所以去调查docker
docker ps
拿到注册表容器id
1
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? |