Cobalt strike3.8 中文支持
0x00 簡介
cobaltstrike3.10 已經出來很久了,其中最吸引人的可能就是他已經支持中文了,但是貌似很久以來都沒在網上看到3.10的資源,所以就沒辦法,拿手上的3.8 改改將就用。
0x01 反編譯
首先我們要對cobaltstrike3.8進行反編譯,這裡可以參照之前破解的方法,戳我,使用jad進行反編譯。
0x02 修改代碼
要怎麼定位到要改哪裡呢? 我們可以看一下CS的輸出:
可以看到在輸出之前有received output,所以我們就可以檢索這個關鍵字,馬上可以定位到BeaconC2.class文件,搜索「received output」一共有5個結果:
查看代碼如下:
可以看到,輸出的結果是由CommonUtils類的bString方法返回的,定位到CommonUtils.class文件查看代碼:
可以看到傳過來的數據使用 ISO8859-1 進行了編碼。ISO8859-1屬於單位元組編碼,最多能表示的字元範圍是0-255,應用於英文系列。比如,字母a的編碼為0x61=97。 很明顯, ISO8859-1 編碼表示的字元範圍很窄,無法表示中文字元。這就是CS無法顯示中文的原因。經過測試,使用 ISO8859-1 進行中間編碼是不會導致數據丟失的。那麼我們是不是可以修改代碼把編碼轉過來來呢?當然可以 !
但是由於自己比較菜,直接修改CommonUtils.java以後編譯不過去(表示很難受,如果你會編譯,還希望不吝賜教)。所以只能去修改BeaconC2.java。
經過多次測試,發現在CS上執行命令以後返回的結果編碼為GBK,所以轉碼過程為 CommonUtils.java轉碼:
GBK -> ISO8859-1
我們要修改的BeaconC2.
ISO8859-1 -> GBK -> UTF-8
所以思路就很明朗了,我們只需要在傳入rest之前把中文轉換成UTF-8就可以了,代碼也很簡單,測試如下:
所以關鍵代碼為:
String tmp = CommonUtils.bString(CommonUtils.readAll(in));
String tmp1 = new String(tmp.getBytes("ISO8859-1"),"gbk");
String rest = new String(tmp1.getBytes(),"utf-8");
源代碼是這樣:
修改以後是這樣:
所以找到所有的:
String rest = CommonUtils.bString(CommonUtils.readAll(in));
替換即可。
0x03 編譯替換
修改以後,需要把BeaconC2.java編譯之後替換原來的BeaconC2.class。編譯方法很簡單,只需要把BeaconC2.java放到解壓以後的CS目錄,執行以下命令:
javac -classpath . BeaconC2.java -Xlint:unchecked
在這裡,可能會碰到以下報錯
這裡可以改一下代碼,將
import c2profile.MalleableHook.MyHook;
import dns.DNSServer.Handler;
改為:
import c2profile.MalleableHook;
import dns.DNSServer;
在進行編譯即可。之後將原來的BeaconC2.class替換,我們的CS就修改完成了。
0x04 效果
這裡錄了一個DEMO:
※HackTheBox Writeup之拿下Mantis主機許可權過程
※甲方安全建設之Windows橫向移動攻擊的檢測
TAG:嘶吼RoarTalk |