Facebookで「(私の友達)がコメントであなたに言及した」という通知を受け取りました。しかし、それをクリックすると、Firefoxは次のファイルをダウンロードしようとしました。
これは、実行可能ファイル(autoit.exe
)を実行します。
これは私がなんとか解読した部分です:
['Msxml2.XMLhttp', 'onreadystatechange', 'readyState', 'status', 'ADODB.Stream', 'open',
'type', 'write', 'position', 'read', 'saveToFile', 'close', 'GET', 'send',
'Scripting.FileSystemObject', 'WScript.Shell', 'Shell.Application', '%APPDATA%\\',
'ExpandEnvironmentStrings', 'Mozila', 'https://www.google.com',
'http://userexperiencestatics.net/ext/Autoit.jpg', '\\autoit.exe',
'http://userexperiencestatics.net/ext/bg.jpg', '\\bg.js',
'http://userexperiencestatics.net/ext/ekl.jpg', '\\ekl.au3',
'http://userexperiencestatics.net/ext/ff.jpg', '\\ff.Zip',
'http://userexperiencestatics.net/ext/force.jpg', '\\force.au3',
'http://userexperiencestatics.net/ext/sabit.jpg', '\\sabit.au3',
'http://userexperiencestatics.net/ext/manifest.jpg', '\\manifest.json',
'http://userexperiencestatics.net/ext/run.jpg', '\\run.bat',
'http://userexperiencestatics.net/ext/up.jpg', '\\up.au3',
'http://whos.amung.us/pingjs/?k=pingjse346', '\\ping.js',
'http://whos.amung.us/pingjs/?k=pingjse3462', '\\ping2.js', '']
これはFacebookのエクスプロイトですか?友人が悪意のあるリンクにタグを付けて、連絡先を標的とするウイルスに感染した可能性はありますか?これをFacebookに報告する必要がありますか?もしそうなら、どうですか?
これは典型的な難読化されたJavaScriptマルウェアで、Windows Script Hostをターゲットにして残りのペイロードをダウンロードします。この場合、主にChrome拡張機能(manifest.json
およびbg.js
)、Windowsの自動実行可能ファイル、およびそれらをインストールする自動実行スクリプトがダウンロードされます。これらのファイルはすべて、目立たないように、ホストされている(セキュリティが低下している可能性がある)サーバー上で.jpg
拡張子が付けられた名前が付けられています。
マルウェアは部分的に不完全であるか、開発されていないか、おそらく他のマルウェアに基づいているようです(品質は非常に低いです)。 autoitスクリプトの多くは実際には何も実行せず、Firefox拡張機能を含むことを意図したZipのように見えるものは実際には空です。 autoitスクリプトは、1つのファイルに結合された大量のインクルードですが、実際に最後にペイロードを持つのは1つ(ekl)だけです。
感染時に実行される1つのアクティブなautoitスクリプトは、Chrome、IE、および場合によっては他のブラウザーのショートカットを、悪質なChrome拡張を実行するために必要な引数を持つChromeへのショートカットに置き換えます。
Chrome拡張機能は、主にこのマルウェアが増殖する方法です。ウイルス対策ソフトウェアドメインをブラックリストに登録したり、Facebookメッセージを自動的に送信したりするなど、いくつかの厄介なことを行います。実際、http://appcdn.co/datajs
にはWebサービスバックエンドがあり、現在表示されているURL(Facebookメッセージの投稿方法)に基づいてユーザーがアクセスしたページに挿入されるスクリプトを提供していました。このサービスは現在オフラインであり、おそらく停止しています。
これはFacebookのエクスプロイトですか?
正確には、Facebookのより悪用のようです。 Facebookのコードは悪用されていません。あなたの友人は、感染したブラウザが彼らに代わって連絡先をフィッシングしているだけです。
友達が悪意のあるリンクにタグを付けて、連絡先を標的とするウイルスに感染した可能性はありますか?
うん、それはまさにこのマルウェアが自分自身を広めている方法です。
これをFacebookに報告する必要がありますか?もしそうなら、どうですか?
はい、Facebookヘルプセンターの 報告方法 を参照してください。
ホストに連絡して次のURLをオフラインにするのもよいでしょう。
http://userexperiencestatics.net/ext/Autoit.jpg
http://userexperiencestatics.net/ext/bg.jpg
http://userexperiencestatics.net/ext/ekl.jpg
http://userexperiencestatics.net/ext/ff.jpg
http://userexperiencestatics.net/ext/force.jpg
http://userexperiencestatics.net/ext/sabit.jpg
http://userexperiencestatics.net/ext/manifest.jpg
http://userexperiencestatics.net/ext/run.jpg
http://userexperiencestatics.net/ext/up.jpg
http://whos.amung.us/pingjs/?k=pingjse346
http://whos.amung.us/pingjs/?k=pingjse3462
http://appcdn.co/datajs
残念ながら、CloudFlareはまだ CloudFlareは、ファイルへのアクセスが制限されているとメールで通知し、ホストに通知することを伝えました。userexperiencestatics.net
のURLを削除していませんが、この回答を投稿した直後に連絡しましたが、実際にこれらのファイルをホストしているのはわかりません。
UPDATE:
私や他の人が.jse
URLをGoogleに報告したところ、ファイルが削除されたようです。さらにコピーが見つかった場合は、それらも報告する必要があります。人々は多くのソースからファイルを受け取っているようです。
詳細情報:
このマルウェアと投稿は非常に注目を集めているので、人々の質問に対処するための情報をさらに追加します。
このファイルはダウンロード時に自動的に実行されますか?
おそらく、そうするようにブラウザーを構成していない限り、そうではありません。それはあなたをだましてそれを開かせるためのものです。
私の電話やWindows以外のコンピュータに感染することはありますか?.
私の知る限り、このマルウェアを実行できる唯一のOSはWindowsです。先ほど触れたように、Windowsスクリプトホストを使用します。 Windows Phoneについてはあまり知りませんが、Windows Phoneでも脆弱であるとは思いません。
ランサムウェアの更新:
以前は、autoitスクリプトにランサムウェアが含まれていると想定されていましたが、さらに調査した結果、そうではないようです。実際のペイロードを不明瞭にする 未使用の暗号関数の束があります 。これは、ほとんど これを難読化 しています。
UPDATE ON CHROME EXTENSION:
解凍されたChrome拡張コード は、こちら で確認できます。上で統合したことの詳細。
JSEスクリプトの更新:
難読化されていないcomment_24016875.jse
スクリプト は、ここ で確認できます。
このスクリプトが行うことを完全にリバースエンジニアリングする時間はありませんが、実際には画像ではなくテキストであるいくつかの.jpg
ファイルにリンクしているようで、いくつかの.au3
ファイルを参照しているため、実際には、それらの.jpg
ファイルをその拡張子で保存します。
それらの.au3
ファイルはAutoItのファイル拡張子と一致しているようで、実際には有効なAutoItスクリプトのように見えます。これがその一部、ekl.jpg
です。
Func _crypt_startup()
If __crypt_refcount() = 0 Then
Local $hadvapi32 = DllOpen("Advapi32.dll")
If $hadvapi32 = -1 Then Return SetError(1, 0, False)
__crypt_dllhandleset($hadvapi32)
Local $iproviderid = $prov_rsa_aes
Local $aret = DllCall(__crypt_dllhandle(), "bool", "CryptAcquireContext", "handle*", 0, "ptr", 0, "ptr", 0, "dword", $iproviderid, "dword", $crypt_verifycontext)
If @error OR NOT $aret[0] Then
Local $ierror = @error + 10, $iextended = @extended
DllClose(__crypt_dllhandle())
Return SetError($ierror, $iextended, False)
Else
__crypt_contextset($aret[1])
EndIf
EndIf
__crypt_refcountinc()
Return True
EndFunc
Func _crypt_shutdown()
__crypt_refcountdec()
If __crypt_refcount() = 0 Then
DllCall(__crypt_dllhandle(), "bool", "CryptReleaseContext", "handle", __crypt_context(), "dword", 0)
DllClose(__crypt_dllhandle())
EndIf
EndFunc
Func _crypt_derivekey($vpassword, $ialg_id, $ihash_alg_id = $calg_md5)
Local $aret = 0, $hbuff = 0, $hcrypthash = 0, $ierror = 0, $iextended = 0, $vreturn = 0
_crypt_startup()
Do
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptCreateHash", "handle", __crypt_context(), "uint", $ihash_alg_id, "ptr", 0, "dword", 0, "handle*", 0)
If @error OR NOT $aret[0] Then
$ierror = @error + 10
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$hcrypthash = $aret[5]
$hbuff = DllStructCreate("byte[" & BinaryLen($vpassword) & "]")
DllStructSetData($hbuff, 1, $vpassword)
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptHashData", "handle", $hcrypthash, "struct*", $hbuff, "dword", DllStructGetSize($hbuff), "dword", $crypt_userdata)
If @error OR NOT $aret[0] Then
$ierror = @error + 20
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptDeriveKey", "handle", __crypt_context(), "uint", $ialg_id, "handle", $hcrypthash, "dword", $crypt_exportable, "handle*", 0)
If @error OR NOT $aret[0] Then
$ierror = @error + 30
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$vreturn = $aret[5]
Until True
If $hcrypthash <> 0 Then DllCall(__crypt_dllhandle(), "bool", "CryptDestroyHash", "handle", $hcrypthash)
Return SetError($ierror, $iextended, $vreturn)
EndFunc
Func _crypt_destroykey($hcryptkey)
Local $aret = DllCall(__crypt_dllhandle(), "bool", "CryptDestroyKey", "handle", $hcryptkey)
Local $ierror = @error, $iextended = @extended
_crypt_shutdown()
If $ierror OR NOT $aret[0] Then
Return SetError($ierror + 10, $iextended, False)
Else
Return True
EndIf
EndFunc
Func _crypt_encryptdata($vdata, $vcryptkey, $ialg_id, $bfinal = True)
Local $ireqbuffsize = 0, $aret = 0, $hbuff = 0, $ierror = 0, $iextended = 0, $vreturn = 0
_crypt_startup()
Do
If $ialg_id <> $calg_userkey Then
$vcryptkey = _crypt_derivekey($vcryptkey, $ialg_id)
If @error Then
$ierror = @error + 100
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
EndIf
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptEncrypt", "handle", $vcryptkey, "handle", 0, "bool", $bfinal, "dword", 0, "ptr", 0, "dword*", BinaryLen($vdata), "dword", 0)
If @error OR NOT $aret[0] Then
$ierror = @error + 20
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$ireqbuffsize = $aret[6]
$hbuff = DllStructCreate("byte[" & $ireqbuffsize & "]")
DllStructSetData($hbuff, 1, $vdata)
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptEncrypt", "handle", $vcryptkey, "handle", 0, "bool", $bfinal, "dword", 0, "struct*", $hbuff, "dword*", BinaryLen($vdata), "dword", DllStructGetSize($hbuff))
If @error OR NOT $aret[0] Then
$ierror = @error + 30
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$vreturn = DllStructGetData($hbuff, 1)
Until True
If $ialg_id <> $calg_userkey Then _crypt_destroykey($vcryptkey)
_crypt_shutdown()
Return SetError($ierror, $iextended, $vreturn)
EndFunc
Func _crypt_decryptdata($vdata, $vcryptkey, $ialg_id, $bfinal = True)
Local $aret = 0, $hbuff = 0, $htempstruct = 0, $ierror = 0, $iextended = 0, $iplaintextsize = 0, $vreturn = 0
_crypt_startup()
Do
If $ialg_id <> $calg_userkey Then
$vcryptkey = _crypt_derivekey($vcryptkey, $ialg_id)
If @error Then
$ierror = @error + 100
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
EndIf
$hbuff = DllStructCreate("byte[" & BinaryLen($vdata) + 1000 & "]")
DllStructSetData($hbuff, 1, $vdata)
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptDecrypt", "handle", $vcryptkey, "handle", 0, "bool", $bfinal, "dword", 0, "struct*", $hbuff, "dword*", BinaryLen($vdata))
If @error OR NOT $aret[0] Then
$ierror = @error + 20
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$iplaintextsize = $aret[6]
$htempstruct = DllStructCreate("byte[" & $iplaintextsize & "]", DllStructGetPtr($hbuff))
$vreturn = DllStructGetData($htempstruct, 1)
Until True
If $ialg_id <> $calg_userkey Then _crypt_destroykey($vcryptkey)
_crypt_shutdown()
Return SetError($ierror, $iextended, $vreturn)
EndFunc
Func _crypt_hashdata($vdata, $ialg_id, $bfinal = True, $hcrypthash = 0)
Local $aret = 0, $hbuff = 0, $ierror = 0, $iextended = 0, $ihashsize = 0, $vreturn = 0
_crypt_startup()
Do
If $hcrypthash = 0 Then
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptCreateHash", "handle", __crypt_context(), "uint", $ialg_id, "ptr", 0, "dword", 0, "handle*", 0)
If @error OR NOT $aret[0] Then
$ierror = @error + 10
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$hcrypthash = $aret[5]
EndIf
$hbuff = DllStructCreate("byte[" & BinaryLen($vdata) & "]")
DllStructSetData($hbuff, 1, $vdata)
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptHashData", "handle", $hcrypthash, "struct*", $hbuff, "dword", DllStructGetSize($hbuff), "dword", $crypt_userdata)
If @error OR NOT $aret[0] Then
$ierror = @error + 20
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
If $bfinal Then
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptGetHashParam", "handle", $hcrypthash, "dword", $hp_hashsize, "dword*", 0, "dword*", 4, "dword", 0)
If @error OR NOT $aret[0] Then
$ierror = @error + 30
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$ihashsize = $aret[3]
$hbuff = DllStructCreate("byte[" & $ihashsize & "]")
$aret = DllCall(__crypt_dllhandle(), "bool", "CryptGetHashParam", "handle", $hcrypthash, "dword", $hp_hashval, "struct*", $hbuff, "dword*", DllStructGetSize($hbuff), "dword", 0)
If @error OR NOT $aret[0] Then
$ierror = @error + 40
$iextended = @extended
$vreturn = -1
ExitLoop
EndIf
$vreturn = DllStructGetData($hbuff, 1)
Else
$vreturn = $hcrypthash
EndIf
Until True
If $hcrypthash <> 0 AND $bfinal Then DllCall(__crypt_dllhandle(), "bool", "CryptDestroyHash", "handle", $hcrypthash)
_crypt_shutdown()
Return SetError($ierror, $iextended, $vreturn)
EndFunc
Func _crypt_hashfile($sfile, $ialg_id)
Local $btempdata = 0, $hfile = 0, $hhashobject = 0, $ierror = 0, $iextended = 0, $vreturn = 0
_crypt_startup()
Do
$hfile = FileOpen($sfile, $fo_binary)
If $hfile = -1 Then
$ierror = 1
$vreturn = -1
ExitLoop
EndIf
Do
$btempdata = FileRead($hfile, 512 * 1024)
If @error Then
$vreturn = _crypt_hashdata($btempdata, $ialg_id, True, $hhashobject)
If @error Then
$ierror = @error
$iextended = @extended
$vreturn = -1
ExitLoop 2
EndIf
ExitLoop 2
Else
$hhashobject = _crypt_hashdata($btempdata, $ialg_id, False, $hhashobject)
If @error Then
$ierror = @error + 100
$iextended = @extended
$vreturn = -1
ExitLoop 2
EndIf
EndIf
Until False
Until True
_crypt_shutdown()
If $hfile <> -1 Then FileClose($hfile)
Return SetError($ierror, $iextended, $vreturn)
EndFunc
Func _crypt_encryptfile($ssourcefile, $sdestinationfile, $vcryptkey, $ialg_id)
Local $btempdata = 0, $hinfile = 0, $houtfile = 0, $ierror = 0, $iextended = 0, $ifilesize = FileGetSize($ssourcefile), $iread = 0, $breturn = True
_crypt_startup()
Do
If $ialg_id <> $calg_userkey Then
$vcryptkey = _crypt_derivekey($vcryptkey, $ialg_id)
If @error Then
$ierror = @error
$iextended = @extended
$breturn = False
ExitLoop
EndIf
EndIf
$hinfile = FileOpen($ssourcefile, $fo_binary)
If @error Then
$ierror = 2
$breturn = False
ExitLoop
EndIf
$houtfile = FileOpen($sdestinationfile, $fo_overwrite + $fo_createpath + $fo_binary)
If @error Then
$ierror = 3
$breturn = False
ExitLoop
EndIf
Do
$btempdata = FileRead($hinfile, 1024 * 1024)
$iread += BinaryLen($btempdata)
If $iread = $ifilesize Then
$btempdata = _crypt_encryptdata($btempdata, $vcryptkey, $calg_userkey, True)
If @error Then
$ierror = @error + 400
$iextended = @extended
$breturn = False
EndIf
FileWrite($houtfile, $btempdata)
ExitLoop 2
Else
$btempdata = _crypt_encryptdata($btempdata, $vcryptkey, $calg_userkey, False)
If @error Then
$ierror = @error + 500
$iextended = @extended
$breturn = False
ExitLoop 2
EndIf
FileWrite($houtfile, $btempdata)
EndIf
Until False
Until True
If $ialg_id <> $calg_userkey Then _crypt_destroykey($vcryptkey)
_crypt_shutdown()
If $hinfile <> -1 Then FileClose($hinfile)
If $houtfile <> -1 Then FileClose($houtfile)
Return SetError($ierror, $iextended, $breturn)
EndFunc
Func _crypt_decryptfile($ssourcefile, $sdestinationfile, $vcryptkey, $ialg_id)
Local $btempdata = 0, $hinfile = 0, $houtfile = 0, $ierror = 0, $iextended = 0, $ifilesize = FileGetSize($ssourcefile), $iread = 0, $breturn = True
_crypt_startup()
Do
If $ialg_id <> $calg_userkey Then
$vcryptkey = _crypt_derivekey($vcryptkey, $ialg_id)
If @error Then
$ierror = @error
$iextended = @extended
$breturn = False
ExitLoop
EndIf
EndIf
$hinfile = FileOpen($ssourcefile, $fo_binary)
If @error Then
$ierror = 2
$breturn = False
ExitLoop
EndIf
$houtfile = FileOpen($sdestinationfile, $fo_overwrite + $fo_createpath + $fo_binary)
If @error Then
$ierror = 3
$breturn = False
ExitLoop
EndIf
Do
$btempdata = FileRead($hinfile, 1024 * 1024)
$iread += BinaryLen($btempdata)
If $iread = $ifilesize Then
$btempdata = _crypt_decryptdata($btempdata, $vcryptkey, $calg_userkey, True)
If @error Then
$ierror = @error + 400
$iextended = @extended
$breturn = False
EndIf
FileWrite($houtfile, $btempdata)
ExitLoop 2
Else
$btempdata = _crypt_decryptdata($btempdata, $vcryptkey, $calg_userkey, False)
If @error Then
$ierror = @error + 500
$iextended = @extended
$breturn = False
ExitLoop 2
EndIf
FileWrite($houtfile, $btempdata)
EndIf
Until False
Until True
If $ialg_id <> $calg_userkey Then _crypt_destroykey($vcryptkey)
_crypt_shutdown()
If $hinfile <> -1 Then FileClose($hinfile)
If $houtfile <> -1 Then FileClose($houtfile)
Return SetError($ierror, $iextended, $breturn)
EndFunc
Func _crypt_genrandom($pbuffer, $isize)
_crypt_startup()
Local $aret = DllCall(__crypt_dllhandle(), "bool", "CryptGenRandom", "handle", __crypt_context(), "dword", $isize, "struct*", $pbuffer)
Local $ierror = @error + 10, $iextended = @extended
_crypt_shutdown()
If $ierror OR (NOT $aret[0]) Then
Return SetError($ierror, $iextended, False)
Else
Return True
EndIf
EndFunc
Func __crypt_refcount()
Return $__g_acryptinternaldata[0]
EndFunc
Func __crypt_refcountinc()
$__g_acryptinternaldata[0] += 1
EndFunc
Func __crypt_refcountdec()
If $__g_acryptinternaldata[0] > 0 Then $__g_acryptinternaldata[0] -= 1
EndFunc
Func __crypt_dllhandle()
Return $__g_acryptinternaldata[1]
EndFunc
Func __crypt_dllhandleset($hadvapi32)
$__g_acryptinternaldata[1] = $hadvapi32
EndFunc
Func __crypt_context()
Return $__g_acryptinternaldata[2]
EndFunc
Func __crypt_contextset($hcryptcontext)
$__g_acryptinternaldata[2] = $hcryptcontext
EndFunc
ご覧のとおり、暗号関連のコードがあり、これは(かなり安っぽくてアマチュアな)ランサムウェアであることを示唆しています。他のすべてをリバースエンジニアリングしてください。
悪意のあるアクターは、XMLの外部エンティティの脆弱性( [〜#〜] xxe [〜#〜] )を利用し、次にサーバー側リクエストフォージェリ(SSRF)を利用します。 。
Facebookのサーバーがだまされて、別のドメインからの悪意のあるXMLファイルをリンクし、それを処理して、あなたに提供しました。 XXEチートシート と SSRF聖書のチートシー tを以下に示します。
考えてみてください...難読化されたスクリプトには次のものが含まれています(msxml2.XMLhttpメソッドで、それはgoogleから来たと述べています)。
具体的には、「 バイナリファイルをASP経由でブラウザに送信するADODB.Streamオブジェクト 」を使用しました。
要するに、はい、それはXXEを利用して(ASPによるxmlドキュメントの作成)、偽造(SSRF)し、それがグーグルから来たと述べました。
これはFacebookのエクスプロイトですか?
最も可能性が高い。悪意のある人は常に、銀行口座、パスワード、友達リストなど、お金を稼ぐためにできることすべてにアクセスする方法を模索しています。
友達が悪意のあるリンクにタグを付けて、連絡先を標的とするウイルスに感染した可能性はありますか?
そうでなければ考える理由はありません。ほとんどのコンピューターユーザーは、ウイルスとは何か、ウイルスを "キャッチ"する方法、またはウイルスに感染した後の対処方法さえ知りません。それが私だったら、友達を追跡し、ウイルス対策プログラムへのリンクを送って、手助けを申し出ます。もちろん、あなたの友達によっては、あなたはそれほど親切ではないかもしれませんが、私は私ができる限り人類を助けることを意図しているとかなり強く信じています。
これをFacebookに報告する必要がありますか?
絶対に。友人を困らせることはありませんが、共有を追跡し、最終的にこのウイルス/マルウェア/詐欺の影響を受ける人々の数を減らすのに役立つ可能性があります。
もしそうなら、どうですか?
元の投稿に移動し、投稿にフラグを付けるオプションをクリックして、ウィザードを実行します。彼らが行動を起こしたら通知されます。
最後に、Microsoftはすでにこのファイルを認識しているようです。 IE Edgeでダウンロードしようとすると、ファイルが危険で保存できないという警告が表示されました。SmartScreenを使用しているユーザーはおそらく安全であり、このウイルスはマイクロソフト以外のシステムをターゲットにします。経験の浅い友人や家族のほとんどは、XPを実行していない限り、大丈夫です。その場合、少なくとも7にアップグレードすることをお勧めします。