工具tabby的学习之路

前言

原本没想着这么早就开学tabby,但由于学长发了个java题目来锻炼锻炼我的能力,一开压缩包我了个豆40MB,自己审计不知道要审到猴年马月,做ctf讲究一个效率,所以毅然决然来开tabby

(没想到开了三天才结束。。。)

环境搭建

tabby配置

(截至到2025.3.24,tabby最新版本为v2.0.0

tabby需要的java版本为17,所以请先把自己电脑里面系统环境变量中的java版本改为17

image-20250324210239246

在项目地址:https://github.com/wh1t3p1g/tabby的release下载下最新的tabby,如果出问题了可以pull一份源码自己本地用gradle编译一下(注意gradle使用的jdk环境也得是至少17)

一个编译打包好的tabby目录结构应该如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ tree
.
├── cases # 用于放置待分析的项目,可以是单个文件,也可以是目录
│ └── commons-collections-3.2.1.jar
├── config # 用于放置配置文件
│ ├── db.properties # 配置数据库相关内容
│ └── settings.properties # 配置待分析项目、污点分析等内容
├── output # 用于放置生成后的csv文件
│ └── dev
├── rules # 规则文件夹
│ ├── basicClasses.json
│ ├── commonJars.json # 用于排除无需分析的三方jar
│ ├── cyphers.yml # 用于 tabby-vul-finder 自动化检索
│ ├── sinks.json # 用于配置 sink 函数
│ ├── system.json # 用于配置专家规则
│ └── tags.json # 用于配置source点识别
├── temp # v2.0 版本开始将临时文件都生成到同级temp目录下
├── run.sh # 运行各类任务的bash脚本
├── tabby-vul-finder.jar # 用于导入和自动化查询的 jar
└── tabby.jar # 核心jar,用于生成图数据

我们下载下来的tabby的config目录下面只有一个settins.properties文件,这是正常的,不用担心

还要更具体的信息可参考官方文档

第一次运行的话会创建一个output目录,并且还会报错,这很正常,看报错是说target没有找到目标,这是对的嘛,毕竟我们都还没指定要分析什么目标

image-20250324212047674

Neo4j配置

注意:由于 tabby-path-finder 需要使用 Neo4j 5.x 版本,推荐默认采用 5.x 版本

首先不是特别建议下载neo4j desktop,

否则你将面对的是:

  • 初始化向被墙的neo4j站点发送签名验证,如果没走代理可能进程打开了但是没有界面弹出来
  • 即使走了代理也可能抽风403
  • 明明环境变量确实是17但是启动数据库仍然提示主类找不到
  • 数据库启动异常缓慢,明明成功启动了但是还是报错得再点一次

当然,以上除了第一二点,其他的可能存在个人因素,总之各有千秋

这里侧重使用社区版:

在官网:https://neo4j.com/deployment-center/#community

微云的站点:https://we-yun.com/doc/neo4j/

在微云里面我下的是5.26.4

下载完后就随便扔在一个地方就行了,环境变量想配的话也可以,不想配的话就每次到bin目录下面执行相关命令就可以了

(证书似乎也可以不装,没影响)

image-20250325192637837

相关的指令

console: 直接启动 neo4j 服务器
install-service | uninstall-service | update-service : 安装/卸载/更新 neo4j 服务
start/stop/restart/status: 启动/停止/重启/状态
-V 输出更多信息

进入到bin目录,执行

1
neo4j console

image-20250325193806305

在浏览器中访问http://localhost:7474
使用用户名neo4j和默认密码neo4j进行连接,然后会提示更改密码(要记住更改完后的密码)

image-20250325194138447

接着我们回到tabby的官方文档去看看关于Neo4j的相关配置

文档中让我们下载两个插件,并且对应的版本不能弄错

image-20250325194734358

插件下载完后丢到plugins目录下面就好了

image-20250325195809247

在settings.properties里添加一个字段,是你本地的tabby(实际上高版本tabby在这里填没什么用,可填可不填,他不会自动上传数据库)

image-20250325200611887

在conf\neo4j.conf下,修改一些配置

取消下面代码的注释

1
server.directories.import=import

允许apoc插件,将注释的这条改为下面这条

image-20250325201855839

1
dbms.security.procedures.unrestricted=jwt.security.*,apoc.*

下面几个内存分配字段自己看着改一改,和tabby文档有点不同的是这里是server.而不是tabby文档中的dbms.开头

image-20250325202513222

在conf目录下创建一个新文件apoc.conf,内容

1
2
apoc.import.file.enabled=true
apoc.import.file.use_neo4j_config=false

至此neo4j该配置的也配置完了,重启一下看看效果

查询语句

1
CALL apoc.help('all')

apoc插件启动正常

image-20250325203520022

查询语句

1
CALL tabby.help('tabby')

tabby-path-finder依赖启动正常

image-20250325203736376

剩下的就参考官方文档中给出的,对数据库做一些前期工作了

image-20250325204351640

image-20250325204553729

扫描结果上传至neo4j数据库

(由于后续的过程我自己配并进行测试的时候出了挺多问题,所以版本改来改去的,现在我用的tabby版本为1.3.2-2,用的neo4j版本为5.9.0)

前面提到过了,高版本的tabby是不会自动将结果上传到neo4j,所以这里需要用官方给出的另一款工具

tabby-vul-finder

笔者的教训是直接将其克隆下来而不是下它的realese,因为它的分发版里面少了听过东西,用的时候数据上传不全

该工具的配置文件db.properties要按自己的neo4j配置来进行改动

接着我们开始测试,这次测的是maven库里面自带的cc漏洞版本

setting.properties内容如下:

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
26
27
28
29
# need to modify
tabby.build.target = C:\\Users\\BD\\.m2\\repository\\commons-collections\\commons-collections\\3.2.1\\commons-collections-3.2.1.jar
tabby.build.libraries = libs
tabby.build.mode = gadget
tabby.output.directory = ./output/dev

# debug
tabby.debug.details = false
tabby.debug.print.current.methods = true

# jdk settings
tabby.build.useSettingJRE = true
tabby.build.isJRE9Module = false
#tabby.build.javaHome = /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home
tabby.build.javaHome = C:\\Program Files\\Java\\jdk1.8.0_65
tabby.build.isJDKProcess = true
tabby.build.withAllJDK = false
tabby.build.isJDKOnly = false

# dealing fatjar
tabby.build.checkFatJar = true

# pointed-to analysis
tabby.build.isFullCallGraphCreate = false
tabby.build.thread.timeout = 2
tabby.build.method.timeout = 5
tabby.build.isNeedToCreateIgnoreList = false
tabby.build.timeout.forceStop = false
tabby.build.isNeedToDealNewAddedMethod = true

启动tabby(命令中的xmx参数不是必需,看自己要求)

1
java -Xmx8G -jar tabby.jar

成功运行的话会返回done bye

然后我们去看ouput/dev目录下面会生成几个csv文件

image-20250327194933447

接下来利用tabby-vul-finder工具将csv数据上传到neo4j上

1
java -jar tabby-vul-finder.jar load E:\safety\tools\tabby\output\dev

然后到https://github.com/wh1t3p1g/tabby/wiki/%E7%8E%B0%E6%9C%89%E5%88%A9%E7%94%A8%E9%93%BE%E8%A6%86%E7%9B%96中找一个cc2的指令来测试一下

成功查出!!!

12cefe470e0b8ab2e7ba4bc44d992d05

历尽三天的折磨,笔者终于是成功用上了

简单改一下官方给出的找setter->jndi的查询语句

1
match path=(m1:Method)-[:CALL*..5]->(m2:Method {IS_SINK:true}) where m1.NAME =~ "get.*" and not m1.HAS_PARAMETERS return path

img