这次TCTF不算太难,题目也不多,@Water Paddler还AK了web,可喜可贺!

ohf

一键日卫星(大雾)!首先通过页面源码发现程序源码文件名是 ohf_main_to_be_deployed.go,再根据less解析支持的 @import 的功能,可以任意读文件,需要注意的是要添加inline属性防止解析报错,参考

1
@import (inline) "ohf_main_to_be_deployed.go"

拿到程序源码后可以在本地跑起来,主要部件是一个gob反序列化解析和一个基于yaegi的动态代码执行,我们先来看yaegi。

yaegi

这个库可以让golang支持 eval,目前还是有很多bug,但是对于本题来说执行简单的程序问题不大。
默认情况下yaegi运行在restricted模式,作者给了一个sandbox的环境通过删掉 os/exec 之类的符号阻止执行能让解释器退出的函数(具体列表),类似于阻止执行命令,但是删的不是很完全,除了 os/execos.StartProcess 也可以执行命令,通过nc,curl,甚至nodejs等方式就能将 readflag 的输出带出或者getshell。

反序列化

golang通过一个自己的序列化编码gob实现数据传递,原本想的是弄一个函数来执行,但是试了下发现无论是生成还是手动改类型,都无法让它反序列化成功,类型系统也根本不让你反序列化函数或者函数指针= =
为了稍微藏一下这个调用链,这边用一个类似于magic function的特性,String() 接口会在输出或者转换成字符串的时候被自动调用,于是乎就加了一个log日志级别,需要在序列化的时候修改才能触发 eval

非预期

看文档的时候扫了眼plugin,发现需要加参数就没管,谁想到默认情况下就允许调用远程插件从而实现rce。不得不说对于less这种还是不要交给服务端渲染吧,用户可控内容的情况下可以通过build之类的功能引入,危害还挺大的。不过反正题目也不难也就没修了……
// 应该直接禁掉出网然后结合任意文件读搞flag

jabasass

zsx师傅总能整出一些让人眼前一黑的东西(笑)……Graalvm是Oracle整出的一个新轮子,可以让java执行其他语言的代码从而提升效率。题目通过h2c走私之后可以控制一个python的eval,然而翻了翻代码可以发现它tmd直接用java重写了一套接口,之前用的一些绕过python沙箱的办法根本没法用,实在太过逆天……

不过socket包倒是能用,我们可以通过这个ssrf打wildfly的管理接口,验题的时候卡在鉴权的部分,由于这个python沙箱啥都不支持,最后给的exp还是自己写md5、http auth,计算nonce来搞,测试环境也挺难配的还是比较恶心人。
最后还有个点是如何rce,由于他不想让人直接deploy就能getshell,把目录写权限给ban了。预期解是通过子模块的CVE-2022-23221来打,里面子模块我翻了翻似乎能用的就这个了。然而貌似有人通过Unmanaged Deploy可以不落盘部署……