tabby项目介绍
项目地址
1 | https://github.com/wh1t3p1g/tabby |
项目介绍
1 | TABBY是一款针对Java语言的静态代码分析工具。 |
配置Neo图数据库
下载安装Neo Desktop
新建project,设置密码为password
下载apoc插件
Neo4j图数据库添加配置项
1 | apoc.import.file.enabled=true |
将apoc的jar包添加到plugins下
使用命令查看是否导入成功
1 | CALL apoc.help('all') |
- 数据库优化
添加索引
1 | CREATE CONSTRAINT c1 IF NOT EXISTS ON (c:Class) ASSERT c.ID IS UNIQUE; |
删除索引
1 | DROP CONSTRAINT c1; |
tabby进行图数据生成
IDEA生成jar包
将项目导入IDEA就在
libs
下自动生成了配置必要配置文件
将config下的settings.properties复制到libs下的config下
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# build code property graph
tabby.build.enable = true
# jdk settings
tabby.build.isJDKProcess = true
tabby.build.withAllJDK = false
tabby.build.excludeJDK = false
tabby.build.isJDKOnly = false
# dealing fatjar
tabby.build.checkFatJar = true
# default pointed-to analysis
tabby.build.isFullCallGraphCreate = true
# targets to analyse
#tabby.build.target = path/to/target
tabby.build.target = jars/
tabby.build.libraries = jars/
# load to neo4j
tabby.load.enable = true
# debug
tabby.debug.details = true
tabby.debug.inner.details = true将rules下的文件也复制到libs下,最终效果如下
用tabby对jar包进行代码属性图生成
首先将jar包放在jars目录下(jar包可以通过在project structure添加artifacts来生成)
1
java -Xmx6g -jar .\tabby-1.1.1.RELEASE.jar
利用链查询
作者样例
利用apoc插件查询
1 | match (source:Method {NAME:"execute"}) |
第一行表示选择出所有名为execute的方法
第二行表示选择所有调用(CALL)了被标记为
sink
的getInstance
方法第三行使用apoc插件的
allSimplePaths
进行路径搜索1
call apoc.algo.allSimplePaths(m1, source, "<CALL|ALIAS", 20) yield path
- startNode是开始节点
- endNode是结束节点
relationshipTypesAndDirections
是关系和指向- MaxNodes是最大节点数,可以理解为深度
这里的意思是,列出最大节点数为20,从source(输入)到sink的调用方法的路径(path)
第四行限制返回路径数量为20
自写样例
这是一个通过doUploadBrithdayCard
进行文件上传的漏洞,已知该cms使用servlet进行请求的处理,因此source是doGet
或者doPost
,写成的neo4j语句如下:
1 | MATCH (source:Method) WHERE source.NAME in ["doGet","doPost"] |
由于不是反序列化的利用链,所以最大深度只设置了8
,成功搜索出利用链
其他样例
样例一:
- 1.对象实现了
java.util.Enumeration
接口 - 2.从该对象的nextElement函数开始,最终能到达一个触发恶意行为的sink函数
- 3.从nextElement函数开始到sink函数,路径上不能出现前面黑名单涉及的对象
1 | # match source |
样例二:
查询以get开头的无参方法、不超过两次调用、到readObject的链子
1 | match path=(m1:Method)-[:CALL*..2]->(m2:Method {NAME:"readObject"}) where m1.NAME =~ "get.*" and m1.PARAMETER_SIZE=0 return path |
其他属性
Method的属性
1 | "properties": { |
Class属性
1 | "properties": { |
Relationship类型
1 | ALIAS |