很高兴拿下了所有题目,荣获奖金!!这里简简记录一下。

1. 安全事件排查

某金融科技公司内部审计发现办公平台存在异常数据流动迹象。安全团队在Spring Boot业务系统的监控日志中检测到异常行为,该行为可能导致云存储配置与数据库连接凭据处于可获取状态。根据《数据安全合规条例》第17条要求,你作为工程师需立即执行以下取证:

(1)从业务系统监控端点提取异常出特征(关键账号信息泄露)

(2)根据配置中心数据访问数据库核心数据

(3)根据特征进一步找到配置中心进一步定位到云存储桶

1.1 actuator未授权访问

发现spring boot actuator 端点泄露,涉及多个敏感端点:

CISP-HX-1-actuator.png

info 端点发现存在隐藏 flag 端点:

CISP-HX-1-actuator-info.png

访问 flag 端点,即可获取 flag:

CISP-HX-1-flag.png

1.2 堆转储文件泄露

尝试访问堆转储端点 heapdump,使用 heapdump_tool 检索敏感信息,发现 nacos 配置密码bypass123#s。

CISP-HX-2-heapdump.png

登录进入 nacos 后台,找到 mysql 配置信息。

CISP-HX-2-nacos.png

CISP-HX-2-nacos-配置.png

CISP-HX-2-nacos-数据库.png

连接 mysql,发现 flag:

CISP-HX-2-flag.png

1.3 OSS ak-sk泄露

发现 OSS 配置,涉及 AK/SK 信息:

CISP-HX-3-aksk.png

使用官OSS 浏览工具,配置 连接信息,不断尝试不同区域,最终读取 flag 文件。

CISP-HX-3-oss浏览.png

CISP-HX-3-flag.png

2. 通信流量文件传输

分析流量包,找到flag值

附:流量包

流量分析,发现存在 FTP 数据流传输,包含 PK/flag 字段,判断 flag.txt 包含在 ZIP 文件内。

CISP-HX-4-传输流量.png

将 16 进制转储为 ZIP 文件,尝试打开发现存在密码:

CISP-HX-4-ZIP加密.png

使用ZipCracker 尝试破解,发现密码并获取 flag:

CISP-HX-4-ZIP爆破.png

CISP-HX-4-flag.png

3. 权限验证绕过

管理员设置了访问限制,但flag就在根目录下,你能找到正确的姿势来读取它吗

提示 403 禁止,尝试修改请求头绕过。

CISP-HX-5-403.png

CISP-HX-5-绕过遍历.png

发现X-Forwarded-For:127.0.0.1 可进行绕过,同时提交路径穿越直接读取 flag 内容。

CISP-HX-5-读取flag.png

CISP-HX-5-flag.png

4. 已知部分明文解密

在一次情报传输中,WNCP 团队使用了一种简单的加密方法对一段秘密消息进行了加密。你截获了该密文文件,并知道消息的部分内容(即固定的开头部分)。请分析加密算法,利用已知明文攻击恢复出完整的明文,并找出其中隐藏的 flag。flag格式为flag{XXX}

密文

13539cbb0b53c45070dd0957527c8ca8204c1c67267056f41db6fc5d0de576bd38cb2e4e17de5c6e2e27fbf2634b9ac05c6e8b1b46efa74e21273fef02c9865354098c11343d8e295a40b3511185313c300f2fa13f493ac71fdb18807e9301301df3c43e0987e79869d332af6656eb2c1f06a3201c94b4751d5459dc304970fd4da5d7d82a187bda5c123c2a127b04884c614dd63b932ec07a6d80952aff8ee4140d2ace

已知明文开头

-----BEGIN SECRET MESSAGE-----

加密过程采用如下步骤:

(1)明文分块

将明文转换为字节后,每 4 个字节分为一块。如果最后一块不足 4 字节,则使用 0x00 填充至 4 字节。

(2)伪随机密钥流生成

使用线性同余发生器

LCG 的参数为:

种子:未知

乘数:a = 1103515245

增量:c = 12345

模数:m = 2^31

(3)异或加密

(4)输出密文

附:提供加密程序。

根据算法以及 python 提示程序,写出解密脚本如下:

import binascii

def encrypt_simplified(plaintext, seed):
    plaintext_bytes = plaintext.encode('utf-8')
    blocks = [plaintext_bytes[i:i+4] for i in range(0, len(plaintext_bytes), 4)]
    ciphertext = b""
    a = 1103515245
    c = 12345
    m = 2**31
    state = seed
    for block in blocks:
        if len(block) < 4:
            block += b'\x00' * (4 - len(block))
        state = (a * state + c) % m
        key = state.to_bytes(4, 'big')
        encrypted_block = bytes([b ^ k for b, k in zip(block, key)])
        ciphertext += encrypted_block
    return ciphertext


# 解密还原
def decrypt(ciphertext, seed):
    a = 1103515245
    c = 12345
    m = 2**31
    state = seed
    plaintext = b""
    # 分块还原
    for block in [ciphertext[i:i+4] for i in range(0, len(ciphertext), 4)]:
        state = (a * state + c) % m
        key = state.to_bytes(4, 'big')
        decrypted = bytes([b ^ k for b, k in zip(block, key)])
        plaintext += decrypted
    return plaintext

# 已知数据
ciphertext_hex = "13539cbb0b53c45070dd0957527c8ca8204c1c67267056f41db6fc5d0de576bd38cb2e4e17de5c6e2e27fbf2634b9ac05c6e8b1b46efa74e21273fef02c9865354098c11343d8e295a40b3511185313c300f2fa13f493ac71fdb18807e9301301df3c43e0987e79869d332af6656eb2c1f06a3201c94b4751d5459dc304970fd4da5d7d82a187bda5c123c2a127b04884c614dd63b932ec07a6d80952aff8ee4140d2ace"
ciphertext = binascii.unhexlify(ciphertext_hex)

plaintext_known = "-----BEGIN SECRET MESSAGE-----".encode('utf-8')

# 分块处理,先根据两个片段计算seed
blocks_plaintext = [plaintext_known[i:i+4].ljust(4, b'\x00') for i in range(0, len(plaintext_known), 4)]
blocks_ciphertext = [ciphertext[i:i+4] for i in range(0, len(blocks_plaintext)*4, 4)]

k1 = bytes([p ^ c for p, c in zip(blocks_plaintext[0], blocks_ciphertext[0])])
k1_int = int.from_bytes(k1, 'big')
k2 = bytes([p ^ c for p, c in zip(blocks_plaintext[1], blocks_ciphertext[1])])
k2_int = int.from_bytes(k2, 'big')

a = 1103515245
c = 12345
m = 2**31

a_squared = (a * a) % m
inv_a_squared = pow(a_squared, -1, m)

term = (c * (a + 1)) % m
numerator = (k2_int - term) % m
seed = (numerator * inv_a_squared) % m
print(f"seed = {seed}")


decrypted_plaintext = decrypt(ciphertext, seed)
print(decrypted_plaintext)

直接运行即可获取 flag。