搭建一个Drupal Core RCE(CVE-2019–6340 )漏洞的蜜罐

栏目: 服务器 · Nginx · 发布时间: 5年前

内容简介:不久前,我开始了一个管理真实网络蜜罐的项目。最初我建立它是为了管理一些WordPress蜜罐,但在Drupalgeddon2出来后,使我不得不重新构建该项目。这意味着我需要相当长的一段时间才能最终发布它。现在,我终于能够分享我的努力成果了:Webhoneypot框架是使用Python 3编写的,需要docker和docker-compose才能运行。你可以使用JSON和相应的docker-compose文件来配置蜜罐。docker-compose文件描述了用于蜜罐的容器及其设置,而JSON文件则用于配置框架

不久前,我开始了一个管理真实网络蜜罐的项目。最初我建立它是为了管理一些WordPress蜜罐,但在Drupalgeddon2出来后,使我不得不重新构建该项目。这意味着我需要相当长的一段时间才能最终发布它。现在,我终于能够分享我的努力成果了: https://gitlab.com/SecurityBender/webhoneypot-framework

Webhoneypot框架是使用 Python 3编写的,需要 docker 和docker-compose才能运行。你可以使用JSON和相应的docker-compose文件来配置蜜罐。docker-compose文件描述了用于蜜罐的容器及其设置,而JSON文件则用于配置框架如何检测攻击并获取蜜罐的快照。

JSON配置的基本结构如下所示:

{
    "docker_compose_file": "./docker-compose.yml",
    "pre_start": "...",
    "post_start": "...",
    "snapshot_path": "./snapshots",
    "snapshots": [
        ...
    ],
    "detections": [
        ...
    ]
}

docker_compose_file的选项非常简单。使用选项pre_start和post_start,用户可以在启动蜜罐后分别在启动前执行脚本。我通常使用它来调整Web根目录的文件权限和文件所有权。

该框架的主要功能是在检测到攻击后创建蜜罐的快照。目前,可以创建目录或 MySQL 数据库的快照。

要获取MySQL快照,应在快照下添加mysql_snapshot选项。这将会创建一个标准MySQL容器的MySQL转储( https://hub.docker.com/_/mysql ):

{
    "type": "mysql_snapshot",
    "mysql_container_name": "webhoneypot_mysql_1",
    "mysql_user": "root",
    "mysql_password": "Password123!",
    "mysql_restore_path": "./mysql/config"
}

来自docker库的MySQL容器,允许通过将文件放入容器的/docker-entrypoint-initdb.d文件夹来恢复数据库转储。因此mysql_restore_path选项应指向该目录的挂载点。

另一个选项是使用folder_snapshot来创建目录快照:

{
    "type": "folder_snapshot",
    "folder_path": "./apache/html"
},

这将创建指定文件夹的ZIP存档,并将其放在已配置的快照文件夹中。

为了检测攻击,webhoneypot框架目前仅支持folder_changed和file_contains。

检测方法folder_changed可以检测与初始快照相比的任意文件更改:

{
    "type": "folder_changed",
    "folder_path": "./apache/html",
    "ignore_files": [
        "folder_to_ignore/"
    ]
}

folder_path选项必须与folder_snapshot块中指定的选项匹配。为了减少干扰,可以忽略某些文件或文件夹。

第二个检测方法file_contains检测指定的文件是否包含特定的字符串或正则表达式:

{
    "type": "file_contains",
    "file_path": "./nginx/logs/access.log",
    "pattern": "pattern to search"
}

要运行该脚本,只需克隆存储库并运行webhoneypot.py:

$ git clone https://gitlab.com/SecurityBender/webhoneypot-framework.git && cd webhoneypot-framework
$ ./webhoneypot.py -h                                                                                             
usage: webhoneypot.py [-h] -c CONFIG option
Management script for docker-based web application honeypots
positional arguments:
  option                the honeypot option, can be
                        [start|stop|init|update|reset]
optional arguments:
  -h, --help            show this help message and exit
  -c CONFIG, --config CONFIG
                        the honeypot configuration file

该脚本主要支持以下五个选项:

  • start:启动honeypot容器
  • 停止:停止蜜罐容器
  • init:初始化蜜罐(例如,第一次设置)并创建初始快照
  • 更新:更新蜜罐并创建新的初始快照
  • reset:快照蜜罐,检测更改并恢复初始快照

在野捕获 CVE-2019-6340

有了以上的基础,现在我们可以构建和配置Drupal蜜罐来尝试在野捕获CVE-2019-6340。 CVE-2019-6340 是Drupal core 中的RCE漏洞,它允许攻击者在主机系统上执行任意命令。

配置蜜罐

我已经为构建Drupalgeddon2蜜罐做了一个配置。你可以在GitLab上找到它。让我们克隆它并为CVE-2019-6340做准备。

$ git clone https://gitlab.com/SecurityBender/webhoneypot-drupal.git
$ cd webhoneypot-drupal

在目录中我们有多个目录和文件:

webhoneypot-drupal/
├── apache/
│   └── Dockerfile
├── nginx/
│   ├── config/
│   │   └── default.conf
│   └── Dockerfile
├── docker-compose.yml
├── drupal.json
└── drupal.sh

apache和nginx目录分别包含Apache和nginx容器的数据和配置文件。其中最重要的文件是docker-compose.yml和drupal.json。

docker-compose.yml包含了启动必要容器的所有信息:

version: '2'

services:
  apache:
    build: apache/
    volumes:
      - ./apache/html:/var/www/html
      - ./apache/tmp:/tmp
    networks:
      - webhoneypot

  nginx:
    build: nginx/
    volumes:
      - ./nginx/config/default.conf:/etc/nginx/conf.d/default.conf:ro
      - ./nginx/logs:/var/log/nginx
    ports:
      - "80:80"
    networks:
      - webhoneypot
    depends_on:
      - apache

networks:
  webhoneypot:
    driver: bridge

在此设置中,我们有一个Apache容器,它托管并运行Drupal和一个用作反向代理的nginx。我们将html和tmp目录挂载到Apache容器,以便从主机访问它们,并让我们拍摄快照以及恢复它们。出于同样的目的,我们还将日志目录挂载到了nginx容器。

主要配置在drupal.json中完成:

{
    "docker_compose_file": "./docker-compose.yml",
    "pre_start": "",
    "post_start": "./drupal.sh",
    "snapshot_path": "./snapshots",
    "snapshots": [
        {
            "type": "folder_snapshot",
            "folder_path": "./apache/html"
        },
        {
            "type": "folder_snapshot",
            "folder_path": "./apache/tmp"
        },
        {
            "type": "folder_snapshot",
            "folder_path": "./nginx/logs"
        }
    ],
    "detections": [
        {
            "type": "folder_changed",
            "folder_path": "./apache/html",
            "ignore_files": [
                "sites/default/files/php/twig/"
            ]
        },
        {
            "type": "folder_changed",
            "folder_path": "./apache/tmp",
            "ignore_files": [
            ]
        },
        {
            "type": "file_contains",
            "file_path": "./nginx/logs/access.log",
            "pattern": "node/1\\?_format=hal_json"
        }
    ]
}

首先,我们使用docker_compose_file指定用于通过docker-compose创建,启动和停止docker容器的文件。每次启动容器后,都会执行drupal.sh来调整./apache/html(Web根目录)目录的所有者和权限,并清除nginx访问日志。此外,我们将蜜罐配置为在每次重置后拍摄./apache/html,./apache/tmp和./nginx/logs目录的快照。我注意到很多drupalgeddon2都利用了/tmp中的drop文件,所以我添加了它。

最关键的是检测部分。你可能会看到我们想要检测./apache/html和./apache/tmp目录中的更改。检测到与初始快照不同的所有文件。因为Drupal将一些生成的文件存储在sites/default/files/php/twig/中,所以我们忽略对该目录的任何更改。检测的另一个选项是检查文件是否包含特定的正则表达式。在这种情况下,我们监控nginx访问日志中的典型的CVE-2019-6340 url。

运行蜜罐

配置蜜罐完成后,我们来获取易受攻击的Drupal版本(例如8.6.9),并将其解压缩到./apache/html目录中:

$ wget -q https://ftp.drupal.org/files/projects/drupal-8.6.9.zip
$ unzip drupal-8.6.9.zip -d ./apache/
$ mv ./apache/drupal-8.6.9 ./apache/html

现在让我们克隆Webhoneypot框架,并初始化Drupal蜜罐。使用./webhoneypot.py -c ../webhoneypot-drupal/drupal.json init初始化脚本,将启动并构建所需的容器。

$ ./webhoneypot.py -c ../webhoneypot-drupal/drupal.json init
2019-04-07 15:11:50,455 - DEBUG - Starting docker compose /opt/webhoneypot-drupal/docker-compose.yml ...
Creating network "webhoneypot-drupal_webhoneypot" with driver "bridge"
Building apache
[...]
Building nginx
[...]
Creating webhoneypot-drupal_apache_1 ... done
Creating webhoneypot-drupal_nginx_1  ... done
Press any key if honeypot setup is finished

初始启动成功,我们可以通过公共IP地址访问Drupal实例。配置(启用RESTful服务等) – 比我想象的更难 – 完成后我们按ENTER键,脚本将开始创建蜜罐的初始快照。

2019-04-07 15:23:17,604 - DEBUG - Creating snapshot "initial" ...
2019-04-07 15:23:17,621 - DEBUG - Create folder backup of "/opt/webhoneypot-drupal/apache/html" to "/opt/webhoneypot-drupal/snapshots/initial/_opt_webhoneypot-drupal_apache_html.zip" ...
2019-04-07 15:23:48,775 - DEBUG - Create folder backup of "/opt/webhoneypot-drupal/apache/tmp" to "/opt/webhoneypot-drupal/snapshots/initial/_opt_webhoneypot-drupal_apache_tmp.zip" ...
2019-04-07 15:23:48,787 - DEBUG - Create folder backup of "/opt/webhoneypot-drupal/nginx/logs" to "/opt/webhoneypot-drupal/snapshots/initial/_opt_webhoneypot-drupal_nginx_logs.zip" ...

测试蜜罐

一切运行良好,现在让我们来对它进行测试。我从 @leonjza 获取到了一个POC并运行了它:

$ python3 poc.py http://<my-ip>/ "id"     
CVE-2019-6340 Drupal 8 REST Services Unauthenticated RCE PoC
 by @leonjza
References:

https://www.drupal.org/sa-core-2019-003


https://www.ambionics.io/blog/drupal8-rce

[warning] Caching heavily affects reliability of this exploit.
Nodes are used as they are discovered, but once they are done,
you will have to wait for cache expiry.
Targeting http://37.120.165.218/...
[+] Finding a usable node id...
[x] Node enum found a cached article at: 1, skipping
[+] Using node_id 2
[+] Target appears to be vulnerable!
uid=33(www-data) gid=33(www-data) groups=33(www-data)

POC成功被执行。现在让我们看看我们的检测是否正常:

$ ./webhoneypot.py -c ../webhoneypot-drupal/drupal.json reset
2019-04-07 17:04:11,767 - DEBUG - Creating snapshot "20190407_170411" ...
[...]
2019-04-07 17:04:48,115 - DEBUG - Stopping docker compose /opt/docker/webhoneypot-drupal/docker-compose.yml ...
Stopping webhoneypot-drupal_nginx_1  ... done
Stopping webhoneypot-drupal_apache_1 ... done
Removing webhoneypot-drupal_nginx_1  ... done
Removing webhoneypot-drupal_apache_1 ... done
Removing network webhoneypot-drupal_webhoneypot
2019-04-07 17:05:08,442 - INFO - Pattern "node/1\?_format=hal_json" detected in file!
2019-04-07 17:05:08,443 - DEBUG - Restoring snapshot "initial" ...
[...]

这就是一个现实世界的Drupal蜜罐,用于检测CVE-2019-6340攻击。

警告

一个被妥协的蜜罐可用于许多其他非法目的(例如加密货币挖矿,发送垃圾邮件,DoS等)。我强烈建议你们设置一个定期的cronjob(每15到30分钟)重置蜜罐。此外,你还可以通过限制容器的CPU时间,或通过主机防火墙来阻止某些传出连接。

  *参考来源: medium ,FB小编secist编译,转载请注明来自FreeBuf.COM


以上所述就是小编给大家介绍的《搭建一个Drupal Core RCE(CVE-2019–6340 )漏洞的蜜罐》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Pro Django

Pro Django

Marty Alchin / Apress / 2008-11-24 / USD 49.99

Django is the leading Python web application development framework. Learn how to leverage the Django web framework to its full potential in this advanced tutorial and reference. Endorsed by Django, Pr......一起来看看 《Pro Django》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具