С помощью этого инструмента вы сможете обнаружить:
Неправильный контроль доступа к COM-объекту (LaunchPermission, AccessPermission) — LPE через неправомерные методы COM, ретрансляция аутентификации DCOM. Это PermissionHunter
.
Неверные права реестра на COM-объект — LPE через COM Hijacking. Это ComDiver
.
Найдите новое прозвище повышения — обход UAC. Это MonikerHound
.
Получите подробную информацию о конкретном CLSID — проверьте COM-объект, чтобы найти неправомерные методы COM. Это ClsidExplorer
.
Проверьте межсеансовую активацию от имени пользователя с низким уровнем привилегий — попытка создать экземпляр объекта в чужом сеансе для LPE. Это ComTraveller
.
Если бы мы опубликовали этот инструмент пару месяцев назад (например, весной 2024 г.), вы бы обнаружили CVE-2024-38100 (FakePotato) и CVE-2024-38061 (SilverPotato).
Начните использовать этот инструмент, и вы сможете найти больше способов повысить привилегии в системах Windows. Это что-то вроде автоматизированного OleViewDotnet :)
PermissionHunter — это инструмент, который позволяет вам проверять LaunchPermission и ActivatePermission на всех COM-объектах в системе.
PS А: мжмо>.PermissionHunter.exe -h , `-. .-' ,-"`````""-__ | / '-.._ _.-'` '-o, _>--:{{< ) |) .-'' '-.__ .-o` '-._____..-/` | ,-' / `-. `PermissionHunter — поиск неправильных LaunchPermission и ActivatePermission Исследовательская группа CICADA8 От Михаила Жмайло (MzHmO)PermissionHunter.exeНебольшой инструмент, который позволяет находить уязвимые COM-объекты с неправильными LaunchPermission и ActivatePermission[ОПЦИИ]-outfile: имя выходного файла-outformat: выходной формат. Принято «csv» и «xlsx»-h/--help: показывает эти окна
Здесь всего два аргумента:
-outfile
- имя файла с отчетом о правах;
-outformat
— формат файла с отчетом, выводить можно как в csv, так и в xlsx. Лучше выводить в csv, потому что если у вас нет Excel, вы не сможете выводить в формате xlsx.
Пример:
PS А: мжмо>.PermissionHunter -outfile result -outformat xlsx , `-. .-' ,-"`````""-__ | / '-.._ _.-'` '-o, _>--:{{< ) |) .-'' '-.__ .-o` '-._____..-/` | ,-' / `-. `PermissionHunter - поиск неправильных LaunchPermission и ActivatePermission Исследовательская группа CICADA8 От Михаила Жмайло (MzHmO)[+] Результат будет в формате xlsx[+] Успех
После этого вы получите файл result.xlsx, в котором будут перечислены все права на существующие COM-объекты.
Я вывожу следующие столбцы:
ApplicationID
— ApplicationID конкретного COM-объекта. Пример: {69AD4AEE-51BE-439b-A92C-86AE490E8B30}
;
ApplicationName
— ИмяПриложения определенного COM-объекта. Пример: Background Intelligent Transfer Service
;
RunAs
— ключ реестра RunAs COM-объекта. Пример: Interactive User
;
LaunchAccess
, LaunchType
, LaunchPrincipal
, LaunchSid
— ключ реестра LaunchPermission. LaunchPrincipal указывает пользователя, имеющего права LaunchAccess на COM-объект. LaunchType — тип ACE: включение или отключение. LaunchSID — SID LaunchPrincipal. Бывший:
ЛокальныйЛаунч. Удаленный запуск. Локальная активация. Доступ к удаленной активации разрешен NT AUTHORITYSYSTEM S-1-5-18
Это означает, что система имеет разрешения LocalLaunch, RemoteLaunch, LocalActivation, RemoteActivation для этого COM-объекта;
AccessAccess
, AccessType
, AccessPrincipal
, AccessSID
— поля имеют то же значение, что и LaunchPermissions, только в контексте AccessPermission;
AuthLevel
, ImpLevel
— уровень аутентификации и уровень олицетворения. По умолчанию для них установлены значения RPC_C_AUTHN_LEVEL_CONNECT
и RPC_C_IMP_LEVEL_IDENTIFY
;
CLSIDs
— CLSID COM-объекта.
Если вы найдете COM-объект, к которому вы можете получить доступ, например, от имени пользователя с низким уровнем привилегий, вы можете злоупотребить им следующим образом:
Создайте экземпляр и вызовите методы этого COM-объекта, например, чтобы записать произвольный файл от имени системы. Например, вы нашли COM-объект с методом DeployCmdShell()
, который выполняется от имени учетной записи NT AUTHORITYSYSTEM
, и у вас есть LaunchPermissions
и AccessPermissions
. Вы можете запустить этот COM-объект, вызвать метод DeployCmdShell()
и получить выполнение кода от имени системы. Посмотреть доступные методы можно с помощью ClsidExplorer
.
Злоупотреблять аутентификацией DCOM. Для этого см. RemoteKrbRelay.
Вся информация о COM-объектах находится в реестре. А что, если регистрация была неверной? В таком случае у нас есть возможность переопределить настройки COM, например, перехватить исполняемый файл.
Этот инструмент позволяет обнаружить подобные уязвимости и сканирует реестр по приоритету ключей, которые просматриваются при поиске COM-объектов. Таким образом, вы даже можете обнаружить Shadow COM Hijacking. Приоритет следующий:
1. HKCUSoftwareClasses(GUID)TreatAs 2. HKLMSoftwareClasses(GUID)TreatAs 3. HKCUSoftwareClasses(GUID)InprocServer32 4. HKLMSoftwareClasses(GUID)InprocServer32 5. HKCUSoftwareClasses(GUID)LocalServer32 6. HKLMSoftwareClasses(GUID)LocalServer32
Таким образом, возникают как минимум два вектора повышения привилегий:
Если у нас есть права на запись в HKCU...TreatAs
, а исходный исполняемый файл COM находится в HKCU...LocalServer32
, то мы можем выполнить теневой перехват COM, записав наш исполняемый файл в HKCU..TreatAs
.
Если COM-объект находится в HKCU..LocalServer32
и мы можем писать в HKCU..LocalServer32
, то мы можем выполнить перехват COM.
Рассмотрим инструмент поближе:
PS A:ssdgitrepoCOMThanasiaComDiverx64Debug> .ComDiver.exe -h/o ^ o/( )/ ____________(%%%%%%%)____________ ( / / )%%%%%%%( ) (___/___/__/ ________) ( / /(%%%%%%%) ) (__/___/ (%%%%%%%) _____) /( ) / (%%%%%) (%%%) !----------- COM DIVER -------------- [?] Небольшой инструмент для проверки незащищенных прав реестра и диска на com-объектах. [?] АРГС -h/--help <- показать это сообщение --from<- проанализировать CLSID из этого clsid --target <- проанализировать один целевой clsid --no-context <- не проверять контекст другого COM-сервера. Только анализ реестра. --no-create <- не создавать целевой COM-объект. Это самый быстрый режим
Он принимает следующие аргументы:
--from
— в системе Windows много CLSID. Если вы не хотите, чтобы инструмент просматривал все CLSID, начиная с первого, вы можете указать CLSID, который должен начинаться с, например, --from {50FDBB99-5C92-495E-9E81-E2C2F48CDDA}
--target
— проанализировать конкретный clsid;
--no-context
— не проверять имя пользователя, от имени которого запускается COM-объект;
--no-create
— не создавать обнаруженный COM-объект. Это ограничивает информацию, которую вы можете получить об этом. Однако это самый быстрый способ проверить только права реестра.
Пример:
.ComDiver.exe --no-create
В этом случае мы видим, что внутри HKCU нет ключей, и у нас есть права на запись для этих ключей. Соответственно, если мы пропишем в этот путь собственное значение, мы осуществим COM Hijacking.
Если вы видите красные строки в выводе инструмента, это потенциальный способ злоупотребления COM-объектом! Вы можете выполнить перехват COM (подмена существующего исполняемого файла) или теневой перехват COM (подмена отсутствующего исполняемого файла). Подробнее о взломе COM можно прочитать здесь.
Существует встроенный способ обойти UAC в системе Windows, это делается через Elevation Moniker. Подробнее об этом можно прочитать здесь. Этот вид обхода UAC требует нестандартного способа регистрации COM-объекта в реестре, который довольно легко отследить. Так что вы можете использовать мой инструмент, чтобы найти новые способы обхода UAC.
Пример:
PS A: ssdgitrepoCOMThanasiaMonikerHoundx64Debug>.MonikerHound.exe ,_ _ _, оо/ ,(.-.), _/ |) (| _ /=-=/ ,| =/ |, _/ | / _ _!_/ MonikerHound — найдите свой собственный обход UAC! Исследовательская группа CICADA8 От Михаила Жмайло (МзХмО) [+] Обнаружен потенциальный COM-сервер для повышения прав! Имя: CEIPLuaElevationHelper CLSID: {01D0A625-782D-4777-8D4E-547E6457FAD5} Локализованная строка: @%systemroot%system32werconcpl.dll,-351 Включено: 1 IconReference: @%systemroot%system32werconcpl.dll,-6 Активировать: Успех ПИД: 15800 DllHost.exe [+]........................[+] [+] Обнаружен потенциальный COM-сервер для повышения прав! Имя: CTapiLuaLib Class CLSID: {03e15b2e-cca6-451c-8fb0-1e2ee37a27dd} Локализованная строка: @%systemroot%system32tapiui.dll,-1 Включено: 1 IconReference: @%systemroot%system32tapiui.dll,-201 Активировать: Успех ПИД: 440 DllHost.exe [+]........................[+]
Как только вы обнаружите потенциальных кандидатов на обход UAC, вы можете начать их проверять. В качестве отличного шаблона для запуска Elevation Moniker можно взять вот эту функцию или вот эту программу.
ClsidExplorer позволяет получить информацию о конкретном CLSID. Программа выводит следующие данные:
AppID
— ApplicationID конкретного COM-объекта;
ProgID
— ProgID конкретного COM-объекта;
PID
— PID, в котором работает этот COM-объект;
Process Name
– имя PID процесса;
Username
— имя пользователя, от имени которого запускается процесс;
Methods
— доступные методы COM-объекта. Сделано путем разбора TypeLib.
PS A: ssdgitrepoCOMThanasiaClsidExplorerx64Debug> .CLSIDExplorer.exe -h CLSIDExplorer.exe — идентифицировать всю информацию по clsid Использование: .CLSIDExplorer.exe --clsid "{00000618-0000-0010-8000-00aa006d2ea4}"
Программа принимает только один аргумент:
--clsid
— целевой CLSID для анализа
PS A:ssdgitrepoCOMThanasiaClsidExplorerx64Debug> .CLSIDExplorer.exe --clsid "{00000618-0000-0010-8000-00aa006d2ea4}"[{00000618-0000-0010-8000-00aa006d2ea4}] Идентификатор приложения: Неизвестно ПрогИД: Неизвестно ПИД: 1572 Имя процесса: CLSIDExplorer.exe Имя пользователя: WINPCMichael Методы: [0] __stdcall void QueryInterface(IN GUID*, OUT void**) [1] __stdcall unsigned long AddRef() [2] __stdcall unsigned long Release() [3] __stdcall void GetTypeInfoCount(OUT unsigned int*) [4] __stdcall void GetTypeInfo(IN unsigned int, IN unsigned long, OUT void**) [5] __stdcall void GetIDsOfNames(IN GUID*, IN char**, IN unsigned int, IN unsigned long, OUT long*) [6] __stdcall void Invoke(IN long, IN GUID*, IN unsigned long, IN unsigned short, IN DISPPARAMS*, OUT VARIANT*, OUT EXCEPINFO*, OUT unsigned int*) [7] __stdcall Имя BSTR() [8] __stdcall void Имя (В BSTR) [9] __stdcall RightsEnum GetPermissions (В ВАРИАНТЕ, В ObjectTypeEnum, В ВАРИАНТЕ) [10] __stdcall void SetPermissions(В ВАРИАНТЕ, В ObjectTypeEnum, В ActionEnum, В RightsEnum, В InheritTypeEnum, В ВАРИАНТЕ) [11] __stdcall void ChangePassword(IN BSTR, IN BSTR) [12] __stdcall Группы* Группы() [13] Свойства __stdcall* Свойства() [14] __stdcall _Catalog* ParentCatalog() [15] __stdcall void ParentCatalog(IN _Catalog*) [16] __stdcall void ParentCatalog(IN _Catalog*) [КОНЕЦ]
Эта программа отлично подходит для проверки COM-класса, обнаруженного с помощью ComTraveller
, PermissionHunter
или MonikerHound
на наличие интересных методов, которыми можно злоупотреблять.
ComTraveller — этот инструмент позволяет исследовать все доступные COM-объекты. Во-первых, он позволяет быстро идентифицировать COM-объекты с интересными значениями (интерактивный пользователь RunAs), доступность TypeLib и возможности межсессионной активации. Таким образом, вы можете быстро обнаружить объекты, экземпляры которых могут быть созданы в другом сеансе пользователя, что приведет к повышению привилегий.
PS A: SSDgitrepoCOMThanasiaComTravellerx64Debug> .ComTraveller.exe -h ,,_ зд$$??= з$$П? F:`c, _ d$$, `c'cc$$i ,cd$?R $$$$ cud$,?$$$i ,=P"2?z " $" " ?$$$, ?$$$. ,-''`>, bzP 'cLdb,?$$,?$$$ ,h' "I$'J$P ... `?$$$,"$$,`$$h $$PxrF'd$"d$PP""?-,"?$$,?$h`$$,,$$'$F44 "?,,_`=4c,?=,"?hu?$`?L4$' ' `""?==""=-"" `""-`'_,,,, .ccu?m?e?JC,-,"=? """=='?"ComTraveller - небольшой инструмент для анализа и извлечения информации обо всех зарегистрированных CLSID в системе. Использование: --file
--file
— имя файла, в который будет выводиться информация о COM-объектах;
--from
— в системе Windows много CLSID. Если вы не хотите, чтобы инструмент просматривал все CLSID, начиная с первого, вы можете указать CLSID, который должен начинаться с, например, --from {50FDBB99-5C92-495E-9E81-E2C2F48CDDA}
--session
— попытаться создать экземпляр объекта в чужом сеансе
--target
— анализировать только один целевой clsid
Пример:
.ComTraveller.exe --файл Rep.csv --сессия 1
После этого вы найдете файл Rep.csv с информацией о COM-объектах. Здесь есть несколько столбцов:
CLSID
— CLSID COM-объекта;
AppId
— APPID COM-объекта;
ProgId
— APPID COM-объекта;
RunAs
— значение в реестре RunAs. Если значение равно The Interactive User
или NT AUTHORITYSYSTEM
, вы можете попробовать создать LPE;
Username
— имя пользователя, от имени которого запускается COM-объект;
PID
— PID, в котором запущен COM-объект;
ProcessName
— имя процесса, в котором запущен COM-объект;
HasTypeLib
— имеет ли COM-объект TypeLib. Если да, вы можете передать этот объект ClsidExplorer
чтобы просмотреть доступные методы;
canCrossSessionActivate
— можно ли злоупотреблять этим COM-классом для LPE через активацию в чужой сессии. Если значение +
или ошибка ACCESS DENIED
, это может быть потенциальным кандидатом на LPE.
Например, если вы примените фильтры, вы сразу найдете интересные COM-классы :) Ого, это COM-класс, который можно активировать межсессионно и он работает от имени системы?
Следует отметить, что программа может аварийно завершить работу из-за обилия COM-объектов. В этом случае вы можете перезапустить его следующим образом:
.ComTraveller.exe --file Rep.csv --session 1 --from "{0006F071-0000-0000-C000-000000000046}"