Skip to content

Linux 应急响应实战 — 入侵排查与取证分析

Published:
15 min read

Linux 服务器因其在 Web 服务、数据库、容器平台等关键基础设施中的广泛应用,一直是攻击者的重点目标。相比 Windows,Linux 系统的入侵排查更依赖命令行工具和对系统底层机制的深入理解。本文将从入侵迹象识别出发,系统讲解 Linux 环境下的用户、进程、网络、定时任务、文件系统和日志六大排查维度,并介绍 Rootkit 检测方法。

Linux 入侵迹象识别

在正式开展排查之前,以下异常现象通常是系统已被入侵的信号:

用户账户排查

用户账户是攻击者进入系统的门户,也是持久化的重要手段。

检查用户列表

# 查看所有用户账户
cat /etc/passwd

# 查找 UID 为 0 的账户(与 root 同权限,高度可疑)
awk -F: '$3==0 {print $1}' /etc/passwd

# 查找可登录的用户(Shell 不是 nologin 或 false 的)
awk -F: '$7!="/sbin/nologin" && $7!="/bin/false" && $7!="/usr/sbin/nologin" {print $1,$7}' /etc/passwd

# 查看有密码哈希的账户(排除锁定和禁用账户)
sudo awk -F: '$2!="!" && $2!="*" && $2!="!!" {print $1}' /etc/shadow

# 查看空密码账户(极其危险)
sudo awk -F: '$2=="" {print $1}' /etc/shadow

检查登录记录

# 查看最近登录记录
last -n 30

# 查看最近登录失败记录
sudo lastb -n 30

# 查看所有用户最后一次登录时间
lastlog

# 查看当前登录用户及来源 IP
w
who -a

# 查看 SSH 登录记录(Debian/Ubuntu)
grep "Accepted" /var/log/auth.log | tail -30

# 查看 SSH 登录记录(RHEL/CentOS)
grep "Accepted" /var/log/secure | tail -30

# 统计 SSH 暴力破解来源 IP(Debian/Ubuntu)
grep "Failed password" /var/log/auth.log | \
    awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20

检查 sudo 和特权操作

# 查看 sudoers 文件(检查异常授权)
cat /etc/sudoers
ls -la /etc/sudoers.d/

# 查看 sudo 执行记录
grep "sudo:" /var/log/auth.log | tail -30

# 查看 su 切换记录
grep "su:" /var/log/auth.log | tail -20

进程排查

进程排查是发现正在运行的恶意程序的最直接方式。

基础进程检查

# 查看所有进程(树形显示,便于分析父子关系)
ps auxf

# 按 CPU 使用率排序(发现挖矿进程)
ps aux --sort=-%cpu | head -20

# 按内存使用率排序
ps aux --sort=-%mem | head -20

# 查看完整的进程命令行
ps -eo pid,ppid,user,args --sort=-%cpu | head -30

# 使用 top 实时监控(按 P 排序 CPU,按 M 排序内存)
top -bn1 | head -30

深度进程分析

# 查看进程对应的实际可执行文件
ls -la /proc/[PID]/exe

# 批量检查所有进程的可执行文件路径
ls -la /proc/*/exe 2>/dev/null | grep -v "Permission denied"

# 查看进程的完整命令行
cat /proc/[PID]/cmdline | tr '\0' ' '

# 查看进程打开的文件(发现可疑文件访问)
ls -la /proc/[PID]/fd/

# 查看进程的环境变量
cat /proc/[PID]/environ | tr '\0' '\n'

# 查看进程的内存映射(发现注入的共享库)
cat /proc/[PID]/maps

# 查找已删除但仍在运行的文件(常见恶意软件技巧)
ls -la /proc/*/exe 2>/dev/null | grep "(deleted)"

使用 lsof 排查

# 查看指定进程打开的所有文件
lsof -p [PID]

# 查看指定进程的网络连接
lsof -i -p [PID]

# 查找使用某个端口的进程
lsof -i :8080

# 查看所有网络连接
lsof -i -n -P

# 查看打开了被删除文件的进程
lsof +L1

网络连接排查

恶意程序几乎都需要网络通信,无论是接收 C2 指令、外传数据还是进行横向移动。

# 查看所有 TCP/UDP 连接及对应进程
ss -tunap

# 只看已建立的连接
ss -tunap state established

# 只看监听端口
ss -tunlp

# 使用 netstat(部分系统可能需要安装 net-tools)
netstat -tunap

# 查看连接到外部 IP 的详细信息
ss -tunap state established | awk '{print $5}' | sort | uniq -c | sort -rn

# 排查异常的 DNS 查询
tcpdump -i eth0 port 53 -nn -c 100

# 抓取特定 IP 的流量
tcpdump -i eth0 host [可疑IP] -w /tmp/capture.pcap -c 10000

# 查看 iptables 规则(检查攻击者是否添加了放行规则)
sudo iptables -L -n -v --line-numbers
sudo iptables -t nat -L -n -v

定时任务排查

定时任务(Cron)是 Linux 系统上最常用的持久化机制之一。

# 查看当前用户的 crontab
crontab -l

# 查看指定用户的 crontab
sudo crontab -l -u [用户名]

# 遍历所有用户的 crontab
for user in $(cut -f1 -d: /etc/passwd); do
    echo "=== ${user} ==="
    sudo crontab -l -u "${user}" 2>/dev/null
done

# 检查系统级 cron 配置
cat /etc/crontab
ls -la /etc/cron.d/
cat /etc/cron.d/*

# 检查定时目录中的脚本
ls -la /etc/cron.hourly/
ls -la /etc/cron.daily/
ls -la /etc/cron.weekly/
ls -la /etc/cron.monthly/

# 检查 anacron
cat /etc/anacrontab

# 检查 systemd timer(现代替代 cron)
systemctl list-timers --all
systemctl list-unit-files --type=timer

自启动服务排查

# 查看所有已启用的 systemd 服务
systemctl list-unit-files --type=service --state=enabled

# 查看正在运行的服务
systemctl list-units --type=service --state=running

# 查看最近启动失败的服务(可能是恶意服务配置有误)
systemctl list-units --type=service --state=failed

# 检查所有 service 文件的位置
find /etc/systemd/system/ /usr/lib/systemd/system/ /run/systemd/system/ \
    -name "*.service" -newer /etc/hostname -ls 2>/dev/null

# 查看可疑服务的详细信息
systemctl cat [服务名]
systemctl show [服务名] | grep -E "ExecStart|ExecStop|User|Group"

# 检查传统 init.d 脚本
ls -la /etc/init.d/
ls -la /etc/rc.local
cat /etc/rc.local

# 检查用户级 systemd 服务
find /home -path "*/.config/systemd/user/*.service" -ls 2>/dev/null

文件系统排查

查找近期修改的文件

# 查找最近24小时内修改的文件
find / -mtime -1 -type f -not -path "/proc/*" -not -path "/sys/*" \
    -not -path "/run/*" -ls 2>/dev/null

# 查找最近2小时内修改的文件(缩小时间范围)
find / -mmin -120 -type f -not -path "/proc/*" -not -path "/sys/*" \
    -not -path "/run/*" -ls 2>/dev/null

# 查找最近修改的可执行文件
find /usr/bin /usr/sbin /usr/local/bin -mtime -7 -type f -ls 2>/dev/null

# 查找时间戳异常的文件(修改时间远早于创建时间,可能被篡改)
find /usr/bin -type f -printf "%T+ %p\n" 2>/dev/null | sort -r | head -20

检查 SUID/SGID 文件

SUID 文件以文件所有者权限运行,攻击者常利用此机制提权。

# 查找所有 SUID 文件
find / -perm -4000 -type f -ls 2>/dev/null

# 查找所有 SGID 文件
find / -perm -2000 -type f -ls 2>/dev/null

# 查找全局可写的目录(可被利用放置恶意文件)
find / -type d -perm -o+w -not -path "/proc/*" -not -path "/sys/*" \
    -not -path "/tmp" -not -path "/var/tmp" -ls 2>/dev/null

# 查找隐藏文件和目录(点开头的文件/目录)
find / -name ".*" -not -path "/proc/*" -not -path "/sys/*" \
    -type f -ls 2>/dev/null | grep -v -E "/(\.bashrc|\.profile|\.bash_history)"

检查可疑位置

# 检查 /tmp 和 /dev/shm(攻击者常用来存放恶意文件)
ls -la /tmp/
ls -la /dev/shm/
ls -la /var/tmp/

# 检查 Web 目录(Webshell 排查)
find /var/www/ -name "*.php" -mtime -7 -ls 2>/dev/null
find /var/www/ -name "*.jsp" -mtime -7 -ls 2>/dev/null

# 检查用户目录下的隐藏文件
find /home/ -maxdepth 3 -name ".*" -type f -ls 2>/dev/null
find /root/ -maxdepth 2 -name ".*" -type f -ls 2>/dev/null

# 检查 SSH 相关文件
find /home -name "authorized_keys" -ls 2>/dev/null
find /root -name "authorized_keys" -ls 2>/dev/null
cat /root/.ssh/authorized_keys 2>/dev/null

日志分析

Linux 系统日志是入侵调查的重要证据源。

认证日志分析

# === Debian/Ubuntu: /var/log/auth.log ===
# === RHEL/CentOS: /var/log/secure ===

# 查看 SSH 成功登录
grep "Accepted" /var/log/auth.log

# 统计 SSH 暴力破解次数(按 IP 统计失败登录)
grep "Failed password" /var/log/auth.log | \
    awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20

# 查看用户创建和删除记录
grep -E "useradd|userdel|groupadd" /var/log/auth.log

# 查看 passwd/shadow 被修改的记录
grep -E "passwd|shadow|chpasswd" /var/log/auth.log

系统日志分析

# 使用 journalctl 查看系统日志(systemd 系统)
# 查看最近1小时的日志
journalctl --since "1 hour ago"

# 查看指定服务的日志
journalctl -u sshd --since "2024-01-01"

# 查看内核日志(硬件异常、模块加载等)
journalctl -k --since "1 day ago"

# 查看优先级为 warning 及以上的日志
journalctl -p warning --since "1 day ago"

# 查看传统系统日志
tail -100 /var/log/syslog       # Debian/Ubuntu
tail -100 /var/log/messages     # RHEL/CentOS

# 检查日志文件是否被篡改(大小为0或时间异常)
ls -la /var/log/
find /var/log -empty -type f -ls

Web 日志分析

# Apache 日志分析
# 查找常见 Web 攻击特征
grep -E "(union.*select|<script>|\.\.\/|etc/passwd|eval\(|base64_decode)" \
    /var/log/apache2/access.log

# 统计访问量最高的 IP
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -20

# 查找 POST 请求到可疑文件
grep "POST.*\.(php|jsp|asp)" /var/log/apache2/access.log

# Nginx 日志分析
grep -E "(\.\./|etc/passwd|union.*select)" /var/log/nginx/access.log
awk '$9>=400' /var/log/nginx/access.log | tail -50

Rootkit 检测

Rootkit 是最隐蔽的恶意软件类型,它通过修改内核或系统工具来隐藏自身存在。

使用 rkhunter 检测

# 安装 rkhunter
sudo apt install rkhunter        # Debian/Ubuntu
sudo yum install rkhunter        # RHEL/CentOS

# 更新签名数据库
sudo rkhunter --update

# 执行全面检测
sudo rkhunter --check --sk

# 查看检测报告
sudo cat /var/log/rkhunter.log | grep "Warning"

# 只检查 rootkit
sudo rkhunter --check --rwo

使用 chkrootkit 检测

# 安装 chkrootkit
sudo apt install chkrootkit      # Debian/Ubuntu
sudo yum install chkrootkit      # RHEL/CentOS

# 执行检测
sudo chkrootkit

# 静默模式(只显示可疑结果)
sudo chkrootkit -q

手动 Rootkit 排查

# 检查内核模块(可疑的 LKM rootkit)
lsmod
cat /proc/modules

# 对比系统工具是否被替换(检查文件哈希)
md5sum /usr/bin/ps /usr/bin/ls /usr/bin/netstat /usr/bin/ss 2>/dev/null
rpm -Va 2>/dev/null | grep "^..5"   # RHEL 系验证 RPM 包完整性
dpkg --verify 2>/dev/null            # Debian 系验证包完整性

# 检查 /etc/ld.so.preload(LD_PRELOAD 劫持)
cat /etc/ld.so.preload 2>/dev/null
echo $LD_PRELOAD

# 检查隐藏的内核模块
# 对比 lsmod 输出和 /sys/module 目录
diff <(lsmod | awk '{print $1}' | sort) \
     <(ls /sys/module/ | sort) | grep "^[<>]"

安全建议与防御措施

  1. 最小权限原则:禁止 root 远程 SSH 登录,使用普通账户 + sudo 管理
  2. SSH 安全加固:使用密钥认证替代密码认证,修改默认端口,配置 Fail2Ban 防暴力破解
  3. 文件完整性监控:部署 AIDE、OSSEC 或 Tripwire 监控关键文件变更
  4. 集中日志管理:将日志实时转发至远程 Syslog 服务器或 SIEM 平台,防止本地日志被清除
  5. 定期安全审计:使用 Lynis 等工具定期进行系统安全审计
  6. 内核安全加固:启用 SELinux 或 AppArmor 强制访问控制
  7. 及时补丁更新:建立补丁管理流程,及时修复已知漏洞

总结

Linux 应急响应排查需要安全人员对系统底层机制有深入理解,并能熟练运用命令行工具。本文覆盖的六大排查维度——用户账户、进程、网络连接、定时任务、文件系统和日志分析——构成了一套完整的排查框架。建议将这些命令整理为自动化采集脚本,并结合 Rootkit 检测工具进行全面排查。在实际响应中,要特别注意保全证据的完整性,避免在调查过程中破坏或覆盖关键痕迹。