

利用容器逃逸实现远程登录k8s集群节点
source link: http://www.cnblogs.com/liguobao/p/14311155.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

某天,
某鱼说要吃瞄,
于是......
李国宝:边缘计算k8s集群SuperEdge初体验
zhuanlan.zhihu.com
图标
照着上一篇文章来说,我这边边缘计算集群有一堆节点。
每个节点都在不同的网络环境下。
他们的共同点都是可以访问内网,
部分是某云学生主机,
部分是跑在家庭网络环境下的虚拟机,
甚至假设中还有一些是树莓派之类的机器。
所以他们另一个共同点是,基本都没有公网IP。
这样一来,我要实现远程登录到某些节点搞事的时候,
只有内网穿透这一条路子了。
使用frp进行内网穿透 - 少数派
sspai.com
图标
https://github.com/fatedier/frp
github.com
内网穿透倒没什么,在公司使用这货长期跑了两年垮大洋穿透也很稳定。
只是...
只是...
只是...
要一台台机器配置一次,要维护一个稳定的公网服务器作为桥接。
就是...麻烦了点。
然后想了下。
当前的kube superedge边缘计算集群本身就实现了4层和7层的内网穿透,
理论上直接使用它的能力也可以做到远程登录的。
于是开始研究了一下怎么实现在只有kubectl环境的机器上,
直接登录k8s容器集群的node节点。
搜了一波之后首先发现的是这个项目。
A kubectl plugin to SSH into Kubernetes nodes using a SSH jump host Pod
github.com
看描述和需求来说,完全符合我的要求。
$ kubectl krew install ssh-jump
照着教程配置好插件,装好环境之后实践了一下。
....
一切都好,就是连不上去。
蛋疼了...
接着又找了一波,发现了一个Redhat老哥的博客。
A consistent, provider-agnostic way to SSH into any Kubernetes node
完美。
我想要的就是这个。
看了下插件代码。luksa/kubectl-plugins看了下插件代码。
https://github.com/luksa/kubectl-plugins/blob/master/kubectl-ssh
github.com
#!/usr/bin/env bash set -e ssh_node() { node=$1 if [ "$node" = "" ]; then node=$(kubectl get node -o name | sed 's/node\///' | tr '\n' ' ') node=${node::-1} if [[ "$node" =~ " " ]]; then echo "Node name must be specified. Choose one of: [$node]" exit 1 else echo "Single-node cluster detected. Defaulting to node $node" fi fi pod=$( kubectl create -o name -f - <<EOF apiVersion: v1 kind: Pod metadata: generateName: ssh-node- labels: plugin: ssh-node spec: nodeName: $node containers: - name: ssh-node image: busybox imagePullPolicy: IfNotPresent command: ["chroot", "/host"] tty: true stdin: true stdinOnce: true securityContext: privileged: true volumeMounts: - name: host mountPath: /host volumes: - name: host hostPath: path: / hostNetwork: true hostIPC: true hostPID: true restartPolicy: Never EOF ) deletePod() { kubectl delete $pod --wait=false } trap deletePod EXIT echo "Created $pod" echo "Waiting for container to start..." kubectl wait --for=condition=Ready $pod >/dev/null kubectl attach -it $pod -c ssh-node } ssh_pod() { # TODO: improve this if [ "$1" == "" ]; then echo "Pod name must be specified." exit 1 fi kubectl exec -it "$@" bash || ( echo "Running bash in pod failed; trying with sh" kubectl exec -it "$@" sh ) } print_usage() { echo "Provider-agnostic way of opening a remote shell to a Kubernetes node." echo echo "Enables you to access a node even when it doesn't run an SSH server or" echo "when you don't have the required credentials. Also, the way you log in" echo "is always the same, regardless of what provides the Kubernetes cluster" echo "(e.g. Minikube, Kind, Docker Desktop, GKE, AKS, EKS, ...)" echo echo "You must have cluster-admin rights to use this plugin." echo echo "The primary focus of this plugin is to provide access to nodes, but it" echo "also provides a quick way of running a shell inside a pod." echo echo "Examples: " echo " # Open a shell to node of a single-node cluster (e.g. Docker Desktop)" echo " kubectl ssh node" echo echo " # Open a shell to node of a multi-node cluster (e.g. GKE)" echo " kubectl ssh node my-worker-node-1" echo echo " # Open a shell to a pod" echo " kubectl ssh pod my-pod" echo echo "Usage:" echo " kubectl ssh node [nodeName]" echo " kubectl ssh pod [podName] [-n namespace] [-c container]" exit 0 } if [ "$1" == "--help" ]; then print_usage fi if [[ "$1" == node/* ]]; then ssh_node ${1:5} elif [ "$1" == "node" ]; then ssh_node $2 elif [[ "$1" == pod/* ]]; then ssh_pod "$@" elif [ "$1" == "pod" ]; then shift ssh_pod "$@" else print_usage fi
认真看了一下这个脚本。
直呼人才啊。
果然是玩Linux的老哥啊。
牛逼啊。
太牛逼了。
太有趣了。
额。
讲人话。
这个脚本使用busybox镜像启动了容器实例,
通过chroot到 /host + 把宿主机所有文件挂在到容器实例的方式,
实现了在容器实例直接对宿主机系统一对一“Copy”(可能表达不太准确),
进而实现直接在这个容器实例中操作宿主机的所有资源。
是的,所有资源。
是的,所有资源。
是的,所有资源。
着这里直接能看到其他程序的进程,
免密码直接操作其他用户的数据。
所谓,
这就是容器逃逸。
然后....
我们的目的确实也达到了。
通过这种方式确实可以直接实现登录任意一台k8s node节点,
再也不需要密码和授权。
总结。
很好玩。
不明镜像确实有风险。
这个世界一直都不太安全。
参考资料:
docker 容器逃逸漏洞(CVE-2020-15257)风险通告
容器逃逸技术概览 - DockOne.io
rambo1412:容器逃逸技术概览
Recommend
-
64
-
40
美国时间2019年2月11日晚,runc通过oss-security邮件列表披露了runc容器逃逸漏洞CVE-2019-5736的详情。runc是Docker、CRI-O、Containerd、Kubernetes等底层的容器运行时,此次安全漏洞无可避免地会影响大多数Docker与Kubernetes用户,也因...
-
68
美国时间2019年2月11日晚,runc通过oss-security邮件列表披露了runc容器逃逸漏洞CVE-2019-5736的详情。runc是Docker、CRI-O、Containerd、Kubernetes等底层的容器运行时,此次安全漏洞无可避免地会影响大多数Docker与Kubernetes用户,也因...
-
11
渗透技巧——利用tscon实现未授权登录远程桌面 0x00 前言 Windows系统下,tscon可被用来切换远程桌面的会话。正常情况下,切换会话时需要提供登录密码,但通过特殊的利用方法能够绕过验证,不输入密码实现未授权登录。...
-
19
Docker 容器逃逸漏洞通知Docker公布一个容器逃逸漏洞CVE-2020-15257,攻击者可以实现容器逃逸,提升特权并破坏主机。containerd使用的抽象套接字仅使用UID做验证,即任意UID为0的进程均可访问此API。当使用docker run --net=host 拉起一个容器时,容器...
-
6
代码安全搞不动了,这几天又开始摸鱼k8s,记录下一些由于配置不当导致的容器逃逸,以及一些利用方式和原理。 privileged特权模式privileged简介docker中提供了一个--privileged参数,这个参数本身最初的目的是为了提供在...
-
23
runc容器逃逸漏洞分析(CVE-2021-30465) - Kingkk's Blog虽然漏洞的利用难度比较高,但是个人感觉还是很有意思的一个洞,值得记录一下。不过分析起来可能会像是一篇译文23333,欢迎直接阅读原文。
-
6
利用CVE-2020-0986实现IE沙箱逃逸 - FreeBuf网络安全行业门户限时体验 主站 漏洞 工具 极客 Web安全...
-
4
内核态eBPF程序实现容器逃逸与隐藏账号rootkit 本文不同于 云原生安全攻防|使用eBPF逃逸容器技术分析与实践,腾讯同学的实现,是用eBPF技术在内核态hook,修改...
-
5
V2EX › 服务器 如何远程登录 WSL2 里面的容器? c...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK