====================
== Alert Overload ==
====================
Tales from a SOC analyst

Node Malware / EvilAI

Node Malware

Node.js is commonly used to deploy stealers on devices. Often, these incidents include WebView2 applications bundled into InnoSetup installers. These installers use custom scheduled task XML configurations to deploy tasks that run malcious Node.js scripts on the host device. Also referred to as EvilAI - TrendMicro

The linked article does a great job of breaking these down. They’re essentially .net assemblies that use WebView2 and AI-generated “web applications” (read vibe-coded html pages). These applications are bundled into an InnoSetup installer with node and a malicious script. When the installer runs, it sets up a scheduled task to execute the node script. The user only sees the intended “legitimate” AI web app get installed.

I did some analysis on a couple of these, but honestly, they aren’t worth posting about. If you want to see analysis, check out Luke Acha’s posts about it. All the EvilAI samples are essentially the same, with different vibe-coded apps.

Hunting Query

This was adapted to be more language agnostic. Basically, all observed node exeutions followed the pattern on C:\Users<users>\AppData\Local\Programs<sample>\node.exe -> C:\Users<users>\AppData\Local\Programs<sample><script>.js.

Command Line="*AppData\Local\Programs*node.exe*AppData\Local\Programs*.js*" | table([time, Computer, Event, User, File Path, File Name, Command Line, SHA256], limit=20000)

This query finds all command line fields that match node.exe executions targeting scripts in AppData\Local\Programs.

Removal Script

$ErrorActionPreference = "SilentlyContinue"
$files = @("AllManualsReader","ManualReaderPro","ClassicSudoku","OpenMyManual","TotalUserManuals","JustAskJacky","ManualsHQ")
$users = (Get-item C:\Users\*).Name
foreach($user in $users){
    $path = "C:\Users\$user\Downloads"
    $apppath = "C:\Users\$user\AppData\Local\Programs"
    if((Test-Path $path) -And (Test-Path $apppath)){
        foreach($file in $files){
            Write-Host "Removing $path\$file matches"
            Get-ChildItem $path | ? Name -match $file | Remove-Item # remove from downloads
            Write-Host "Removing $apppath\$file matches"
            Get-ChildItem $apppath | ? Name -match $file | Remove-Item -force -recurse # should delete appdata folders probably
        }
    }
}
$tasks = Get-CimInstance -Namespace Root/Microsoft/Windows/TaskScheduler -ClassName MSFT_ScheduledTask
foreach($task in $tasks){
    if($task.Actions.Arguments -match "node.exe"){
        Write-Host "Unregistering task: $($task.TaskName)"
        Unregister-ScheduledTask -TaskName $task.TaskName -Confirm:$false
    }
}

This is a simple script that finds all the related file names from the given file array. It then attempts to delete them out of the Downloads and AppData\Local\Programs directories. It will also try and find the scheduled task that gets created. Keep in mind, this will delete all scheduled tasks that launch node. For my use, this worked fine for most infections.

Known IOCs

These are known samples that have been identified in the environment.

ManualReaderPro

IOC Type Description
0ABD1E39E17FA99366C8F1CC9171730867B6E86F6362B0492A090170F0305E55 SHA256 manualreaderpro.exe - InnoSetup installer
167359B715610003752CBC89B122A6DF97E501304CB4A1EE94A6E75EBF51D6D6 SHA256 24c92c24-5c4e-451a-8885-9509dc69ab38.js - Node Malware
EC3487B0C87A072D9A730CB7AD6671FC1C9B983F26EF1F9CE66B9BD718FE92E9 SHA256 ManualReaderPro.exe - Unpacked Application
api.cjby76nlcynrc4jvrb.com Domain API endpoint called by Node malware

OpenMyManual

IOC Type Description
A0DAE9B551026295575DCF4B1F668069B8FE8119458E792E8293299A74E79436 SHA256 OpenMyManual.exe - InnoSetup installer
822F5DCFE7350D259594D92128BA9FC2B7620AA33B571D8AF8A87945D8909026 SHA256 licensekey.js - Node Malware
33A9D45E2D549B81718593134E3EE3CB1CFD3A38A8BBDE3C62A7062D2015D6BD SHA256 OpenMyManual.exe - Unpacked Application
api.pyej17uw09d1bqlndg.com Domain API endpoint called by Node malware

TotalUserManuals

IOC Type Description
94DC4138BFABF6A3E7CEFFFC5F5062FE0AC31384BAE4AD78F27557DDB29F6EAE SHA256 TotalUserManuals.exe -InnoSetup installer
BCC9EBCE78FDBB1271FF1A2E0DEF82EC87D6E964A18293E82EC0CDD12856E66B SHA256 script.js - Node Malware
B34643B3CA2636195B650E47BFE117FB53FFECF66CD4EA8EB428797D531AECBE SHA256 TotalUserManuals.exe - Unpacked Application
get.latest-manuals.com Domain API endpoint called by Node malware

AllManualsReader

IOC Type Description
B09FD02E58AFD99F7EE8B00C604319D5E83CFA63819B6DD56568FBF4DBCE528A SHA256 AllManualsReader_oc.exe - InnoSetup installer
25BCCBE33F9EB7769061033D8C630E325ACD5FE3EB2ABCB40EADDB56AB9F242D SHA256 2d4d7602-8032-4207-a03f-be08e68d1094.js - Node Malware
44AD5554FE91BAE93CD6242E75D2AD73BC7F52A2547B1601AD0A77E4B803D433 SHA256 AllManualsReader.exe - Unpacked Application
api.k2ioeasm874fnacr9x.com Domain API endpoint called by Node malware

ClassicSudoku

IOC Type Description
A7FBBB0393E36BC70B6EAFB967A3B11A65C442090DA1840364886B984784135C SHA256 ClassicSudoku_oc.exe - InnoSetup installer
DB08B3742A8FB499D8F18F1C03D88CD6E9AE92A70E5B1441935A1891A48B5E0F SHA256 2edd5db0-15e8-4e96-b8a5-ba0e0562023e.js - Node Malware
B9C9898BE3A04BDE91863137C784F0C76ED031EE6DB1501C17D2128681B4412F SHA256 ClassicSudoku.exe - Unpacked Application
api.rmr6qd1zy9hyafyzk2.com Domain API endpoint called by Node malware

JustAskJacky

IOC Type Description
8ECD3C8C126BE7128BF654456D171284F03E4F212C27E1B33F875B8907A7BC65 SHA256 justaskjacky.exe - InnoSetup installer
DD8502622EAA4E3798F4848CFE81C06ED0DFFD7CB0A62C7AB6C7124D5B07BB04 SHA256 c99f5c91-8d40-4172-887d-fa0f2519a694.js - Node Malware
532F78CEB001D9F081607F2CF6740635BB6BA2E87ECACA89A149E82C26F28034 SHA256 JustAskJacky.exe - Unpacked Application
api.vtqgo0729ilnmyxs9q.com Domain API endpoint called by Node malware