Охотимся на GetSystem: повышение привилегий через именованные каналы
Named pipe impersonation: что происходит, когда выполняешь getsystem, и как это обнаружить. Meterpeter, Cobalstrike и PowerSploit.
GetSystem — это техника эскалации привилегий, которая позволяет перейти с уровня администратора (Administrator) на уровень NT AUTHORITY\SYSTEM, высший уровень привилегий в Windows. Важно отметить, что эта техника не работает из-под обычного пользователя — требуется уже иметь административные права.
Где встречается GetSystem
Эта техника реализована в популярных инструментах:
Cobalt Strike —
getsystem
команда в BeaconMeterpreter (Metasploit Framework) —
getsystem
командаPowerSploit — Get-System.ps1 (его же адаптированную версию использует Empire)
Как это работает? Именованные каналы и Impersonation
Под капотом GetSystem использует механизм именованных каналов (Named Pipes) и Impersonation (принятие прав другого пользователя).
На примере Meterpreter:
Meterpreter создает именованный канал (например,
\\.\pipe\xyz123
) - имя случайное. В случае с PowerSploit произвольное имя pipe можно задать параметром, если не задать, то будет использовать захардкоженный "TestSVC". Регистрируется событие Sysmon EID 17.Создает службу (которая по умолчанию работает как SYSTEM). Служба имеет довольно специфичный командлайн с перенаправлением вывода в недавно созданный именованный канал:
cmd.exe /c echo xyz123 > \\.\pipe\xyz123
Для Powersploit:
cmd.exe /C start %COMSPEC% /C `"timeout /t 3 >nul&&echo TestSVC > \\.\pipe\TestSVC
Регистрируется событие EventID 4697 или 7045.
Служба запускает процесс от имени NT AUTHORITY\SYSTEM, который подключается к этому каналу. При старте процесса регистриуется EventID 4688 или Sysmon EID 1. Родительский процесс: services.exe. Процесс страртует с правами SYSTEM. При подключении к именованному каналу - Sysmon 18.
Через API
ImpersonateNamedPipeClient
Meterpreter перехватывает токен SYSTEMИспользует украденный токен для дальнейших действий с наивысшими правами. Если родитель запущен от пользовательской УЗ, а потомок уже в системной сессии - то это хороший индикатор того, что произошло повышение привилегий.
Вариации GetSystem
В Meterpreter команда getsystem
предоставляет несколько методов эскалации привилегий через параметр -t
.
При вызове getsystem
без параметров (-t 0
) Meterpreter пробует методы по порядку до первого успешного:
-t The technique to use. (Default to '0').
0 : All techniques available
1 : Named Pipe Impersonation (In Memory/Admin)
2 : Named Pipe Impersonation (Dropper/Admin)
3 : Token Duplication (In Memory/Admin)
4 : Named Pipe Impersonation (RPCSS variant)
5 : Named Pipe Impersonation (PrintSpooler variant)
6 : Named Pipe Impersonation (EFSRPC variant - AKA EfsPotato)
Метод 1: Named Pipe Impersonation (In Memory/Admin) [Default]
Классический метод через именованные каналы - именно его мы только что разобрали
Не оставляет следов на диске (in-memory)
Метод 2: Named Pipe Impersonation (Dropper/Admin)
Вариация первого метода с записью временного исполняемого файла на диск
Создает небольшой DLL-файл, вызов функции которого происходит из службы
Затем использует тот же механизм с именованными каналами
Отличие будет в команде, переданной службе на исполнение:
rundll32.exe C:\Users\user\AppData\Local\Temp\pdxxuf.dll,a /p:pdxxuf
Будет фигурировать rundll32.exe, так как вся нагрузка будет находится в DLL-файле, где:
a
- это вызываемая функция/p
- именованный канал, к которому нужно подключиться
В Sysmon EID 18 именно rundll32.exe будет осуществлять подключение к именованному каналу, а не cmd.exe, в отличие от классического метода.
И обратите внимание на странное расположение DLL, что тоже можно использовать для ханта.
Метод 3: Token Duplication (In Memory/Admin)
Использует дублирование токена из системного процесса
На самом деле работает только в x86 операционных системах, поэтому позволю себе не разбирать тут.
Метод 4: Named Pipe Impersonation (RPCSS variant)
Единственный не создает службу, поэтому не регистрируются Event ID 7045 и 4697.
Так как использует RCP, то регистрируется Event ID 5145, где в
RelativeTargetName
- имя подконтрольного именованного канала. Обращение будет с localhost (::1
).В sysmon EID 18 в поле
Image
(имя образа, осуществляющего доступ) находится System (4) - ядро Windows.
Пример правил обнаружения
Некоторый произвольный процесс, запущенный НЕ от имени системы создает именованный канал (Sysmon EID 17). Имя канало обычно случайное, но можнт быть и "TestSVC".
Этот же процесс создает службу (Event ID 7045, 4697). В команде запуска будет перенаправление на созданные ранее именованный канал. Либо (если использкется
-t 4
) зарегистрируется Event ID 5145 c localhost, обращение будет к тому же файдуВ резлуьтате запуска службы или взаимодействия с RPCSS произойдет подключение к подконтрольном уменованному каналу - Sysmon EID 18. Image будет cmd.exe, rundll32.exe или system (4) - в зависимости и того, какой метод используется. Независимо от того, какой процесс, он должен уже находиться в системной сессии, так как именно этот токен воруется для повышения привилегий.
После получения токена дочерние процессы исходного атакующего процесса будут запускаться от имени system.
Last updated
Was this helpful?