geacon_pro - クロスプラットフォームは、コアツトリクビーコンをリファクタリングし、ベアコンの機能の大部分に適合し、国内主流の殺傷をソフトにし、4.1以上のバージョンをサポートしています。 A cobaltstrike Beacon bypass anti-virus, supports 4.1+ version.

(跨平台重构了Cobaltstrike Beacon,适配了大部分Beacon的功能,行为对国内主流杀软免杀,支持4.1以上的版本。 A cobaltstrike Beacon bypass anti-virus, supports 4.1+ version.)

Created at: 2022-10-27 20:07:00
Language: Go

geacon_pro

プロジェクトの紹介

このプロジェクトは、geacon プロジェクトに基づいて cobaltstrike のbeaconをリファクタリングし、ベーコンの機能の大部分に適合します。

このプロジェクトは、殺傷フリー技術を継続的にフォローアップし、プロジェクトを殺傷から保護し、殺す技術とツールを統合し、将来的にはcs機能だけでなく、ポスト浸透殺傷ツールを作成することを期待しています。 マスターが関連するニーズやアイデアを持っている場合は、議論するために一緒に来て歓迎します。

このプロジェクトは、CobaltStrike プロトコルの学習テストにのみ使用されます。 違法な使用には使用しないでください。

このプロジェクトは、グッドブラザーZ3ratu1と共同開発し、彼はgeacon_plusのバージョン4.0をサポートするバージョンを実装し、私はbeaconの4.1以上のバージョンをサポートするバージョンを実装し、おおよその機能は類似しており、いくつかの機能が異なります。

従来の cs の殺傷は、オンラインにロードする方法に偏っていますが、beacon の特性、特にカバのメモリを厳しく検出し、自分で再構築する方が良くありません。

殺傷の免除は、主に3つの分野に反映されています。

  • 再構成のため,beaconの特徴はなく,beacon素性に対する殺ソフトは検出できない.
  • golang自体は、特定の殺傷フリーを持っています
  • 各機能に対して殺傷不要を実現し,cs部分不免殺の機能を交換した

マスターの助けを借りて、バージョン4.3、4.4、4.5、4.7をテストし、理論的には4.1+バージョンがサポートされています。 現在、arm アーキテクチャ マシンは、現在調整中の機能の一部でエラーが発生する可能性があります。

殺すべき場所があれば、速やかに私に知らせてください。

プロジェクトが最初に行われたので、現在のバージョンは、いくつかの機能不全の場所があり、必要に応じてマスターに提案してください。

現在実装されている機能は、Defender、360コアクリスタル(powershellを除く)、カスペルスキー(ネイティブcsに注入されたdllなどのメモリ操作を除く)、ファイアーベルベットなどの致死性を備えています

上記のテスト環境は、すべて実機です

fork&&run操作の360の監視を回避するために,本プロジェクトは現在,独自の方法でcsネイティブdllをインジェクションして実行しているが,テストではcsネイティブpowerpickがインジェクション自体で実行したときにエコーが得られず,fork&&runモードでは正常であることが分かった. したがって、execute-assembly は、Defender、360 などをバイパスする別の powershell 殺すガジェットを実行できます。

bypassUAC を殺さない場合は,execute-assemblyにプロジェクトのCsharpバージョンを実行してもらい,Csharpプログラムは殺さずであるが,execute−assembly以降はDefenderと360を通過できる. プロジェクト dll バージョンは自分でコンパイルできますが、着陸が必要で、rndll32 で実行する必要があるため、推奨されません。

開発の過程では、チキンブラザーの記事や多くのプロジェクトを参照し、パッケージをつかんでサービス側から返される内容を推測し、サービス側の Java コードを部分的に理解しました。

バイナリ方向への私の接触はあまりないので、マスターは、より多くのカバーを願っています、マスターの交換を歓迎し、問題を指摘することを歓迎します。

マスターがヒープ メモリ暗号化に関する優れた解決策を持っている場合は、議論を歓迎し、実装の詳細に私の実装のアイデアがあります

メソッドを使用します

このプロジェクトは、Windows、Linux、macプラットフォームの使用をサポートしています。

基本的な使用方法は、元のプロジェクトを参照し、windows コンパイル時に -ldflags "-H windowsgui -s -w" を追加してプログラムのサイズを縮小し、黒いボックスをキャンセルします。 linux と mac は、プログラムのサイズを小さくし、バックグラウンドで実行するために -ldflags "-s -w" を追加します。

現在、プロジェクトにはコンソール出力の一部があり、削除する場合はコードから削除できます。

最も簡単な方法は、config.go の公開キーと C2 サーバー アドレスを変更し、C2profile を次の例に置き換えることです。 C2profile サンプルが更新され、C2profile の適合コードが更新されましたので、マスターにもう一度ダウンロードしてもらい、C2profile の設定が失敗した場合、またはより多くのニーズがある場合は、速やかに私に連絡してください

シェルは createprocess の実装に置き換えられました

機能を実装します

Windows プラットフォームでサポートされる機能:

sleep、shell、upload、download、exit、cd、pwd、file_browse、ps、kill、getuid、mkdir、rm、cp、mv、run、execute、drives、powershell-import、powershell、execute-assembly(c#を着地せずに実行する)、 複数のスレッドインジェクションの方法(ソースを自分で交換可能)、shinject、dllinject、パイプラインの転送、複数のcsネイティブ反射型dllインジェクション(mimikatz、portscan、screenshot、keyloggerなど)、トークンの盗難と復元、トークンの作成、プロキシパケットなどの機能

LinuxとMacプラットフォームがサポートする機能:

sleep、shell、upload、download、exit、cd、pwd、file_browse、ps、kill、getuid、mkdir、rm、cp、mv

グラフィカルな対話は、プロセス管理セクション、ファイル管理セクションでサポートされています

C2profile:

10.31 の新機能:

1、メタデータに適したheader,parameter,uri-append形式は,当分の間printはサポートされていないが,prependとparameterが同時に存在する場合は解析できないよう注意し,同時使用は避けてください.

2、http-postのidに適合したprepend、appendおよびparameter、header形式。

3、http-postのoutputに適合したparameter、header、print形式は、当分の間、uri-append形式をサポートしていません。

C2profile トラフィック側の設定と一部のホスト側の設定に適合し、サポートされているアルゴリズムは base64、base64url、mask、netbios、netbiosu、詳細は config.go で、例 C2profile を示し、C2profile を変更した後、config.go で適切な位置を変更することを忘れないでください。

# default sleep time is 60s
set sleeptime "3000";

https-certificate {
    set C "KZ";
    set CN "foren.zik";
    set O "NN Fern Sub";
    set OU "NN Fern";
    set ST "KZ";
    set validity "365";
}

# define indicators for an HTTP GET
http-get {

	set uri "/www/handle/doc";

	client {
		#header "Host" "aliyun.com";
		# base64 encode session metadata and store it in the Cookie header.
		metadata {
			base64url;
			prepend "SESSIONID=";
			header "Cookie";
		}
	}

	server {
		# server should send output with no changes
		#header "Content-Type" "application/octet-stream";
		header "Server" "nginx/1.10.3 (Ubuntu)";
    		header "Content-Type" "application/octet-stream";
        	header "Connection" "keep-alive";
        	header "Vary" "Accept";
        	header "Pragma" "public";
        	header "Expires" "0";
        	header "Cache-Control" "must-revalidate, post-check=0, pre-check=0";

		output {
			mask;
			netbios;
			prepend "data=";
			append "%%";
			print;
		}
	}
}

# define indicators for an HTTP 
http-post {
	# Same as above, Beacon will randomly choose from this pool of URIs [if multiple URIs are provided]
	set uri "/IMXo";
	client {
		#header "Content-Type" "application/octet-stream";				

		# transmit our session identifier as /submit.php?id=[identifier]
		
		id {				
			mask;
			netbiosu;
			prepend "user=";
			append "%%";
			header "User";
		}

		# post our output with no real changes
		output {
			mask;
			base64url;
			prepend "data=";
			append "%%";		
			print;
		}
	}

	# The server's response to our HTTP POST
	server {
		header "Server" "nginx/1.10.3 (Ubuntu)";
    		header "Content-Type" "application/octet-stream";
        	header "Connection" "keep-alive";
       	 	header "Vary" "Accept";
        	header "Pragma" "public";
        	header "Expires" "0";
        	header "Cache-Control" "must-revalidate, post-check=0, pre-check=0";

		# this will just print an empty string, meh...
		output {
			mask;
			netbios;
			prepend "data=";
			append "%%";
			print;
		}
	}
}

post-ex {
    set spawnto_x86 "c:\\windows\\syswow64\\rundll32.exe";
    set spawnto_x64 "c:\\windows\\system32\\rundll32.exe";
    
    set thread_hint "ntdll.dll!RtlUserThreadStart+0x1000";
    set pipename "DserNamePipe##, PGMessagePipe##, MsFteWds##";
    set keylogger "SetWindowsHookEx";
}

改善すべき点:

  • ヒープ メモリの暗号化は現在不安定であり、まだ正式には使用されていません
  • 中国語の文字化けの問題の下で機能の一部を変更します
  • 一部の機能は、現在、x86 システムをサポートしていません (最近はビジー状態のため、できるだけ早く変更されます)。

プリンシパル コード構造

config

  • 公開キー、C2 サーバー アドレス、https 通信、タイムアウト時間、プロキシなどの設定
  • C2profile設定

crypt

  • 通信に必要な AES、RSA 暗号化アルゴリズム
  • C2profile における暗号化アルゴリズムの実装

packet

  • commands は、各プラットフォームの下の機能の一部の実装です
  • execute_assembly、Windows プラットフォームのメモリに対してドロップしない c# コードを実行します
  • heap は、Windows プラットフォームの下にメモリ暗号化コードをヒープします
  • http はパッケージのコードです
  • inject は、Windows プラットフォームの下のプロセスに挿入されたコードです
  • jobs は、windows プラットフォームの下に cs ネイティブリフレクション dll を注入し、パイプラインでループバックするコードを挿入します
  • packet は、通信に必要な機能の一部です
  • token は、Windows プラットフォームの下でトークン関連の機能です

services

packet 内の機能は、main.go 呼び出しを容易にするためにクロスプラットフォーム でカプセル化されています

sysinfo

  • メタ情報の処理としてメタ
  • sysinfoは,異なるプラットフォームにおけるプロセスやシステムに関する判断と処理である

main.go

メイン メソッドは、個々のコマンドを解析して実行し、結果とエラーを返します

機能の一部の実装の詳細

shell

シェルは以前に golang の os/exec ライブラリを直接呼び出し、現在は基になる CreateProcess の実装に変更され、run との違いはシェルが cmd を呼び出した場合のみです。

run && execute

run と execute の違いは、run が実行の結果を返すことができることですが、exeecute はエコーされません。 最下位層の実装の違いは、run がパイプラインを介して実行の結果をバックパスし、exeecute が実行しないことです。

シェル、run、および exeecute の実装は、トークンを盗み出さずに CreateProcess を呼び出し、トークンを盗んだ後、CreateProcessWithTokenW を呼び出してトークン権限でコマンドを実行します。

powershell-import

powershell-import部分的实现与cs的思路一样,先把输入的powershell module保存,之后在执行powershell命令的时候本地开一个端口并把module放上去,powershell直接请求该端口进行不落地的powershell module加载,不落地加载powershell module可以对部分杀软进行绕过。

powershell

powershell命令直接调用了powershell,会被360监控,可以尝试用免杀的方式执行。

execute-assembly

execute-assembly的实现与cs原生的实现不太一样,cs的beacon从服务端返回的内容的主体部分是c#的程序以及开.net环境的dll。cs的beacon首先拉起来一个进程(默认是rundll32),之后把用来开环境的dll注入到该进程中,然后将c#的程序注入到该进程并执行。考虑到步骤过于繁琐,并且容易拿不到执行的结果,我这里直接用该项目实现了execute-assembly的功能,但未对全版本windows进行测试。

进程注入

进程注入shinject和dllinject采用的是APC注入。

反射型dll注入

csネイティブ反射型dll注入の考え方は,まずrundll32プロセスを引き上げ,その後dllを注入して実行するが,360コア結晶報リモートスレッドによって注入される. nativeやunhookなどの方法を用いて失敗し,最終的にdllを自分に注入しても殺されないとわかったので,csのfork&runの方式を自分の方式に変更することを考えた. csはfork&&runの形式であるため,部分dllは終了時にExitProcessを実行する.

1666934161850

しかし,我々は自分自身を注入するとトロイの木馬のメインスレッドを終了するので,下のdllに簡単な修正を加え,dll中のExitProcess文字列をExitThread+\x00に置き換える必要がある.

dll は、パイプラインを介して結果をサービス側に非同期に返します。 現在の dll リフレクション インジェクションは、ユーザーがプロファイルを使用してインジェクション方法を変更する独自の方法を実装します。

トークン

トークンの部分は、現在、トークンの盗難、復元、および作成を実装しています。

アップライン イントラネットは、ネットワーク ホストからはみ出ません

侵入では、イントラネット ホストがオンラインになることが多いことを考えると、エッジ ホストがネットワークから出て、イントラネット ホストがネットワークに接続されない場合があります。 現在実装されているトロイの木馬は、プロキシ転送の機能をサポートしていませんが、config.go の proxy パラメータを設定することで、エッジ ホストのプロキシを介してトロイの木馬をオンラインにすることができます。 すなわち,エッジホストの8080ポートにhttpプロキシを開設した場合,config.goにProxyOnをtrue,Proxyをイントラネットの木をすぐにライン化できるC2サーバとする.

http://ip:8080

ヒープ メモリの暗号化

ヒープ メモリ暗号化のメソッドの実装は、この記事を参照します。 sleep の前にメイン スレッド以外のスレッドを中断し、ヒープを走査してヒープ メモリを暗号化します。 sleep が終了すると、スレッドが復号化され、回復されます。 しかし、この機能は不安定であり、ヒープトラバーサル中に突然スタックしたり、直接終了したりすることがありますが、バックグラウンドでkeyloggerやportscanなどの永続的なタスクがある可能性があることを考えると、スレッドをすべてハングさせるのは適切ではありません。 同時に、私はgoのtimeがなぜ理解できません。 Sleep 関数は、他のスレッドが中断された後、Windows を呼び出しながらスリープを続ける. SleepExは問題を抱えませんし、マスターが答えることを願っています。