文章总结: 本文详细介绍了Linux应急响应中的主机排查方法,包括系统信息查询、账号安全、进程分析、计划任务检查、自启动项排查、服务管理、日志分析和动态链接库检测等技术要点,特别针对恶意软件和rootkit的检测与清除提供了实用命令和技巧,是Linux系统安全应急响应的实用指南。
综合评分: 91
文章分类: 应急响应,终端安全,恶意软件,漏洞分析,安全工具
【应急响应基础】三、主机排查-Linux基础排查
原创
混子Hacker
混子Hacker
2025年12月8日 06:36
四川
免责声明
请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不承担任何法律及连带责任。
[ 简介 ]
Linux应急基础
在应急响应的过程中经常遇见很多系统相关项排查,如主机网络连接、主机启动进程、主机启动项、计划任务等。本文主要介绍Linux系统中如何对这些内容进行查询
| |
| — |
| 目录 一、系统基础信息 1.1 系统信息查询 1.2 网络信息查询 1.3 抓包 二、账号信息 2.1 所有用户 2.2 当前用户 三、日志分析 3.1 进程查询 3.2 进程中止 四、计划任务 4.1 类型 4.2 查询修改 4.3 日志查询 五、启动项 六、服务分析 6.1 基础查询 6.2 删除服务 七、日志分析 7.1 日志目录 7.2 日志查询 八、动态链接库 8.1 $LD_PRELOAD加载 8.2 /etc/ld.so.preload加载 8.3 修改器修改加载 |
Linux应急基础
混子Hacker
01
系统信息
1.1 系统信息查询
cat /proc/version
uname -a
内核名称(Kernel name)对应 uname -s。主机名(Nodename / Hostname)对应 uname -n。内核版本(Kernel release)对应 uname -r。内核版本详细信息(Kernel version)编译时间(如 Thu Feb 1 10:35:14 UTC 2024)对应 uname -v。机器硬件架构(Machine hardware name)如 x86_64、aarch64、i686 等。对应 uname -m。处理器类型(Processor type)对应 uname -p(注意:该字段在部分系统上不可靠或为 unknown)。硬件平台(Hardware platform)通常与 -m 相同,例如 x86_64。对应 uname -i(该选项在较新系统中已弃用,可能返回 unknown)。操作系统(Operating system)通常是 GNU/Linux。对应 uname -o。
1.2 网络信息查询
netstat -antp
| 选项 | 含义 |
| — | — |
| -a | 显示 所有 连接和监听端口(包括 LISTEN 和 ESTABLISHED 等) |
| -t | 显示 TCP 协议的连接 |
| -u | 显示 UDP 协议的连接 |
| -n | 以 数字形式 显示地址和端口号(不解析主机名和服务名),强烈建议加上,速度更快 |
| -l | 仅显示 监听(Listening) 的套接字 |
| -p | 显示 进程 PID 和程序名(需 root 权限) |
| -r | 显示 内核路由表(等价于 route -n) |
| -i | 显示 网络接口列表(类似 ifconfig -s) |
| -s | 显示 各协议的统计信息(如 TCP/UDP 包数、错误数) |
ss -tunlp
ss -tunlp# 参数说明:# -t: TCP# -u: UDP# -l: listening# -n: 不解析服务名(显示数字端口)# -p: 显示进程 PID 和名称(需 root)
lsof
# 用于列出当前系统中被进程打开的文件lsof -i :822 # 查看占用 80 端口的进程lsof -i TCP # 查看所有 TCP 连接
网卡信息
ifconfig 、ip 看网卡详细信息
/etc/resolv.conf 查看dns配置
traceroute 跟踪路由路径
1.3 抓包
tcpdump -网络包分析
-i # eth0指定网卡(any 表示所有接口)-n # 不解析主机名(加快速度)-nn # 不解析主机名和端口名(显示数字)-s 0 # 抓取完整数据包(默认只抓前 262144 字节)-w # file.pcap 保存为 pcap 文件(供 Wireshark 分析)-r # file.pcap 读取 pcap 文件-c # 10 只抓 10 个包后退出-v, -vv, -vvv #详细程度递增
查看(可读性较差建议导出之后使用wireshark查看)
# 查看所有包(简略)tcpdump -r traffic.pcap# 显示详细内容(含 payload)tcpdump -r traffic.pcap -vvv -X# 只看 HTTP 请求tcpdump -r traffic.pcap -nn -A 'tcp port 80 and (GET or POST)'# 只看与某 IP 的通信tcpdump -r traffic.pcap host 192.168.1.100
混子Hacker
02
账号信息
2.1 所有用户
cat /etc/passwd 、getent passwd
awk -F: ‘$3 == 0 && $1 != “root” {print}’ /etc/passwd #查询uid为0的非root用户
# 输入结果描述:用户名:密码占位符:UID:GID:用户描述:家目录:登录Shell# 密码占位符: x表示密码已移至更安全的 /etc/shadow 空(::):表示无密码登录,*或!表示账户被锁定,无法通过密码认证# 用户ID(UID): 0:root 超级用户, 1~999(或 1~499)系统保留账号, 1000+:普通用户# 登录Shell -/bin/bash、/bin/sh、/bin/zsh(可交互登录) -/sbin/nologin 或 /usr/sbin/nologin(禁止登录,用于服务账户) -/bin/false(效果类似 nologin)(/sbin/nologin表示无法登录)
cat /etc/shadow
# 需要root权限用户名:加密密码:最后修改日期:最小天数:最大天数:警告天数:非活动天数:失效日期:保留字段
2.2 当前登录用户
id # 当前用户信息包含idwho # 显示当前登录的用户列表whoami # 当前用户名w # 显示登录用户 + 正在运行的进程
混子Hacker
03
进程分析
3.1进程查询
ps 进程快照
a # 显示所有终端进程p # 进程号x # 显示后台进程 无终端进程 u # 以易于查看格式显示 -e # 所有进程 显示所有进程(等价于 aux 的效果)-u # 显示用户名或ID -f # 全格式输出(Full format),包含 PPID、C、STIME 等
pstree -p 进程树、和进程号
top 查看CPU利用率,实时监控输入q退出
进程启动文件信息
lsof -p pid 查看进程打开的文件
进程虚拟目录
ls -la /proc/[PID]
# 说明exe # 指向进程可执行文件的符号链接cmdline #启动命令行参数cwd #当前工作目录fd/ # 打开的文件描述符列表environ # 环境变量(status #进程状态、内存使用、UID/GID 等(maps # 内存映射(加载的库、堆栈、匿名内存等)stat / statm #原始性能统计(CPU 时间、页数等)limits #资源限制(如打开文件数、内存上限)
# 查看进程详细信息status #状态cmdline #命令行maps # 查看进程内存映射
3.2 停止进程
kill —— 按 PID 发送信号(最精准)
kill <PID>kill -9 <PID> #强制终止(发送 SIGKILL)
killall —— 按进程名批量终止
killall xmrig # 终止所有名为 xmrig 的进程(默认 SIGTERM)killall -9 xmrigkillall -I XmRiG # 忽略大小写
pkill —— 按名称/用户/命令行匹配终止(更灵活)
pkill nginxpkill -f "python malicious.py" # 按完整命令行终止(推荐用于带参数的脚本)pkill -u username # 终止某用户的所有进程pkill -9 -f xmrig # 强制终止pkill -f ".configures/xmrig" #清除隐藏挖矿进程
混子Hacker
04
计划任务
计划任务格式
* * * * * [user] command
1-5列分别表示 分 时 天 月 周几
* 所有即每天每时的意思
, 表示并列 3,5表示指定周期的3,5 如每周3和5执行
- 表示连续区间,3-5表示3至5这个区间内执行,如每周三至周五执行
/ 表示步幅,/5表示每5个间隔执行一次,如每五分钟
user #执行的用户系统cron中指定用户
command # 执行的命令
4.1 类型
系统级计划任务
# 系统cron配置文件/etc/crontab/etc/cron.d/ # 分片配置文件目录/etc/cron.daily/ # 每日执行/etc/cron.weekly/ # 每周执行/etc/cron.monthly/ # 每月执行/etc/cron.hourly/ # 每小时执行
用户级计划任务
# 用户cron文件位置/var/spool/cron/crontabs/ # 不同发行版位置可能不同/var/spool/cron/ # CentOS/RHEL用户cron目录/tmp/crontab.* # 临时编辑文件
4.2 查询修改
查看当前用户和指定用户的计划任务
cat /var/spool/cron/root
crontab
-l # 列出当前用户的计划任务-e # 编辑当前用户的计划任务-r # 删除当前用户的所有计划任务
查看系统主 cron 文件(可指定运行用户)
cat /etc/crontab
如下表示每隔1分钟执行一次
4.3 检查cron日志
tail -f /var/log/cron
混子Hacker
05
自启动项
1. /etc/rc.local
脚本文件,传统上用于在系统启动时执行用户自定义的命令或脚本。当所有其他初始化脚本执行完毕后,会执行 /etc/rc.local 文件中的命令。因此,用户可以将需要在启动时运行的命令(如启动自定义服务、设置环境变量等)放入该文件
cat /etc/rc.local
2、/etc/rc.d/
System V init系统的主要启动脚本目录
init.d/ – 所有服务的启动脚本
rc0.d/ ~ rc6.d/ – 运行级别对应的脚本链接
rc.local – 本地启动脚本(有些系统放在这里)
3.、/etc/rc.d/rc[0-6].d/
运行级别特定的启动目录
-
每个目录对应一个运行级别(runlevel):
-
rc0.d/ – 运行级别 0:关机
-
rc1.d/ – 运行级别 1:单用户模式(救援模式)
-
rc2.d/ – 运行级别 2:多用户模式,无NFS
-
rc3.d/ – 运行级别 3:完全多用户模式(文本模式)
-
rc4.d/ – 运行级别 4:未使用(可自定义)
-
rc5.d/ – 运行级别 5:图形界面模式
-
rc6.d/ – 运行级别 6:重启
混子Hacker
06
服务分析
6.1 基础查询
systemctl status PID 查询指定进程服务详细信息
systemctl start service_name # 启动服务systemctl stop service_name # 停止服务systemctl restart service_name # 重启服务systemctl reload service_name # 重新加载配置(不重启进程)systemctl status service_name # 查看服务状态# 启用服务开机自启systemctl enable apache.service# 禁用服务开机自启systemctl disable apache.service
6.2 删除服务
systemctl stop service 停止服务
rm /etc/systemd/system/<服务名>.service 删除单元文件
混子Hacker
07
日志分析
7.1 /var/log 目录结构
/var/log/messages # 通用系统消息(RHEL/CentOS)/var/log/syslog # 通用系统消息(Debian/Ubuntu)/var/log/auth.log # 身份验证日志(Debian/Ubuntu)/var/log/secure # 身份验证日志(RHEL/CentOS)/var/log/boot.log # 系统启动日志/var/log/dmesg # 内核环形缓冲区日志/var/log/cron # 定时任务日志/var/log/maillog # 邮件服务器日志/var/log/httpd/ # Apache Web服务器日志/var/log/nginx/ # Nginx Web服务器日志/var/log/mysql.log # MySQL数据库日志/var/log/audit/ # Audit审计日志(如果启用)/var/log/lastlog # 所有用户最后一次登录二进制日志,需使用lastlog命令查看/var/log/btmp #记录错误登录日志二进制文件,需使用lastb命令查看/var/log/utmp #记录当前已经登录的用户信息,需使用w,who,users等命令来查询/var/log/wtmp #记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。需使用last命令来查看
7.2 日志查询
cat /var/log/xx
tail -f /var/log/messages # 实时查看
lastb 登录失败日志
less large.log 分页查看,空格向下、b向上
文件过大时
1、筛选指定日志查看
# 提取特定时间段日志sed -n '/2025-12-07 10:00:00/,/2025-12-07 11:00:00/p' large.log# 提取今天日志grep "$(date +'%Y-%m-%d')" large.log# 提取最近一小时grep "$(date -d '1 hour ago' +'%Y-%m-%d %H:')" large.log
2、切割日志
# 按行数分割(每个文件100万行)split -l 1000000 large.log large_part_# 按大小分割(每个文件100MB)split -b 100M large.log large_part_# 按时间戳分割awk '/2025-12-07/{print > "log_20251207.txt"}' large.lo
混子Hacker
08
动态链接库
动态链接库预加载机制是系统提供给用户运行自定义动态链接库的一种方式,在可执行程序运行之前就会预先加载用户定义的动态链接库的一种技术,这种技术可以重写系统的库函数,只需要在预加载的链接库中重新定义相同名称的库函数,程序调用库函数时,重新定义的函数即会短路正常的库函数
在linux操作系统的动态链接库加载过程中,动态链接器会读取LD_PRELOAD环境变量的值和默认配置文件/etc/ld.so.preload的文件内容,并将读取到的动态链接库进行预加载,即使程序不依赖这些动态链接库
https://www.freebuf.com/column/162604.html
8.1 利用LD_PRELOAD加载恶意动态链接库
LD_PRELOAD=/lib/evil.so LD_PRELOAD的值设置为要预加载的动态链接库
export LD_PRELOAD 导出环境变量使该环境变量生效
检测
输出LD_PRELOAD的值(默认LD_PRELOAD环境变量无值),如果LD_PRELOAD中有值,则将该文件上传到virustotal或微步在线等恶意软件检测平台检测该文件是否正常
清除
使用命令unset LD_PRELOAD即可实现卸载使用LD_PRELOAD环境变量安装的恶意动态链接库。如下图,可以看到被隐藏的文件evil.so显示出来了。
8.2 利用/etc/ld.so.preload加载恶意动态链接库
将恶意动态链接库路径写入/etc/ld.so.preload(没有则创建)配置文件中
检测
因为恶意动态链接库一般都有隐藏/etc/ld.so.preload文件的功能,使用普通的cat命令和busybox中的cat命令查看/etc/ld.so.preload文件内容对比,即可判断出是否有通过/etc/ld.so.preload配置文件加载的恶意动态链接库。
清除
清除上方/etc/ld.so.preload文件中查看到的/lib/evil.so文件,使其无法正常预加载,然后清除/etc/ld.so.preload中的恶意文件内容
8.3 修改动态链接器来实现恶意功能
使用的恶意rootkit名称为Vlany,下载地址为https://github.com/mempodippy/vlany
检测
获取系统中的动态链接器的文件路径,判断该动态链接器文件的完整性。这里测试系统是centos,自带rpm校验功能
使用strace命令来查看预加载的配置文件是不是/etc/ld.so.preload文件,如下图,动态链接库预加载的配置文件是/sbin/.XsknPn3F而不是原有的配置文件确认系统中存在修改动态链接器的rootkit
使用busybox自带的cat命令查看该文件,因为使用正常cat命令无法查看该文件,被预加载的库函数给隐藏了
清除
清除修改动态链接器的rootkit,需要使用相同系统的相同版本动态链接器替换被修改了的动态链接器,才能达到彻底清除的目的,暂时缓解的方式则是将上方检测过程中看到的恶意动态链接库删除,以及将对应的动态链接库配置文件中的内容清除。
| |
| — |
| 本专栏往期文章: 【应急响应基础】一、系统查询-Windows基础排查 【应急响应基础】一、系统查询-Windows基础排查2 【应急响应基础】二、Windows病毒排查-手动排查 |
<<< END >>>
原创文章|转载请附上原文出处链接
更多漏洞|关注作者查看
作者|混子Hacker
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:混子Hacker 混子Hacker《【应急响应基础】三、主机排查-Linux基础排查》