Wiz-K8S-LAN-PARTY题解及思考
Wiz K8S network挑战 TL;DR 此次挑战围绕Kubernetes网络服务展开,一共有5个题目。出题人在题目容器内提供了dnscan工具,dnscan能够针对给出的CIDR地址进行存活性探测,并根据IP地址反查其在集群中的域名地址。注意 ,每道题目都需要使用dnscan来确定本题开放的网络服务。 Challenge1 提示需要找到当前集群中存在的Web Service服务。在K8S集群中,Pod容器的「环境变量」包含了K8S的kube-apiserver通信地址,因此使用dnscan指定此类地址的B段扫描,能够得到集群存在的其他svc服务(如下图),在访问10.100.136.254的HTTP服务后拿到flag。 这里再拓展一点关于网格服务(Service Mesh)的「坑」,但和题目本身无关。当前题目环境所在的K8S集群使用istio作为Service Mesh,用来转发Pod出口、入口的网络流量。在做题过程中发现,在使用nmap对10.100.136.254容器进行端口扫描,单从结果上看,这个IP地址所在容器开放了TCP全端口。 这种错误的结果在Kubernetes Service Mesh场景很常见,也是信息收集过程中的坑点:TCP端口的假阳性。Kubernetes Internal Service Discovery这篇文章中,作者指出造成此现象的原因在与: 某些服务网格(例如 Istio)通过拦截某些 Pod 和服务的流量来工作,以提供功能更丰富的流量路由。在这种情况下,网格组件将为其配置范围内的所有有效端口和所有有效 IP 地址完成 TCP 三向握手,然后仅当存在到 pod 或服务的已配置服务网格路由时,才在后端转发连接。即使在关联的 IP 地址和/或端口上没有实际监听任何内容,这也会导致 TCP 端口看起来是打开的。当发生这种情况时,使用 TCP 握手来确定主机是否处于活动状态或端口是否打开的端口扫描程序将给出非常不准确的结果。在这些情况下,您只能依赖应用程序级别的响应返回,然后才能判断所谓的侦听 TCP 服务器是否确实背后有某些东西。 因此,通过「TCP握手」情况来判断端口状态,并不适用存在K8S Service Mesh的场景中,那么常见的nmap和fscan工具都是不可取的。作者实现了一个简易版本的端口扫描脚本:先建立TCP连接,使用socket发送捏造的TCP探针,根据是否有响应来判断端口的开放情况。当然这个脚本还是有点玩具性质,只对6379(redis)进行了处理而其他端口的探针一律捏造为HTTP请求。 Challenge2 依然使用dnscan发现svc地址:10.100.171.123 -> reporting-service.k8s-lan-party.svc.cluster.local. 同时,容器环境给了cap_net_admin,这允许我们通过tcpdump导出容器的虚拟网卡流量 题目描述告知,当前Pod容器启动时存在Sidecar,且让我们借助Sidecar获取敏感数据。 请求reporting-service后的HTTP结果如下图,表明当前集群使用istio-envoy作为sidecar istio-envoy是一个proxy层面的sidecar。istio envoy的架构参考如下图,简单理解就是envoy作为Pod Proxy,伴随每个Pod启动。Pod中容器的所有出、入口流量都会流经instio-envoy这个proxy sidecar。 当在题目环境中执行netstat -all查看通信情况时,发现当前容器和reporting-service服务建立了大量http连接,那这个reporting-service服务很可能就是容器用到的proxy sidecar。 分析容器和reporting-service通信的流量即可,使用tcpdump抓取发往reporting-service的所有流量后,在某个HTTP POST请求中找到flag值 Chall3 使用mount信息得知当前容器挂载了EFS文件系统,同时capsh信息依然保有cap_net_admin权限 fs-0779524599b7d5e7e.efs.us-west-1.amazonaws.com:/ on /efs type nfs4 (ro,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.23.121,local_lock=none,addr=192.168.124.98) 通过mount挂载的EFS文件目录中有flag.txt文件,但当前player用户不具备读权限 EFS全称为Amazon Elastic File System,是用来给AWS EC2提供弹性存储空间的,EFS基于NFSv4.1 和 NFSv4.
Read more...