web-dev-qa-db-ja.com

反射の検出DLL注入

過去数年間、マルウェア(およびMetasploitのmeterpreterペイロードなどのいくつかのペンテストツール)が リフレクティブDLLインジェクション(PDF) を使用してDLLをメモリにロードし始めました。処理する。利点は、ファイルがディスクに書き込まれることがなく、検出が難しいことです。私が見た多くの例は、 Joachim Bauchの作品 に基づいています。

ただし、 DEF CON 20で、Andrew Kingは反射DLL注入を使用して注入されたDLLを検出できることを示しました 。彼のプレゼンテーションは「 Detecting Reflective Injection 」と呼ばれていました。 残念ながら、彼はソースコードをリリースしていません(確かに彼はそうする義務がない)。

[〜#〜] update [〜#〜]:どうやらそれを逃したようですが、Andrewは数年前にこの作品をオープンソースにしました: https://github.com/aking1012/dc20

さらに、「 Antimeter 」と呼ばれるツールは、反射dllインジェクションを使用して読み込まれたときにmeterpreterエンジンを検出できます。再び、クローズドソース。

Andrew KingのツールとAntimeterの両方がPythonで記述されており、実行中の実行可能ファイルのメモリを列挙するためにpydbg/pydasmを使用していることを理解しています。

誰もがPythonまたはその他の一般的なソースコードを共有して、反射DLLインジェクションを検出する方法を示すために喜んで共有しますか?メモリダンプを分析してこれを見つけることができるメモリフォレンジックツールがありますが、実行中のシステムでアプリケーションを実行して(アンチメーターのように)、反射的にDLLが注入されたプロセスを見つけようとしています。

反射DLLインジェクションがどのように機能するかを理解することに関心がある場合は、これを行う方法を示すいくつかの Delphiで書かれたオープンソースコード があります。

[〜#〜] update [〜#〜]:私はテストし、管理者権限なしで(そして通常のユーザーとして)DLLを反射的に注入できますが、もちろん、ユーザーとして、私は同じ整合性レベル(および私のセッション)で実行されているプロセスにのみ注入できますが、それでもOfficeスイートやInternet Explorerなどのアプリケーションがカバーされます。

16
Mick

反射DLLインジェクションとは何かを検討してください。アプリケーションを悪用して任意のコードを実行させると、このシェルコードはDLLをデータのblobとしてメモリにロードします(これまでのすべての標準的なシェルコードの内容...)そして、DLLがPEローダーを介してDLLとして自身を適切にロードするように、それを実行します。この全体的なアイデアの目的:マルウェア全体を固定メモリオフセットのアセンブリコードとして書き込むのではなく、選択した言語でDLL)にコンパイルできる完全なアプリケーションを作成してみましょう。

検出するには、メモリ上にのみ存在し、ディスク上には存在せず、その中でコードを実行しているPEファイルを探す必要があります。したがって、実行可能メモリBLOBをスキャンして、PEファイルのように見えても、ディスクファイルには関連付けられていないものを探します。これは、悪用後の科学捜査として行うことができます。または、リアルタイムで検出したい場合は、通常、リフレクティブDLLインジェクション(LoadLibrary、GetProcAddress、VirtualAllocなど)に関連付けられている呼び出しをフックし、前の手順をよりスマートに実行します。 ambuships.com

8
0xdabbad00

これはかなり古いことは知っていますが、将来この問題に遭遇する可能性がある他の人のために追加します。

VADツリーを歩くなどの手法は、特定のアンチフォレンジック手法を使用してこの領域のトラックをカバーしていない限り、反射的に注入されたDLLを見つけるのに役立ちます。これらに関する2007年のフォレンジックペーパー( [〜#〜] pdf [〜#〜] )があり、これらを検出するための将来の取り組みに役立つ可能性があります。

検出は、プロセスのPEB(プロセス環境ブロック、リフレクトDLLが登録されていない)に読み込まれたモジュールリストを見ると言うほど簡単ではありませんが、適切な相互参照とそのようなツールは、代わりにVADツリーを使用して検出を行うことができます。VADツリーは、プロセスのEPROCESSブロックにあります(システム空間に格納されています)。

2
Jordan Hanna

私は大きなセキュリティ製品でやりました。カーネルモードでVADウォーキングを使用するだけでなく、リモートスレッドを検出する機能を使用します。

最初に、リモートスレッドを検出してメモリの場所を取得します。挿入されたスレッドは、ほとんどの場合、アプリケーションによって読み込まれたモジュールにはない開始アドレスを持ちます。これは発生するとは想定されていません。その後、メモリを逆戻りしてPEヘッダーまたはIAT/EATセクションを検出できます。これにより、悪意のあるコードが挿入されている場所を特定できます。

0
Félix

スレッドスタックを調べ、GetMappedFileを使用して関数呼び出しがどこから読み込まれているかを報告するツール(リフレクションを使用したC#およびPowerShell)を作成しました。 MappedFileプロパティが空白の場合、すべての関数がどこから実行されているか(つまり、どのdllとディスクのどこにあるか)を示します。おそらく、反射的にロードされます;) https://github.com/secabstraction/PowerWalker

0
secabstraction