0×01静的検出と対立
1。静的分析の原理
簡単に言えば、署名コードを介して静的ファイルを識別することです。ソフトウェアを殺すと、ディスク上の画像ファイルがスキャンされます。署名コードが満たされている場合、マルウェアとして認識されます。
マルウェアマッチングルールYaraは、マルウェアを一致させるときにこの方法を使用します。
quarkspwdumpは、ハッシュツールを識別およびキャプチャするために使用されます。ヤラのルールは次のとおりです(ソースコードを参照)
/*
このYaraルールセットは、GNU-GPLV2ライセンス(http://www.gnu.org/licenses/gpl-2.0.html)の下にあり、このライセンスで使用する限り、任意のユーザーまたは組織に開かれています。
*/
ルールquarkspwdump_gen : Toolkit {
Meta:
説明='すべてのquarkspwdumpバージョンを検出してください
著者='FlorianRoth'
日付='2015-09-29'
スコア=80
Hash1='2B86E6AEA37C324CE686BD2B49CF5B871D90F51CEC24476DAA01DD69543B54FA' '
Hash2='87E4C76CD194568E65287F894B4AFCEF26D498386DE181F568879DDE124FF48F'
hash3='a59be92bf4cce04335bd1a1fcf08c1a94d5820b80c068b3efe13e2ca83d857c9c9' '
Hash4='C5CBB06CAA5067FDF916E2F56572435DD40439D8E8554D3354B44F0FD45814AB'
HASH5='677C06DB064EE8D8777A56A641F773266A4D8E0E48FBF0331DA696BEA16DF6AA'
Hash6='D3A1EB1F47588E953B9759A76DFA3F07A3B95FAB8D8AA59000FD98251D499674'
Hash7='8A81B3A75E783765FE4335A2A6D1E126B12E09380EDC4DA8319EFD9288D88819' '
文字列:
$ s1='openProcessToken()error:0x%08x'フルワードascii
$ s2='%d dumped' fullword ascii
$ s3='AdcustTokenPrivileges()error:0x%08x'フルワードascii
$ s4='\\ sam-%u.dmp'フルワードascii
条件:
それらすべて
}
マッチマッチ$ S1 $ S2 $ S3 $ S4は4つのルールすべてであり、識別としてマークされていることがわかります。
もちろん、MD5およびSHA1を介してファイルハッシュ認識を計算するマルウェアもあります。それは最もシンプルで、粗野で効果的ですが、それをバイパスするのも簡単です。セグメントの類似性を特定する方法もあります。原則は上記の機能コード認識と同じなので、ここでは繰り返しません。
2。抗静止分析
1.機能コードを変更します
機能コードを識別する方法もいくつかあります。最初は、それを見つけるために単一の機能コードを使用し、それに反対するCCLがありました。敵対技術のアップグレードにより、複数の機能コードがあり、対応するものはMutilCCL、MyCCL、Virtest、さらにはGitHubでの自動化された機能コード認識でさえ、ますます多様なテクノロジーを備えていました。
機能コードを変更する上で最も重要なことは機能コードを配置することですが、機能コードを配置した後、プログラムが正常に実行できることを意味しません。これは時間がかかり、労働集約的です。各ソフトキル入力メーカーの機能データベースは異なるため、ソフトキル入力の種類にのみ影響を与えることができます。効果は良くありませんが、ソースコードなしでは使用できます。
MeterPreterは私たちのオープンソースですが、コンパイルされたファイルを変更すると、それらを直接変更してソフトウェアを直接廃棄することがあります。これも保持方法です。スペースの制限のため、ここにコードと操作を投稿することはありません。
2.シェルを追加します
砲撃は機能コードのバイパスに非常に良い影響を与え、暗号化されたシェルは基本的にすべての機能コードをカバーすることができますが、シェル自体には機能があるため、欠点も非常に明白です。より不正な国内のソフトキルディング検出方法の下で、VMP、Mhemidaなどの主流のシェルは、それらが検出されると、ボックスに直接ポップアップして、このことに何か問題があることを伝えます。それは非常に直接的ですが、それでも非常に効果的です。場合によっては、シェルのいくつかの一般的なバージョンが直接削除されて分析されます。
この状況に直面して、人気のない暗号化されたすべてのシェルを使用することを検討できます。時間とエネルギーがある場合は、オープンソース圧縮シェルに基づいてソースコードを変更できます。効果は非常に良い場合があります。
一般に、特にオープンしていないソースPEファイルの場合、シェルを追加することで殺害を避けることがより実用的です。多くの機能コード認識は、鋳造によってバイパスされる可能性があります。
3.シェルコードコンパイル
Metasploitは、私が思う世界で最高の浸透試験ツールです。
MSFvenomは、シェルコードを含む複数の形式でペイロードを提供するだけではありません。シェルコードは、基本的に、静的なソフトキルを殺すことなくソースコードに使用するのに最適なツールです。
シェルコードコンパイルの特定の方法について、MeterPreterスキル共有に関する以前の記事を参照してください。ここでは繰り返しません。
MSFvenomを使用してエンコーダーを選択する場合、通常、shikata_ga_naiのエンコーディング方法(x86のエンコーダーの唯一のランクが優れているため)を選択し、このエンコーダーのデコードおよびエンコードプロセスはランダムに生成されます。 (エンコーディングプロセスのソースコードを参照)。
ただし、このエンコードコンテンツの特徴はあります。 shikata_ga_naiエンコード後のシェルコードには、16進数文字\ xd9 \ x74 \ x24 \ xf4が含まれている必要があります。 shikata_ga_naによってエンコードされたシェルコードを簡単に検出するためにYaraルールを書きました。ルールは次のとおりです。
ルールMetasploit_encoder_shikata_ga_nai :Decoder {
Meta:
説明='shikata_ga_naiを検出しますshellcode'
著者='green-m'
日付='2017-11-27'
文字列:
$ hex_string={d9 7424 f4(? | ?)c9 b1}
条件:
$ hex_string
}
テスト結果は図に示されています。
もちろん、それはshikata_ga_naエンコード方法だけではありませんが、他のエンコード方法の特性がより明白になるかもしれません(x86/fnstenv_movのエンコーディング方法は、多くのソフトキル入力ソフトウェアによって直接検出されます。次に、この状況と戦う場合は、エンコードされたシェルコードを自分でエンコードまたは暗号化できます。
誰もが体験できるデモとしてシンプルなXORを書きます。コードは次のとおりです。
unsignedcharシェルコード[]=
'\ x33 \ xc9 \ xb1 \ xc6 \ xd9 \ xee \ xd9 \ x74 \ x24 \ xf4 \ x5b \ x81 \ x73 \ x13 \ xe6';
//xorのキー
unsignedChar key []='\ xcc \0xfa \0x1f \0x3d';
//シェルコードをエンコードします
for(i=0; i(sizeof(shellcode)-1); i=i+1)
{
shellcode [i]=shellcode [i]^key [i%sizeof(key)];
}
//デコーダー
voiddecode()
{
for(i=0; i(sizeof(shellcode)-1); i+=1)
shellcode [i]=shellcode [i]^key [i%sizeof(key)];
}
voidexecuteshellcode()
{
decode();
//シェルコードを実行します
}
4.シェルコードインプラントバックドア
現在、多くの記事やツールは、背景を植え付ける方法を提供しています。たとえば、ShellterとThe-Backdoor-Factoryツールはすべて非常に強力です。
これは、コード洞窟(コードギャップ)にバックドアを手動で埋め込む方法の説明です。全体的なプロセスを図に示します。
より重要な部分は、スタックバランスを調整し、サブESPを介してスタックを調整するか、ESPを追加することです。そうしないと、ペイロードを実行した後の通常のプログラムがクラッシュします。
サイズに適したコード洞窟がない場合、またはペイロードが非常に大きい場合、一緒に使用するには複数のコード洞窟が必要になる場合があります。重要な部分は次のとおりです。
また、エンコーディングまたは暗号化の前の部分と組み合わせることができ、殺害効果は非常に良好です。殺害ソフトウェアのほとんどは直接GGです。
5。マルチプラットフォームと多言語
同じコンパイラによって生成されたPEファイルは、一部のセクションで同じまたは類似のバイナリバイトを持っています。同じ方法で生成された多数のトロイの木馬を収集した後、識別のためにこれらのPEファイルの機能を抽出するのは簡単です(たとえば、MSFvenomによって直接生成されるEXEはこのようなものです)。したがって、コンピレーション環境を変更し、認識された機能コードを変更して殺害を回避するという目標を達成することにより、同じアイデアも同じです。
Linuxの下のクロスコンパイラには、MINGW-W64、TDM-GCCなどが含まれます。VEIL-EVASIONのC言語コンパイラはMINGW64を使用し、Avetコンパイラは最初は非常に効果的だったTDM-GCCを使用します。それを使用した後、Soft Killingはこれらのコンパイラのコンパイルされた機能コードを意図的に抽出し始め、それらは1つずつ殺されました。
無料の殺害のために継続的に更新されたフレームワークとして、ベールは複数の言語を使用してコンパイルし、機能コードを無料で殺害する目的を達成します。使用される言語には、C、Python、Ruby、Perl、Powershell、C#、Goなどが含まれ、PytoexeまたはPywin32を介してPythonコードをExeに変換して、独自のトロイの木馬の多様性を維持します(ペイロードはソースコードを生成します)。
もちろん、JS、PHP、SCTなどのコンパイルされていない言語の実行に変換するなど、よりわいせつな方法があります。そのため、ここでは詳細には記載されていません。興味があるなら、あなたはそれを自分で理解するでしょう。
6。概要
これはおそらく静的殺人の方法です。複数の方法と組み合わせて使用する必要がある場合があります。もちろん、最初と2番目のメソッドは、一般にソースコードなしで採用されます。もちろん、分解と花、空のソースコードを変更するためにも考慮することができます。ソースコードは、より多くの時間とエネルギーを必要とし、オペレーターのスキル要件が高くなります。
0×02フロー検出と対立
1.メータープレタートランスミッションロード
MeterPreterのトラフィック特性を知るには、まずMeterPreterの送信方法を理解する必要があります。
Metasploitのトロイの木馬は、段階的で雄弁な2つの主要なカテゴリに分かれています。
段階的なタイプのトロイの木馬の実行プロセスは次のとおりです。
クライアントがサーバーからステイガーを受信した後、ステイガーはブートローダーとペイロードで構成されます。クライアントは、ペイロードを一時的に保存するためにメモリ内のアドレスを割り当て、次にローダーにペイロードをローダーにロードします。メモリにPEファイルを注入するこの方法は、反射DLLインジェクションと呼ばれます。
雄弁なものは、完全なペイロードをトロイの木馬にコンパイルすることです。段階的なトロイの木馬と比較して、前者は巨大で柔軟性がなく、殺すのは簡単です。
Windows/MeterPreter/Reverse_tcpを例として取りましょう。以下はソースコードの一部です(完全なソースコード)
#ステイガーを生成してコンパイルします
#
defgenerate_reverse_tcp(opts={})
combined_asm=%q^
CLD;方向フラグをクリアします。
スタートを呼び出します。コールスタートで、これにより「API_CALL」のアドレスがスタックに押し付けられます。
#{asm_block_api}; VirutalAlloc()などの関数アドレスを見つけるには
start:
ポップEBP
#{asm_reverse_tcp(opts)};ソケット接続を送信して削除します
#{asm_block_recv(opts)};ペイロードを再度再生した後、いくつかのことをしてください
^
Metasm:ShellCode.Assemble(Metasm:3360x86.new、combined_asm).encode_string
終わり
ASM_BLOCK_APIパーツは、クエリAPI呼び出しのアドレスを定義するために使用される関数です。
ASM_REVERSE_TCPパーツは、ソケットリクエストを送信するために使用されます。
ASM_BLOCK_RECVパーツは、接続を確立し、サーバーから送信されたステージャーを受信し、VirtualAlloc()を介してRWX許可メモリを割り当ててから、後続の操作を実行することです。
次に、接続を開始するためにクライアントを確立するプロセスのこの部分に特性がないことがわかります。特性は、主にサーバーに送信されるステージャーです。次に、詳細に送られたステージャーにあるものを見てみましょう。
クライアントがサーバーから送信されたメータープレターのペイロードを実行するには、最初にLoad MeterPreter_loaderを送信する必要があります。このブートコードのソースコードは次のとおりです(完全なソースコードアドレス):
def asm_invoke_metsrv(opts={})
^
ASM=%Q^
;プロローグ
12月EBP; 'm'
ポップEDX; 「Z」
$+5を呼び出します。次の指示に電話してください
ポップEBX;現在の場所(+7バイト)を取得します
プッシュedx; Edxを復元します
Inc ebp; EBPを復元します
EBPを押します。後でEBPを保存します
mov ebp、esp;新しいスタックフレームをセットアップします
; Refrictiveloader()を呼び出す
; OffsetをReflectiveloader()(0x ?)に追加します
ebx、#{'0x%.8x'%(opts [:rdi_offset] -7)}
EBXに電話してください。 Refrictiveloader()を呼び出す
; dllmain(hinstance、dll_metasploit_attach、config_ptr)を呼び出します
; Reflectiveloader()からDLLの終わりまでのオフセット
EBX、#{'0x%.8x'%(opts [:length] -opts [:rdi_offset])}
このコードの主な機能は、反射噴射ブートコードReflectiveloaderをロードし、Reflectiveloaderを介してMeterPreterおよび関連構成をロードすることです。スペースの理由により、ここでは、反射注射の詳細な荷重方法を掘り下げません。一般原則を知ってください。興味がある場合は、ソースコードを読んで理解できます。
2.METERPRETER検出
このmeterpreter_loaderは、固定アセンブリコードです。アセンブリコードの部分は、次のようにNASMを介してマシンコードに変換されます(環境で変化する可能性があります)。
4D5AE80000000005B52455589E581C364130000FFD381C395A40200893B536A0450FFD0
16進数文字列は、MeterPreterの機能です。アイデアを検証するために、送信されたペイロードを表示するためにトラフィックをクロールすることにより、図に示すように、送信後の送信ペイロードの最初の部分が上記のマシンコードであることがわかります。
Yaraルールを記述して、検出できるかどうかをテストします(Yaraは静的PE形式ファイルを検出するだけでなく、トラフィックファイルを検出できます。もちろん、Snortも使用できます)。ルールは次のとおりです。
ルールMetasploit_meterpreter_loader :rat {
Meta:
説明='MetasploitmeterPreter Windowsリバースステイガーを検出する'
著者='green-m'
日付='2017-12-11'
文字列:
$ hex_string={4d 5a e8 00 00 00 00 00 00 5b 52 45 55 89 E5 81 C3 64 13 00 00 ff D3 81 C3 95 A4 02 00 89 3B 53 6A 04 50 FF D0}
条件:
$ hex_string
}
図に示すように、Yaraを使用して送信されたトラフィックパケットを検出し、即座に検出します。
注:このYaraルールを使用してプロセス内のメモリを直接検出すると、トラフィックがどのように暗号化されても、最終的には復号化されます。次に、MeterPreter_LoaderがYaraによって検出されます。効率が低下することに加えて、バイパスできれば、ソースコードのみを変更できます。
スペースの制限があるため、他のペイロードのトラフィック特性を自分で確認してテストしてください。ここではあまりスペースを無駄にしません。
3。トラフィック検出との戦い
トラフィックが特徴付けられるため、トラフィックを暗号化する方法はありますか?答えは、サーバー側に設定することで、はいです
EnableSageEncodingをtrueに設定します
StageEncoder x86/fnstenv_movを設定します
効果は図に示されています(もちろん、ここでstagerencoderを選択できます)
送られたステイガーがエンコードされています。トラフィックから判断すると、図に示すように、すべてのエンコードされたデータが表示されません。
トラフィックをエンコードするこの方法が十分に安全ではないと感じた場合、MSFは証明書でトラフィックを暗号化できる妄想モードも提供します。
特定の操作方法については、公式ドキュメントまたは私のブログを参照してください。
0×03動的監視対立
静的検出とトラフィック監視の両方が言及されています。次に、サンドボックスと戦う方法について説明します。完全な対立を達成するために、サンドボックスプロジェクトは非常に大きいです。ここでは、ソフトを殺すというサンドボックス分析を欺くための下品なヒントについてのみお話します。
アンチウイルスソフトウェアの最大の問題は、単一のファイルで多くのパフォーマンスを無駄にすることなく、すべてのファイルをできるだけ迅速にスキャンする方法です(スキャンプロセス中にマシンを停止させるのは非常に悪い経験です)。これを行うには、多数のファイルで合理的な選択が必要です。
1.寝る
ソフトソフトとの戦いの初期の技術では、睡眠は多くの時間をかけ、ソフトソフトの動的な分析をバイパスできます。もちろん、これは間違いなく不可能です。ソフトを殺すとシステムの睡眠機能がフックし、直接スキップしてコードに直接従うと推測されます。これは、最も賢くてトラブルのない方法です。アイデアを確認するために、コードを使用してテストします。
他の簡単に干渉する要因を削除するために、固定コンパイラを使用してシェルコードをコンパイルすることを選択しました。
直接コンパイルして生成すると、Virustotalの結果は次のとおりです。19/67
確認する前に次のコードを追加します。
time_begin=getTickCount();
睡眠(5555);
time_end=getTickCount();
dword time_cost=time_end -time_begin;
if((time_cost time_sleep+5)||(time_cost(time_sleep-5))))
{return0;}
runshellcode();
テスト16/66
削減されたのは3つだけでしたが、そのうちのいくつかはまだこのトリックを取っていることを意味します。
2. numa
Numaは、均一なメモリアクセスの略です。これは、複数のシステムでメモリ管理を構成する方法です。 kernel32.dllで定義されているすべての一連の関数に関連しています。
詳細については、公式ドキュメントを参照してください。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363804(v=vs.85).aspx
コードは次のとおりです。
address=virtualAllocexNuma(ハンドル、null、sizeof(buf)、mem_reserve | mem_c