<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>云安全 on root@wanth3f1ag</title>
    <link>https://wanth3f1ag.top/categories/%E4%BA%91%E5%AE%89%E5%85%A8/</link>
    <description>Recent content in 云安全 on root@wanth3f1ag</description>
    <image>
      <title>root@wanth3f1ag</title>
      <url>https://wanth3f1ag.top/images/avatar.jpg</url>
      <link>https://wanth3f1ag.top/images/avatar.jpg</link>
    </image>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Mon, 22 Jun 2026 17:34:57 +0800</lastBuildDate>
    <atom:link href="https://wanth3f1ag.top/categories/%E4%BA%91%E5%AE%89%E5%85%A8/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>K8s基础</title>
      <link>https://wanth3f1ag.top/posts/K8s%E5%9F%BA%E7%A1%80/</link>
      <pubDate>Wed, 17 Jun 2026 14:57:57 +0800</pubDate>
      <guid>https://wanth3f1ag.top/posts/K8s%E5%9F%BA%E7%A1%80/</guid>
      <description>&lt;h1 id=&#34;什么是kubernetes&#34;&gt;什么是Kubernetes&lt;/h1&gt;
&lt;p&gt;Kubernetes又名k8s，是一个由Google开源，现由 CNCF（云原生计算基金会）维护的容器编排平台&lt;/p&gt;
&lt;p&gt;Kubernetes（K8s） 集群是k8s的基本运行单元，由一个控制平面和一组用于运行容器化应用的工作机器组成， 这些工作机器称作节点（Node）。每个集群至少需要一个工作节点来运行 Pod。&lt;/p&gt;
&lt;p&gt;K8S集群主要负责容器编排，本质上来说，K8S不仅能将单个容器运行起来，将其对外暴露出去提供服务。还提供了：路由网关、集群监控、灾难恢复，以及应用的水平扩展等能力。&lt;/p&gt;
&lt;h1 id=&#34;kubernetes架构&#34;&gt;Kubernetes架构&lt;/h1&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://wanth3f1ag.top/posts/K8s%E5%9F%BA%E7%A1%80/image/Pasted%20image%2020260731112310.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;从结构图不难看出，k8s主要是由Master节点（控制平面）以及工作器节点组成，Master节点参与对Node节点的管理控制&lt;/p&gt;
&lt;h1 id=&#34;master节点&#34;&gt;Master节点&lt;/h1&gt;
&lt;p&gt;MasterNode主要包括四个部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ApiServer：顾名思义就是提供API接口进行资源操作，并提供认证、授权、访问控制、API 注册和发现等机制&lt;/li&gt;
&lt;li&gt;Controller Manager：控制管理，负责维护集群的状态，监控各种资源状态的变化&lt;/li&gt;
&lt;li&gt;Scheduler：调度程序，负责资源的调度，其实就是根据策略将Pod调度到相应的机器上&lt;/li&gt;
&lt;li&gt;etcd：里面保存了整个集群的状态，用作 Kubernetes 所有集群数据的后台数据库。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;worker节点&#34;&gt;Worker节点&lt;/h1&gt;
&lt;p&gt;WorkerNode主要有以下部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pod：k8s的最小的调度和运行单元，一个pod可以包含一个或多个容器，pod内所有容器都共用一个IP地址和网络命名空间，其实就类似于一台机器以及机器上的进程服务&lt;/li&gt;
&lt;li&gt;kubelet：每台节点上的代理，负责维护容器的生命周期&lt;/li&gt;
&lt;li&gt;Kube-proxy：通过为Service资源的ClusterIP生成iptable或ipvs规则，实现将K8S内部的服务暴露到集群外面去；处理节点上的网络规则，让 Pod 之间能互相通信&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;k8s和dockerdocker-compose的区别&#34;&gt;k8s和docker，docker-compose的区别&lt;/h1&gt;
&lt;p&gt;最大的区别就是在于运行管理方面，doker和docker-compose更偏向于单机运行的管理，docker一次只能管理一个容器，虽然docker-compose能同时管理多个容器，但本质上还是只限制在一台机器中，而k8s是集群多机器编排，可以同时管理多台机器&lt;/p&gt;
&lt;p&gt;除此之外，k8s还有以下特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;弹性伸缩：容器数量的控制，流量高峰自动加副本，低谷自动缩减，节省成本&lt;/li&gt;
&lt;li&gt;自我修复/高可用：对容器进行监测，如果某台机器宕机，Pod 自动迁移到其他机器，而出现问题的机器会自动抛弃或重启&lt;/li&gt;
&lt;li&gt;自动部署和回滚：自动对容器的回滚更新且更新版本时无缝替换，用户无感知&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;k8s工作流程&#34;&gt;k8s工作流程&lt;/h1&gt;
&lt;p&gt;k8s工作的时候通常会使用kubectl，kubectl 是 k8s 的客户端工具，可以使用命令行管理集群&lt;/p&gt;
&lt;p&gt;具体流程如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kubectl向apiserver发送部署创建请求（例如使用 kubectl create -f deployment.yml）&lt;/li&gt;
&lt;li&gt;apiserver将请求写入etcd，随后收到etcd的回调事件&lt;/li&gt;
&lt;li&gt;apiserver将回调事件发送给ControllerManager，ControllerManager中的ReplicationController根据deployment的描述创建一个ReplicaSet并将ReplicaSet对象返回给apiserver并持久化回etcd&lt;/li&gt;
&lt;li&gt;Scheduler调度程序看到未调度的pod对象，根据调度规则选择一个可调度的节点，将节点名写入pod描述的nodeName字段中，并将pod对象返回给apiserver并写入etcd&lt;/li&gt;
&lt;li&gt;apiserver接收到etcd的回调后会将更新pod的事件发送给pod对应的node上的kubelet进程&lt;/li&gt;
&lt;li&gt;kubelet在看到有pod对象中nodeName字段属于本节点，将其从队列中拉出，通过容器运行时创建pod中描述的容器&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;k8s安全基础&#34;&gt;k8s安全基础&lt;/h1&gt;
&lt;p&gt;一方面是组件接口的安全风险：&lt;/p&gt;
&lt;h2 id=&#34;api-server未授权访问&#34;&gt;API server未授权访问&lt;/h2&gt;
&lt;p&gt;API server的默认服务接口是8080和6443，但是8080只提供http服务，并没有认证与授权机制，而6443两者兼并&lt;/p&gt;
&lt;p&gt;默认情况下8080端口是不会启动的，但是如果使用者开启了该服务，就可能会造成API的未授权访问，从而控制整个k8s集群&lt;/p&gt;
&lt;p&gt;使用kubectl获取集群信息&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl -s &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;ip&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;port&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; get nodes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;kubelet未授权访问&#34;&gt;Kubelet未授权访问&lt;/h2&gt;
&lt;p&gt;Kubelet也是运行API服务的，默认服务端口是10250和10248，同样也容易存在未授权访问&lt;/p&gt;
&lt;h2 id=&#34;etcd信息泄露&#34;&gt;etcd信息泄露&lt;/h2&gt;
&lt;p&gt;etcd默认监听2379（用于客户端连接）和2380（用于多个etcd之间的通信）端口&lt;/p&gt;
&lt;p&gt;默认情况下，etcd两个端口的访问都需要证书去进行认证，所以如果我们拿到了证书或者使用者给etcd设置了允许匿名访问，那么就可以读取etcd中的数据，导致信息泄露风险&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;etcd v2：Kubernetes ≤ 1.5的版本默认使用etcd v2&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/v2/keys/?recursive=true
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;etcd v3：k8s v1.6开始默认使用 etcd v3,一般使用etcdctl实现对etcd的访问&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文档：https://github.com/etcd-io/etcd/tree/main/etcdctl&lt;/p&gt;</description>
    </item>
    <item>
      <title>Docker逃逸学习</title>
      <link>https://wanth3f1ag.top/posts/Docker%E9%80%83%E9%80%B8%E5%AD%A6%E4%B9%A0/</link>
      <pubDate>Thu, 28 May 2026 20:27:36 +0800</pubDate>
      <guid>https://wanth3f1ag.top/posts/Docker%E9%80%83%E9%80%B8%E5%AD%A6%E4%B9%A0/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;趁着这几天刚出完公司的题，抽出时间看了一下docker逃逸方面的东西，这里的话主要就是放攻击手法了，一些基础的概念就懒得赘述了&lt;/p&gt;
&lt;h1 id=&#34;如何判断虚拟环境类型&#34;&gt;如何判断虚拟环境类型&lt;/h1&gt;
&lt;p&gt;参考：https://yuy0ung.github.io/blog/%E4%BA%91%E5%AE%89%E5%85%A8/%E8%AF%86%E5%88%AB%E8%99%9A%E6%8B%9F%E6%9C%BAdocker%E5%92%8Ck8s%E9%9B%86%E7%BE%A4%E7%8E%AF%E5%A2%83/&lt;/p&gt;
&lt;p&gt;通常在getshell之后，我们都需要考虑一个问题：我们是真的拿到目标机器的shell了还是只是处于机器中虚拟环境里？前者的话肯定直接做一些比如提权，内网穿透，横向移动，权限维持等内网渗透的手法，但是如果我们此时是处在机器中的虚拟环境中的话，我们需要先判断该虚拟环境的类型&lt;/p&gt;
&lt;p&gt;通常情况下，shell的虚拟环境可能有三个类型：虚拟机，Docker，k8s。这三种类型对应着三种不同的攻击面：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;虚拟机&lt;/strong&gt;：通常考虑横向移动来扩大攻击效果&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt;：通常考虑容器逃逸到宿主机&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;K8s&lt;/strong&gt;：通常先尝试接管集群，以获取对容器和集群资源的完全控制（注意：K8s其实本质上也是跑容器，只不过不一定用 Docker，现代 K8s 常见运行时是 containerd / cri-o）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当然，仍有一些特殊的情况比如：Docker运行在虚拟机里，这种情况在这里就不讲述了&lt;/p&gt;
&lt;h2 id=&#34;查看主机名和进程&#34;&gt;查看主机名和进程&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;hostname	&lt;span class=&#34;c1&#34;&gt;#查看主机名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ps aux		&lt;span class=&#34;c1&#34;&gt;#显示系统上所有用户的详细进程信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Docker 默认 hostname 通常是容器 ID 的前 12 位（不绝对），PID1非系统进程，可初步判断当前为容器环境&lt;/p&gt;
&lt;p&gt;如果是在普通虚拟机或物理机里，PID 1 通常是：systemd 或者 init&lt;/p&gt;
&lt;p&gt;如果是在容器里，PID 1 可能是：&lt;/p&gt;
&lt;p&gt;bash，sh，python，node，java，nginx，tini，supervisord&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://wanth3f1ag.top/posts/Docker%E9%80%83%E9%80%B8%E5%AD%A6%E4%B9%A0/image/Pasted%20image%2020260604204425.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;但是注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;有些容器也会跑 systemd&lt;/li&gt;
&lt;li&gt;有些轻量 VM 也可能不是 systemd&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以 PID 1 只是作为初步的判断&lt;/p&gt;
&lt;h2 id=&#34;检查根目录下dockerenv文件&#34;&gt;检查根目录下.dockerenv文件&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -la /.dockerenv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过判断根目录下的&lt;code&gt;.dockerenv&lt;/code&gt;文件是否存在，确认当前环境是否为容器环境。&lt;/p&gt;
&lt;p&gt;需要注意：有些 Docker 容器可能没有这个文件，甚至有些镜像为了伪装会删除掉这个文件&lt;/p&gt;
&lt;h2 id=&#34;看-cgroup-信息&#34;&gt;看 cgroup 信息&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /proc/1/cgroup
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  或者：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /proc/self/cgroup
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个文件是一个 &lt;strong&gt;内核提供的虚拟文件，里面包含了PID 1 这个进程属于哪些 cgroup&lt;/strong&gt;，而cgroup 是 Linux 用来做&lt;strong&gt;资源隔离和限制&lt;/strong&gt;的机制，通常用于限制一个进程/容器的cpu，内存等资源使用&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
