在这里插入图片描述


背景说明

很多服务器被入侵时,管理员根本不知道。等发现的时候,数据已经没了,或者服务器已经成了别人的"肉鸡"。

今天聊聊怎么判断服务器是否被入侵——在它造成更大损失之前发现它。


一、为什么服务器被入侵很难发现

攻击者的静默期

入侵后立即搞破坏的,是"菜鸟"黑客。

专业黑客的操作是:

  1. 入侵服务器
  2. 植入后门(长期控制)
  3. 窃取数据(慢慢拿)
  4. 如果是勒索,等到合适时机再发作

这个"静默期"可能长达几周甚至几个月。

攻击者的逻辑是:被发现 = 暴露 = 损失。

所以他们会尽量:

  • 不触发告警
  • 不留下明显痕迹
  • 把自己伪装成正常进程

等你发现的时候,可能已经不是"有没有被入侵"的问题,而是"被入侵了多久"的问题。


二、判断方法一:检查异常登录记录

Linux服务器

# 查看登录成功记录
last

# 查看登录失败记录(被人尝试破解)
lastb

# 查看所有登录记录的汇总
lastlog

# 查看某个时间段内的登录情况
last | grep "2026-04"

# Debian/Ubuntu系统查看auth日志
cat /var/log/auth.log | grep "Failed password"
cat /var/log/auth.log | grep "Accepted password"

# CentOS/RHEL/Rocky Linux系统查看secure日志
cat /var/log/secure | grep "Failed password"
cat /var/log/secure | grep "Accepted password"

专家提示:不同Linux发行版的登录日志路径不同。Debian/Ubuntu系统使用 /var/log/auth.log,而 CentOS/RHEL/Rocky Linux 等RedHat系发行版SSH认证日志记录在 /var/log/secure(RHEL 7+可能被systemd-journald接管,建议同时使用 journalctl -u sshd 查看)。

异常信号:

  • 异地登录:你在北京,但登录记录显示"上海"
  • 凌晨登录:3点钟有人登上了服务器
  • 异常用户:登录记录里出现一个你不认识的账户

Windows服务器

通过事件查看器:

  1. Win+R,输入"eventvwr.msc"
  2. 导航到"Windows日志" → “安全”
  3. 筛选事件ID:
    • 4624:账户登录成功
    • 4625:登录失败
    • 4672:特权分配(管理员登录)
# 查看最近是否有账户被锁定
Search-EventLog -LogName Security -InstanceId 4740 -Newest 10

# 查看是否有可疑的远程登录
Search-EventLog -LogName Security -InstanceId 4624 -Message "*RDP*" -Newest 20

重点关注:

  • 短时间内大量4625事件(暴力破解迹象)
  • 管理员账户从异常IP登录
  • 非管理员账户突然获得高权限

三、判断方法二:检查异常进程和服务

Linux服务器

# 查看占用CPU最高的进程(挖矿常用)
top -c

# 查看进程及其完整命令
ps auxf

# 查看监听端口(有没有多了奇怪的端口)
netstat -tulpn

# 查看所有进程(包括隐藏进程)
ps -ef

# 检查是否有可疑计划任务
crontab -l
cat /etc/crontab

# 检查systemd服务(现代Linux持久化手段)
ls /etc/systemd/system/ | grep -v "^d"
systemctl list-units --type=service --state=running

# 检查环境变量是否被劫持
echo $LD_PRELOAD
# 如果有输出,说明有库被预加载,可能是入侵信号

# 检查LD_PRELOAD持久化配置(更隐蔽的劫持方式)
cat /etc/ld.so.preload
# 如果这个文件存在且包含内容,即使LD_PRELOAD环境变量为空,劫持依然生效
# 这是黑客常用的"无痕"劫持手段

> **专家提示**:如果服务器被植入Rootkit(内核级木马),黑客可以hook系统调用,此时你看到的进程列表全部是"假象"。这种情况下 `ps``top``ls` 等命令本身都可能被篡改。正确做法是使用从安全环境带来的静态链接工具(如BusyBox静态编译版)进行排查,或者将服务器硬盘挂载到另一台干净的系统进行分析。

**挖矿木马的典型特征:**
- CPU占用99%,但top看到的进程名是随机字符串
- 进程名是"python""perl",但你明明没跑Python/Perl应用
- 进程在高CPU占用下"消失"了(可能用了进程守护)

### Windows服务器

```powershell
# 查看异常进程
tasklist
Get-Process | Sort-Object CPU -Descending

# 查看监听端口
netstat -ano | findstr LISTENING

# 查看可疑服务
services.msc

# 查看开机启动项
wmic startup list full

异常信号:

  • 进程名是随机字母数字组合(svchost0.exe、a.exe)
  • 系统进程但路径在用户目录(C:\Users\)
  • 某个进程CPU占用持续80%+,但你不知道它是什么

四、判断方法三:检查系统文件变更

Linux服务器

# 查看最近被修改的系统文件
find /bin /usr/bin /sbin /lib -mtime -7 -ls

# 检查可疑的SSH密钥(黑客可能添加了免密登录的公钥)
cat ~/.ssh/authorized_keys
cat /root/.ssh/authorized_keys

# 检查SSH配置文件是否被篡改
cat /etc/ssh/sshd_config

# 检查文件是否被设置为不可修改(chattr +i)
lsattr /bin /usr/bin /sbin /usr/sbin
# 如果看到 i 标志,说明文件被锁定,即使root也删不掉
# 这常被黑客用于保护木马文件

# 检查关键系统文件的权限是否被修改
rpm -Va  # CentOS/RHEL(推荐,比单查MD5更全面)
debsums  # Debian/Ubuntu

# 检查隐藏目录和临时文件(黑客喜欢在这些地方藏木马)
ls -la /dev/shm /tmp /var/tmp
# /dev/shm 是内存临时目录,关机即消失,常被杀毒软件忽略
# /var/tmp 是临时文件夹,权限较大

SUID/SGID权限后门排查

黑客常通过给普通命令加上SUID权限,让普通用户运行时获得root权限。

# 查找系统中具有SUID权限的异常文件
find / -perm -u=s -type f 2>/dev/null

# 重点关注非系统命令被赋予了SUID权限
# 常见的被利用命令:vim, less, more, nano, find, bash, perl, python等
# 如果这些命令出现在非预期的位置,要警惕

验证系统命令是否被篡改

# 方式一:使用发行版自带的完整性检查(推荐)
rpm -V coreutils  # CentOS/RHEL,比对权限、大小、MD5等所有元数据
apt-check -r coreutils  # Debian/Ubuntu

# 方式二:MD5校验(需在干净环境下比对)
# 1. 在同版本清洁机器(或虚拟机)上执行
md5sum /bin/ls
# 2. 记录结果
# 3. 在受害机器上执行相同命令并比对
md5sum /bin/ls
# 如果值不同,说明文件被篡改

专家提示:MD5校验必须在干净环境下比对,不能在本地自检(如果系统命令已被篡改,md5sum本身也可能是假的)。正确做法是从可信来源(如官方ISO镜像)提取干净版本的二进制MD5值进行比对。使用 rpm -V 比单查MD5更全面,因为能比对权限、大小、时间戳等所有元数据。

Windows服务器

# 检查系统目录是否有新出现的可执行文件
Get-ChildItem -Path C:\Windows\System32 -Filter "*.exe" | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-30)}

# 检查注册表Run键值(开机启动项)
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
Get-ItemProperty "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"

# 检查计划任务(现代Windows攻击的常用持久化手段,比Run键值更难发现)
Get-ScheduledTask | Where-Object {$_.Author -notlike "*Microsoft*"} | Format-List TaskName, Author, State

# 查看非微软官方创建的计划任务详情
Get-ScheduledTaskInfo -TaskName "任务名称"  # 替换为实际任务名

五、判断方法四:检查网络流量和连接

Linux服务器

# 查看当前的网络连接
ss -tulpn

# 查看对外连接(中了木马的服务器会常驻一个C2连接)
ss -tnp | grep ESTAB

# 查看带宽占用异常
iftop -i eth0

# 查看流量异常
nethogs

异常信号:

  • 服务器主动连接了你不认识的境外IP
  • 有大量到境外IP的连接(数据外传)
  • DNS查询异常(有些木马通过DNS协议通信)

判断是否有流量攻击

# 查看哪个IP的连接数最多
netstat -anp | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn

如果某个IP建立了大量连接,可能是被当成了攻击源(肉鸡)。


六、判断方法五:检查日志异常

重要技巧

如果怀疑日志被清除了,可以用:

# 查看日志文件是否被截断
ls -l /var/log/auth.log
cat /var/log/auth.log | wc -l

如果日志文件被截断为0字节,或者行数突然减少,要警惕。

专家提示:黑客入侵后第一件事往往是清空本地日志,因为日志会暴露他们的入侵路径。建议建立远程日志服务器(通过Syslog-ng或rsyslog将日志实时同步到另一台服务器),这样即使本地日志被删除,远程备份仍然保留证据。

核弹级排查工具:Auditd

如果系统安装了auditd,即使黑客删除了日志文件,auditd的记录往往能救命。

# 安装auditd
yum install audit -y     # CentOS/RHEL
apt install auditd -y    # Debian/Ubuntu

# 查看审计服务状态
systemctl status auditd

# 监控谁动了核心文件(如/etc/shadow、/etc/passwd)
ausearch -f /etc/shadow -i

# 监控SSH配置变更
ausearch -k ssh_config

# 实时监控文件访问
auditctl -w /etc/passwd -p wa -k identity
auditctl -w /etc/shadow -p wa -k identity

# 查看审计规则
auditctl -l

专家提示:ausearch是auditd提供的查询工具,即使黑客删除了 /var/log/auth.log,只要auditd规则配置得当,你依然可以查到"是谁在什么时间访问了/etc/shadow"。这是最后一道防线。


七、快速排查清单

当怀疑服务器被入侵时,按这个顺序检查:

1. 先查登录记录
   └─ last / lastlog / 事件查看器
   └─ 有没有异地/凌晨登录?

2. 再查进程和端口
   └─ top / 任务管理器
   └─ 有没有CPU占用异常高的进程?
   └─ 检查 LD_PRELOAD 和 alias

3. 然后查网络连接
   └─ ss / netstat
   └─ 有没有连接境外IP?

4. 接着查系统文件
   └─ authorized_keys / 启动项
   └─ lsattr 检查不可修改文件
   └─ systemctl 检查systemd服务
   └─ /dev/shm /tmp /var/tmp 检查隐藏文件
   └─ find / -perm -u=s 查找SUID后门

5. 最后查日志
   └─ /var/log/auth.log 或 /var/log/secure
   └─ 有没有大量登录失败记录?
   └─ ausearch -f /etc/shadow(如果装了auditd)

提示:不同Linux发行版日志路径不同——Debian/Ubuntu用 /var/log/auth.log,RedHat系用 /var/log/secure

专家排查清单(进阶必查)

检测项 命令 说明
不可修改文件 lsattr /bin /usr/bin chattr +i 是木马保护常用手段
LD_PRELOAD劫持 echo $LD_PRELOAD && cat /etc/ld.so.preload 环境变量和持久化配置都要查
恶意systemd服务 systemctl list-units --type=service 现代Linux持久化主流手段
命令别名篡改 alias 黑客可能让ls隐藏恶意文件
SUID后门 find / -perm -u=s -type f 2>/dev/null 查找被赋予root权限的异常文件
隐藏目录/临时文件 ls -la /dev/shm /tmp /var/tmp 内存目录和临时目录是黑客最爱
静态工具排查 使用BusyBox静态编译版 避免依赖被篡改的系统命令
Auditd审计 ausearch -f /etc/shadow -i 即使日志被删也能查到痕迹
Windows计划任务 Get-ScheduledTask | Where-Object {$_.Author -notlike "*Microsoft*"} 非微软任务可能是木马

八、发现了入侵迹象怎么办

第一步:不要慌,先确认

“看到异常"不等于"被入侵了”。有些异常可能是:

  • 员工在非工作时间紧急处理问题
  • 正常的定时备份任务
  • 监控agent的正常行为

先确认,再行动。

第二步:隔离

不要:

  • 重启服务器(木马可能设置成重启后自启动)
  • 删除可疑文件(可能打草惊蛇)
  • 登录服务器操作(可能暴露你的操作)
  • 格式化磁盘后重装系统(会丢失入侵证据)

应该:

  • 云服务器:通过云控制台(Web Console)登录,通过安全组/防火墙从网络层阻断
  • 物理服务器:通过IP KVM或IPMI(带外管理)进入系统
  • 保留现场(截图、录屏)
  • 完整备份被入侵服务器的磁盘镜像

专家提示:如果你通过SSH远程连接服务器,直接执行 ifconfig eth0 down 会导致自己也立即掉线,无法再远程恢复。这是"远程自杀"。正确做法是通过云控制台、Web Console、或IP KVM等带外管理方式进入系统。

第三步:证据保留

# Linux:使用专业内存取证工具(推荐)
# AVML (Azure VM Memory Analyzer) - Microsoft开发
./avml /tmp/memory.lime

# LiME (Linux Memory Extractor)
insmod lime.ko "path=/tmp/memory.lime format=lime"

# 导出系统进程信息
ps auxf > /tmp/process_$(date +%Y%m%d).txt
netstat -tulpn > /tmp/network_$(date +%Y%m%d).txt

# 导出日志
cp -r /var/log /tmp/logs_$(date +%Y%m%d)

# Windows:导出安全日志
wevtutil qe Security /f:text /c:1000 > C:\security_log.txt

专家提示dd if=/dev/mem 在现代Linux内核(默认开启CONFIG_STRICT_DEVMEM)下已经基本失效,无法直接读取物理内存。必须使用专业的内存取证工具如AVML或LiME。另外,不要在发现入侵后立即执行大量IO操作(如完整磁盘备份),这会覆盖内存中残留的攻击者指令证据。


九、总结

判断服务器是否被入侵的五个方法:

  1. 检查登录记录——异地登录、凌晨登录是信号
  2. 检查异常进程——CPU占用异常、陌生进程名
  3. 检查网络连接——主动连接境外IP很可疑
  4. 检查系统文件——SSH密钥、启动项是否被篡改
  5. 检查日志——登录失败记录、日志文件完整性

最重要的一点:被入侵不可怕,可怕的是被入侵了还不知道。

建立日常巡检习惯,配合远程日志Auditd监控,才能真正做到"看见"威胁。

核心原则:被入侵不可怕,可怕的是被入侵了还不知道。建立日常巡检习惯,比什么都重要。


你有什么服务器安全检测经验?欢迎在评论区分享。

#运维安全 #服务器安全 #入侵检测 #应急响应

Logo

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

更多推荐