前言
最近忙着国护前期准备,收到老大指示做了个致远OA的综合利用工具,之前的gui开发一直都是在做python的,没怎么做过Java的,所以这次尝试着手javafx架构,一做不知道,做了才发现真拿捏了!微信公众号很少有这类讲授gui武器开发实战的文章,我作此文的目的,在于帮助想要增加自身开发功底以及想要用javafx开发gui却无处着手的师傅们,一篇文章上手javafx。文章内容中需要涉及到一些java基础,互联网学习的资料很多,师傅们自行食用。对啦,我们wingby团队建了一个对外公开交流群,这里可以和师傅们交流SRC、红队项目经验、护网经验、免杀、安全开发、代码审计、红蓝对抗等等,期待各位师傅们的加入。团队师傅银联SRC5月特别活动打下10800积分,收揽榜一,银联四月榜团队中两位师傅位居前五。有在某厂红队实习的大学生,也有网安4年经验、参加各级别护网的大黑客。
下期给大家上个大货,Dedecms爆RCE的那个版本仿佛停在了过去,但是利用代码审计Bypass最新版本的Dedecms进行RCE超酷好吧,后面等着证书下来用一篇文章带大家进入完整的代码审计过程,希望大家多多关注Wingby!我们是一群积极向上的大学生(bushi)。
以下实例讲解仅作技术分享,无教唆指导任何网络犯罪行为,因为传播利用本文所提供信息造成的任何结果,均由使用者本人承担责任,公众号作者不为此承担任何责任!
架构
初步了解完整的javafx架构,因为之前学过javaweb,所以javafx摸起来轻车熟路。按个人理解写了个思维导图如下:
架构思路上和javaweb是差不多的,甚至比javaweb还要简单一些(因为他不像javaweb分那么多的层:controller->service->model->dbutil(mybatis封装)->databse字段映射类)。这里的架构思路则轻松的多: 分为两类逻辑,一类是一键检查,一类是根据用户选择和填入参数进行检查攻击。
一键检查:
1.主类加载Main.fxml后将后端接口映射到gui界面,当用户选择一键检查则传递vulname=ALL,触发的是MainControler从Util工具包中取出HashMap进行遍历取出相应的名字的值,也就是映射的Check接口实现类的check重写方法,每种漏洞的check根据自身校验流程不同需要重写。
有点绕,我这里用一句话阐述下: 用户填入的参数传递->存储到.properties文件中->MainControlle读入->Util中的相关其他Check类(比如UrlCheck)进行参数校验->传给Tools类调用Check方法new一个exp类实例->交由实例对象进行check调用校验。
用户选择漏洞验证模式:
流程跟上方的差不多,不同的是他不用遍历所有的HashMap,而是进行匹配用户选择的漏洞模型就好。
我这里还是画个总的一个架构图方便说清楚,项目架构如下。
--根目录
-exp
--各种exp实现类(每一种类对应一个poc验证)
-util
--Config
--Tools
--urlCheck
--CheckVul
-MainApplication
-MainController
-module-info.java
-resource
-Main.fxml
-my.png
以下的讲解可能要涉及到一定的java基础和javaweb的一种分层mvc理念,不太了解的师傅们可以通过菜鸟教程去学,网上很多教程。
我这里从一个流程,两组架构,三个层面来讲解:
一个流程:
Main.fxml由主类MainApplication启动->生成前端gui->用户进行交互传参指定动作->参数交付给.properties配置文件->动作映射MainController中的对应处理函数->处理函数提取配置文件中传参进行行为动作->根据行为动作指定不同的Tools类->根据不同的Tools类返回实现CheckVul接口的exp类实例—>函数调用验证漏洞->反馈结果
两组架构:
--gui前端:
---Main.fxml作为根生成模板文件->参数传递给.properties配置文件存储->后端多层处理->反馈结果
--后端:
---Maincontroller获悉动作,从配置文件读入参数->根据Tools类映射攻击模式返回对应实例化类->实例化攻击类进行载荷攻击
三个层面:
主类:Config、MainController、MainApplicaton贯穿整个gui生命周期,各司其职,Config起一个参数传递与存储功能,MainApplicaton渲染模板,MainController映射动作
Exp类: 各司其职,一个类对应一个poc校验
Util类: 抽象接口用于类多态化,参数校验过滤,参数处理,漏洞映射模式
上手实践
前端ui设计
这个需要去下载一个SceneBuilder ,网上IDEA配置SceneBuilder的教程很多,新建一个项目,社区版的idea可能需要自己手动配置,网上也有教程。
组织架构如下。
运行完主类长这样。
继续使用SceneBuilder进行前端界面设计。
这里先加一块画布,方便我们gui工具前端页面绘制。
我们先绘制完了再来逐一讲解,它是个树形结构。
层次结构(最简单的)
-画布 AnchorPane
-MenuBar(用于用户点击介绍)
-TabPane(类型HTML中iframe)
-Tab1(功能点1)
-Text(说明)
-TextFiled(参数传递框)
-Button(动作触发器)
-Textarea(结果回显)
绘制好后我们进入MainApp运行一下,这里漏洞选择之所以没下拉列表是因为我们还没去写入(这个需要后端代码来完成)。
这里下拉列表不能直接在.fxml中去添加,我们需要去Controller控制器去写。首先.fxml中增加fx:id="随便写个名字",方便辨识。
此时回到控制器MainController。
别忘记给Main.fxml匹配controller。
这时候就很帅了。
CheckVul接口
在开发中我们常常用到接口类,这样方便进行每个实现类重写塑形,漏洞Check同样如此,有RCE、文件上传、文件任意下载、重置密码等等那么多接口,难道我们需要一个漏洞对应一个类吗?那样太麻烦,JAVA的面向对象优势此时凸显出来了。。。
这里先写个CheckVul接口,放到Util工具软件包(根据个人习惯)
package com.seeyon.seeyonexploit.util;
import java.net.URL;
public interface CheckVul {
boolean isVul=false;
boolean checkTarget(String protocol,String host,int port,String path) throws Exception;
boolean checkUrl(URL url) throws Exception;
String getFile(URL url,String filepath) throws Exception;
String upLoadFile(URL url,String Cookie,String filepath,String fileContent) throws Exception;
String remoteCmdExec(URL url ,String VPS ,String cmd)throws Exception;
String printInfo();
}
上面定义了一个布尔属性isVul来回返是否存在漏洞,这里初始化0,同时定义了各种漏洞校验利用抽象方法,checkTarget用于实现校验漏洞(针对重置漏洞因为只用发一次包即可知道成功与否,所以合并)。其他的抽象方法就是RCE、文件上传、文件下载等,最后printInfo方法打印相关利用和回返结果信息。
Exp类
接着新建一个exp软件包,用于写exp漏洞验证类,exp里面的类都要去implements CheckVul接口重写实现其底层方法。需要注意的是因为是从config文件中获取的,我们要先把Config类写好。Config类中的核心方法为init,用于初始化一个配置文件的读取和处理机制,保存相关.properties文件后让PropertiesConfiguration类propConfig实例读取。
private static void init(String propertiesFile) {
try {
File f = new File(propertiesFile);
if (!f.exists())
f.createNewFile();
propConfig = new PropertiesConfiguration(propertiesFile);
propConfig.setReloadingStrategy((ReloadingStrategy)new FileChangedReloadingStrategy());
propConfig.setAutoSave(autoSave);
} catch (ConfigurationException | java.io.IOException e) {
e.printStackTrace();
}
}
接着写exp类,其实和写python脚本发包过程是差不多的,只是这里用的是读入.properties文件获取参数。
private static final Config config=Config.getInstance("config.properties");
String loginName=config.getStringValue("loginName");
String loginPass=config.getStringValue("password");
模拟发包的代码简单抓个图,因为和python的代码逻辑没啥区别。
Tools包
写Tools包是为了联动exp类还有就是参数过滤,以及封装我们的业务调用逻辑。
urlCheck
用于校验用户目标输入的协议、ip、端口校验,毕竟OA部署在web服务上,我们去校验http和https协议即可,并提取相关信息。
package com.seeyon.seeyonexploit.util;
import java.net.MalformedURLException;
import java.net.URL;
public class urlCheck {
public URL urlCheck(String url){
int port = 80;
String ip = "127.0.0.1";
String protocol = "http";
String path;
//获取url
try {
URL u = new URL(url);
protocol = u.getProtocol().toLowerCase();
ip =u.getHost();
if(protocol.equals("https")){
port = 443;
}
if(u.getPort() != -1){
port = u.getPort();
}
path = u.getPath();
return u;
}catch (MalformedURLException e) {
System.out.println("error");
Tools.alert("错误","不是一个有效的url");
return null;
}
}
}
这里最主要的是这两个函数:alert(),CheckVul()。
CheckVul()
根据读入的字符串匹配漏洞模式,并返回一个exp类实例
如果没有匹配上模式,直接返回null对象了
public static CheckVul expolit(String vulname){
CheckVul cv=null;
switch (vulname)
{
case "phoneLogin_ResetPasswd":
CheckVul payload1=new phoneLogin_ResetPasswd();
return (CheckVul)payload1;
}
return cv;
}
alert()
设置一个弹窗显示内容的函数
第一个是弹窗警告类型设置的标题字符串,第二个弹窗中显示的内容
public static void alert(String header_text, String content_text) {
Alert alert = new Alert(Alert.AlertType.WARNING);
// 点 x 退出
Window window = alert.getDialogPane().getScene().getWindow();
window.setOnCloseRequest((e) -> {
window.hide();
});
alert.setHeaderText(header_text);
alert.setContentText(content_text);
alert.show();
}
Maincontroller联动
每个gui前端的画布都可以指定给对应的controller进行交付参数和动作。使用fx:controller="controller包路径"进行指定。
然后来到前端的交互界面我们可以看到有很多的标签。
fxml标签中<button>表示动作交互,需要用onAction进行指定激活函数(我这里是resetAttack,当然是指定Controller类中的函数)。
其他标签就是获取用户输入的,要与main.fxml文件中的fx:id名称保持一致。
核心就是tools类实例化exp类,并向实例对象传递相关参数。
成果展示
这里的工具预计会在我们的公开交流群开始内测,V1.0版本我已经写好了,内测时间大概在八月份。
关于运行
需jdk17环境,项目以及依赖全部打包完成,只需点击start.bat即可运行。
漏洞归纳总览
工具整合的漏洞共计21个,各个模块如下:
用户操作:
"phoneLogin_ResetPasswd任意用户密码重置",
"thirdpartyController.do管理员cookie获取",
"M1-server index管理员身份访问",
"M3-mobile_server用户session获取",
"rest_token接口相关漏洞"
"ucplogin audit-admin管理员登录"
文件上传操作:
"致远A6 uploadForm任意文件上传",
"致远互联FE协作办公平台uploadAccessory任意文件上传",
"致远OA ajaxdo_post_saveExcelInBase(新)任意文件上传",
"致远OA ajaxdo_post_formulaManager(老)任意文件上传",
"致远OA v8.0sp2 wpsAssistServlet任意文件上传"
信息泄露操作:
"致远OA A6 DownExcelBeanServlet敏感信息泄露",
"致远OA A6 initDataAssess敏感信息泄露",
"致远互联FE协作办公平台GUID sql注入",
"致远A8-V5协同管理软件 V6.1 ReportServer目录遍历",
"致远OA A8-V5 Webmaildo任意文件读取",
"致远 A6 operaFileActionController任意文件读取"
"致远OA getAjaxDataServlet XXE任意文件读取"
远程命令执行操作:
"M1-Server RCE(仅作whoami验证)",
"致远OA maindo-fastjson反序列化(支持dnslog验证,低版本漏洞)",
"M3-Mobile fastjson反序列化(仅支持whoami验证)"
Tips
文件上传操作漏洞,工具内置了哥斯拉免杀马以及冰蝎子免杀马上线,对于低java版本的服务器仅作jsp解析验证。
远程命令执行部分漏洞暂不提供自主命令,payload需要经过yoserial以及其他编码脚本处理,较为复杂,仅作whoami验证。对于fastjson类型漏洞,可作dnslog解析。
信息泄露漏洞集成了各类造成直接信息泄露的漏洞,包含sql注入、任意文件读取、任意文件下载、未授权等。
验证
部分老洞互联网上已经很少有漏洞资产,如果未成功会反馈信息!
用户操作
---phoneLogin_ResetPasswd任意用户密码重置
--thirdpartyController.do管理员cookie获取
--M1-server index管理员身份访问
--M3-mobile_server用户session获取
--rest_token接口相关漏洞
--ucplogin audit-admin管理员登录
文件上传操作
--"致远A6 uploadForm任意文件上传"
-- "致远互联FE协作办公平台uploadAccessory任意文件上传"
-- "致远OA ajaxdo_post_saveExcelInBase(新)任意文件上传"
-- "致远OA ajaxdo_post_formulaManager(老)任意文件上传"
-- "致远OA v8.0sp2 wpsAssistServlet任意文件上传"
敏感信息获取
--- "致远OA A6 DownExcelBeanServlet敏感信息泄露"
---"致远OA A6 initDataAssess敏感信息泄露"
---"致远互联FE协作办公平台GUID sql注入"
---"致远A8-V5协同管理软件 V6.1 ReportServer目录遍历
---"致远OA A8-V5 Webmaildo任意文件读取"
---"致远 A6 operaFileActionController任意文件读取"
---"致远OA getAjaxDataServlet XXE任意文件读取"
远程命令执行
---"M1-Server RCE"
--- "致远OA maindo-fastjson反序列化(支持dnslog验证,低版本漏洞)"
--- "M3-Mobile fastjson反序列化"
空间测绘
密文解密
新增数据库配置文件中密文解密处理模块,能够为我们提供横向时的OA数据库连接池密码。
密文如下格式
解密后