Node.js上的后门程序:为什么,为什么以及如何工作

最近,Yandex的同事与我们分享了一个有趣的特洛伊木马样本,我们在新闻中对此进行了报道。 这种恶意软件并不经常出现,因此我们决定对其进行详细介绍,同时讨论为什么我们很少遇到此类样本。

该木马是一个用JavaScript编写并使用Node.js运行的多组件后门。 它的主要元素是worker和updater,它们由引导程序下载并安装到系统中。 有效负载可以是任何负载,但在这种情况下,特洛伊木马会安装xmrig挖矿机。 在研究时,开发人员使用矿工来开采TurtleCoin加密货币。

MonsterInstall通过带有欺骗手段的站点进行分发,这些站点可以欺骗流行的视频游戏。 这些资源大多数属于Trojan的开发人员,但是我们在其他类似的站点上发现了更多受感染的文件。 其中一个的所有者定期监视竞争对手的更新,并用新内容补充他的资源。 为此,他使用了parser.php脚本,该脚本通过代理在cheathappens.com上搜索新的作弊文件。

Proxy parse done, total: 1 Use sox 84.228.64.133:1080 Error: CURL error(#52), attempts left: 10 Use sox 84.228.64.133:1080 Posts found: 30! [33mPage Satisfactory: ўЂµ№ЅµЂ +8 vCL#96731 {CheatHappens.com} already in base[0m [33mPage Borderlands: The Pre-Sequel - ўЂµ№ЅµЂ +28 v1.2019 {LinGon} already in base[0m [33mPage Borderlands - Game of the Year Enhanced: ўЂµ№ЅµЂ +19 v1.0.1 {LinGon} already in base[0m [33mPage Star Wars: Battlefront 2 (2017): ўЂµ№ЅµЂ +4 v01.04.2019 {MrAntiFun} already in base[0m [36mPage Far Cry 5: ўЂµ№ЅµЂ +23 v1.012 (+LOST ON MARS/DEAD LIVING ZOMBIES) {CheatHappens.com} added 2019-Apr-09[0m [36mPage Fate/Extella Link: ўЂµ№ЅµЂ +13 v04.09.2019 {CheatHappens.com} added 2019-Apr-09[0m [36mPage Superhot: ўЂµ№ЅµЂ +3 v2.1.01p { MrAntiFun} added 2019-Apr-09[0m [36mPage Dawn of Man: ўЂµ№ЅµЂ +7 v1.0.6 {CheatHappens.com} added 2019-Apr-08[0m [36mPage Borderlands 2: ўЂµ№ЅµЂ +14 v06.04.2019 {MrAntiFun} added 2019-Apr-08[0m [36mPage Borderlands: The Pre-Sequel - ўЂµ№ЅµЂ +17 v06.04.2019 {MrAntiFun} added 2019-Apr-08[0m [36mPage Tropico 6: ўЂµ№ЅµЂ +9 v1.01 {MrAntiFun} added 2019-Apr-08[0m [36mPage Operencia: The Stolen Sun - ўЂµ№ЅµЂ +20 v1.2.2 {CheatHappens.com} added 2019-Apr-08[0m [36mPage Enter the Gungeon: ўЂµ№ЅµЂ +6 v2.1.3 {MrAntiFun} added 2019-Apr-07[0m [36mPage The Guild 3: ўЂµ№ЅµЂ +2 v0.7.5 {MrAntiFun} added 2019-Apr-07[0m [36mPage Dead Effect 2: ўЂµ№ЅµЂ +8 v190401 {MrAntiFun} added 2019-Apr-07[0m [36mPage Assassin's Creed: Odyssey - ўЂµ№ЅµЂ +26 v1.2.0 {FLiNG} added 2019-Apr-07[0m [36mPage Assassin's Creed: Odyssey - ўЂµ№ЅµЂ +12 v1.2.0 {MrAntiFun} added 2019-Apr-06[0m [36mPage Super Dragon Ball Heroes: World Mission - ўЂµ№ЅµЂ +11 v1.0 {FLiNG} added 2019-Apr-05[0m [36mPage Tropico 6: ўЂµ№ЅµЂ +7 v1.02 97490 {CheatHappens.com} added 2019-Apr-05[0m [36mPage Risk of Rain 2: ўЂµ№ЅµЂ +10 Build 3703355 {CheatHappens.com} added 2019-Apr-05[0m [36mPage Sid Meier's Civilization 6 - Rise and Fall: ўЂµ№ЅµЂ +12 v1.0.0.314 {MrAntiFun} added 2019-Apr-05[0m [36mPage Sid Meier's Civilization 6 - Gathering Storm: ўЂµ№ЅµЂ +12 v1.0.0.314 {MrAntiFun} added 2019-Apr-05[0m [36mPage Sid Meier's Civilization 6: ўЂµ№ЅµЂ +12 v1.0.0.314 {MrAntiFun} added 2019-Apr-05[0m [36mPage Borderlands GOTY Enhanced: ўЂµ№ЅµЂ +16 v1.0 {CheatHappens.com} added 2019-Apr-05[0m [36mPage Borderlands Game of the Year Enhanced: ўЂµ№ЅµЂ +13 v1.00 {MrAntiFun} added 2019-Apr-04[0m [36mPage Assassin's Creed: Odyssey: ўЂµ№ЅµЂ +24 v1.2.0 (04.04.2019) {CheatHappens.com} added 2019-Apr-04[0m [36mPage Sekiro: Shadows Die Twice - ўЂµ№ЅµЂ +24 v1.02 {FLiNG} added 2019-Apr-04[0m [36mPage Hearts of Iron 4: ўЂµ№ЅµЂ +24 v1.6.2 {MrAntiFun} added 2019-Apr-04[0m [36mPage Wolcen: Lords of Mayhem - ўЂµ№ЅµЂ +5 v1.0.2.1 {MrAntiFun} added 2019-Apr-04[0m [36mPage Devil May Cry 5: ўЂµ№ЅµЂ +18 v1.0 (04.03.2019) {CheatHappens.com} added 2019-Apr-04[0m Parse done 


在开发人员的网站上,有很多作弊手段,但是所有链接都将返回相同的存档。 如果尝试从恶意软件站点下载任何文件,则用户将收到Trojan.MonsterInstall。 可以从下载链接中猜测木马的一些参数:

 https://<malicious_site>/fc/download.php?name=Borderlands%20GOTY%20Enhanced:%20%D0%A2%D1%80%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%20+16%20v1.0%20{CheatHappens.com}&link=https://<malicious_site>//r.php?site=http://gtrainers.com/load/0-0-1-7081-20&password=<malicious_site>/&uid=101&sid1=1&sid2=1&charset=utf-8 

  • name-档案名称和档案中的exe;
  • link-指向用户想要下载的文件的链接(连接在data.json中);
  • 密码-存档的密码。

假设我们选择了所需的作弊文件,并从特洛伊木马程序开发人员的网站下载了受密码保护的7zip存档,其名称很有前途:“ ExtrimHack.rar”。 它的内部有一个可执行文件,一个配置文件,一个7zip库以及一个带有使用Node.js Binar启动的本机C ++库和脚本的bin存档。

存档内容示例:

  • 7z.dll;
  • data.bin;
  • data.json;
  • ESP作弊COP GO.exe。


启动可执行文件后,特洛伊木马将使用data.json文件中的参数信息安装其运行所需的所有组件,并下载用户所需的作弊文件。

data.json的示例内容:
 {"source":[5,10,11,43],"dataVersion":[0,0,0,115],"link":"http:\/\/clearcheats.ru\/images\/dl\/csgo\/ESP_csgo.dll"} 


为了排除其过程的多个副本,特洛伊木马创建了“ cortelMoney-suncMutex”互斥体并将其安装在“%WINDIR%\ WinKit \”目录中。 然后,它检查它是否在注册表中([HKLM \\ Software \\ Microsoft \\ Windows Node])。 如果是这样,它将读取其参数并将版本与data.json中指定的版本进行比较。 如果版本是最新版本,则它将不再执行任何操作并结束。

然后,木马将WINDIR%\\ WinKit \\中的data.bin内容解压缩,并安装服务以启动start.js。

data.bin的内容:
  • 守护进程
  • node_modules;
  • 7z.dll;
  • msnode.exe;
  • start.js;
  • startDll.dll;
  • update.js;
  • updateDll.dll。

同时,msnode.exe是具有有效数字签名的可执行文件Node.js,node_modules目录包含库“ ffi”,“ node-windows”和“ ref”。

将startDll.dll库加载到start.js中,并调用其mymain导出,该库从注册表中读取其参数,启动“%WINDIR%\\ WinKit \\ msnode%WINDIR%\\ WinKit \\ update.js”并停止该服务“ Windows节点”。 依次,update.js脚本加载updateDll.dll库并调用其mymain导出。 没什么复杂的。

在updateDll.dll中,木马将开始检查您的Internet连接。 为此,他将每10秒将请求发送到google.com,yahoo.com,facebook.com,直到所有三个返回200个代码为止。 然后它将带有配置数据的请求发送到s44571fu [。] Bget [。] Ru / CortelMoney / enter.php POST服务器:

 {"login":"NULL","mainId":"PPrn1DXeGvUtzXC7jna2oqdO2m?WUMzHAoM8hHQF","password":"NULL","source":[0,0,0,0],"updaterVersion":[0,0,0,0],"workerVersion":[0,0,0,0]} 


在这种情况下,对于基本授权,使用一对“ cortel:money”,并且将User-Agent设置为“ USER AGENT”。 对于后续请求的基本授权,将使用login:密码,该密码将由服务器报告。

服务器使用json进行响应,如下所示:

 { "login": "240797", "password": "tdzjIF?JgEG5NOofJO6YrEPQcw2TJ7y4xPxqcz?X", "updaterVersion": [0, 0, 0, 115], "updaterLink": "http:\/\/s44571fu.bget.ru\/CortelMoney\/version\/0-0-0-115-upd.7z", "workerVersion": [0, 0, 3, 0], "workerLink": "http:\/\/s44571fu.bget.ru\/CortelMoney\/version\/0-0-3-0-work.7z" } 


如您所见,服务器的响应包含特洛伊木马主要元素的版本。 如果用户设备上的更新程序的当前版本比服务器报告的版本旧,则特洛伊木马会从指定的链接下载文件并将压缩文件解压缩到目录“%WINDIR%\\ WinKit \\\\”中,在该目录中将显示服务器响应中的updaterVersion参数的值。 。

该木马将工作文件解压缩到%WINDIR%\\ WinKit \\ SystemNode \\目录中,然后启动“%WINDIR%\\ WinKit \\ SystemNode \\ sysnode%WINDIR%\\ WinKit \\ SystemNode \\ main.js”。

与工作人员一起归档的内容:
  • node_modules;
  • 7za.exe;
  • 食典;
  • main.js;
  • sysnode.exe。

然后,木马删除Windows Node Guard服务,然后再次创建它,将可执行文件替换为Windows Node服务文件。 以相同的方式,它重新创建Windows节点服务,并用守护程序\\ service.exe替换可执行文件。

接下来形成带有参数的service.xml:
 <service><id>service.exe</id><executable>C:\Windows\\WinKit\0.0.0.115\msnode.exe</executable><arguments>"C:\Windows\\WinKit\0.0.0.115\start.js"</arguments></service> 


Updater安装在“ C:\ Windows \ Reserve Service”目录中,由该服务注册并由Node.js.二进制文件启动。 它还由几个js脚本和本机C ++库组成。 主要模块是main.js。

使用更新程序归档的内容:
  • main.js;
  • start.js;
  • crypto.dll;
  • network.dll;
  • service.exe。

首先,该木马通过向google.com,yandex.ru或www.i.ua发送请求来了解当前日期。 他使用了稍后收到的信息。 然后,它使用crypto.dll库解密bootList.json文件的内容。

解密算法:
 key = '123' s = '' for i in range(len(d)): s += chr((ord(d[i]) - ord(key[i % len(key)])) & 0xff) 


从那里获取管理服务器列表:
 [{"node":"http://cortel8x.beget.tech/reserve","weight":10},{"node":"http://reserve-system.ru/work","weight":10}] 


然后,木马从注册表中读取信息:
 function getInfo() { var WindowsNodeInfo = new Object(); WindowsNodeInfo.mainId = windowsLib.getStringRegKey("HLM\\SOFTWARE\\Microsoft\\Windows Node", "mainId"); WindowsNodeInfo.login = windowsLib.getStringRegKey("HLM\\SOFTWARE\\Microsoft\\Windows Node", "log"); WindowsNodeInfo.password = windowsLib.getStringRegKey("HLM\\SOFTWARE\\Microsoft\\Windows Node", "pass"); WindowsNodeInfo.source = windowsLib.getStringRegKey("HLM\\SOFTWARE\\Microsoft\\Windows Node", "source"); WindowsNodeInfo.updaterVersion = windowsLib.getStringRegKey("HLM\\SOFTWARE\\Microsoft\\Windows Node", "updaterVersion"); WindowsNodeInfo.workerVersion = windowsLib.getStringRegKey("HLM\\SOFTWARE\\Microsoft\\Windows Node", "workerVersion"); var ReserveSystemInfo = new Object(); ReserveSystemInfo.workerVersion = windowsLib.getStringRegKey("HLM\\SOFTWARE\\Microsoft\\Reserve System", "updaterVersion"); var myInfo = new Object(); myInfo.windowsNode = WindowsNodeInfo; myInfo.reserveSystem = ReserveSystemInfo; return JSON.stringify(myInfo); } 

然后,它添加与“ cortel:money”对相对应的基本授权的HTTP标头,并将其与POST请求一起发送到先前解密的管理服务器。
作为响应,服务器收到:

 { "data": { "updaterVersion": [0, 0, 0, 1], "updaterLink": "/upd.7z", "updaterVerify": "£ñß(\u0012Ä\ti¾$ë5ž»\u001c²\u001c\fÙ=±÷ö‚´èUnŽÐÂBÔ\n\u001dW6?u½\u0005Œn\u000fp:üÍ\u0019\u0000\u000bSý«\u00137÷\u0013”'ì¥û§s7F\u0016ó\\\u000f%6ñê\"7î<ýo䃃0Æ%t ñÅv‚S¡\r\u001e•ÅÆ¡¿N)v\\f8\u0004F\fUS¯‰³§ oIõŒiÆîGݪ\u0017êH/8Ö1-°™[P 5E7X‡Fø%S ŠXÕ6Oþ=Vô‰…ˆ:.3Œ‚i\u000eÁù9Ã&¾ŒM\u001eÛªé$\u0006#IèÞÛ\u0018À\u001b^è,ÁòÑCTXb\u001d$ç\u0004„ð¶0UVÕ»e\u001f\b\u001e¡Ä¼è+Fjúÿoâz\r !çô3xØs—_\u000b\u0017\u001fY]\u0001¥j^û\\W", "dateTime": 1534868028000, "bootList": [{ "node": "http://cortel8x.beget.tech/reserve/", "weight": 10 }, { "node": "http://reserve-system.ru/work/", "weight": 10 }] }, "dataInfo": "I`ù@ÀP'ÈcÊÛ´#iè Ò~\u0007<\u0001Ýìûl«ÔÆq\u0013àÛ\u0003\b\u0017ÑLÁ}ÿÚ˜DS']\u0003bf\u0003!¿Cð¸q¸ÖÜ'B¢CÄAMˆÀA¤d\u001c5¨d -\u0013‰\u0011ѼF'|SB[¬°(ܹÈÒÜ £L\u00071¾:`\u001bŒìýKõ\"²Ÿ¸$´3™UºÅ¨J†¨cƒf¿}r;Öeì¶x‰ØKt¥‹„47a\u001e¸Ô‡ˆy\u0006•\u001b\u0004‚‹„„•ó\u001a\u0019\nu>¨)bkæ…'\u00127@é‹7µæy3ÈNrS'Mð‡\u0018\u0019¾òÓ[Žå5H‡ƒ·¦k'¿ÉŠ&PÂÈîåÚ~M\u0010ðnáH擪xÃv cד\u0013…T…ïÑÝ\tœŽ\u0018†Æ\u00148$”Ôî" } 


这是较早获得的当前日期。 木马会根据服务器传递的dataTime参数对其进行检查。 如果日期之间的差异超过一周(以毫秒为单位),则特洛伊木马程序将不执行命令。 dataInfo参数还包含数据签名(数据字段),使用main.js中连接的公共密钥对其进行检查。 “ bootList”参数包含服务器列表,特洛伊木马会将其加密并存储在“ bootList.json”中。

之后,木马会根据updaterVersion参数中指定的版本检查其版本。 如果安装的版本不低于最新版本,则木马会通过传递参数“ main.js”来启动“ upd \\ upd.exe”。 如果服务器响应中的版本较新,则特洛伊木马使用“ updaterLink”参数upd.7z中的链接下载更新档案,检查其签名并解压缩。 然后,它将更新[HKLM \\ SOFTWARE \\ Microsoft \\保留系统]'updaterVersion'的版本写入注册表,此后,它再次启动“ upd \\ upd.exe”,并将其传递给参数“ main.js”。

特洛伊木马程序的工作人员检查是否已安装组件之一,并就是否安装应用程序做出决定。 首先,他创建MoonTitleWorker互斥锁,然后使用带有字符串“ xor”的XOR解密codeX文件并执行它。 之后,形成带有信息的json:
 {"userId": id, "starter": [], "worker": [], "source": [], "osInfo": {"isX64": True, "osString": "Windows 7 Enterprise"}} 

将此信息与POST请求一起发送到http:// <malicious_site> [。] Xyz:1001 / getApps(为了简洁起见,我们未指定域名,但可以在此处找到。)服务器响应可能包含有关需要安装的应用程序的信息。

答案示例:
 { "body": { "apps": [{ "hash": "452f8e156c5c3206b46ea0fe61a47b247251f24d60bdba31c41298cd5e8eba9a", "size": 8137466, "version": [2, 0, 0, 2], "link": "xmr-1-64.7z", "path": "%pf%\\Microsoft JDX\\64", "runComand": "%path%\\moonlight.exe start.js", "name": "xmr64" }] }, "head": "O~¨^Óå+ßzIçsG¬üS„ʶ$êL–LùθZ\f\u0019ÐÐ\u000e \u0004\u001cÀU¯\u0011š)áUÚ\u001flß²A\u001fôÝÔ숱y%\"DP» ^¯«FUâ\u001cÔû\u001dµ´Jï#¬ÌȹÎÚª?\r—]Yj·÷õ³—\u001e°ÖÒ\\鉤d'BT\u0019·¦FõVQ°Aç')\u001cõªµ¦ýûHlb͸þ}éŒ\u0000jvÔ%S;Ã×þA\u0011ß'I[´\u0004ýÚ\u0007Z:ZÂ\n–ñz#ÈBö›²2\u0007ÎJw±èTVoŸå\bÖR3½ù;ƒó\u0011ÉÌ€ÅÖàð06ÓeÕþˆ”7Ùš\u0011•»”˜¢5µgôÛc˜&L\u000fê.?!Çæ}¨\u001eÕ—J#A¼_Ì\u0015càñb" } 

如果设备没有这样的应用程序,则特洛伊木马通过将POST请求发送到URL http:// <malicious_site> [。] Xyz:1001 / /来下载该应用程序,其中将指示来自服务器响应的相应应用程序的链接参数。 如果有这样的应用程序,但是版本较旧,则会将其更新为当前版本。

该木马程序使用服务器在hash和size参数中指定的信息来检查下载文件的大小和哈希。 如果数据收敛,它将沿着path参数中的路径移动文件,并运行runCommand字段中指定的命令。 有关下载的应用程序的信息存储在注册表中[HKLM \\ SOFTWARE \\ Microsoft \\ MoonTitle \\ apps \\]。

目前,正在使用后门设置xmrig采矿机。 根据系统容量,木马会下载xmr-1.7z或xmr-1-64.7z存档。 在start.js中,它加载xmrig.dll库并调用mymain export,在其中部署环境变量并终止进程:
  • %sys32_86%\\ xmr;
  • %sys32_86%\\ xmr64;
  • %pf_86%\\ Microsoft JDX \\ 32 \\ windows-update.exe;
  • %pf_86%\\ Microsoft JDX \\ 64 \\ windows-update.exe。

如果xmrig.exe文件位于附近,则特洛伊木马程序将其加载到当前进程的内存中,擦除MZ签名,使用XOR与0x39对其解密,然后将其转储保存在转储文件中。 如果木马在同一目录中找到“转储”文件,则会以相同方式对其进行解密,启动windows-update.exe并将解密后的有效负载嵌入其中。

该木马通过POST请求收集并发送到URL: cherry-pot [。] Top / RemoteApps / xmr / main.php以下系统信息:{“ action”:“ enter”,“ architecture”:“ INTEL”,“ cpuAES” :true,“ cpuCache”:8192,“ cpuSpeed”:3392.0,“ cpuThreads”:2,2,“ cpuVendorString”:“Intel®Core(TM)i5-4690S CPU @ 3.20GHz \ u0000”,“ hightPages”:false,“登录“:” null“,”密码“:” null“,” ramPhysicalSize“:3071,” xmrigVersion“:[2,10,0]}

作为响应,服务器发送矿工配置:
 {"maxCpuLoad":1000,"minCpuLoad ":0,"algo":"cryptonight-pico/trtl","av":0,"background":false,"donate-level":1,"max-cpu-usage":75,"retries":5,"retry-pause":5,"cpu-priority":1,"pools":[{"url":"185.224.133.91:5511","keepalive":true,"nicehash":true}]} 

木马将配置保存在config.json中后,它将自动启动并开始挖掘。

MonsterInstall还有其他修改。 例如,除了游戏作弊外,Malvari开发人员还以Chrome浏览器安装程序和用于检查文件的程序的名义分发了该文件。 在木马的更高版本中,开发人员考虑了安全性并添加了字符串加密,并且需要为某些文件输入密码。 此外,特洛伊木马之一版本的引导程序甚至具有指向特洛伊木马开发者域中托管的许可协议的链接。

(不幸的是,有关此类协议的法律效力的问题不在本文的讨论范围之内,但是如果您有兴趣阅读有关该主题的材料,请在评论中告知我们)。

结论

对于病毒编写者来说,Node.js并不是最实用的解决方案。 如果这种特洛伊木马的大小很小,则Node.js绑定(可执行文件和库)将比标准malvari显着“重”。 是什么决定了这个选择? 通常,开发人员会选择他们熟悉的工具。 因此,即使是育种者,技术的选择也更取决于个人喜好。 但是,Node.js具有其优点,其中之一是有效的签名。 在系统中,这样的过程将被签名为Node.js,这很少引起怀疑。

总结一下,可以注意到,尽管选择了有趣的工具,但这并没有给后门开发人员带来任何明显的优势。 将来我们不太可能看到使用Node.js的恶意软件。

像往常一样,我们共享妥协指标

Source: https://habr.com/ru/post/zh-CN460255/


All Articles