Linux应急响应深度实战:服务排查、文件审计与敏感目录监控

前言

在Linux应急响应中,除了进程和网络分析,服务配置排查和文件系统审计同样关键。攻击者常常通过修改服务配置实现持久化,替换系统命令植入后门,在敏感目录隐藏恶意文件。本文将深入讲解Linux服务管理、文件完整性检查、敏感目录监控等高级技术,帮助安全人员全面掌握文件系统层面的威胁检测能力。

文章目录

  • 前言
  • 一、网络服务深度排查
    • [1.1 服务配置文件分析](#1.1 服务配置文件分析)
    • [1.2 端口分配机制](#1.2 端口分配机制)
    • [1.3 服务自启动管理(传统SysV)](#1.3 服务自启动管理(传统SysV))
    • [1.4 服务自启动管理(systemd)](#1.4 服务自启动管理(systemd))
    • [1.5 查看已安装的软件包](#1.5 查看已安装的软件包)
  • 二、文件系统深度审计
    • [2.1 敏感目录分析](#2.1 敏感目录分析)
    • [2.2 文件时间戳分析](#2.2 文件时间戳分析)
    • [2.3 文件类型检测](#2.3 文件类型检测)
    • [2.4 特殊权限文件查找](#2.4 特殊权限文件查找)
    • [2.5 隐藏文件检测](#2.5 隐藏文件检测)
  • 三、文件完整性检查
    • [3.1 MD5校验基础](#3.1 MD5校验基础)
    • [3.2 建立基线对比](#3.2 建立基线对比)
    • [3.3 使用whereis定位文件](#3.3 使用whereis定位文件)
  • 四、高级文件搜索技术
    • [4.1 按用户查找文件](#4.1 按用户查找文件)
    • [4.2 按大小查找文件](#4.2 按大小查找文件)
    • [4.3 按文件名模式查找](#4.3 按文件名模式查找)
    • [4.4 综合搜索示例](#4.4 综合搜索示例)
  • 五、文件传输与分析
    • [5.1 使用SFTP传输文件](#5.1 使用SFTP传输文件)
    • [5.2 WebShell检测工具](#5.2 WebShell检测工具)
  • 六、实战案例分析
    • [6.1 发现WebShell后门](#6.1 发现WebShell后门)
    • [6.2 发现系统命令替换](#6.2 发现系统命令替换)
  • 总结

一、网络服务深度排查

1.1 服务配置文件分析

查看系统服务端口映射:

bash 复制代码
cat /etc/services

这个文件记录了标准的服务名称和对应端口号。

输出示例:

复制代码
# service-name  port/protocol  [aliases ...]   [# comment]
ftp             21/tcp
ssh             22/tcp
telnet          23/tcp
smtp            25/tcp
http            80/tcp          www
https           443/tcp
mysql           3306/tcp

作用:

  • 了解标准端口分配
  • 对比实际监听端口,发现异常服务
  • 识别非标准端口的服务

1.2 端口分配机制

Linux端口分配规则:

端口范围 用途 权限要求 典型服务
1-1024 系统保留端口 仅root可绑定 SSH(22), HTTP(80), HTTPS(443)
1025-4999 客户端程序 普通用户可用 临时出站连接
5000-65535 服务器程序 普通用户可用 自定义应用服务

安全含义:

  • 普通用户进程监听1-1024端口需警惕(可能是提权后的恶意服务)
  • 高端口(>10000)监听需要关注其对应进程
  • 非标准端口的标准服务(如SSH在2222)需要文档记录

检查异常端口:

bash 复制代码
# 查看所有监听端口
netstat -tulnp

# 过滤非标准端口
netstat -tulnp | awk '$4 ~ /:/ {split($4, a, ":"); port=a[length(a)]; if (port>10000) print}'

# 查询特定端口对应的服务名
grep "^[^#].*[[:space:]]4444/" /etc/services

1.3 服务自启动管理(传统SysV)

chkconfig命令详解:

chkconfig是CentOS/RHEL系统管理服务自启动的传统工具。

基本语法:

bash 复制代码
chkconfig --level [运行级别] [服务名] [on/off]

运行级别说明:

复制代码
级别 0: 关机(halt)
级别 1: 单用户模式(救援模式,无网络)
级别 2: 多用户模式(无NFS网络文件系统)
级别 3: 完整多用户命令行模式(标准服务器模式)
级别 4: 保留未使用
级别 5: 图形界面模式(X11)
级别 6: 重启(reboot)

实用命令:

1. 设置服务开机自启:

bash 复制代码
# 在级别2,3,4,5自动启动httpd
chkconfig --level 2345 httpd on

# 简化写法(默认2345)
chkconfig httpd on

2. 关闭服务自启动:

bash 复制代码
chkconfig httpd off

3. 查看所有服务自启动状态:

bash 复制代码
chkconfig --list

输出示例:

复制代码
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off
evil-service    0:off   1:off   2:on    3:on    4:on    5:on    6:off  ← 可疑服务!

4. 查看特定服务:

bash 复制代码
chkconfig --list | grep httpd

5. 删除服务:

bash 复制代码
chkconfig --del [服务名]

注意: 删除后服务仍在/etc/init.d/,只是不再被chkconfig管理。

完整清除服务:

bash 复制代码
# 1. 停止服务
service evil-service stop

# 2. 从chkconfig移除
chkconfig --del evil-service

# 3. 删除启动脚本
rm -f /etc/init.d/evil-service

1.4 服务自启动管理(systemd)

现代Linux系统使用systemd:

查看所有已启用的服务:

bash 复制代码
systemctl list-unit-files --type=service --state=enabled

查看特定服务状态:

bash 复制代码
systemctl status httpd

启用/禁用服务:

bash 复制代码
# 启用开机自启
systemctl enable httpd

# 禁用开机自启
systemctl disable httpd

# 立即停止服务
systemctl stop httpd

# 禁用并停止
systemctl disable --now httpd

查找可疑服务:

bash 复制代码
# 列出所有服务
systemctl list-units --type=service --all

# 查找用户自定义服务
find /etc/systemd/system -name "*.service" -type f

# 查看最近修改的服务文件
find /etc/systemd/system /usr/lib/systemd/system -name "*.service" -mtime -7

1.5 查看已安装的软件包

RPM系统(CentOS/RHEL):

bash 复制代码
# 查看所有已安装的包
rpm -qa

# 查找特定软件
rpm -qa | grep httpd

# 查看包的详细信息
rpm -qi httpd

# 查看包安装的文件列表
rpm -ql httpd

# 验证包的完整性
rpm -V httpd

输出解读(rpm -V):

复制代码
S.5....T.  c /etc/httpd/conf/httpd.conf
  • S: 文件大小改变
  • 5: MD5校验和改变
  • T: 修改时间改变
  • c: 配置文件

APT系统(Ubuntu/Debian):

bash 复制代码
# 查看所有已安装的包
dpkg -l

# 查找特定软件
dpkg -l | grep apache2

# 查看包的详细信息
dpkg -s apache2

# 查看包安装的文件列表
dpkg -L apache2

# 验证包的完整性
debsums apache2

二、文件系统深度审计

2.1 敏感目录分析

关键系统目录:

目录 说明 检查重点
/tmp 临时文件目录 上传的木马、提权工具
/var/tmp 持久临时目录 长期驻留的恶意文件
/dev/shm 共享内存目录 无磁盘痕迹的恶意程序
/root root用户家目录 后门脚本、敏感数据
/home/[user] 普通用户家目录 用户上传的恶意文件
/bin, /sbin 系统命令 被替换的系统命令
/usr/bin, /usr/sbin 用户命令 伪装的恶意程序
/etc/init.d 服务启动脚本 持久化后门
/var/www/html Web根目录 WebShell后门

2.2 文件时间戳分析

按时间排序查看文件:

bash 复制代码
# 按修改时间降序(最新的在前)
ls -alt /tmp

# 按修改时间升序
ls -altr /tmp

参数说明:

  • -a: 显示隐藏文件
  • -l: 详细列表
  • -t: 按时间排序
  • -r: 反向排序

查找特定日期的文件:

bash 复制代码
# 查找2月10日修改的文件
ls -al /tmp | grep "Feb 10"

# 或使用find
find /tmp -type f -newermt "2024-02-10" ! -newermt "2024-02-11"

查找最近N天修改的文件:

bash 复制代码
# 最近1天内修改
find /tmp -type f -mtime -1

# 最近7天内修改
find /tmp -type f -mtime -7

# 7天前修改
find /tmp -type f -mtime +7

时间参数说明:

  • -mtime: 修改时间(modify time)
  • -atime: 访问时间(access time)
  • -ctime: 状态改变时间(change time,包括权限、所有者变更)

实战示例:

bash 复制代码
# 查找/etc/init.d最近7天修改的启动脚本
find /etc/init.d -type f -mtime -7 -ls

# 查找系统命令目录最近修改的文件
find /bin /sbin /usr/bin /usr/sbin -type f -mtime -30

2.3 文件类型检测

file命令识别文件真实类型:

bash 复制代码
file [文件路径]

示例:

bash 复制代码
# 正常情况
file /bin/ls
# 输出: /bin/ls: ELF 64-bit LSB executable, x86-64

# 可疑情况:图片文件实际是PHP脚本
file /var/www/html/logo.jpg
# 输出: /var/www/html/logo.jpg: PHP script, ASCII text

批量检测:

bash 复制代码
# 检测/tmp下所有文件
find /tmp -type f -exec file {} \;

# 查找伪装成图片的PHP脚本
find /var/www/html -name "*.jpg" -o -name "*.png" | xargs file | grep -i "php\|script"

2.4 特殊权限文件查找

SUID/SGID位的危险性:

SUID(Set User ID)位允许普通用户以文件所有者权限执行,常被用于提权。

查找SUID文件:

bash 复制代码
# 查找所有SUID文件
find / -perm -4000 -type f 2>/dev/null

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

# 查找SUID和SGID文件
find / -perm -6000 -type f 2>/dev/null

查找777权限文件(所有人可读写执行):

bash 复制代码
# 查找所有777权限的文件
find / -perm 0777 -type f 2>/dev/null

# 查找特定类型的777权限文件
find /var/www/html -name "*.php" -perm 0777 2>/dev/null
find /var/www/html -name "*.jsp" -perm 0777 2>/dev/null

实战示例:

bash 复制代码
# 查找/var/www/html下777权限的PHP文件
find /var/www/html -name "*.php" -perm 0777 -ls

# 输出示例:
# 1234567 8 -rwxrwxrwx 1 www-data www-data 5234 Feb 10 14:35 /var/www/html/shell.php

检查要点:

  • Web目录不应有777权限的脚本文件
  • 查看文件内容,可能是WebShell
  • 检查文件修改时间和上传日志

查找可写的系统目录:

bash 复制代码
# 查找所有用户可写的目录
find / -type d -perm -002 2>/dev/null | grep -v proc

2.5 隐藏文件检测

Linux隐藏文件规则:

.开头的文件和目录在ls命令默认不显示。

查看隐藏文件:

bash 复制代码
# 显示所有文件(包括隐藏)
ls -a

# 详细列表
ls -al

# 仅显示隐藏文件
ls -ld .*

在/tmp目录查找可疑隐藏文件:

bash 复制代码
# 查看所有隐藏文件
ls -al /tmp | grep "^\."

# 查找特定日期的隐藏文件
ls -al /tmp | grep "^\." | grep "Feb 10"

# 查找所有隐藏的可执行文件
find /tmp -name ".*" -type f -executable

可疑隐藏文件特征:

  • .x, .bash, .config等随机名称
  • 在非用户目录出现的隐藏目录(如/tmp/.x/)
  • 隐藏文件具有可执行权限
  • 隐藏文件体积较大

示例:

bash 复制代码
# 查找/tmp下的隐藏可执行文件
find /tmp -name ".*" -type f -perm -111 -ls

# 输出:
# 2345678 2048 -rwxr-xr-x 1 www-data www-data 2048576 Feb 10 14:35 /tmp/.x/miner

三、文件完整性检查

3.1 MD5校验基础

MD5哈希特性:

  • 固定128位(32个十六进制字符)
  • 文件内容改变,MD5必然改变
  • 即使修改时间被还原,MD5仍然不同

计算文件MD5:

bash 复制代码
md5sum [文件路径]

示例:

bash 复制代码
md5sum /bin/ls
# 输出: d41d8cd98f00b204e9800998ecf8427e  /bin/ls

批量计算MD5:

bash 复制代码
# 计算/bin目录所有文件的MD5
md5sum /bin/* > /tmp/bin_md5_baseline.txt

# 计算/usr/bin目录
md5sum /usr/bin/* > /tmp/usr_bin_md5_baseline.txt

3.2 建立基线对比

在干净系统上建立基线:

bash 复制代码
#!/bin/bash
# 创建系统命令MD5基线

echo "正在创建系统命令MD5基线..."

# 创建基线目录
mkdir -p /root/baseline

# 计算关键目录的MD5
for dir in /bin /sbin /usr/bin /usr/sbin; do
    echo "处理 $dir ..."
    find $dir -type f -exec md5sum {} \; > /root/baseline/$(basename $dir)_md5.txt
done

echo "基线创建完成,保存在 /root/baseline/"

后续检测对比:

bash 复制代码
#!/bin/bash
# 检测系统命令是否被篡改

echo "正在检测系统文件完整性..."

for baseline in /root/baseline/*_md5.txt; do
    dir=$(basename $baseline | sed 's/_md5.txt//')
    echo "检查 /$dir ..."
    
    # 重新计算MD5
    find /$dir -type f -exec md5sum {} \; > /tmp/current_md5.txt
    
    # 对比差异
    diff $baseline /tmp/current_md5.txt
    
    if [ $? -eq 0 ]; then
        echo "✓ /$dir 未发现篡改"
    else
        echo "✗ /$dir 发现异常!"
    fi
done

使用rpm/dpkg验证:

bash 复制代码
# CentOS/RHEL - 验证所有包
rpm -Va

# 验证特定包
rpm -V coreutils

# Ubuntu/Debian
debsums -c

3.3 使用whereis定位文件

whereis命令查找程序路径:

bash 复制代码
whereis [命令名]

示例:

bash 复制代码
whereis ls
# 输出: ls: /bin/ls /usr/share/man/man1/ls.1.gz

whereis python
# 输出: python: /usr/bin/python /usr/bin/python3.8 /usr/lib/python3.8

用途:

  • 快速定位系统命令位置
  • 发现异常的命令路径(如在/tmp下的ls命令)
  • 查找替换后的恶意命令

检测命令替换:

bash 复制代码
# 查找所有名为"ps"的文件
find / -name ps 2>/dev/null

# 正常输出:
# /bin/ps
# /usr/share/man/man1/ps.1.gz

# 异常输出:
# /bin/ps
# /tmp/ps  ← 可疑!

四、高级文件搜索技术

4.1 按用户查找文件

查找特权文件(UID 0 = root):

bash 复制代码
find / -uid 0 -type f 2>/dev/null

用途:

  • 查找所有root拥有的文件
  • 发现提权后创建的文件
  • 检测被篡改为root所有的系统文件

查找特定用户的文件:

bash 复制代码
# 查找www-data用户的文件
find / -user www-data -type f 2>/dev/null

# 查找nobody用户的文件(常见Web服务用户)
find / -user nobody -type f 2>/dev/null

4.2 按大小查找文件

查找大文件:

bash 复制代码
# 查找大于10MB的文件
find / -size +10000k -type f 2>/dev/null

# 查找大于100MB的文件
find / -size +100M -type f 2>/dev/null

# 查找大于1GB的文件
find / -size +1G -type f 2>/dev/null

应用场景:

  • 查找被上传的大型恶意程序
  • 发现异常的日志文件(可能被写入大量数据)
  • 定位数据库备份文件

组合条件查找:

bash 复制代码
# 查找/tmp下大于10MB的最近创建的文件
find /tmp -size +10M -type f -mtime -7 -ls

# 查找www-data用户拥有的大于5MB的文件
find /var/www -user www-data -size +5M -type f -ls

4.3 按文件名模式查找

查找特定名称的文件:

bash 复制代码
# 查找名为"..."的文件(常见隐藏手法)
find / -name "..." -type f 2>/dev/null

# 查找所有.php文件
find /var/www/html -name "*.php" -type f

# 查找包含"shell"的文件
find /var/www/html -name "*shell*" -type f

常见恶意文件名特征:

  • ..., .., .(点号命名)
  • shell.php, c99.php, r57.php
  • eval.php, assert.php
  • 1.php, a.php(简短随机名)
  • .config.php, .test.php(伪装成配置文件)

实战搜索:

bash 复制代码
# 查找Web目录下的可疑PHP文件
find /var/www/html \( -name "*shell*" -o -name "c99*" -o -name "r57*" -o -name "eval*" \) -type f

# 查找单字母命名的PHP文件
find /var/www/html -name "[a-z].php" -type f

# 查找最近7天创建的PHP文件
find /var/www/html -name "*.php" -type f -mtime -7 -ls

4.4 综合搜索示例

全面的可疑文件扫描脚本:

bash 复制代码
#!/bin/bash
# Linux可疑文件全面扫描脚本

echo "========== 扫描开始 =========="
date

echo ""
echo "1. 查找/tmp下最近7天的文件:"
find /tmp -type f -mtime -7 -ls

echo ""
echo "2. 查找SUID文件:"
find / -perm -4000 -type f 2>/dev/null

echo ""
echo "3. 查找777权限文件:"
find /var/www/html -perm 0777 -type f 2>/dev/null

echo ""
echo "4. 查找隐藏的可执行文件:"
find /tmp /var/tmp /dev/shm -name ".*" -type f -executable 2>/dev/null

echo ""
echo "5. 查找大于10MB的最近文件:"
find / -size +10M -type f -mtime -7 2>/dev/null | head -20

echo ""
echo "6. 查找可疑文件名:"
find /var/www/html \( -name "*shell*" -o -name "c99*" -o -name "eval*" \) -type f 2>/dev/null

echo ""
echo "========== 扫描完成 =========="

保存为scan_suspicious_files.sh,执行:

bash 复制代码
chmod +x scan_suspicious_files.sh
./scan_suspicious_files.sh > scan_report_$(date +%Y%m%d_%H%M%S).txt

五、文件传输与分析

5.1 使用SFTP传输文件

当在远程Linux服务器上发现可疑文件,可以通过SFTP下载到本地分析。

SFTP连接:

bash 复制代码
sftp root@192.168.1.100

常用SFTP命令:

bash 复制代码
# 查看远程目录
ls

# 切换远程目录
cd /var/www/html

# 下载文件
get shell.php

# 下载目录
get -r /var/www/html/uploads

# 上传文件
put clean_file.php

# 查看本地目录
lls

# 切换本地目录
lcd /home/user/evidence

# 退出
exit

批量下载可疑文件:

bash 复制代码
#!/bin/bash
# 批量下载可疑文件脚本

# 定义远程服务器
REMOTE_HOST="192.168.1.100"
REMOTE_USER="root"
EVIDENCE_DIR="/root/evidence"

# 创建本地证据目录
mkdir -p ./evidence

# 使用sftp批量下载
sftp $REMOTE_USER@$REMOTE_HOST << EOF
cd $EVIDENCE_DIR
lcd ./evidence
mget *
EOF

5.2 WebShell检测工具

河马WebShell扫描器(本地使用):

下载可疑文件后,使用专业工具扫描:

bash 复制代码
# Linux版河马
./hm scan /path/to/suspicious/files

# 递归扫描
./hm scan -r /var/www/html

# 生成报告
./hm scan /var/www/html -o report.html

开源WebShell检测工具:

bash 复制代码
# 安装shelldetector
git clone https://github.com/emposha/Shell-Detector.git
cd Shell-Detector
php shelldetector.php -d /var/www/html

六、实战案例分析

6.1 发现WebShell后门

场景: Web服务器被入侵,需要定位WebShell。

排查流程:

bash 复制代码
# 1. 查找最近7天修改的PHP文件
find /var/www/html -name "*.php" -type f -mtime -7 -ls

# 输出:
# 2345678  64 -rw-r--r-- 1 www-data www-data 65234 Feb 10 14:35 /var/www/html/upload/shell.php

# 2. 检查文件内容
head -20 /var/www/html/upload/shell.php

# 发现eval($_POST['cmd']);等可疑代码

# 3. 查看文件MD5
md5sum /var/www/html/upload/shell.php

# 4. 提交到VirusTotal
# (复制MD5到https://www.virustotal.com)

# 5. 检查访问日志
grep "shell.php" /var/log/apache2/access.log

# 找到攻击者IP: 185.xxx.xxx.xxx

# 6. 备份证据
mkdir /root/evidence
cp /var/www/html/upload/shell.php /root/evidence/
cp /var/log/apache2/access.log /root/evidence/

# 7. 删除WebShell
rm -f /var/www/html/upload/shell.php

# 8. 检查是否有其他后门
find /var/www/html -name "*.php" -exec grep -l "eval\|base64_decode\|system\|exec" {} \;

6.2 发现系统命令替换

场景: 系统命令行为异常,怀疑被替换。

排查流程:

bash 复制代码
# 1. 检查ps命令
whereis ps
# 输出: ps: /bin/ps /tmp/ps  ← 发现异常!

# 2. 比较两个文件
ls -l /bin/ps /tmp/ps
md5sum /bin/ps /tmp/ps

# 3. 使用file判断类型
file /bin/ps
file /tmp/ps

# 4. 如果/tmp/ps是恶意的,删除它
rm -f /tmp/ps

# 5. 验证/bin/ps是否也被替换
rpm -V procps-ng  # CentOS/RHEL
# 如果显示MD5改变,重新安装:
rpm --force -ivh procps-ng-*.rpm

# 6. 全面检查其他命令
rpm -Va | grep "^..5"  # 查找MD5改变的文件

总结

Linux文件系统层面的应急响应需要细致和系统化的方法。从服务配置到文件权限,从时间戳到MD5校验,每个维度都可能发现攻击痕迹。

核心要点回顾:

  1. 服务管理要熟练 - chkconfig和systemctl是服务持久化检测的关键
  2. 端口分配有规律 - 1-1024是系统保留,异常监听需警惕
  3. 敏感目录要重点监控 - /tmp、/var/www、/etc/init.d是高危区域
  4. 时间戳可以伪造 - 必须结合MD5校验
  5. 文件类型要验证 - file命令识别伪装文件
  6. 特殊权限是提权关键 - SUID和777权限需要特别关注
  7. 隐藏文件常被忽视 - 以.开头的文件和目录要全面检查
  8. 基线对比最可靠 - 在干净系统上建立MD5基线

能力提升建议:

  • 熟练掌握find命令的各种参数组合
  • 学习编写自动化扫描脚本
  • 建立系统文件完整性基线
  • 定期审计服务和启动项
  • 练习WebShell特征识别
  • 了解常见的文件隐藏和伪装手法

最佳实践:

  • 定期备份关键目录的文件列表和MD5
  • 使用文件完整性监控工具(如AIDE、Tripwire)
  • 限制/tmp等目录的执行权限
  • 实施最小权限原则
  • 定期审计SUID文件和服务配置

记住:**魔鬼藏在细节中。**全面细致的文件系统审计,配合日志分析和网络监控,才能构建完整的应急响应体系。


免责声明: 本文技术内容仅供安全从业人员学习和研究使用。所有命令和技术应当在合法授权的环境中使用。未经授权对他人系统进行分析和操作属于违法行为。

相关推荐
网安CILLE4 小时前
PHP四大输出语句
linux·开发语言·python·web安全·网络安全·系统安全·php
MOON404☾1 天前
006.Backdoor后门编写
网络·安全·网络安全·系统安全
信创天地1 天前
深耕金融政务核心场景:国产化数据库迁移的全流程架构设计与风险管控
运维·网络安全·系统架构·系统安全·运维开发
Coder个人博客1 天前
Linux6.19-ARM64 boot Makefile子模块深入分析
linux·车载系统·系统架构·系统安全·鸿蒙系统
南行*1 天前
MSF安全开发
安全·网络安全·系统安全·ruby
PyHaVolask2 天前
Linux应急响应实战:异常检测、进程分析与安全加固
日志分析·入侵检测·webshell查杀·linux应急响应·进程分析·rootkit检测
MOON404☾2 天前
004.漏洞分析与利用
前端·网络·网络安全·系统安全·firefox
钦拆大仁2 天前
后端开发对系统安全应该做点什么
系统安全