0x00概要
Cobaltstrikeは、イントラネットに浸透する商用リモートコントロールソフトウェアです。カスタムスクリプトの拡張をサポートし、非常に強力な機能を備えています。しばらく前に、Githubの優しい人がCobaltstrike 3.12の試行バージョンをリリースし、LZ1Yはすぐにひび割れたバージョンをリリースしました。熱狂的な兄弟(トライアルバージョンにはそのようなファイルはありません)が提供するXOR64.binで、比較的完璧な最新バージョンが誕生しました。最新のトライアルバージョンがどのように完全にクラックされたかを見てみましょう。
0x02は開始
Cobaltstrike(以下、CSと呼ばれる)メインコードはJavaで開発されており、それを逆転させる方がより友好的です。 jd-guiを使用して、cobaltstrike.jarファイルを逆コンパイルすると、コードがほとんど割れていないことがわかります。 Javaソースコードに混乱はありません。ただし、分解されたソースコードを表示する場合、//内部エラー//は多くの場所に表示されます。ここでは、Javaの逆コンパイルツールLuytenをお勧めします。Luytenは、Cobaltstrike.jarソースコードを取得するためにほぼ100%の逆コンパイルを取得できます。
CSライセンス処理ロジックは、common/license.javaファイルにあります。
パッケージ共通。
攻撃者をインポート。*;
javax.swing。*;
java.awt。*;
パブリッククラスライセンス
{
プライベートな静的長寿命;
今日のプライベート静的長い。
プライベート静的なロングスタート。
プライベートの静的な長い差。
private static long gettimesincestart(){
final prefs options=prefs.getPreferences();
license.today=system.currenttimemillis();
license.start=options.getLongNumber( 'cobaltstrike.start.int'、0l);
if(license.start==0l){
options.set( 'cobaltstrike.start.int'、license.today + '');
options.save();
license.start=license.today;
}
return license.difference=(license.today -license.start)/86400000l;
}
public static void checklicensegui(最終認証認証){
getTimesIncestart();
if(license.difference license.life || license.today -clense.start 0l){
joptionpane.showmessagedialog(null、 'あなたのコバルトストライクトライアルは現在期限切れになりました。
System.Exit(0);
}
それ以外{
final long left=license.life -license.difference;
文字列form=left + 'day';
if(left!=1L){
form +='s';
}
commonutils.print_warn( 'これはコバルトストライクのトライアルバージョンです。あなたは' + form + 'トライアルの左にあります。コバルトストライクを購入した場合。更新プログラムを実行してライセンスを入力します。');
commonutils.print_trial( '警告!このトライアルは標準的な防御に巻き込まれるために *構築されます。ライセンス製品にはこれらの制限がありません。
joptionpane.showmessagedialog(null、 'これはコバルトストライクのトライアルバージョンです。
}
}
public static boolean iStrial(){
trueを返します。
}
public static void checklicenseconsole(最終認証認証){
getTimesIncestart();
if(license.difference license.life || license.today -clense.start 0l){
commonutils.print_error( 'コバルトストライクトライアルが期限切れになりました。ライセンスを購入し、ソフトウェア更新機能を使用して続行してください。詳細については、 https://www.cobaltstrike.com/');
System.Exit(0);
}
それ以外{
final long left=license.life -license.difference;
文字列form=left + 'day';
if(left!=1L){
form +='s';
}
commonutils.print_warn( 'これはコバルトストライクのトライアルバージョンです。あなたは' + form + 'トライアルの左にあります。コバルトストライクを購入した場合。更新プログラムを実行してライセンスを入力します。');
commonutils.print_trial( '警告!このトライアルは標準的な防御に巻き込まれるために *構築されます。ライセンス製品にはこれらの制限がありません。
}
}
static {
license.life=21l;
license.today=0l;
license.start=0l;
license.difference=0l;
}
}
コードロジックは非常に明確です。ここには、パッチする2つの方向があります。
ライセンスを変更します。LifeInfinite Extensionトライアル
iStrial()の返品値を変更し、公式バージョンに偽造します
CSの多くの場所でのトライアルバージョンと公式バージョンの処理ロジックは異なるため、iStrial()の返品値を変更した後、ISTrial()関数が呼び出されるすべての場所を変更してコードを調整する必要があります。さらに、CSのトライアルバージョンは、いくつかの機能指紋と制限を残しており、対応する機能コードも削除する必要があります。
変更と再パッケージは、ひび割れのアイデアがわかったので、ソースコードを変更して再コンパイルする方法を見てみましょう。 Javaプログラミングでは、JARツールを使用して、一連の.classファイルをJARパッケージにパッケージ化して、他のJavaプログラムを使用することができます。また、JARパッケージの.classファイルのコンテンツを変更して、再コンパイルしてパッケージ化することもできます。たとえば、example.classをDemo.jarで変更して再コンパイルするプロセスは次のとおりです。
jd-gui、luyten、その他のツールを使用して、demo.jarパッケージのクラスをソースコードに逆コンパイルし、exple.javaを抽出します。
jar xvf demo.jarを実行してdemo.jarを解凍してjarパッケージのサブファイルを取得し(現在のディレクトリに解凍されることに注意してください)、example.javaファイルをexample.classファイルと同じディレクトリに配置します
javac -cp a.jar; b.jar; c.jar example.javaを再コンパイルして実行します。 (またはjavac -cp demo.jar emple.java)新しいExample.classファイルを取得します。
その中で、A.jar、B.jar、およびC.jarは依存関係であり、一般に、生の減圧Demo.jarパッケージに直接依存することができます。
コンパイルされたexample.classが元のexample.classファイルを置き換えることを確認してください(JD-GUIの逆コンパイルで表示できます)
Jar -uvf demo.jar com/some/path/example.classを実行するには、demo.jarパッケージを更新します
JARパッケージでクラスファイルを更新する場合、新しいクラスファイルディレクトリパスを元のパッケージパスと一致させる必要があります。たとえば、aggressor.aggressorclient.javaを変更して再コンパイルした後、JARパッケージを更新するコマンドは次のとおりです。
kingx modified_java_files jar -uvf cobaltstrike-with-xor64.jar aggressor/aggressorclient*.class
: aggressor/aggressorclient $ 1.クラス(入力=650)(出力=403)(圧縮38%)の追加
: aggressor/aggressorclient $ 2.class(input=1263)(output=704)(圧縮44%)の追加
: aggressor/aggressorclient.class(input=11115)(output=5196)(圧縮53%)の追加
おそらく問題に遭遇しました。変更されたJavaファイルをクラスファイルに再コンパイルすると、多くの奇妙なエラーが発生する可能性があります。分解されたソースコードのエラーによって引き起こされる場合があります。現時点では、Luyten、Jad、JD-GUIなどの逆コンパイルツールを組み合わせて、正しいソースコードに復元してから再コンパイルすることができます。例:aggressorclient.java、jad aggressor/aggressorclient*.classおよびluytenの分解ソースコードは異なります。
0x03試行バージョンパッチの詳細な分析
TIPS:次のコードスニペットは、行の最初の行です - 削除を表し、 +は新しい表現
パッチトライアルバージョンはcommon.licenseを変更し、checklicensegui()およびchecklicenseconsole()関数ボディを削除し、iStrial()のreturn値をtrueに変更します
メインプログラムタイトルAggressor.aggressorclientを変更し、getTitle()関数を変更します
リスナーの数の制限を解放します。 TeamServerは、デフォルトでのみ1人のリスナーのみを聴くことができます。コードを変更して制限を削除できます。
aggressor.dialogs.listenerdialog、次のコードを削除します。
.
else if(ristener.isegressbeacon(payload)datautils.isbeacondefined(this.data)!name.equals(datautils.getegressbeaconlistener(this.data)){
Dialogutils.Showerror( 'チームサーバーごとに1つの出口ビーコンのみを定義できます。
}
.
3。 EICARバックドアフィンガープリント機能を削除します
試験バージョンには、EICAR機能文字を備えたいくつかの場所があります:x5o!p%@ap [4 \ pzx54(p^)7cc)7} $ eicar-standard-antivirus-test-file!$ h+h*
common.listenerconfig
パッド()機能を変更します:
result.append( '5o!p%@ap [4 \\ pzx54(p^)7cc)7} $ eicar-standard-antivirus-test-file!$ h+h*\ u0000');
result.append( '123 \ u0000');
リソース/template.x64.ps1、resources/template.x86.ps1
$ eicar='x5o!p%@ap [4 \ pzx54(p^)7cc)7} $ eicar-standard-antivirus-test-file!$ h+h*'
$ eicar=''
server.profileedits
c2profile.addcommand('。http-get.server '、'!header '、' x-malware: x5o!p%@ap [4 \\ pzx54(p^)7cc)7} $ eicar-standard-test-file!$ h+h*');
c2profile.addcommand( '。http-post.server'、 '!header'、 'x-malware: x5o!p%@ap [4 \\ pzx54(p^)7cc)7} $ eicar-standard-antivirus-test-file!$ h+h*');
c2profile.addcommand( '。http-stager.server'、 '!header'、 'x-malware: x5o!p%@ap [4 \\ pzx54(p^)7cc)7} $ eicar-standard-antivirus-test-file!$ h+h*');
c2profile.addcommand( '。stage.transform-x86'、 'append'、 'x5o!p%@ap [4 \\ pzx54(p^)7cc)7} $ eicar-standard-antivirus-test-file!$ h+h*');
c2profile.addcommand( '。stage.transform-x64'、 'append'、 'x5o!p%@ap [4 \\ pzx54(p^)7cc)7} $ eicar-standard-antivirus-test-file!$ h+h*');
common.artifactutils
ライセンスの返品値が虚偽に変更されているため、次の段落が変更されているかどうかは効果があります。
if(license.istrial()){
Packer.AddString( 'x5o!p%@ap [4 \\ pzx54(p^)7cc)7} $ eicar-standard-antivirus-test-file!$ h+h*');
commonutils.print_trial( 'eicar文字列を' + sに追加);
}
xor64.binを追加してペイロードを生成すると、common.artifactutilsのxorencode()がエンコードのために呼び出されます。
public static byte [] _xorencode(final byte [] data、final string arch){
assertutils.testarch(arch);
if( 'x86'.equals(arch)){
final byte [] decoder=xorstub();
final byte [] payload=xorencoder.encode(data);
return commonutils.join(decoder、payload);
}
if( 'x64'.equals(arch)){
final byte [] decoder=commonutils.readresource( 'resources/xor64.bin');
final byte [] payload=xorencoder.encode(data);
return commonutils.join(decoder、payload);
}
新しいバイトを返します[0];
}
public static byte [] xorencode(final byte [] data、final string arch){
if(license.istrial()){
commonutils.print_trial( 'disabled' + arch + 'ペイロード段階エンコード');
データを返す;
}
assertutils.test(data.length 16384、 'xorencode stager(または他の小さなもの)で使用されます');
return _xorencode(data、arch);
}
トライアルバージョンはペイロードステージエンコーディングを実行しないため、試用版パッケージにはXor.bin/xor64.binファイルは含まれません。これらの2つのファイルが存在する場合は、リソース/xor.binおよびリソース/xor64.binパスに追加できます。 GitHubの熱狂的な男はXOR64生成スクリプトを提供します:https://Github.com/verctor/cs_xor64
ソースコードを1つずつ変更した後、それを再コンパイルしてCobaltstrike.jarパッケージに更新し、元のJARパッケージをコピーして交換します。
出典:https://kingx.me/cobaltstrike-patch.html?nsukey=%2Bdg38hxq7jl6bumazqcy6jvfumtbx1gsfudvo9fixqpb%2fkqderiienvokw3wflt8kkenwwswswwswswswswswwswwswwswwswwswwswwswwswwwswwswwswwswwswwswwswwswwswwwswwwsq0d8e1w2m77 kjzy9tgrzayatztd6xzibijhfgirssm4iol9c4txrhlv%2banffkxbzeg0o9gxtcj%2f3 JK%2BBOXBXM13S71RM3RLGZQQQYWYH1PXD%2BDQQNYDS7ZSJNNGHZQVEFKQW6KQ%3D%3D