diff --git a/Dockerfile b/Dockerfile index 06b6f44..233c09b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM b1u3r/trackray:3.0.0 +FROM b1u3r/trackray:3.2.0 MAINTAINER b1u3r "blue@ixsec.org" @@ -8,7 +8,12 @@ COPY . . RUN mvn clean package +EXPOSE 80 EXPOSE 8080 +EXPOSE 7777 +EXPOSE 8888 +EXPOSE 8888 +EXPOSE 8090 EXPOSE 10000 EXPOSE 10001 EXPOSE 10002 diff --git a/README.md b/README.md index 3bdb09c..94f830c 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@
![](https://img.shields.io/badge/KCon-%E5%85%B5%E5%99%A8%E8%B0%B1-red) -![](https://img.shields.io/badge/version-3.1.0-success) +![](https://img.shields.io/badge/version-3.2.0-success) ![](https://img.shields.io/github/stars/iSafeBlue/Trackray.svg) ![](https://img.shields.io/github/forks/iSafeBlue/Trackray.svg) ![](https://img.shields.io/github/license/iSafeBlue/Trackray.svg) @@ -24,25 +24,20 @@ **溯光**,英文名“**TrackRay**”,意为逆光而行,追溯光源。同时致敬安全圈前辈开发的“溯雪”,“流光”。 -溯光是一个开源的插件化渗透测试框架,框架自身实现了漏洞扫描功能,集成了知名安全工具:Metasploit、Nmap、Sqlmap、AWVS等。 +溯光是一个开源渗透测试框架,框架自身实现了漏洞扫描功能,集成了知名安全工具:Metasploit、Nmap、Sqlmap、AWVS、Burpsuite等。 -溯光使用 Java 编写,SpringBoot 作为基础框架,JPA + HSQLDB嵌入式数据库做持久化,Maven 管理依赖,Jython 实现 Python 插件调用,quartz 做任务调度,freemarker 做视图层,Websocket 实现命令行式插件交互。 +溯光使用 Java 编写,SpringBoot 作为基础框架,JPA + HSQLDB嵌入式数据库做持久化,Maven 管理依赖,Jython 管理 Python 插件,quartz 做任务调度,freemarker 做视图层,Websocket 实现命令行式插件交互。 -框架可扩展性高,支持 Java、Python、JSON 等方式编写插件,有“漏洞扫描插件”、“爬虫插件”、“独立应用插件”、“内部插件”、“无交互插件”和“可交互插件” 等插件类型。 +如有任何使用上的问题请提交 issue。如果你具备插件开发的能力,希望你也能一起来维护这个项目。 -如有任何使用上的问题请提交 issue。 - -如果你具备插件开发的能力,希望你也能一起来维护这个项目。 - -项目开发不易,如果可以的话请留下你的 star 表示对我的鼓励。 +项目开发不易,如果对你有帮助请下 star 以示鼓励。 ## ⭐️特点 -- 提供 WEB 服务接口 - 使用只需要一个浏览器 -- 集成 AWVS、SQLMap、NMap、Metasploit、Kunpeng、XRay 等安全工具 -- 内置漏洞扫描器 -- 强大、易用、方便、开源 +- 集成 AWVS、SQLMap、NMap、Metasploit、Burpsuite、Crawlergo、Kunpeng、XRay 等安全工具 +- 内置多个渗透测试辅助插件 +- 方便、开源 ## ❗️申明 @@ -60,32 +55,30 @@ ## ⚡️快速使用 -可以通过源码编译为jar包后运行,或直接运行已编译好的jar包 - -#### 源代码版本 -1. 在 [releases](https://github.com/iSafeBlue/TrackRay/releases) 下载`trackray-x.x.x.src.zip`解压 -2. 如已安装 maven、jdk 等溯光编译所必备环境可忽略第2-5条 -3. `docker build -t trackray_beta .` 构建镜像 -4. `docker run -dit -p 8080:8080 --name trackray_runtime trackray_beta` 启动容器,可根据需求自行设定参数 -5. `docker exec -it trackray_runtime /bin/bash` 进入溯光工作目录 -6. 启动有需要的服务,如AWVS、msfprc、SQLMap等。并根据自己的需求修改`application.properties`配置文件 -7. 执行`nohup java -jar trackray.jar &` 或 `java -jar trackray.jar`,若提示未找到文件请先执行一遍`mvn clean package` -8. 访问`http://127.0.0.1:8080` - -#### 已编译版本 -1. 在 [releases](https://github.com/iSafeBlue/TrackRay/releases) 下载`trackray-x.x.x.bin.zip`解压 -2. 启动有需要的服务,如AWVS、msfprc、SQLMap等。并根据自己的需求修改`application.properties`配置文件 -3. 执行`nohup java -jar trackray.jar &` 或 `java -jar trackray.jar` -4. 访问`http://127.0.0.1:8080` +#### docker启动 +1. `git clone --depth=1 https://github.com/iSafeBlue/TrackRay.git` 或下载 [releases](https://github.com/iSafeBlue/TrackRay/releases) 最新版本源码 +2. `docker build -t trackray_beta .` 构建镜像 +3. `docker run -dit -p 80:80 --name trackray_v3 trackray_beta` 启动容器,可根据需求自行设定参数 +4. `docker exec -it trackray_v3 /bin/bash` 进入溯光工作目录 +5. 启动有需要的服务,如 AWVS、msfprc、SQLMap 等。并根据自己的需求修改`application.properties`配置文件 +6. 下载溯光依赖资源文件,将文件移动到 `/release/` 目录 +7. 进入发布目录 `cd release/`,运行溯光`nohup java -jar trackray.jar &` 或 `java -jar trackray.jar`,若提示未找到文件请先执行一遍`mvn clean package` +8. 访问`http://127.0.0.1` +#### 本地启动 +1. `git clone --depth=1 https://github.com/iSafeBlue/TrackRay.git` 或下载 [releases](https://github.com/iSafeBlue/TrackRay/releases) 最新版本源码 +2. 启动有需要的服务,如AWVS、msfprc、SQLMap等。并根据自己的需求修改`application.properties`配置文件或直接通过启动参数配置 +3. 下载溯光依赖资源文件,将文件移动到 `/release/` 目录 +4. 执行 Maven 编译命令 `mvn clean package` +5. 进入发布目录 `cd release/`,运行溯光`nohup java -jar trackray.jar &` 或 `java -jar trackray.jar` +6. 访问`http://127.0.0.1` -## 📘文档 -[安装说明](/docs/安装说明.md) +#### 溯光依赖资源 -[插件开发](/docs/扩展开发.md) +> 链接: https://pan.baidu.com/s/1lVAcB1r4gLJxzYXWtSs5xg 提取码: eexr -[功能介绍](/docs/功能.md) +下载资源文件解压后将“resource”目录移动到“release”目录下。 ## ❤️注意 @@ -100,6 +93,7 @@ | 日期 | 描述 | | ---- | ---- | +| 2020-04-11 | 溯光3.2.0更新 | | 2019-08-16 | 溯光3.1.0更新 | | 2019-05-14 | 溯光3更新 | | 2019-03-11 | 新增jython支持,可通过`PyScript.java`插件调用python脚本 | diff --git a/base/pom.xml b/base/pom.xml index 22a8eb4..d3314af 100644 --- a/base/pom.xml +++ b/base/pom.xml @@ -5,7 +5,7 @@ framework com.trackray - 3.1.0-BETA + 3.2.0 ../pom.xml diff --git "a/docs/\345\212\237\350\203\275.md" "b/docs/\345\212\237\350\203\275.md" deleted file mode 100644 index f416fb5..0000000 --- "a/docs/\345\212\237\350\203\275.md" +++ /dev/null @@ -1,20 +0,0 @@ -### 功能介绍 - -* /task/create 创建任务 -* /task/destroy 销毁任务 -* /task/process 开启任务 -* /task/data 任务数据 -* /task/find 查找任务 - -* /plugin/list 插件列表 -* /plugin/use 调用插件 -* /plugin/result 插件执行结果 -* /plugin/stop 结束插件线程 - -* /manage 管理后台 -* /manage/create 创建任务 -* /manage/task 任务列表 - -* /api 无交互式插件入口 -* /console 交互式插件控制台 -* /msf metasploit 控制台 diff --git "a/docs/\345\256\211\350\243\205\350\257\264\346\230\216.md" "b/docs/\345\256\211\350\243\205\350\257\264\346\230\216.md" deleted file mode 100644 index e84def8..0000000 --- "a/docs/\345\256\211\350\243\205\350\257\264\346\230\216.md" +++ /dev/null @@ -1,148 +0,0 @@ -# 依赖环境 -> 加粗为必须环境,没有安装程序则无法正常编译运行 - -- **JDK 1.8** -- Python 2.7 -- **Maven** -- Git -- Metasploit -- Nmap(建议安装) -- SQLMAP(建议安装) -- AWVS - -不论是 Windows 还是 linux 一定需要先安装 JDK1.8 和 Maven。 -安装过程这里不做演示。 -保证 JDK 和 Maven 都在系统环境变量,能执行`java -version` 和 `mvn --version`即可。 - -# 安装过程 - -**第一步** -手动启动 AWVS 服务 - -![][1] - -登录后台,生成一个API密匙。 - -![][2] - -复制密匙和 AWVS 的地址。 - -找到`web/src/main/resources/application.properties`配置文件。 - -修改如下部分 - -``` -awvs.host=https://127.0.0.1:3443 -awvs.key=你的API KEY -``` - -**第二步** - -找到你 python 的第三方库目录。 - -Windows 的一般在 python 安装目录下的 `/Lib/site-packages` - -Linux 下可以通过输出 sys.path 来找第三方包路径 - -![][3] - -我的是 `D:/Python2/Lib/site-packages` - -同样找到`web/src/main/resources/application.properties`配置文件。 - -修改`python.package.path`参数 -``` -python.package.path=D:/Python/Lib/site-packages -``` - -**第三步** - -安装 Maven 后找到仓库位置。 - -如果没有在 `settings.xml` 里配置指定仓库目录,默认会在当前用户目录中生成一个 `.m2`的目录 - -> Linux /root/.m2/repository -> Windows C:/Users/blue/.m2/repository - -找到仓库目录后修改 `application.properties` 的 `maven.repository.path`参数 - -``` -maven.repository.path=/root/.m2/repository -``` - - -**第四步** - -这个是 DNSLOG 回显检测漏洞时需要的。 - -去 `ceye.io` 注册一个账号,拿到给你分配的域名和 TOKEN。 - -![][4] - -修改配置文件 - -``` -#ceye.io -ceye.io.token=****** -ceye.io.identifier=****.ceye.io -``` - - -**第五步** - -启动 msf 和 sqlmapapi。 - -如果你是 kali 操作系统,可以直接运行`startdep.sh`。 - -如果是其他系统,则要找到 metasploit 和 sqlmap 的目录分别执行 - -``` -msfrpcd -U 用户名 -P 密码 -S -f -``` -``` -python sqlmapapi.py -s -``` - -启动成功后修改配置文件 - -``` -#msfrpc -metasploit.host=127.0.0.1:55553 -metasploit.user=msf -metasploit.pass=msf -``` - -``` -#sqlmap api -sqlmap.root=http://127.0.0.1:8775/ -``` - -**第六步** - -编译打包程序 - -Windows 下运行`package.bat` -Linux 下运行 `package.sh` - -等待依赖下载完成和编译完成,如果以上操作都没有出现问题则会提示 `BUILD SUCCESS` - -![1557584484(1).jpg][5] - -编译成功后会在当前目录打包一个`trackray.jar`就是溯光的主程序。 - -然后直接执行`startup.bat`或`startup.sh`溯光就会启动服务。 - -![1557584966(1).jpg][6] - -没有抛出异常或`ERROR`日志,访问 8080 端口正常。 - -服务启动正常后,登录账号,默认账号 blue,密码 trackray。 - - - - [1]: http://blueblog.test.upcdn.net/usr/uploads/2019/05/143460336.png - [2]: http://blueblog.test.upcdn.net/usr/uploads/2019/05/703035688.png - [3]: http://blueblog.test.upcdn.net/usr/uploads/2019/05/447148357.png - [4]: http://blueblog.test.upcdn.net/usr/uploads/2019/05/3530661395.png - [5]: http://blueblog.test.upcdn.net/usr/uploads/2019/05/3731947807.jpg - [6]: http://blueblog.test.upcdn.net/usr/uploads/2019/05/558596656.jpg \ No newline at end of file diff --git "a/docs/\346\211\251\345\261\225\345\274\200\345\217\221.md" "b/docs/\346\211\251\345\261\225\345\274\200\345\217\221.md" deleted file mode 100644 index dfeb1ee..0000000 --- "a/docs/\346\211\251\345\261\225\345\274\200\345\217\221.md" +++ /dev/null @@ -1,745 +0,0 @@ - -# 目录结构 - -``` -├─trackray.jar # 编译出来的主程序 -│ LICENSE # 许可协议 -│ pom.xml # maven 根依赖配置文件 -│ README.md # 说明文档 -├─base # 基础模块 -│ │ pom.xml # 基础模块依赖配置 -│ │ -│ ├─src -│ │ ├─main -│ │ │ ├─java -│ │ │ │ └─com -│ │ │ │ └─trackray -│ │ │ │ └─base -│ │ │ │ ├─annotation # 注解包 -│ │ │ │ │ Exploit.java # 漏洞扫描注解类 -│ │ │ │ │ Function.java # MVC插件功能注解类 -│ │ │ │ │ Param.java # 插件参数注解类 -│ │ │ │ │ Plugin.java # 插件注解类 -│ │ │ │ │ Rule.java # 插件规则注解类 -│ │ │ │ │ -│ │ │ │ ├─attack # 集成模块包 -│ │ │ │ │ Awvs.java # AWVS 实现类 -│ │ │ │ │ HackKit.java # 插件工具包 -│ │ │ │ │ Metasploit.java # Metasploit 实现类 -│ │ │ │ │ Payload.java # Payload 字典类 -│ │ │ │ │ Python.java # Python 实现类 -│ │ │ │ │ -│ │ │ │ ├─bean # JavaBean -│ │ │ │ │ Assets.java -│ │ │ │ │ Banner.java -│ │ │ │ │ Constant.java # 系统常量 -│ │ │ │ │ FingerBean.java -│ │ │ │ │ HostInfo.java -│ │ │ │ │ Result.java -│ │ │ │ │ ResultCode.java -│ │ │ │ │ Rule.java -│ │ │ │ │ SenseInfo.java -│ │ │ │ │ SystemInfo.java -│ │ │ │ │ Task.java -│ │ │ │ │ Vulnerable.java # 漏洞类 -│ │ │ │ │ -│ │ │ │ ├─controller -│ │ │ │ │ DispatchController.java -│ │ │ │ │ -│ │ │ │ ├─entity -│ │ │ │ │ PortEntity.java -│ │ │ │ │ SystemEntity.java -│ │ │ │ │ -│ │ │ │ ├─enums # 枚举 -│ │ │ │ │ FingerPrint.java # WEB指纹库 -│ │ │ │ │ HttpMethod.java -│ │ │ │ │ Language.java # 编程语言枚举类 -│ │ │ │ │ SystemOS.java # 操作系统枚举类 -│ │ │ │ │ VulnLevel.java -│ │ │ │ │ VulnType.java -│ │ │ │ │ WEBServer.java # WEB服务器枚举类 -│ │ │ │ │ -│ │ │ │ ├─exception -│ │ │ │ ├─exploit -│ │ │ │ │ AbstractExploit.java # 漏洞插件抽象类 -│ │ │ │ │ Exploter.java -│ │ │ │ │ -│ │ │ │ ├─handle -│ │ │ │ │ CoreThreadMap.java -│ │ │ │ │ Shell.java # 系统 SHELL 工具 -│ │ │ │ │ SystemInit.java # 系统初始化 -│ │ │ │ │ ThreadMonitor.java -│ │ │ │ │ -│ │ │ │ ├─httpclient # Http发包工具 -│ │ │ │ │ CrawlerPage.java -│ │ │ │ │ Fetcher.java -│ │ │ │ │ HttpClient.java -│ │ │ │ │ HttpClientWrapper.java -│ │ │ │ │ HttpProxy.java -│ │ │ │ │ Request.java -│ │ │ │ │ Response.java -│ │ │ │ │ ResponseStatus.java -│ │ │ │ │ -│ │ │ │ ├─plugin -│ │ │ │ │ AbstractPlugin.java # 插件抽象类 -│ │ │ │ │ CommonPlugin.java # 无交互式接口插件父类 -│ │ │ │ │ CrawlerPlugin.java # 爬虫插件父类 -│ │ │ │ │ InnerPlugin.java # 内部插件父类 -│ │ │ │ │ MVCPlugin.java # MVC插件父类 -│ │ │ │ │ WebSocketPlugin.java # 命令行交互式插件父类 -│ │ │ │ │ -│ │ │ │ ├─quartz -│ │ │ │ │ QuartzManager.java # quartz调度管理 -│ │ │ │ │ SpringJobFactory.java -│ │ │ │ │ -│ │ │ │ ├─service -│ │ │ │ ├─store -│ │ │ │ │ VulnDTO.java -│ │ │ │ │ VulnRepository.java -│ │ │ │ │ -│ │ │ │ └─utils -│ │ │ │ ... -│ │ │ │ -│ │ │ └─resources -│ │ │ log4j2.xml -│ │ │ -│ │ │ -├─data # 数据库目录 -├─module # 插件模块 -│ │ pom.xml # 插件模块依赖配置文件 -│ │ -│ ├─src -│ │ ├─main -│ │ │ ├─java -│ │ │ │ └─com -│ │ │ │ └─trackray -│ │ │ │ └─module -│ │ │ │ │ Verify.java -│ │ │ │ │ -│ │ │ │ ├─auxiliary # 辅助工具包 -│ │ │ │ │ ... -│ │ │ │ │ -│ │ │ │ ├─crawler # 爬虫插件包 -│ │ │ │ │ ... -│ │ │ │ │ -│ │ │ │ ├─exploit # 漏洞扫描插件包 -│ │ │ │ │ ... -│ │ │ │ │ -│ │ │ │ ├─inner # 内部插件包 -│ │ │ │ │ ... -│ │ │ │ │ -│ │ │ │ ├─mvc # MVC插件包 -│ │ │ │ │ ... -│ │ │ │ │ -│ │ │ │ └─plugin # 普通插件包 -│ │ │ │ -│ │ │ └─resources # 资源包 -│ │ │ │ -│ │ │ └─templates # MVC插件模板目录 -│ │ │ ├─common -│ │ │ │ error.html -│ │ │ │ -│ │ │ ├─json -│ │ │ │ index.html -│ │ │ │ result.html -│ │ │ -├─resources # 外部资源目录 -│ -└─web - │ pom.xml # WEB模块依赖配置文件 - │ - ├─src - │─main - │ │ ├─java - │ │ │ └─com - │ │ │ └─trackray - │ │ │ │ WebApplication.java # 程序启动类 - │ │ │ │ - │ │ │ └─web - │ │ │ ├─api - │ │ │ │ - │ │ │ ├─config # Springboot 配置包 - │ │ │ │ - │ │ │ ├─handle - │ │ │ │ ScannerJob.java - │ │ │ │ - │ │ │ ├─service - │ │ │ │ │ PluginService.java - │ │ │ │ │ TaskService.java - │ │ │ │ │ - │ │ │ │ └─impl - │ │ │ │ PluginServiceImpl.java - │ │ │ │ TaskServiceImpl.java - │ │ │ │ - │ │ │ └─ws - │ │ │ HandshakeInterceptor.java - │ │ │ MsfHandler.java - │ │ │ PluginHandler.java - │ │ │ - │ │ └─resources - │ │ │ application.properties # 程序配置文件 - │ │ │ log4j.properties - │ │ │ trackray-base-framework.xml - │ │ │ trackray-moudle-application.xml - │ │ │ trackray-web-application.xml - │ │ │ - │ │ ├─static # 静态资源目录 - │ │ │ ├─assets - │ │ │ │ - │ │ │ ├─css - │ │ │ │ - │ │ │ └─js - │ │ │ - │ │ ├─templates # 网页模板目录 - -``` - -# 插件 - -## AbstractPlugin - -这是交互式插件和非交互式插件的父类。 - -**BASE常量** - -其中的静态常量 `BASE` 是 /resources/include/ 的所在目录绝对路径。 - -如果你的插件需要额外的静态资源,那么你可以在 `/resources/include` 目录里创建一个和插件 KEY 相同的文件夹,便于识别,如果没有在 @Plugin 注解中设置 value 则默认的插件 KEY 就是当前类名首字母小写。 - -如 `Typecho001` = `typecho001` - -**check(Map param)** - -``` -public abstract boolean check(Map param); -``` - -这是用于检验是否合规的方法,需要被强制重写,当返回 true 时才会调用 start() 方法 - -param 参数是从前台传过来的参数键值对。 - -用于检验参数格式是否正确或漏洞是否存在。 - -**after()** - -在 start() 方法之前调用 - -**before()** - -在 start() 方法之后调用 - -**start()** - -``` -public abstract E start(); -``` - -这是一个抽象方法,所有继承了该类的子类都需要重写这个方法。 - -在 check 方法通过后会调用 start() 方法 - -start() 方法返回值最终会会当做插件结果,响应给前台。 - -**shell()** - -调用当前系统 shell 来辅助完成插件功能。 - -**executor()** - -插件执行的主方法 - -**crawlerPage** - -http请求对象(不推荐使用) - -**fetcher** - -执行 http 请求对象(不推荐使用) - - -**errorMsg** - -当校验不通过时,返回给前台的信息。 - -**param** - -前台传过来的参数键值对 - -**requests** - -HTTP 发包工具(推荐使用) - -**hackKit** - -hack 常用工具包 - - -## 无交互插件 - -无交互插件需要你填写好所有要填写的参数,直接请求接口来执行插件。 - -默认需要去继承 `CommonPlugin`类。 - -``` -public abstract class CommonPlugin extends AbstractPlugin { - - public enum Type{ - /** - * 非交互式插件响应类型 - */ - JSON("application/json"), - XML("application/xml"), - HTML("text/html"), - TEXT("text/plain"); - - private String value; - - Type(String value) { - this.value = value; - } - - public String getValue() { - return value; - } - } - public enum Charset{ - /** - * 非交互式插件响应编码 - */ - UTF8("charset=utf-8"), - GBK("charset=gbk"), - GB2312("charset=gb2312"), - NULL(""); - - private String value; - - Charset(String value) { - this.value = value; - } - - public String getValue() { - return value; - } - } - - public HttpServletRequest request; - public HttpServletResponse response; - - public boolean isNone(String o){ - return StringUtils.isBlank(o); - } - - public boolean isNull(Object o){ - return o==null; - } - -} -``` -这是一个抽象类,继承了 `AbstractPlugin` - -主要多出来两个属性:`request` 和 `response`。 - -继承了 `CommonPlugin` 的类可以通过调用这两个属性来控制请求和响应内容。 - -`Type` 和 `Charset` 枚举类,用于在插件注解里声明当前接口返回的数据格式和编码类型。 - -无交互插件同时也需要使用 `@Rule` 和 `@Plugin` 插件,这两个注解后面会讲到。 - -在 `http://127.0.0.1:8080/api`,找到相应的插件填写好参数提交即可完成调用。 - -或直接调用接口。 - -> http://127.0.0.1:8080/plugin/use?key=插件KEY&参数=参数值 - -## 交互式插件 - -交互式插件一般在命令行控制台中调用,可以允许你通过命令行交互来完成插件的调用。 - -交互式插件由 Websocket 实现,想要写一个交互式插件,首先要继承 `WebSocketPlugin` 类。 - -同时设置 `@Rule` 注解的 websocket 参数为 `true` ,如果需要异步交互需要将 `sync` 也设置为 `true`。 - -``` -@Rule(sync = true,websocket = true) -``` - - - -``` - - public void sendColorMsg(WebSocketMessage msg);//向控制台发送有颜色的消息 - - public void send(String text);//向控制台发送消息 - - public String getInput();//获取控制的输入 - - public void onClose();//当前会话结束时调用,有需要做对象销毁处理的可以重写这个方法 - -``` - -## 内部插件 - -> 所属包:con.trackray.module.inner - -内部插件是不可以通过外部去调用的,需要继承 `InnerPlugin` 并使用 `@Plugin` 注解,通常在漏洞扫描时时会调用。 - -例如 “网页爬虫”,“指纹识别”,“端口扫描” 等,都是通过调用内部插件实现的。 - -还有用于检测 SSRF 等漏洞用的 `FuckCeye` 插件也属于内部插件。 - -如果你的插件里需要使用内部插件,可以通过 spring 的自动注入 `@Autowired` 注解,来注入内部插件到当前对象。 - -``` -@Autowired -private FuckCeye fuckceye; -``` - -例子可参考 `WebLogicWLSRCE.java` - - -## 爬虫插件 - -> 所属包:con.trackray.module.crawler - -爬虫插件会在扫描任务被勾选“网页爬虫”时调用,每爬取一条请求就会调用一次爬虫插件。 - -爬虫插件需要继承 `CrawlerPlugin`,继承该类必须重写 check 和 process 方法。 - -**check **方法用于检验请求是否符合插件规则,以免产生多余请求。 - -当 check 方法返回为 true 时会调用 process 方法。 - -process 方法里写插件主要检测代码。 - -**addVulnerable()** - -当插件检测出漏洞时,可以通过调用 addVulnerable() 方法来向数据库插入一条漏洞。 - -**requests** - -requests 属性为请求工具包,处理 https 和 http 都很方便。 - -**response** - -response 属性为当前爬虫得到的 HTTP 响应。 - -**task** - -task 属性为当前任务对象,如果你的爬虫插件不是检测漏洞而希望是检测一些敏感信息的话可以修改 task.getResult() 里的属性。 - -参考 `FingerProbe.java` 或 `InfoProbe.java`。 - -**target** - -爬虫爬取到的 URL 对象。 - -**fetcher & crawlerPage** - -http 请求对象(不建议使用)。 - -## 漏洞扫描插件 - -漏洞扫描插件会在,扫描任务中勾选“漏洞攻击模块”时调用。 - -漏洞扫描插件分为三种 - -### 1.独立插件 - -> com.trackray.module.exploit - -独立的漏洞扫描插件需要继承 `AbstractExploit` 并使用 `@Plugin` 或 `@Exploit` - -`AbstractExploit` 中有以下需要了解的方法和属性。 - -**requests** - -http / https 发包工具 - -**target** 当前扫描任务的地址。 - -**task** - -当前扫描任务对象。 - -**check()** - -check 是一个抽象方法,需要被子类强制重写。 - -该方法一般用于检验是否符合当前漏洞扫描插件的规则,以免产生多与请求。 - -**attack()** - -attack 也是一个抽象方法,需要被子类强制重写。 - -该方法是检测漏洞的主方法。 - -**before()** - -在 attack 方法前执行 - -**after()** - -在 attack 方法后执行 - -**addVulnerable()** - -当插件检测出漏洞时,可以通过调用 addVulnerable() 方法来向数据库插入一条漏洞。 - -**fetcher & crawlerPage** - -http 请求对象(不建议使用)。 - -### 2.漏洞规则 - -位于 -> com.trackray.module.inner.SimpleVulRule - -实际上这是一个“内部插件”,会在勾选漏洞模块攻击时调用。 - -有一些漏洞检测方法很简单,只通过简单的判断响应体就能识别出来,也就没有必要再去写一个独立的插件而占用空间了。 - -在 doSwitch() 方法中会先去根据当前任务的指纹识别结果走一遍 switch 流程。 - -swtich 的每一个 case 都是 WEB 指纹的枚举对象。 -当 switch 找到当前任务 WEB 指纹对应的 case 后,case 内的代码会通过构建一个漏洞规则添加到 loaders 集合里。 -如果规则是通用的,可以写在 switch 的外面。 - -> 例:phpcms 的 authkey 泄漏漏洞规则 -``` - switch (finger) { - case $phpcms: - loaders.add( - Payloader.builder() - .url("/api.php?op=get_menu&act=ajax_getlist&callback=aaaaa&parentid=0&key=authkey&cachefile=..\\..\\..\\phpsso_server\\caches\\caches_admin\\caches_data\\applist&path=admin") - .method(HttpRequest.Method.GET) - .containsStr("aaaaa") - .vuln( - Vulnerable.builder() - .level(Vulnerable.Level.HIGH.getLevel()) - .type(Vulnerable.Type.INFO_LEAKAGE.getType()) - .title("phpcms authkey泄漏") - .build()) //另一种实现方式 - .build() - ); - break; - } -``` - - -### 3.kunpeng JSON插件 - -kunpeng 是一个 go 语言编写的 poc 测试框架,这里我对 kunpeng 的 JSON 插件做了一个支持。 - -只需要按照 kunpeng json 插件的格式规范创建一个 json 文件到 `/resources/json` 目录。 - -在扫描任务勾选“漏洞攻击模块”时会被调用,或通过 MVC 插件调用 `http://127.0.0.1:8080/apps/json`。 - -## MVC 插件 - -位于 -> com.trackray.module.mvc - -MVC 插件的特点在于,他可以像是在写一个功能一样,而非简单的接口式调用。 - -MVC 插件需要继承 MVCPlugin 类,并使用 `@Rule`,`@Plugin` 注解。 - -`@Rule` 注解可以配置`defaultPage`来指定当前插件的首页路径,如果不配置,则默认该插件的首页路径为 `index`。 - -例子: -``` -/* - 默认首页:/plugin/mvc/testplugin/test123 -*/ -@Rule(defaultPage = "test123") -@Plugin(title = "Test", value = "testplugin" ) -public class Test extends MVCPlugin{ - @Override - public void index() { - model.setViewName("indexPage"); - } - @Function(value="test123") - public void index() { - model.setViewName("testPage"); - } -} -``` - - -MVCPlugin 内置了一个 `ModelAndView` 对象, 是 SpringMVC 提供的。 - -可以通过 `setViewName()` 来指定视图层的网页模板。 - -通过 `addObject(key,value)` 向视图层网页模板注入参数。 - -这里的视图层是使用 freemarker 实现的,需要懂 freemarker 的语法。 - -例子可以参考:`com.trackray.module.inner.JSONPlugin` - -继承 `MVCPlugin` 必须要重写一个 `index` 方法,这是插件的入口。 - -如果需要写其他的功能,就得再创建一个 `public` 返回值为 `void` 的无参方法。 - -并且要在该方法上使用 `@Function` 注解,该注解的 value 参数如果不填写的话则默认的 requestMapping 地址为方法名。 - -例如 -``` -@Rule -@Plugin(title = "渗透测试思维导图", value = "pentest" ) -public class Pentest extends MVCPlugin{ - @Override - public void index() { - model.setViewName("indexPage"); - } - @Function(value="foo") - public void fooTest(){ - model.setViewName("fooPage"); - } -} -``` - -> http://127.0.0.1:8080/plugin/mvc/pentest/index 对应 index() - -> http://127.0.0.1:8080/plugin/mvc/pentest/foo 对应 fooTest() - -最后还需要在 `/module/src/main/resources/templates` 创建一个目录名为插件 KEY 的目录。 - -里面存放扩展名为 `.html` 的模板文件。 - -以刚才的代码为例 - -`fooTest()` 方法对应模板文件路径为`/module/src/main/resources/templates/pentest/fooPage.html` - - -![1557660576(1).jpg][1] - -## Python 插件 - -python 插件有两种实现方式。 - -**1.通过命令行实现** -这种方式最为简单,通过在 include 里写一个 python 脚本。 - -然后在插件里调用 shell() 方法来执行系统命令。 - -案例可参考 `com.trackray.module.plugin.windows.smb.MS17010` - -但这样还需要再写 java 的插件代码。 - -**2.通过jython实现** - -jython 是一个 Python 语言在 Java 中的完全实现。 - -我将它的调用过程写成了一个交互式插件。 - -你可以通过在 `/resources/python/` 目录下安装如下规范去创建一个 python 文件。 - -在这个 python 文件中需要写两个方法。 - -> params(): 返回字典对象,key 为 参数,value 为参数的说明。 - -> verify(args): args 是一个字典类型,是从前台传过来的参数。 - -``` -def params(): - return {"url":"this is target url."} - -def verify(args): - return args -``` - -**建议 python 插件使用原生类库依赖,如要使用第三方依赖,请先安装到python** - -![1557661673(1).jpg][2] - - -# 关于注解 - -> com.trackray.base.annotation - -## @Rule - -一般用在“可交互插件”和“无交互插件”类上。 - -``` -public @interface Rule { - boolean enable() default true; //是否在外部启用插件 - boolean websocket() default false; //是否为websocket插件 - boolean sync() default false; //是否为异步任务 - Param[] params() default {}; // 插件参数 - CommonPlugin.Type type() default CommonPlugin.Type.JSON; //当使用commonplugin时返回给浏览器的文本类型 - CommonPlugin.Charset charset() default CommonPlugin.Charset.UTF8; //使用commonplugin时返回给浏览器的文本编码 - String[] headers() default {}; //返回给浏览器时的response header - String filename() default ""; //插件用于下载功能时返回的文件名 - String defaultPage() default "index";//MVC插件的默认页面 -} -``` -`params()` 最为常用,它用来声明这个插件需要哪几个参数。 - -``` -public @interface Param { - String key () default ""; // 参数键 - String defaultValue() default ""; // 参数默认值 - String desc() default ""; // 参数说明 - -} -``` -例子:Thinkphp51and52RCE.java -``` -@Rule( type = CommonPlugin.Type.HTML , - params = { - @Param(key = "target", desc = "目标地址"), - @Param(key = "func",defaultValue = "phpinfo" , desc = "执行函数"), - @Param(key = "var",defaultValue = "1" , desc = "函数参数"), - }) -``` -## @Plugin - -它是所有插件必须要使用的注解,只有声明了这个注解才可以使用。 - -``` -public @interface Plugin { - String value() default ""; //插件在springioc容器的ID - String title(); //插件标题 - String desc() default ""; //插件介绍 - String author() default "anonymous"; //插件作者 - String[] link() default ""; //插件相关连接 - long time() default 0L; //插件对应的时间戳 -} -``` - -# WEB指纹 - -这里顺便再说一下如何添加指纹库。 - -> com.trackray.base.enums.FingerPrint - -指纹库位于 base 模块,是一个枚举类。 - -可以在首部或尾部添加一条新的枚举,尽量使用 `$` 开头。 - -第一个参数是 指纹的名称,如果第二个参数是 String 类型则是该指纹的说明。 - -FingerBean 类是指纹匹配对象。 - -``` -public class FingerBean { - private String version; //指纹版本 - private String match; //匹配表达式 - private String url; //指纹URL - private String md5; //指纹MD5 -} -``` -> dedecms 指纹示例 -``` - $dedecms("dedecms", - new FingerBean("","/data/admin/allowurl.txt","dedecms",""), - new FingerBean("","/data/index.html","dedecms",""), - new FingerBean("","/data/js/index.html","dedecms",""), - new FingerBean("","/data/admin/ver.txt","","b4d132542083d1364022bac8f790cc95"), - new FingerBean("","/include/data/vdcode.jpg","","ea3350e457f70cf7b4f122c8b832ddbe")), - -``` - - - [1]: http://blueblog.test.upcdn.net/usr/uploads/2019/05/1171646061.jpg - [2]: http://blueblog.test.upcdn.net/usr/uploads/2019/05/1282720821.jpg \ No newline at end of file diff --git a/module/pom.xml b/module/pom.xml index a3f2c3b..6151c8e 100644 --- a/module/pom.xml +++ b/module/pom.xml @@ -5,7 +5,7 @@ framework com.trackray - 3.1.0-BETA + 3.2.0 ../pom.xml diff --git a/pom.xml b/pom.xml index 8cfe067..4939097 100644 --- a/pom.xml +++ b/pom.xml @@ -19,13 +19,13 @@ com.trackray framework - 3.1.0-BETA + 3.2.0 trackray framework trackray pentest framework 1.8 - 3.1.0-BETA + 3.2.0 diff --git a/web/pom.xml b/web/pom.xml index 2c15eed..0daa276 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -5,7 +5,7 @@ framework com.trackray - 3.1.0-BETA + 3.2.0 ../pom.xml diff --git a/web/src/main/resources/application.properties b/web/src/main/resources/application.properties index 9503348..511c617 100644 --- a/web/src/main/resources/application.properties +++ b/web/src/main/resources/application.properties @@ -1,4 +1,4 @@ -trackray.version=3.1.0 +trackray.version=3.2.0 #TrackRay Account trackray.account=blue trackray.password=trackray @@ -9,6 +9,7 @@ trackray.host=127.0.0.1 #trackray URL (http/https) trackray.url=http://${trackray.host}:${server.port}/ +# ԴļĿ¼ trackray.resource=/resources/ @@ -36,26 +37,35 @@ server.tomcat.protocol-header=X-Forwarded-Proto ########### #burpsuite# ########### -burp.console.log=false +# Ƿڿ̨ burpsuite ־ +burp.console.log=true burp.remote.host=127.0.0.1 burp.remote.port=8090 +# Ƿʹ burp loader-keygen burp.local.loader=true -burp.local.headless=false +# Ƿʹͷģʽ(ʾburp) +burp.local.headless=true ########### ####xray### ########### xray.remote.host=127.0.0.1 xray.remote.port=7777 +# Ƿڿ̨ xray ־ xray.console.log=false ########### #crawlergo# ########### +# chrome · crawlergo.chrome.path=C:/Program Files (x86)/Google/Chrome/Application/chrome.exe +# crawlergo Ĭϴ͵ַ crawlergo.push.proxy=http://${burp.remote.host}:8080/ +# ģʽ crawlergo.filter.mode=smart +# Ƿڿ̨crawlergo ־ crawlergo.console.log=true +# crawlergo ǩ crawlergo.max.tab=20 @@ -85,16 +95,16 @@ sqlmap.host=http://127.0.0.1:8775/ ceye.io.token=601db116c2a926704952249af21a2951 ceye.io.identifier=spn7ez.ceye.io -#jython plugin +#jython plugin pythonĿ¼ python.script.path=${user.dir}/resources/python/ -#python library +#python library pythonĿ¼ python.package.path=D:\\Software\\Python\\Lib\\site-packages -#maven repository +#maven repository mavenֿĿ¼ maven.repository.path=D:/Development/maven/repository -#system temp path +#system temp path ʱļĿ¼ temp.dir=${java.io.tmpdir}/trackray/ #quartz