[De1ctf 2019]SSRF Me

目录

具体做题分析:

字符串拼接:

哈希拓展攻击:


点开是一段flask代码,经过还原后格式如下:

#!/usr/bin/env python

# encoding=utf-8

from flask import Flask, request

import socket

import hashlib

import urllib

import sys

import os

import json


reload(sys)

sys.setdefaultencoding('latin1')


app = Flask(__name__)

secert_key = os.urandom(16)  #秘钥长度16



class Task:

    def __init__(self, action, param, sign, ip):

        self.action = action

        self.param = param

        self.sign = sign

        self.sandbox = md5(ip)

        

        if not os.path.exists(self.sandbox):  # SandBox For Remote_Addr

            os.mkdir(self.sandbox)


    def Exec(self):

        result = {}

        result['code'] = 500

        if self.checkSign():

            if "scan" in self.action:

                tmpfile = open("./%s/result.txt" % self.sandbox, 'w')

                resp = scan(self.param)              

                if resp == "Connection Timeout":

                    result['data'] = resp

                else:

                    print resp

                    tmpfile.write(resp)

                

                tmpfile.close()

                result['code'] = 200

            

            if "read" in self.action:

                f = open("./%s/result.txt" % self.sandbox, 'r')

                result['code'] = 200

                result['data'] = f.read()   

        if result['code'] == 500:

            result['data'] = "Action Error"

        else:

            result['code'] = 500

            result['msg'] = "Sign Error"

        return result


    def checkSign(self):

        if getSign(self.action, self.param) == self.sign:

            return True

        else:

            return False

@app.route("/geneSign", methods=['GET', 'POST'])

def geneSign():

    param = urllib.unquote(request.args.get("param", ""))

    action = "scan"

    return getSign(action, param)

@app.route('/De1ta', methods=['GET', 'POST'])

def challenge():

    action = urllib.unquote(request.cookies.get("action"))

    param = urllib.unquote(request.args.get("param", ""))

    sign = urllib.unquote(request.cookies.get("sign"))

    ip = request.remote_addr
    

    if waf(param):

        return "No Hacker!!!!"
    

    task = Task(action, param, sign, ip)

    return json.dumps(task.Exec())



@app.route('/')

def index():

    return open("code.txt", "r").read()

def scan(param):

    socket.setdefaulttimeout(1)

    try:

        return urllib.urlopen(param).read()[:50]

    except:

        return "Connection Timeout"

def getSign(action, param):

    return hashlib.md5(secert_key + param + action).hexdigest()

def md5(content):

    return hashlib.md5(content).hexdigest()

def waf(param):

    check = param.strip().lower()
    

    if check.startswith("gopher") or check.startswith("file"):

        return True

    else:

        return False

if __name__ == '__main__':

    app.debug = False

    app.run(host='0.0.0.0', port=80)

这段代码使用 Python 的 Flask 框架实现了一个简单的 Web 应用。以下是代码的基本功能:

  1. 定义了一个名为 Task 的类,该类用于处理用户请求并执行相应的操作。
  2. 实例化了一个名为 app 的 Flask 应用对象。
  3. 定义了一个 /geneSign 路由,用于生成签名。
  4. 定义了一个 /De1ta 路由,用于处理用户的请求,并返回 JSON 格式的响应结果。
  5. 定义了一个 / 路由,用于返回一个名为 code.txt 的文件内容。

在 Task 类中,有以下几个方法:

  • __init__(self, action, param, sign, ip):初始化方法,用于设置任务的属性,并创建一个与客户端 IP 相关的沙盒目录。
  • Exec(self):执行任务的方法,根据不同的操作类型执行相应的动作,并返回执行结果。
  • checkSign(self):检查签名的方法,验证请求中的签名是否正确。
  • scan(param):扫描方法,尝试连接给定的 URL 并返回前 50 个字符的内容。
  • getSign(action, param):生成签名的方法,使用 MD5 哈希算法对参数进行签名。
  • md5(content):计算 MD5 哈希值的方法。
  • waf(param):Web 应用防火墙(WAF)方法,用于检测参数是否包含潜在的攻击代码。

具体做题分析:

这里我们虽然无法直接读取flag.txt,但是可以传参给param参数读取

def scan(param):

    socket.setdefaulttimeout(1)

    try:

        return urllib.urlopen(param).read()[:50]

    except:

        return "Connection Timeout"

注意到一个生成签名的函数:

def getSign(action, param): 

return hashlib.md5(secret_key + param + action).hexdigest()

以下代码得知action默认为”scan”

@app.route("/geneSign", methods=['GET', 'POST'])

def geneSign():

    param = urllib.unquote(request.args.get("param", ""))

    action = "scan"

return getSign(action, param)

也就是说如果访问/geneSign?param=flag.txt ,会得到一个 md5(这个md5相当于“secret_key + flag.txt+ scan”的MD5加密)

注意到以下代码

if "scan" in self.action:

                tmpfile = open("./%s/result.txt" % self.sandbox, 'w')

                resp = scan(self.param)

                

                if resp == "Connection Timeout":

                    result['data'] = resp

                else:

                    print resp

                    tmpfile.write(resp)

                

                tmpfile.close()

                result['code'] = 200

            

if "read" in self.action:

                f = open("./%s/result.txt" % self.sandbox, 'r')

                result['code'] = 200

                result['data'] = f.read()

  这段程序会根据传入的任务动作self.action来执行不同的操作。如果任务动作是"scan",那么程序会执行scan函数来进行扫描操作,并将扫描结果写入一个临时文件中,文件路径为当前沙箱目录下的result.txt文件。

如果任务动作是"read",则程序会读取之前保存在临时文件中的扫描结果,并将结果保存在响应消息中,然后返回响应码200表示操作成功。

 如果action里面是“readscan”或者“scanread”则会先扫描并写入结果,后读取结果并回显。显然我们要构造readsacn以下提供两种解法:

字符串拼接:

访问 /geneSign?param=flag.txtread ,得到md5(secret_key + flag.txtread+ scan)的值为33c3d402c2d927665edcfdbde564d14a (也就相当于action变成了readscan然后拼接秘钥和flag.txt加密了),然后抓包直接访问 /De1ta?param=flag.txt 且构造cookie请求头Cookie:action=readscan;sign=33c3d402c2d927665edcfdbde564d14a

哈希拓展攻击:

相关文章:哈希拓展攻击CTF题做法-CSDN博客

  首先在kali下载相关工具hash-ext-attack:

    git clone https://github.com/shellfeel/hash-ext-attack.git

    cd /home/kali/hash-ext-attack/

    pip install -r requirements.txt

  在secret_key + param + action里,已知secert_key = os.urandom(16)(长度16),已知明文flag.txt和scan,我们需要添加read。

把flag.txt算进秘钥长度里,则秘钥长度为16+8,已知明文为scan,已知hash(secret_key +flag.txt+scan的加密)为8370a8f86a7a74b4053d1bc554a9d126,

扩展字符为read,启动刚刚的脚本依次填入得到新明文和新hash,

然后访问 /De1ta?param=flag.txt抓包添加cookie:

Cookie:action=scan%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%E0%00%00%00%00%00%00%00read;sign=51550ee14b4e7b4e0479e5b44fc33d23

得到flag

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

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

相关文章

pod节点jar包替换流程

1、查找到该docker容器 docker ps | grep backend # ./entrypoint.sh文件启动的那个容器2、替换jar 包 mv xxx.jar app.jar docker cp app.jar 66bc6fea9fb5:/home/aimind/3、重启容器 docker restart 66bc6fea9fb5 4、重启容器后进行功能验证 功能验证没问题了,再…

决策树--CART回归树算法详解

1、介绍 (1)简介 CART(Classification and Regression Trees)回归树是一种基于决策树的机器学习算法,用于预 测连续型目标变量而不是离散型类别变量。 (2)生成过程 ① 选择一个特征和相应的…

在win10上cuda12+tensorrt8.6+vs2019环境下编译paddle2.6生成python包与c++推理库

paddle infer官方目前没有发布基于cuda12的c库,为此参考https://www.paddlepaddle.org.cn/inference/user_guides/source_compile.html实现cuda12的编译安装,不料博主才边缘好自己的paddle2.6,paddle官方已经发布了cuda12.0的paddle2.6框架。…

全视通发表“物联网赋能智慧医院建设”主题演讲获关注

邕州山河,神州沃壤。近日,备受瞩目的“2024广西医院和实验室建设学术年会暨净化专业委员会成立六周年庆典”在广西南宁圆满召开。作为智慧医康养整体方案提供商,全视通受邀参会并发表了主题为“物联网赋能智慧医院建设”的演讲,深…

1873_ssh scp的速度限制设置

全部学习汇总: GreyZhang/little_bits_of_linux: My notes on the trip of learning linux. (github.com) 正常情况下,我们对于传输速度的要求自然是越快越好。不过凡事也有一个例外,比如我遇到的一个场景:经过了内网穿透的环境&a…

Web前端篇——ElementUI之el-scrollbar + el-backtop + el-timeline实现时间轴触底刷新和一键返回页面顶部

ElementUI之el-scrollbar el-backtop el-timeline实现时间轴触底刷新和一键返回页面顶部。 背景:ElementUI的版本(vue.global.js 3.2.36, index.css 2.4.4, index.full.js 2.4.4) 废话不多说,先看动…

卷积神经网络|猫狗分类系列--导入kaggle猫狗数据集

解决任何真实问题的重要一步是获取数据,Kaggle提供了大量不同数据科学问题的竞赛。 我们将从 https://www.kaggle.com/competitions/dogs-vs-cats/data 下载猫狗数据集,并对其进行一定的操作,以正确的导入到我们的计算机,为接下…

python+playwright 学习-1.环境准备与快速开始

前言 说到 web 自动化,大家最熟悉的就是 selenium 了,selenium 之后又出现了三个强势的框架Puppeteer、CyPress、TestCafe, 但这3个都需要掌握 JavaScript 语言,所以只是少部分人在用。 2020年微软开源一个 UI 自动化测试工具 P…

使用openssl 生成pfx格式证书时报错:unable to load certificates

问题现象包如下: 之前在centos上使用openssl部署证书服务器以及颁发证书的时候遇到的问题,在进行个人证书生成之后需要形成pfx格式证书,结果过程中报错了。网上类似资料比较少,做个记录。 生成pfx格式证书的命令: o…

Eureka的自我保护机制

一:Eureka的自我保护机制是什么? 保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不…

springCould中的Hystrix【下】-从小白开始【8】

目录 🧂1.熔断机制❤️❤️❤️ 🌭2.修改8001服务 ❤️❤️❤️ 🥞3.测试 ❤️❤️❤️ 🥓4. 服务监控hystrixDashboard❤️❤️❤️ 🌭5.仪表盘❤️❤️❤️ 🧂6.仪表盘的使用 ❤️❤️❤️ 1.熔断机…

LibVLC中播放、录制

video 1:首先官网下载vlc库 2:将下载的库添加到工程目录 3:添加功能接口 bool QtVLCWidget::playMedia(const char* url, PlayType type) {if (type PT_Url){m_media libvlc_media_new_location(url);}else if (type PT_LocalFile){m_med…

设计模式④ :分开考虑

一、前言 有时候不想动脑子,就懒得看源码又不像浪费时间所以会看看书,但是又记不住,所以决定开始写"抄书"系列。本系列大部分内容都是来源于《 图解设计模式》(【日】结城浩 著)。该系列文章可随意转载。 …

实验二 Linux文件编程

一、实验目的与任务 目的:了解掌握文件系统特点与功能,学会借助文件系统的功能函数进行编程。 任务:利用C语言指令编写程序调用文件系统函数,完成相应功能。 二、实验设备 装有Linux操作系统的计算机一台。 三、实验要求 1&…

电源芯片浪涌电流如何产生?该怎么测试?

对于电源芯片的设计和制造商来说,防止芯片受到电源干扰是非常重要的。为了保障芯片能正常稳定运行,浪涌测试无疑是必要的。本篇文章将全方位为你介绍浪涌电流如何产生以及如何测试的过程。 电源芯片浪涌电流的产生原因 1.开关电源切换和电压突变 在电源开…

Golang : Bson\Json互转

代码 package bson_jsonimport ("encoding/json""errors""fmt""gopkg.in/mgo.v2/bson""os""testing" )type User struct {Name string json:"name,omitempty" bson:"name,omitempty"CSD…

软件测试|MySQL主键约束详解:保障数据完整性与性能优化

简介 主键(PRIMARY KEY)的完整称呼是“主键约束”,是 MySQL 中使用最为频繁的约束。一般情况下,为了便于 DBMS 更快的查找到表中的记录,都会在表中设置一个主键。 MySQL是一种广泛使用的开源关系型数据库管理系统&am…

轻松实现Word转PPT!别说你还不知道这个办公神器!

在日常的学习和工作中,Microsoft Word和PowerPoint是我们最常使用的2款办公软件。Word,拥有出色的文字处理功能,让我们能够轻松编辑各种文档,而PowerPoint,可以让我们轻松地进行各种演示文稿的创建和播放。 在实际使用…

Unity 3D GridLayoutGroup3D 让子物体对齐,调整子物体间距

Unity 3D GridLayoutGroup3D 让子物体对齐,调整子物体间距 效果 介绍 GridLayoutGroup3D 脚本是一个用于在 Unity 3D 编辑器中创建 3D 网格布局的实用工具。主要用于在 Unity 编辑器中提供一种可视化的方式来设置和调整子物体的位置,同时支持删除脚本时…

BabylonJS 6.0文档 Deep Dive 摄像机(二):摄像机碰撞

摄像机、网格碰撞和重力 你玩过第一人称射击游戏(FPS)吗?在本教程中,我们将模拟FPS的摄影机移动:摄影机位于地板上,与地面碰撞,并可能与场景中的任何对象碰撞。 如何实现? 为了实现这一功能,我们必须执…