前言
在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.phpeval.php,assert.php1.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校验,每个维度都可能发现攻击痕迹。
核心要点回顾:
- 服务管理要熟练 - chkconfig和systemctl是服务持久化检测的关键
- 端口分配有规律 - 1-1024是系统保留,异常监听需警惕
- 敏感目录要重点监控 - /tmp、/var/www、/etc/init.d是高危区域
- 时间戳可以伪造 - 必须结合MD5校验
- 文件类型要验证 - file命令识别伪装文件
- 特殊权限是提权关键 - SUID和777权限需要特别关注
- 隐藏文件常被忽视 - 以.开头的文件和目录要全面检查
- 基线对比最可靠 - 在干净系统上建立MD5基线
能力提升建议:
- 熟练掌握find命令的各种参数组合
- 学习编写自动化扫描脚本
- 建立系统文件完整性基线
- 定期审计服务和启动项
- 练习WebShell特征识别
- 了解常见的文件隐藏和伪装手法
最佳实践:
- 定期备份关键目录的文件列表和MD5
- 使用文件完整性监控工具(如AIDE、Tripwire)
- 限制/tmp等目录的执行权限
- 实施最小权限原则
- 定期审计SUID文件和服务配置
记住:**魔鬼藏在细节中。**全面细致的文件系统审计,配合日志分析和网络监控,才能构建完整的应急响应体系。
免责声明: 本文技术内容仅供安全从业人员学习和研究使用。所有命令和技术应当在合法授权的环境中使用。未经授权对他人系统进行分析和操作属于违法行为。