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 |