【红队基础 武器开发】一篇文章上手JAVAGUI武器开发

科技   2024-06-02 18:38   湖北  

前言

最近忙着国护前期准备,收到老大指示做了个致远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数据库连接池密码。

密文如下格式

解密后

CKCsec安全研究院
专注于网络安全的公众号,分享最新的Red Team、APT等高级攻击技术、以及最新的漏洞威胁刨析。