accelerator

command module
v0.0.0-...-78cea50 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 8, 2022 License: MIT Imports: 10 Imported by: 0

README

Accelerator

基于Golang批量分析Jar包,用于检测Java安全漏洞

这将比Java ASM更容易上手使用,且有更高的执行效率

该工具是一个辅助工具,可以帮助安全研究人员快速分析jar文件,尤其是对于一些闭源项目

使用此功能的优点是易于上手并检测效率较高(比编写ASMMethodVisitor简单很多)

使用这种方法的缺点是不能进行太多定制操作,并且在多指令规则下可能会出现误报

快速开始

accelerator需要指定一个规则文件(默认:rule.txt)

并且需要输入jar文件的目录,然后accelerator会解压该目录中所有jar并扫描其中的class文件

./accelerator -rule your_rule_file -jars your_jar_dir

目前编写规则仅支持INVOKE相关的指令(实际上这也是最主要的指令)

todo: 删除具体的INVOKE指令,因为实际情况下不容易确定是VIRTUAL或者SPECIAL,使用者没有必要了解具体的指令名称

单指令规则

单指令规则一般用来确定哪些方法中存在危险调用

INVOKEVIRTUAL ... *

如果是单一的INVOKE指令,对某方法的指令集进行检测的过程中只要匹配到则认为成功

通常方法的desc属性并不容易记,所以可以使用通配符*来代替该位置

多指令规则

多指令规则将会有更大的用处

todo: 目前仅支持顺序的且一定出现的指令,实际上可以加入“非”条件进行进一步判断

INVOKEVIRTUAL [first rule] *
INVOKEVIRTUAL [next rule] *
...

支持多条INVOKE指令的规则,将会按照顺序进行匹配

无论中间夹杂多少其他指令只要按照顺序可以匹配到每一条指令,则认为成功

工作原理

(1) 解压缩jar文件以获取所有class文件

(2) 根据Oracle Java规范对class文件进行解析

(3) 解析所有类的方法区域中的方法以获得指令集(在attr属性中)

(4) 通过寻找常量池来改进指令内容(方法名和字符串索引等)

(5) 解析用户规则并将其与当前方法的指令集匹配

使用示例

原生的SQL注入规则(拼接字符串)

字符串的拼接在JVM中会优化为StringBuilder.append方法,如果某方法调用了该方法且存在SQL注入的execute等方法则有风险

INVOKEVIRTUAL java/lang/StringBuilder.append *
INVOKEINTERFACE java/sql/Statement.executeQuery *

基于JdbcTemplate的SQL注入规则(拼接字符串)

原理同上,不过执行SQL语句的是JdbcTemplate

INVOKEVIRTUAL java/lang/StringBuilder.append *
INVOKEVIRTUAL org/springframework/jdbc/core/JdbcTemplate.query *

简单的RCE检测

INVOKEVIRTUAL java/lang/Runtime.exec *

简单的RCE检测(由于字符串拼接导致的命令注入)

原理同上,执行的命令中有拼接字符串的风险

INVOKEVIRTUAL java/lang/StringBuilder.append *
INVOKEVIRTUAL java/lang/Runtime.exec *

一些SSRF规则

  • INVOKEVIRTUAL java/net/URL.openConnection *
  • INVOKEVIRTUAL org/apache/http/impl/client/CloseableHttpClient.execute *
  • INVOKEINTERFACE okhttp3/Call.execute *

实战

log4j-core-2.14.0.jar

定位目标Jar中可能存在的JNDI注入

Rule

INVOKEINTERFACE javax/naming/Context.lookup *

Result

org/apache/logging/log4j/core/net/JndiManager lookup
spring-cloud-gateway-server-3.0.6.jar

寻找目标Jar中可能执行的SPEL表达式

Rule

INVOKEINTERFACE org/springframework/expression/Expression.getValue *

Result

org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocator buildRouteDefinition
org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocator getValueFromExpr
org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocator lambda$getRouteDefinitions$2
org/springframework/cloud/gateway/support/ShortcutConfigurable getValue

进一步定位目标SPEL表达式是否是基于StandardEvaluationContext的,此类存在RCE风险

Rule

INVOKESPECIAL org/springframework/expression/spel/support/StandardEvaluationContext.<init> *
INVOKEVIRTUAL org/springframework/expression/spel/standard/SpelExpressionParser.parseExpression *
INVOKEINTERFACE org/springframework/expression/Expression.getValue *

Result

org/springframework/cloud/gateway/support/ShortcutConfigurable getValue
spring-cloud-function-context-3.1.0.jar

该案列原理同上

Rule

INVOKEINTERFACE org/springframework/expression/Expression.getValue *

Result

org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry$FunctionInvocationWrapper parseMultipleValueArguments
org/springframework/cloud/function/context/config/RoutingFunction functionFromExpression

Rule

INVOKESPECIAL org/springframework/expression/spel/support/StandardEvaluationContext.<init> *

Result

org/springframework/cloud/function/context/config/RoutingFunction <init>

参考

Java Class File Format

JVM Instruction Set

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL