应急响应|学校不教的我来教!某学校系统中挖矿病毒的超详细排查思路

原文链接: https://mp.weixin.qq.com/s?__biz=Mzg5MDA5NzUzNA==&mid=2247489445&idx=1&sn=4c075fbb5045b9a184dc54e9de443288

应急响应|学校不教的我来教!某学校系统中挖矿病毒的超详细排查思路

藏剑安全 2025-07-22 01:30

本篇文章共 7000字+1视频,完全阅读全篇约 110 分钟 州弟学安全,只学有用的知识

前言

文章开篇还是关于我对靶场开发
的那些话

在本次环境学习之前,我也想回答大家和自己心中的一些疑虑,因为有师傅也包括我在之前也认为,靶场/靶机是水货
,是基于模拟的角度进行出发的,是没有规律的,是乱出题的,是糊弄人的,当然了,很多靶场包括培训或有些比赛多少会有这个情况的,这个毋庸置疑,但是从我的角度来看,我自己的亲身经历,我为什么要这么做?

以攻击视角来看,我能做什么,我为什么要做靶机?

在23年,我开始做的州弟学安全这个账号,一开始的初衷是为了记录、总结以及学习,因为我之前表达的能力很差,当时做打SRC,从公益SRC开始(因为容易挖掘),几乎日更,没有这么难的,我的思路也慢慢有了,知道什么地方可能会出现什么漏洞,我着重分享我的渗透思路,但是后面被举报下架、被警告甚至有触碰法律责任的风险(即使打码了)

应急响应|学校不教的我来教!某学校系统中挖矿病毒的超详细排查思路

其次,从24年下半年开始,因为一些分享POC事件的公众号被约喝茶,甚至大批量的删除、注销公众号,这也导致目前很多资源无法分享

乃至在25年前个月开始,某平台大面积删除关于渗透测试(红方)文章,这也恰恰证明,网络安全(含攻击行为)的学习文章(实战)将在后期越来越难找到

应急响应|学校不教的我来教!某学校系统中挖矿病毒的超详细排查思路

截止目前,在我的观点和对后期的判断以及当下的形势,我认为我做靶场的道路是没错的,也是坚定的,可能对很多人是不理解的,对于渗透靶场的一些思路也是来自我日常挖洞的一些思路复现,当然后期会在(PHP/Java SRC逻辑漏洞以及安服渗透测试漏洞
)进行仿真复现

以防守视角来看,我能做什么,我为什么要做靶机?

有时候来看,防守远比渗透的靶机难做,因为渗透只需要复现漏洞出来,而防守需要做到环境的仿真以及合理的攻击并讲清相应的思路,这也是很多人认为有些靶机是没有逻辑,糊弄人的,甚至是在正常的环境复现中,我们没有办法做到完全仿真,比如:IDS,EDR,WAF
等设备的调用,因为很多设备没有开源,那么我们只能通过流量或者找平替去复现,百分百仿真很难实现,再加上成本的原因

比如:内网的横向特征,一般情况下安服是基于安全设备的告警去追流量的,比如通过哪个设备扫描的,通过哪个漏洞上线的这样去排查,当然有时候无感打穿的情况下,还需要根据对外,对内的资产进行日志和流量的排查,这样大规模的复现也是很难的,所以想要做的有逻辑、严谨且不挨骂的产出是慢的

回到本次学习环境

本次环境完全仿真了在某学校系统年久失修的情况,被黑客攻击后进行了控制并上传了挖矿和后门,需要你根据题目知识点排查,举一反三思考学习(学习请不要死记硬背
)

应急响应|学校不教的我来教!某学校系统中挖矿病毒的超详细排查思路

版权:州弟学安全(公众号&B站同名),不定时直播自行开发靶场学习思路,目前红蓝靶场共发布近20个  

背景:完全仿真了某学校长期未运营维护的程序,被黑客发现了漏洞,但好在学校有全流量设备,抓取到了过程中的流量包
需要你进行上机以及结合流量分析,排查攻击者利用的漏洞以及上传利用成功的木马
以及清除掉攻击者上传的挖矿程序以及后门程序,挖矿环境完全还原了真实环境,但不会出网,比较有意义,清除做了check操作,你只需要按照相关题目引导进行清除
在指定目录下查看flag提交即可,流量包在远程登录成功后/hacker2025.pcap(玄机直接以附件形式下载)  
流量中被攻击机IP:192.168.37.11  
SSH远程端口:2222 账号密码:root/edusec123  

WEB端口为:19999 你需要访问和流量进行还原攻击者路径,在注册账号登录成功后,下载首页的应急响应报告模板进行复现描述攻击过程以及加固流程,非常具有学习意义  

环境地址:网盘离线安装:https://docs.qq.com/doc/DVkNMaVhUTXpnekpa(夸克官方一直屏蔽大文件,很烦人,所以需要在线表格更新)  
(离线获取主机IP需以扫描的方式获取,因为远程登录是映射的docker容器,NAT是动态IP,所以需要进行扫描IP获取主机,如:nmap -PE -n -T4 192.168.37.0/24 看到有2222端口和19999端口的大概率就是了)  
玄机在线体验:https://xj.edisec.net/challenges/159  
玄机邀请码获取(关注州弟学安全公众号发送邀请码)

在本篇文章中仍然是采用PPT+文档+直播+录播的方式,一方面锻炼我自己的思维能力和总结,另一方面是和大家互动

fig:
环境均为自作,不针对任何现实环境,仅供学习参考,实战请遵循网络安全法

  • 如您认为对您学习有了帮助,请一键三连

fig:

流程复现

超详细的直播视频教学,建议观看,更能身临其境(共1.4小时)

题目:  
1. 使用工具分析共有多少IP存在扫描web特征,提交其数量  
2. 在2025.6.22日17点03分27秒,192.168.37.10,55689端口进行访问的url路径以flag方式进行提交(应急三要素缩小范围)  
3. 提交存在使用NMAP扫描特征的IP  
4. 审计流量并结合web站点,攻击者通过什么漏洞进行控制主机,提交漏洞文件名接口  
5. 审计流量并结合web站点,攻击者通过哪个用户名利用的漏洞,提交其注册用户名  
6. 审计流量并结合漏洞,提交攻击者控制成功木马文件名  
7. 审计流量并清除掉攻击者上传的木马,清除成功后在/var/flag/1/flag中查看flag并提交  
8. 黑客拿到主机权限后,上传了挖矿木马,需要你提交矿池地址  
9. 清除掉主机上的挖矿木马,完成后在/var/flag/2/flag文件中查看flag并提交  
10. 黑客做了后门,即使你清除以后,仍然会定时更新挖矿程序并运行,你找到这个程序,提交其路径  
11. 清除掉后门挖矿程序,在/var/flag/3/flag下查看提交flag

资产查找

如果使用的玄机平台的话,直接使用给到的主机IP连接排查即可

fig:

如果我们本地离线搭建的话,比如安装到本地成功后,且开启了NAT(与你其它攻击机一个网段内),可以使用nmap或fscan扫描网段获取IP(因为给到的端口是docker容器映射出来的,并不是宿主机)

fig:

已知我kali攻击机的IP为192.168.37.12
,网段就是192.168.37.0/24
,且edusec
靶机同样开启了NAT,直接开机后,用攻击机扫本段即可

nmap -PE -n -T4 192.168.37.0/24

fig:

此处并没有进行全端口扫描,因为速度太慢,那么这样就知道目标IP是192.168.37.11
了,对应的WEB端口就是192.168.37.11:19999
以及SSH端口为192.168.37.11:2222

使用工具分析共有多少IP存在扫描web特征,提交其数量

先使用ssh远程工具连接2222端口,账号密码:root/edusec123
,在root目录下有个hacker2025.pcap
流量包,下载到本地分析,此处我用finashell
进行连接

fig:

登录进来以后看到流量包,然后finashell看到,CPU满载了,这就是挖矿的一大特征,因挖矿需要算力,需要消耗GPU或CPU资源,当然,我们这里是模拟的,并不会真实挖

下载到流量包后,用wireshark
打开,在上方统计->ipv4->all address

fig:

然后进行过滤器条件如下,进行筛选带有扫描特征的条件,那么之前讲过,怎么判断扫描特征?短时间内大量访问不存在的文件属于扫描特征,但是由于实战中每个站点”文件不存在
“返回状态码不一致,可能是404、403、500、502、405等情况,那么我们可以自行测试

fig:

那么经过测试我们是可以看到,本次站点文件不存在是404
状态码,看UI使用的是tomcat

http.response.code==404

fig:

通过扫描次数看,实际上排除极个别少量的次数以及被攻击机本机的IP,是可以看到有29个IP进行了扫描

那么我还是比较偏向于在实战中使用
ZUI(前身brim)
进行过滤流量的,在之前的应急响应文章中我也是用这个分析的,速度很快

count() by id.orig_h,status_code|status_code==404

count() by 表示计数
id.orig_h表示源地址
status_code表示状态码
,|表示条件分隔

fig:

与wireshark不同的是,ZUI在筛选后没有关于被攻击机的流量,所以只需要将少量的状态码(这里称为误报
)进行剔除,最终也是29个

在2025.6.22日17点03分27秒,192.168.37.10,55689端口进行访问的url路径以flag方式进行提交(应急三要素缩小范围)

如果这个组合条件你在wireshark不会用的话,建议去多问问AI,因为这不是期末考试,实战应急响应,可以使用很多手段
,只要可以解决问题,这就是能力

提示词:  
在2025.6.22日17点03分27秒,192.168.37.10,55689端口进行访问的url路径  
给我wireshark的筛选语句

fig:

frame.time >= &#34;Jun 22, 2025 17:03:27&#34; and frame.time <= &#34;Jun 22, 2025 17:03:28&#34; and (ip.src == 192.168.37.10 or ip.dst == 192.168.37.10) and tcp.port == 55689

其实这里题目有一些争议的,因为在这一秒内有三个URL访问请求,看图

fig:

第一个请求看特征就知道是上传文件、第二个看关键词就知道上传成功,第三个应该是GET访问了上传的文件,实际上最终的flag为:06853c4f-8b05-4949-90ae-9adc49f27a94.jsp

那么这个题目的灵感是来自于一位师傅那天我们聊天的时候提到的,假设在一个办公楼内,每天可能出网4-10T流量,在这个办公楼内出网还都是一个IPV4互联网地址,那么怎么判断攻击流量呢?
1. 内网使用NAT或者固定内网分配的IP,但是最终出网用的是固定的IPV4+动态分配的端口

  1. 有具体时间,也就是我们有了以上:IPV4地址+端口+具体时间,就可以将攻击者缩小到一定范围内,可能把10T流量缩小到10M

提交存在使用NMAP扫描特征的IP

首先NMAP默认最大的特征是在扫描HTTP的时候会在URL以及UA里面包含nmap关键字的特征

http.request.headers contains &#34;Nmap&#34;  
http.user_agent contains &#34;Nmap&#34;

fig:

假如对方没有扫描HTTP协议,只进行了端口扫描?那么在nmap中使用TCP SYN扫描的情况下,可以进行筛选

tcp.flags.syn == 1 and tcp.window_size == 1024 and tcp.len == 0 and ip.frag_offset == 0

fig:

默认情况下大部分版本的nmap窗口大小为 1024
,当然也有其它版本的扫描可能为: 2048
3072
4096

如果使用UDP进行了扫描,则筛选条件如下

(udp.length == 8 and ip.frag_offset == 0) or (icmp.type == 3 and icmp.code == 3)

fig:

这里没有结果的原因是因为,本次扫描使用的nmap -sV
 参数,sV默认使用的SYN进行半连接扫描

所以最终使用nmap扫描的IP是:192.168.37.4

审计流量并结合web站点,攻击者通过什么漏洞进行控制主机,提交漏洞文件名接口

刚才在第二个题目的时候,我们看到了文件上传的操作,那么是否可以确定WEB起码有文件上传的功能了?思路很清晰,排除掉非正常状态码或者只看正常状态码,以URL访问次数进行排序,这次还是使用ZUI
进行筛选

count () by id.orig_h,status_code,uri|status_code==200 | sort -r count

fig:

那么经过筛选且升序后可以看到,访问最多的是一个上传成功的jsp文件,其次是上传成功的接口,然后就是IP就是:192.168.37.10
这个IP

前往wireshark筛选这个上传成功的接口,看看上传了什么内容

ip.addr == 192.168.37.10&&http.request.uri==&#34;/servlet/user/profile?uploadSuccess=true&#34;

fig:

追踪其中一个TCP流,实际是可以发现上传的冰蝎jsp木马的

fig:

通过图片可以看到上传文件名为shell.jsp,后面上传成功后,302跳转到/servlet/user/profile?uploadSuccess=true
接口,表示上传成功的回显,至于最后访问的06853c4f-8b05-4949-90ae-9adc49f27a94.jsp
还是70b86b64-ce15-46bf-8095-4764809e2ee5.jsp
都是后端进行了重命名操作的

那么这里漏洞文件接口为uploadAvatar
,因为是从这个接口上传的,这里存在任意文件上传漏洞

fig:

审计流量并结合web站点,攻击者通过哪个用户名利用的漏洞,提交其注册用户名

其实我们访问WEB端口看到是有鉴权的,那么攻击者肯定是通过注册账号进去的,有时候溯源,账号可能会有很大的用处

fig:

比如大部分人的习惯就是,账号密码比较有意义,这样方便记住,但是这也容易被溯源到,当然,不是所有情况都这样

fig:

随便输入账号密码,抓个接口,然后去流量筛选

ip.addr==192.168.37.10&&http.request.uri==&#34;/servlet/user/login&#34;

fig:

登录成功后肯定会跳转到首页或者其它页面,那么之前说过,跳转重定向状态码是什么?是302

fig:

往下看到,用户名为wangyunqing
密码为wangyunqing123
,后面location跳转到了index.jsp,那么可以知道这里的攻击者注册用户名为:wangyunqing

审计流量并结合漏洞,提交攻击者控制成功木马文件名

这里更容易了,实际上在前面看到攻击者上传了两个文件,但是访问次数最多的是:/uploads/70b86b64-ce15-46bf-8095-4764809e2ee5.jsp

fig:

流量来筛选一下,看看做了什么操作?

ip.addr==192.168.37.10&&http.request.uri==&#34;/uploads/70b86b64-ce15-46bf-8095-4764809e2ee5.jsp&#34;

fig:

之前文章中讲过,在冰蝎初次连接后会生成一个session,后续进行通信使用,那么图中的GET请求就是生成session的过程

fig:

那么通过”希谭实验室
“师傅做的工具,我们将其中一条请求流量放进去以后,然后解密并反编译后,在Tmjldiqio
类中看到执行的命令是做了一个计划任务进去的

所以最终成功控制主机的木马文件名为:70b86b64-ce15-46bf-8095-4764809e2ee5.jsp

审计流量并清除掉攻击者上传的木马,清除成功后在/var/flag/1/flag中查看flag并提交

这里做了一个check
操作,就是检测我们是否清除了木马,因为以往我们只能被动去做题,没有check
有很大局限性,比如增删改操作,所以当我们做了清除操作
后,flag会在主机指定文件生成

fig:

上机后假如不知道webshell在哪个目录,具体路径,直接find查找试试

find / -name *4764809e2ee5.jsp  
// 这里我发现上传成功我访问的文件名和实际上传的在服务器储存的文件名有差距,所以模糊搜索

fig:

直接进行rm -rf删除即可

rm -rf /var/lib/tomcat9/webapps/ROOT/uploads/70b86b64-002dce15-002d46bf-002d8095-002d4764809e2ee5.jsp

然后查看/var/flag/1/flag
文件进行提交即可

fig:

flag{1979c46c2af37dc62a4b05881e816995}

黑客拿到主机权限后,上传了挖矿木马,需要你提交矿池地址

在一开始我们实际就看到了,远程连接后,CPU使用率疯狂飙升,执行TOP
看一下

fig:

执行ps -ef
看一下后台进程,是可以看到有一个/tmp/miner.jar
在运行的

fig:

直接下载下来使用jadx
工具进行反编译jar包

fig:

其实是可以看到,在Miner类中定义了矿池地址和钱包地址,但是实际上并没有对外出网的请求,后面17行定义了使用for循环增加线程然后消耗CPU的性能,接着下面使用SHA-256进行哈希计算,所以大可不必担心会出网挖矿哦

那么最终矿池地址为:pool.minexmr.com:4444

通过微步也可以查询到确实是真实挖矿地址

fig:

清除掉主机上的挖矿木马,完成后在/var/flag/2/flag文件中查看flag并提交

找到了矿池程序以后,那么就应该后面的收尾工作了,删除挖矿木马文件

rm -rf /tmp/miner.jar

fig:

确实删除了,但是CPU还在消耗,说明后台程序还在运行,我们需要kill掉这个进程

fig:

删除文件且杀掉进程成功,CPU消耗下来了,查看/var/flag/2/flag

fig:

flag{da236fe0cda81bfc03d022799589110e}

黑客做了后门,即使你清除以后,仍然会定时更新挖矿程序并运行,你找到这个程序,提交其路径

一般这种情况,黑客好不容易拿到了主机控制权限,是肯定会做后门的,比如备份文件
计划任务
隐藏用户
等,这里我们只针对后门排查,其它的可以参考既往文章进行排查

fig:

一分钟后程序再次被恢复以及CPU继续飙升,恢复的原理肯定有检测,那么执行肯定不是手动,那也就是自动执行

查看计划任务,比如

crontab -l  
ls -la /etc/cron*

fig:

可以看到,在root权限运行了一个persistence.sh
的脚本,且目录还是.per
也就是隐藏目录

* * * * * /usr/share/.per/persistence.sh  
表示每分钟运行一次

fig:

#!/bin/bash  

SOURCE_FILE=&#34;/usr/share/.miner/miner.jar&#34;
DEST_FILE=&#34;/tmp/miner.jar&#34;
PROCESS_NAME=&#34;java -jar $DEST_FILE&#34;
LOG_FILE=&#34;/var/log/.malware_events.log&#34;

if pgrep -f &#34;$PROCESS_NAME&#34; > /dev/null; then

exit 0  
else

echo&#34;[$(date)] Miner process not found. Taking action...&#34; >> &#34;$LOG_FILE&#34;

if [ ! -f &#34;$DEST_FILE&#34; ]; then
echo&#34;[$(date)] Miner file ($DEST_FILE) is missing. Restoring from backup...&#34; >> &#34;$LOG_FILE&#34;

cp &#34;$SOURCE_FILE&#34;&#34;$DEST_FILE&#34;
chmod +x &#34;$DEST_FILE&#34;
fi

if [ -f &#34;$DEST_FILE&#34; ]; then
nohup java -jar &#34;$DEST_FILE&#34; > /dev/null 2>&1 &  
echo&#34;[$(date)] Miner process restarted with PID $!.&#34; >> &#34;$LOG_FILE&#34;
else

echo&#34;[$(date)] CRITICAL: Could not restore miner file from backup. Cannot start.&#34; >> &#34;$LOG_FILE&#34;
fi

审计代码可以看到,还有个备份的隐藏挖矿脚本,在:/usr/share/.miner/miner.jar
,然后PROCESS_NAME=”java -jar $DEST_FILE”会运行相关脚本,后面的程序逻辑
1. 先检测/tmp/miner.jar是否存在且运行

  1. 如果存在则exit退出

  2. 如果不存在则将备份目录下的miner.jar文件复制到/tmp/下,然后运行:nohup java -jar “$DEST_FILE” > /dev/null 2>&1 &

所以最终这个后门程序的路径为:/usr/share/.per/persistence.sh

清除掉后门挖矿程序,在/var/flag/3/flag下查看提交flag

清除掉所有挖矿程序,不只是后门哦,也就是原有的已被恢复的挖矿程序
以及进程
定时任务
以及定时任务中的脚本
隐藏备份的挖矿脚本

crontab -e //编辑计划任务清除掉计划任务  
rm /usr/share/.per/persistence.sh //删除掉后门脚本程序  
rm /usr/share/.miner/miner.jarh //删除备份挖矿程序  
rm /tmp/miner.jar //删除已恢复的挖矿脚本  
kill -9 (PID) //杀掉挖矿进程

fig:

等待一分钟过后,CPU和进程都恢复正常,查看/var/flag/3/flag
文件获取到flag

fig:

flag{27bd067769b51ed71f899c7a6f08af2c}

实际上最终还有点没有收尾,不要忘了,黑客是通过任意文件上传
获取到的主机控制权限,那么这个修复问题,留给你了

报告输出

报告三要素,首先下载相关文档,文档需要注册账号后在首页获取

fig:

三要素:
1. 发生时间以及事件关联性(如扫描事件,文件上传事件)

  1. IP与行为关联性(如某IP在某事件内进行了什么操作)

  2. 完整步骤以及文档通读性(如整个流量包这些IP先后做了什么操作,后面我们做了什么操作)

最后安全加固完毕给到一个后期的一个防范意识加强等收尾

fig:

fig:

fig:

fig:

fig:

fig:

fig:

fig:

fig:

fig:

fig:

结语

那么在此次事件中是参考了大量的真实环境进行开发的,中间规避了很多比如真实矿池外联
的弊端,但是又完全仿真了这一块,当然在排查进程的时候,可能还会遇到,比如攻击者通过alias
伪造执行结果,这些都会在后期进行开发,做靶场州弟是认真的,由于当下网络安全法的收敛和重视,靶场的方向是没错的,请勿催更,时间磨练出好的作品

州弟学安全,只学有用的知识

往期文章分享

开源万岁|我妈说我奶想学习了,让我给搭建一个知识库学学IT
渗透测试|倒反天罡!转发给你的老师《0基础也能学渗透测试+代码审计电商平台靶场》让他重修
渗透测试|学校教不会的我来教,一篇文章学习渗透测试那些事(某金融程序靶场测试的项目式教学)
应急加固|超详细的某医院系统被脱库 从溯源到报告输出的项目式教学
渗透测试|柳暗花明(记一次有趣的高危漏洞以及思考修复方案)
渗透测试|学姐为获取靶场WP,竟不惜以黑丝诱惑我
漏洞挖掘|还没开始就结束了?行不行啊!毫无体验感