web-dev-qa-db-ja.com

ファイルが暗号化されているかどうかを判断する方法は?

私はランサムウェア対策プロジェクトに取り組んでいます。単にファイルシステムを監視し、ファイルが作成および削除されるのを監視します。 (既知のランサムウェアファイル拡張子も監視します。)

基本操作:(ディレクトリYのファイルXが作成された)場合、その直後(ディレクトリYのファイルZが削除されます)。ファイルXをスキャンし、暗号化されたファイルかどうかを確認します。

ファイルが暗号化されているかどうかを判断する方法がわからないので、行き詰まっています。私はSOでかなりの数のスレッドを読みましたが、まだ空になっています。

私の質問は基本的に:ファイルが暗号化されているかどうかを判断するためにどのような方法を使用できますか?

7
Nobody

環境で使用可能な場合は、fileコマンドを使用できます(BSD/OSX/Linuxの標準部分)。たとえば、暗号化されたコンテンツが利用可能になると、次のようになります。

$ gpg --encrypt test-encrypted -r [email protected]

Enter the user ID.  End with an empty line: 
$ ls                       
test-encrypted      test-encrypted.gpg
$ mv test-encrypted.gpg testfile.txt

fileは、それをGPG暗号化コンテンツとして識別できます。

$ file testfile.txt 
testfile.txt: GPG encrypted data

ただし、これはヘッダーとトレーラーに基づく情報のみを表示します。しばらく前に、誰かが Cryptolockerファイルを見つけるためのPowerShellスクリプトPSスクリプトへのリンク )を書いて、役に立たない場合があります。あなたが遭遇する問題は次のとおりです:「これはどのように暗号化されましたか?」たとえば、攻撃者が「パスワードで保護されたZip」ファイルの複雑なパスワードを作成しただけの場合、それ自体は暗号化ではないため、スクリプトは暗号化されたファイルではなくZipファイルとして検出されます。

また、注目に値するのは、これらのランサムウェアファイルの多くが反復ごとに変化することです。たとえば、lockyは* .lockyを各ファイルに追加します。そのため、いくつかは簡単に検出できるかもしれませんが、すべてのファイルの名前がランダムなチェックサムに変更されたかどうかを想像してください。これでファイルを識別できなくなります。例:

MD5 ("salesfile") = 64d11ab29c2d78b325d8a944119d1150.doc
MD5 ("payrollfile") = d9087b158cd38e844999456d17611f1c.doc
MD5 ("engineeringfile") = 14e8e9011a4d3343df39e35fc7f2cd29.doc
MD5 ("researchfile") = 26779202429523339305a90e6ec74146.doc
MD5 ("managementfile") = 419765bc586cdd1bf741afe771951bec.doc

今、あなたはより大きな問題を抱えています。 「クラッキング/復号化など」に時間を費やすには、どのファイルがよりミッションクリティカルです。ほとんどの場合、Unixベースのシステムのfileコマンド、またはPowershellスクリプトが出発点になります。 [〜#〜] yara [〜#〜] もあり、本当にそれについて技術的になりたいのなら。 YARA署名を作成し、それを使用して検索します。

5
munkeyoto

ent を実行すると、ファイルのエントロピーの量を確認できます。エントロピーの高いファイルは、おそらく圧縮または暗号化されています(またはその両方)。問題は、JPEG、XLSX、Zipが圧縮されているため、実際に圧縮されたファイルが非常に一般的であることです。

XがファイルZの暗号化されたバージョンであると思われる場合は、それらが同様のサイズであるかどうかに加えて、暗号化ヘッダーの小さなデルタがあるかどうかを確認できます。

6
NikoNyrh

クリーンなシステムの場合、PowerShellを使用して有効なファイルのハッシュを生成できます(つまり、有効な暗号化、圧縮、バイナリ、および通常のファイルがある可能性があります)。そして、スイープごとに新しいハッシュを生成し、ハッシュが変更されたかどうかを比較します。

タイプなどに基づいて、これが正常な動作かどうかを判断できます。

たとえば、WindowsでPowerShell Get-Processを使用して、プロセスに変更があった場合に警告するように見えます。

これは拡張可能なアイデアのデモです。

#
 Get-Process * | Export-Clixml 'D:\ Digital Forensics\__\baseline-local-GPROC-000.xml' 
 $ gpbaseline000 = Import-Clixml 'D:\ Digital Forensics\__\baseline-local-GPROC-000。 xml '
 
 Start-Process notepad.exe 
 
 Get-Process * | Export-Clixml 'D:\ Digital Forensics\__\baseline-local-GPROC-001.xml' 
 $ gpbaseline001 = Import-Clixml 'D:\ Digital Forensics\__\baseline-local-GPROC-001。 xml '
 
 Compare-Object $ gpbaseline000 $ gpbaseline001 -Property processname 
 

Sample PowerShell session within PowerShell ISE サンプル出力については、画像を参照してください。

0
Larry T