Warning
风险声明本文仅用于网络安全技术学习与研究,相关内容严禁用于未经授权的渗透测试、恶意攻击及任何违法违规行为。任何个人或组织擅自使用造成的法律责任与不良后果,均由使用者自行承担,与本文作者及发布平台无关。
Abstract
全文小结这篇文章记录了一次 Linux 服务器被入侵后的应急排查过程。排查思路基本是:先从 Web 目录和访问日志找入口,再顺着 SSH 登录、后门账户、SUID 提权文件一路往下挖,最终把攻击链条基本还原出来:后台弱口令登录 → 写入 WebShell → SSH 登录主机 → 创建高权限账户 → 落地提权程序与持久化后门。
wp参考:https://pan.baidu.com/s/1fb4eL4U1UaXOdMT4iYDMjA?pwd=kgvqhttps://mp.weixin.qq.com/s/nYNSnPB5xTAslb_rVvioLg?scene=1&click_id=12
在线靶场地址:https://vip.mhtsec.com/ulab/lab.html?page=target-detail&id=38

Linux 服务器被黑应急响应靶场考点该靶场环境来自暗月 2025 培训课程,请使用 web123/Abc@1234 通过 SSH 远程连接,如需 root 使用 sudo -i 切换。flag 答题程序在桌面文件夹中,执行后答题获取最终 flag。
access.log / error.log)时间线提取与关键字检索/var/log/auth.log)登录成功/失败、sudo 使用记录解析*.log.* / *.gz)联合查询技巧(grep/zgrep)mtime/cmin 的近期文件查找(find -mtime -1 / -cmin -720)*.php*.sh*.so)与临时目录(/tmp/dev/shm/var/tmp)重点排查-printf %TY-%Tm-%Td %TH:%TM:%TS %p)/etc/passwd、/etc/group 中 shell 用户与特权组(root、sudo)梳理ls -ld /home/*)与系统新增账号定位sudo 授权记录与提权操作复现find / -perm -u=s -type f -mtime -2)与风险判定top / ps 实时进程观察,异常服务识别netstat -anltp 网络连接清单,异常端口/外部 IP 定位crontab、/etc/cron.* 计划任务全面检查,持久化后门排查gobuster 特征)与后台功能滥用(makehtml_homepage.php)关联分析某天客户反馈:Linux 服务器存在异常连接,疑似被入侵,需要应急工程师到现场排查,并出一份应急响应报告。
根据客户提供的 IP,对服务器进行初步分析。
先通过 SSH 连上目标服务器。
这次任务本质上就是 入侵排查。而这台机器上有 Web 服务,所以第一反应就是:先看有没有 WebShell。
Tip
排查思路真实应急里,Web 根目录、临时目录、用户目录 往往都是最先看的地方。因为攻击者无论是传脚本、写后门还是放临时载荷,十有八九会碰这些路径。
以下是常用排查命令。
# 全盘找最近 24 小时被修改过的文件find / -type f -mtime -1 -ls 2>/dev/null快速定位近期在临时目录、Web 目录及用户目录中被创建或修改的文件,这些位置常被攻击者用于存放恶意脚本、后门或临时载荷。
# 优先排查高风险目录find /tmp /var/tmp /dev/shm /var/www /home -type f -mtime -1 -ls 2>/dev/null全盘扫描最近 24 小时内新增或修改的可疑脚本 / 库文件:
# 重点筛 php / sh / so 这类高危文件find / -type f -mtime -1 \( -name "*.php" -o -name "*.sh" -o -name "*.so" \) -ls 2>/dev/null在 Web 目录中扫描最近 3 天内新增或修改的可疑脚本 / 库文件,并对每个文件执行 ls -lta:
# 在 Web 根目录内缩小范围排查find /var/www/html -type f -mtime -3 \( -name "*.php" -o -name "*.sh" -o -name "*.so" \) 2>/dev/null | xargs ls -lta先从 Web 目录找起,这里也是最容易有 WebShell 的地方。
使用命令找到 shell.php:
# 枚举 Web 目录中的 php / sh / so 文件,并按时间细看find /var/www/html -type f \( -name "*.php" -o -name "*.sh" -o -name "*.so" \) 2>/dev/null | xargs ls -lta
使用 stat 查看详细时间:
# 查看文件的精确时间戳stat /var/www/html/shell.php得到时间:2025-06-29 14:30:15

第一题解出:

继续排查,中间件日志里搜一下关于 shell.php 的访问记录。
# zgrep 能同时搜普通日志和 .gz 压缩日志zgrep 'shell.php' /var/log/apache2/access.log*zgrep:能搜索 普通日志 + .gz 压缩日志access.log*:匹配所有 Apache 访问日志我自己平时更喜欢这个写法,按时间排一下,顺手很多:
# 以 [时间] 字段排序,方便拉时间线zgrep 'shell.php' /var/log/apache2/access.log* | sort -t "[" -k 2
29/Jun/2025:13:23:26 +0800,192.168.10.145 这个 IP 在扫目录,最后扫到 shell.php29/Jun/2025:14:32:53 +0800,192.168.10.94 在通过 http://192.168.10.107/rm4u.php 去使用 shell.php,所以 rm4u.php 也不是什么好东西已知:
192.168.10.107 就是当时被攻击的服务器 IP192.168.10.145 在扫目录192.168.10.94 在连 shell.php锁定 192.168.10.145 和 192.168.10.94,全票打飞这两只狼。
从 14:30 往前推 3 个小时,分析攻击者的入侵行为,顺便看看还有没有别的 IP 混进来。
# 回看 11~14 点这个时间段的 Apache 访问日志zgrep "29/Jun/2025:1[1-4]:" /var/log/apache2/access.log* | sort -t "[" -k 2全是爆破记录:

攻击者是用 gobuster 去爆破的。
先把 gobuster 特征排除掉,再看别的:
# 去掉明显的目录扫描流量,聚焦真实利用请求zgrep "29/Jun/2025:1[1-4]:" /var/log/apache2/access.log* | grep -v gobuster | sort -t "[" -k 2
再统计一下 IP:
# 统计这个时间段里出现过的源 IPzgrep "29/Jun/2025:1[1-4]:" /var/log/apache2/access.log* \| grep -v gobuster \| sort -t "[" -k 2 \| awk '{print $1}' \| cut -d: -f2 \| sort \| uniq -c
/var/log/apache2/access.log.1:192.168.10.145 - - [29/Jun/2025:13:40:05 +0800] "POST /dede/login.php HTTP/1.1" 200 1540 "http://192.168.10.107/dede/login.php" "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0"/var/log/apache2/access.log.1:192.168.10.145 - - [29/Jun/2025:13:40:06 +0800] "GET /dede/index.php HTTP/1.1" 200 4359 "http://192.168.10.107/dede/login.php" "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0"/var/log/apache2/access.log.1:192.168.10.145 - - [29/Jun/2025:13:40:06 +0800] "GET /dede/css/frame.css HTTP/1.1" 200 2464 "http://192.168.10.107/dede/index.php" "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0"/var/log/apache2/access.log.1:192.168.10.145 - - [29/Jun/2025:14:29:19 +0800] "POST /dede/makehtml_homepage.php HTTP/1.1" 200 462 "http://192.168.10.107/dede/makehtml_homepage.php" "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0"/var/log/apache2/access.log.1:192.168.10.145 - - [29/Jun/2025:14:29:21 +0800] "GET /tags.php HTTP/1.1" 200 312 "http://192.168.10.107/dede/makehtml_homepage.php" "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0"/var/log/apache2/access.log.1:192.168.10.145 - - [29/Jun/2025:14:30:15 +0800] "POST /dede/makehtml_homepage.php HTTP/1.1" 200 463 "http://192.168.10.107/dede/makehtml_homepage.php" "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0"/var/log/apache2/access.log.1:192.168.10.145 - - [29/Jun/2025:14:30:16 +0800] "GET /shell.php HTTP/1.1" 200 312 "http://192.168.10.107/dede/makehtml_homepage.php" "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0"192.168.10.145 在 29/Jun/2025:13:40:05 登录了 dede/login.php,随后访问 dede/index.php。到了 29/Jun/2025:14:29:19 和 14:30:15,又两次访问 makehtml_homepage.php,紧接着在 14:30:16 成功访问 /shell.php。
这里大概率就是:后台弱口令登录成功后,利用后台功能把 WebShell 写进去了。
Note
说明一下Apache
access.log默认通常只记录请求行、状态码、来源页、UA 等信息,不会直接记 POST 包体内容,所以这里能还原出“访问了哪个接口”,但拿不到当时具体提交了什么参数。
访问后台后也能发现:确实存在弱口令问题。
客户反馈服务器存在异常连接,那接下来就该看服务器内部了。
# 查看 SSH 成功/失败登录记录grep -E "Accepted|Failed" /var/log/auth.log* | sort
/var/log/auth.log.1:Jun 30 00:42:31 web123-virtual-machine sshd[4009]: Accepted password for sysadmin from 192.168.10.145 port 59900 ssh2发现 192.168.10.145 在 Jun 30 00:42:31 用 sysadmin 账户成功登录过。
所以,用户 sysadmin 和攻击者有强关联性。
sysadmin 的行为# 追踪 sysadmin 在认证日志里的相关行为grep "sysadmin" /var/log/auth.log* | sort
从日志看:
sysadmin 是 00:41:32 新创建的root 组sudo 组Note
一个小提醒文中这里说“加入 root 组”,这个动作本身就已经非常异常了;而真正更关键的权限提升信号通常是被加入
sudo组,或者拥有可直接提权的 sudoers / SUID 配置。
# 列出系统中的 SUID 文件,并按时间排序看最近异常项find / -perm -4000 -type f 2>/dev/null | xargs -r stat -c "%y %n" | sort | tail -n 30
其中有一条特别扎眼:
2025-06-30 00:53:11.753845900 +0800 /usr/local/bin/rootshell最后这个 rootshell 明显不正常。它出现在 /usr/local/bin/ 里,而且创建时间是 30 号 00:53 分,和整个入侵时间线高度吻合。

它通过 setuid + /bin/bash 获得 root shell。rootshell 基本就是提权核心程序。

# 看 /etc/passwd 末尾新增账户tail -n 30 /etc/passwd
这里原文写的是“uuid1000 开始的才是用户”,这里顺手更正一下:应该是看 UID,通常很多 Linux 发行版里 UID >= 1000 的更可能是普通用户(具体也要结合发行版和现场环境判断)。
可以看到这里比较值得关注的是 1001 和 1002 这两个账户。
# 从 systemd/journal 日志里找创建账户、改密码、改组等动作journalctl --no-pager | grep -E "new user|useradd|chpasswd|usermod|backdoor" | tail -n 120
可以看出:
sysadminroot 组sudo 组backdoorsudo 组所以,攻击者最后一次创建的后门用户名是:backdoor。

Summary
攻击链复盘这台机器并不是“突然异常”那么简单,而是已经被攻击者一步一步打穿并做了持久化。
192.168.10.145 | gobuster 特征 | |
dede/login.php | ||
makehtml_homepage.php | ||
shell.php | ||
192.168.10.94rm4u.php 调用 shell.php | ||
sysadmin | ||
sysadmin | ||
/usr/local/bin/rootshell | ||
backdoor |
shell.phpsysadminsysadmin 从 192.168.10.145 成功 SSH 登录/etc/shadow,并进行了提权相关操作/usr/local/bin/rootshellroot 历史命令中明确记录了它的编译和赋权过程backdoorbackdoor 加入 sudo 组用于持久化Danger
应急处置建议如果这是实战现场,而不是靶场,下面这些动作一般都要尽快做。
192.168.10.145、192.168.10.94。shell.php、rm4u.php、/usr/local/bin/rootshell。sysadmin、backdoor,并复核 sudoers、计划任务、SSH 公钥等持久化点。crontab、systemd service、启动项、~/.ssh/authorized_keys、临时目录残留文件等。