应急响应练习:青少年CTF靶场(全)
特洛伊挖矿木马事件排查

真不是我说,这和我遇到的那个kdevtmpfsi听着怎么能那么像,真的没忍住来做一下,别告诉我真就是kdevtmpfsi
任务一:提交挖矿文件的绝对路径

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

先用top,发现没有了,可能是被感染了,那试试看ps aux
1 | |
降序看看进程CPU占用情况

可以看到CPU异常高的只有第一个(没有kdevtmpfsi吓人啊)
这进程的命令是/tmp/kworkerds,正常的系统内核工作线程应该是kworker才对,而且也不该在/tmp路径,所以这玩意很可疑,很有可能就是所谓的挖矿文件
所以本题的答案就是这一个高嫌疑的/tmp/kworkerds
flag{/tmp/kworkerds}
任务二:提交挖矿文件的外联IP

刚刚已经找到了可疑进程的PID是306
题目问挖矿文件的外联IP,其实就是问的网络连接情况
我们用netstat或者ss都可以
1 | |

我们-a显示所有链接,然后-n看ip
这边就能直接看到外网的外联ip和端口是那个104.21.6.99:10235
这个10235是一个非标准的高位端口,在这种恶意文件里很常见
任务三:守护进程脚本的绝对路径

一般的木马都会搭配有守护进程脚本,以防止木马被kill后就没了,守护进程会使其再生,正如我中的kdevtmpfsi自带守护进程kinsing
直接找有点没有头绪,不妨我们跟着题目提示,先试试看删了这玩意会不会再蹦出来
1 | |
发现了删了没几秒就又崩了一个出来

有点太快了吧这也
接下来我们尝试直接删除/tmp/kworkerds文件
1 | |

真是似曾相识来了,之前的kdevtmpfsi也是说我一个root没权限
可能是用了文件锁,跟上次一样,我们用lsattr看看属性
1 | |

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

完全没报错,说明删掉了,但是还是有这个玩意
这说明要么就是有文件每秒都在生成挖矿文件,要么就是有文件检测这玩意还在不在,不在就生
来检测一下计划任务
1 | |

发现没有计划任务啊,至少root没有
也有可能是系统级别的?再cat文件看看
1 | |

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

这下看到了,这个0guardian也太显眼了,名字就很逆天了
为了验证,我们可以cat看看内容

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

这脚本还挺直接的,直接说了自己是守护脚本
当然也很简洁了,就一行,这边是在用stat命令看/tmp的情况,而且不回显
这边很有可能是感染了stat函数,使其不只是单纯的查看
我们自己调用stat也发现了这个命令无法做到一些本来能做到的事情了,确认已被感染的事实
因此再生的思路已经明确了
1 | |
所以这一题的答案很明确了,是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 | |
通过这一步我们可以直接将程序进行覆盖更新,从而将原来染病的全都覆盖掉

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

flag{e510c5fca680b1b4bd5c9d8d6b3f4bdc}
任务七:最终清理

我们已经搞清楚了具体都是点啥
1 | |
注意这边要按顺序,我们得先去掉计划任务才能进行对挖矿程序的删除
1 | |

flag{081ce3688c6cd6e2946125081381087c}
Linux安全加固-主机运维

来继续做一下青少年CTF的靶场,一共没几题
这边是针对Linux的一次加固练习,解决风险
任务一:修改用户:bus的ssh密码

根据题目我们就已经知道了原来的密码是bus123
这是很典型的弱口令密码,很容易被爆破出来
我们利用命令进行更改
1 | |

这边为了保护都是不显现的,不过看见successfully就是成功了
改完之后按校验即可发现成功
任务二:允许root用户ssh远程登录

如果我们想做到这一点,我们需要将ssh的配置文件中的PermitRootLogin给开启
这是一个很危险的设置,但是根据题目要求我们去做一下
1 | |
ssh的配置文件一般都在这个地方/etc/ssh/sshd_config

把这行改了

一般这个时候我们需要重启ssh服务才能生效(不过我直接校验也给过了)
1 | |
任务三:运维远程完毕,可关闭root用户的ssh远程权限

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

没什么好说的
任务四:创建新用户并配置SSH私钥

最后让我们创建一个back用户并修改其密码,生成私钥
一步步来,首先创建back用户顺便修改密码
1 | |
这边-m是为了自动创建用户主目录

题目没规定,随便输入吧,我输入的是bus123
接下来就是生成私钥了
首先切换到back用户
1 | |

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

默认的路径是私钥文件在~/.ssh/id_rsa,然后公钥在id_rsa.pub
接下来配置公钥,设置权限
注意,这边的权限设置极为重要,没有的话是不给过认证的
1 | |


然后就做完了,很简单吧(
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 | |

过滤出来就只有一条
当然了,不放心也可以自己看看,发现确实是只有一条写操作
这是一个单线圈的功能码,我们看看具体内容

可以看到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 | |

成功过滤,就一条数据

所以本题flag即为flag{ns=2;s=Pump/SpeedSetpoint}
这个NodeId的意思是找到命名空间索引为2的,更改泵的转速,改成1200
任务三:找出工程站域名解析IP

找域名解析结果?听上去就是找的DNS协议的流量吧
过滤一下
1 | |

差不多长这样子
这边有很多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 | |

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

所以flag就是这一个,注意要UTC的
flag{2025-03-12T14:22:09Z}
任务五:找到HMI对工程站发起的HTTP请求

我们在任务四已经分析过了,HMI是10.0.0.5,而工程站是10.0.0.8,最后要求是HTTP请求
所以我们多过滤个HTTP即可
1 | |

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

所以本题的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 | |
那我们的ip.php就会直接变成
1 | |
然后服务器就直接干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 | |
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平台蒸蒸日上

我们玄机见
