
Привет, Хабр! На связи снова команда UserGate uFactor, и мы продолжаем делиться нашими исследованиями в области кибербезопасности. В прошлом материале мы рассказали о двух сценариях атаки: об атаке через LNK-файлы с применением криптографических методов и о многоступенчатой загрузке через BAT-файлы. В этот раз разберем атаку, основанную на фишинговой рассылке вредоносного программного обеспечения DarkWatchman (Buhtrap).

В первую очередь необходимо определить почтовый сервер отправителя и соотнести его с электронным адресом на предмет подмены (spoofing). Для этого необходимо просмотреть заголовок электронного письма. Это можно сделать стандартными средствами Outlook (открыть EML-файл в Outlook, затем нажать «Файл» → «Свойства») или воспользоваться специализированными программами.

Мы видим, что рассылка распространяется с почтового сервера ponyexpress.website и соответствует электронному адресу отправителя, IP-адрес — 195.19.93.148. Далее можно получить информацию об этом IP-адресе. На рисунке 3 представлены сведения, полученные при помощи интернет-ресурса AbuseIPDB.

К электронному письму приложен файл — это ZIP-архив, содержащий ВПО DarkWatchman. Исследуемый образец DarkWatchman — это SFX-архив, который содержит сценарий инсталляции и основной вредоносный модуль, написанный на JavaScript. В ресурсах добавлена иконка, имитирующая PDF-файлы, по умолчанию включено «Скрывать расширение для зарегистрированных типов файлов» — это позволяет вводить пользователя в заблуждение.

Посмотреть ресурсы исполняемого файла можно при помощи программы ProcessHacker.

Получить сведения о файле (о компиляторе, языке программирования, используемом для написания ПО, и других параметрах) можно при помощи Detect It Easy, PE-bear и пр.

Для анализа ВПО, упакованного в SFX-архив, можно воспользоваться WinRAR и открыть архив с его помощью.

На рисунке 7 в правой части можно увидеть сценарий, который будет выполнен при запуске ВПО. Сценарий указывает на следующее: добавляются исключения для системного диска при помощи PowerShell и осуществляется запуск файла 4157934657 при помощи wscript. Так как wscript отвечает за запуск скриптовых сценариев (например, VBS, JavaScript и т. п.), можно предположить, что файл 4157934657 является скриптовым сценарием. Извлечем его из архива и проанализируем.


Метод сокрытия строк реализован через XOR-операции. Для анализа можно воспользоваться, например, онлайн-компилятором и поэтапно исследовать строки.
Сначала проанализируем часть скрипта, где вычисляется ключ для расшифровки основного модуля. Фрагмент представлен на рисунке 10.

Для расшифровки воспользуемся интернет-ресурсом OneCompiler. На рисунке 11 представлен метод, используемый для расшифровки (в левой части), и полученные строки (в правой).

Теперь поправим скрипт, записав полученные строки.

Далее преобразуем вредоносный скрипт для расшифровки основного модуля, содержащегося в переменной var i1a0a864a = "db460075cc43160ac6420b6edb460075df42150acf460130f24c172c..."; (см. рис. 8 и 9). Расшифровывать будем также при помощи OneCompiler.

Для удобства восприятия скопируем полученный код в de4js.


Анализ кода показал, что ВПО многофункционально. Наиболее интересными являются алгоритм генерации доменов (domain generation algorithm) и использование DynamicWrapperX.

Было бы более правильным сказать, что речь идет о генерации URL, так как, хотя изменения и касаются домена, по итогам работы алгоритма будет сгенерирован новый URL. Алгоритм выглядит следующим образом:
import js2py
url_prefix = 'https://'
url_zones = ['.online', '.store', '.site', '.fun', '.space', '.shop']
url_suffix = '/index.php'
default_salt = '2d187a42'
domains = ['bd0baba4', '101ff85d', 'c87cecad', '00712ceb', 'cffab9dc', '3725284b', 'b695ecf2', 'b21851ce', 'b6c98b7a', 'b9ef072b', '5acc6ea7', 'b390342d', '975d38de', '75d7f08b', '13c9e43f', '9e3b6298', '7dd00d3e', '1f07839e', 'c06f244e', 'ae70386a']
outdomainsold = []
outdomainsnews = []
oldurl = []
gmt_date = input('input your data (expample: Mon,23Dec2024) for today date, just press Enter: ')
if gmt_date == '':
from datetime import datetime
d = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')
da = d.split(' ')
if len(da) > 3:
gmt_date = da[0] + da[1] + da[2] + da[3]
salt = input('if your know new salt, enter or skip press Enter: ')
if salt == '':
salt = default_salt
def int2hex32(s):
r = hex(s)[2:]
while len(r) < 8:
r = '0' + r
return r
# В функции используется оригинальная функция из JavaScript-кода, так как Python не умеет работать с такими побитовыми сдвигами (>>>)
def crc32(input_string):
fj = "function crc32(r) {for (var a, o = [], c = 0; c < 256; c++) {a = c;for (var f = 0; f < 8; f++) a = 1 & a ? 8590457354 ^ a >>> 1 : a >>> 1;o[c] = a}for (var n = -1, t = 0; t < r.length; t++) n = n >>> 8 ^ o[255 & (n ^ r.charCodeAt(t))];return (-1 ^ n) >>> 0};"
crc = js2py.eval_js(fj)
return crc(input_string)
def get_current_domains(salt):
for domain in domains:
outdomainsold.append(domain)
for i in range(100):
out = int2hex32(crc32(gmt_date + salt + str(i)))
outdomainsnews.append(out)
def get_actually_url():
current_domains = get_current_domains(salt)
print("URL HardCore: ")
for i in outdomainsold:
for zone in url_zones:
url = url_prefix + i + zone + url_suffix
oldurl.append(url)
print(oldurl)
print("URL YOUR Date Choice: ")
for i in outdomainsnews:
for zone in url_zones:
url = url_prefix + i + zone + url_suffix
print(url)
get_actually_url()
Также ВПО умеет работать с WinAPI при помощи DynamicWrapperX с использованием dynwrapx.dll. Суть алгоритма: в ответе командного сервера могут быть дополнительные модули; ВПО выделяет память в процессе, записывает в нее команды (код) от командного сервера и исполняет их при помощи WinAPI.



Заключение
Вредонос DarkWatchman обладает широкой функциональностью, среди его возможностей:
очистка журналов событий;
удаление теневых копий;
использование планировщика заданий для автозагрузки;
очистка истории браузеров (Chrome, Yandex, Firefox, Edge);
загрузка и исполнение файлов;
работа с командной строкой;
кейлоггер.
Атака с использованием DarkWatchman, как и многие подобные атаки, начинается с фишингового письма, вложение в котором скрывает свою истинную природу. Основной модуль выполняется за счет сценария, размещенного в замаскированном SFX-архиве. Для избежания детектирования автоматизированными СЗИ и усложнения статического анализа DarkWatchman использует XOR-шифрование строк. Для стабильного сетевого взаимодействия используется генератор доменных имен. И конечно, все это дополняется большим набором функций для взаимодействия с оператором.
# Mail server
195.19.93.148
# Mail Sender
# REG
HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM\fjhsfgds
HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM\<[0-9a-f]{9}>
# C&C – закрепленные в коде
'https://bd0baba4[.]online/index[.]php'
'https://bd0baba4[.]store/index[.]php'
'https://bd0baba4[.]site/index[.]php'
'https://bd0baba4[.]fun/index[.]php'
'https://bd0baba4[.]space/index[.]php'
'https://bd0baba4[.]shop/index[.]php'
'https://101ff85d[.]online/index[.]php'
'https://101ff85d[.]store/index[.]php'
'https://101ff85d[.]site/index[.]php'
'https://101ff85d[.]fun/index[.]php'
'https://101ff85d[.]space/index[.]php'
'https://101ff85d[.]shop/index[.]php'
'https://c87cecad[.]online/index[.]php'
'https://c87cecad[.]store/index[.]php'
'https://c87cecad[.]site/index[.]php'
'https://c87cecad[.]fun/index[.]php'
'https://c87cecad[.]space/index[.]php'
'https://c87cecad[.]shop/index[.]php'
'https://00712ceb[.]online/index[.]php'
'https://00712ceb[.]store/index[.]php'
'https://00712ceb[.]site/index[.]php'
'https://00712ceb[.]fun/index[.]php'
'https://00712ceb[.]space/index[.]php'
'https://00712ceb[.]shop/index[.]php'
'https://cffab9dc[.]online/index[.]php'
'https://cffab9dc[.]store/index[.]php'
'https://cffab9dc[.]site/index[.]php'
'https://cffab9dc[.]fun/index[.]php'
'https://cffab9dc[.]space/index[.]php'
'https://cffab9dc[.]shop/index[.]php'
'https://3725284b[.]online/index[.]php'
'https://3725284b[.]store/index[.]php'
'https://3725284b[.]site/index[.]php'
'https://3725284b[.]fun/index[.]php'
'https://3725284b[.]space/index[.]php'
'https://3725284b[.]shop/index[.]php'
'https://b695ecf2[.]online/index[.]php'
'https://b695ecf2[.]store/index[.]php'
'https://b695ecf2[.]site/index[.]php'
'https://b695ecf2[.]fun/index[.]php'
'https://b695ecf2[.]space/index[.]php'
'https://b695ecf2[.]shop/index[.]php'
'https://b21851ce[.]online/index[.]php'
'https://b21851ce[.]store/index[.]php'
'https://b21851ce[.]site/index[.]php'
'https://b21851ce[.]fun/index[.]php'
'https://b21851ce[.]space/index[.]php'
'https://b21851ce[.]shop/index[.]php'
'https://b6c98b7a[.]online/index[.]php'
'https://b6c98b7a[.]store/index[.]php'
'https://b6c98b7a[.]site/index[.]php'
'https://b6c98b7a[.]fun/index[.]php'
'https://b6c98b7a[.]space/index[.]php'
'https://b6c98b7a[.]shop/index[.]php'
'https://b9ef072b[.]online/index[.]php'
'https://b9ef072b[.]store/index[.]php'
'https://b9ef072b[.]site/index[.]php'
'https://b9ef072b[.]fun/index[.]php'
'https://b9ef072b[.]space/index[.]php'
'https://b9ef072b[.]shop/index[.]php'
'https://5acc6ea7[.]online/index[.]php'
'https://5acc6ea7[.]store/index[.]php'
'https://5acc6ea7[.]site/index[.]php'
'https://5acc6ea7[.]fun/index[.]php'
'https://5acc6ea7[.]space/index[.]php'
'https://5acc6ea7[.]shop/index[.]php'
'https://b390342d[.]online/index[.]php'
'https://b390342d[.]store/index[.]php'
'https://b390342d[.]site/index[.]php'
'https://b390342d[.]fun/index[.]php'
'https://b390342d[.]space/index[.]php'
'https://b390342d[.]shop/index[.]php'
'https://975d38de[.]online/index[.]php'
'https://975d38de[.]store/index[.]php'
'https://975d38de[.]site/index[.]php'
'https://975d38de[.]fun/index[.]php'
'https://975d38de[.]space/index[.]php'
'https://975d38de[.]shop/index[.]php'
'https://75d7f08b[.]online/index[.]php'
'https://75d7f08b[.]store/index[.]php'
'https://75d7f08b[.]site/index[.]php'
'https://75d7f08b[.]fun/index[.]php'
'https://75d7f08b[.]space/index[.]php'
'https://75d7f08b[.]shop/index[.]php'
'https://13c9e43f[.]online/index[.]php'
'https://13c9e43f[.]store/index[.]php'
'https://13c9e43f[.]site/index[.]php'
'https://13c9e43f[.]fun/index[.]php'
'https://13c9e43f[.]space/index[.]php'
'https://13c9e43f[.]shop/index[.]php'
'https://9e3b6298[.]online/index[.]php'
'https://9e3b6298[.]store/index[.]php'
'https://9e3b6298[.]site/index[.]php'
'https://9e3b6298[.]fun/index[.]php'
'https://9e3b6298[.]space/index[.]php'
'https://9e3b6298[.]shop/index[.]php'
'https://7dd00d3e[.]online/index[.]php'
'https://7dd00d3e[.]store/index[.]php'
'https://7dd00d3e[.]site/index[.]php'
'https://7dd00d3e[.]fun/index[.]php'
'https://7dd00d3e[.]space/index[.]php'
'https://7dd00d3e[.]shop/index[.]php'
'https://1f07839e[.]online/index[.]php'
'https://1f07839e[.]store/index[.]php'
'https://1f07839e[.]site/index[.]php'
'https://1f07839e[.]fun/index[.]php'
'https://1f07839e[.]space/index[.]php'
'https://1f07839e[.]shop/index[.]php'
'https://c06f244e[.]online/index[.]php'
'https://c06f244e[.]store/index[.]php'
'https://c06f244e[.]site/index[.]php'
'https://c06f244e[.]fun/index[.]php'
'https://c06f244e[.]space/index[.]php'
'https://c06f244e[.]shop/index[.]php'
'https://ae70386a[.]online/index[.]php'
'https://ae70386a[.]store/index[.]php'
'https://ae70386a[.]site/index[.]php'
'https://ae70386a[.]fun/index[.]php'
'https://ae70386a[.]space/index[.]php'
'https://ae70386a[.]shop/index[.]php'
HASH
----------------------------------
4157934657
e45e91d6a776d4d4c5a39bd13a01704d
566a5b9328874ba747be4f5b331277ce15ae5898
99b6062a9dabf81011e569495d0b31e7b3cdb049d73fe34ab72615ff8d1f8d39
----------------------------------
cbaca0553f9a13f9b540a55a5cc03bab
20253b3300fb0ec9c6e56e95b4cf080c78c41719
022f581ce15b4f8ce63fd9ba218b865d48124bda1518eb3b7155d461a3bffc37
----------------------------------
f1eec66e15aff1fcf23dbafa9f8e205b
2e7c0312a98fafb886c583bc29e1fabe11ed3cb8
caf6f4f4c11e65163472ca48f72a6beaee20a4ac66cd419bef4c7b726602409b
----------------------------------
fautmand.pi
3440632fa1b3837fce0e3bb4f1910138
0c6f8f0de2a14542f68ab23fb20460ecdccf7c5c
dc293682142759dbec88d19d536df5c17b18789af0a44bdd4879f3371bd88751
----------------------------------
7f8b6c929cea9b45a73a4cb6f4ad030a
3d32cf65fa7b26bcfdbe85892cc5f384c21c63db
a436cc567334682957eed5fc80e8e4575be169c58032458dad97a7fd6d7deab6
----------------------------------
loffin.sot
47b1c1b01bc866c7dcecc2f283ab3396
72578e3adfa3119bffae602a5df951e9a09d97e2
bef60c4f17b8a8ee3d5ad732f43104d2f4c3a3045fb437f703b99705d3b3af55
----------------------------------
93e39c7275a7377ff837992141789593
40e0d90a868166cd36c896b6be389acbfa8a1cdc
b61900a4208a9aed35dcdd706fbf0bab417abfeaef6aa1c8fca7f68575a14ef2
----------------------------------
nsdothry.nti
ff13c0e958d09c467b594d61706be4e7
f27768b2685fcd5ca2ab7f880bbf502871ed37ba
20612c0e26b5a25efc22ccb5b44e4f1b7dd152a846073d1881d3c04089039907
----------------------------------
nslisfil.yli
2e85e26f1bcf5f1672a53daf39f2a168
61e4ac99d32b5b8207584ebf87c70b6d9b4cc902
de0f099a6f7bde71538999345e8fd460ff173efdd0e521024700a13253a1a706
----------------------------------
782dc802d8efd2b75bef589a20c94024
5fe4ec6bdbd579068831a822e86670e2160d2147
e80dc7946e566ddc3f84e10e83d276cc69cc8ff7040bd0cd8e99c8f8306cfb8f
----------------------------------
stnestsh.opl
5812e9a2bfdc59a34a6b5aeb7a2fdb3a
42706bf6f6bcfac6c3b25057a86a7385fb393720
09c18ecb453e89a205cc6e5e5032a85139a2a034c1b39a85be7ba23e147e4bb8
----------------------------------
Накладная №55-0780-2219.exe
22ce5e4c54352d99f9dc0326591b6526
af47d787e78812184270d4fda2c5abd9efbbfdba
d1348d73eafbcd78a584ce7c57542331061bbd44d2b425644e92d01368ad6862
----------------------------------
Накладная №55-0780-2219.zip
2ad2f698bc13114796a44392a0f82012
523ec8ed85b2eadd08662bc7fb67653e2456c9af
5654faf2d7d2bf6e8fcca0ff5bf12d10c284503632cbc964466cc810ded31571