이 도구를 사용하면 다음을 감지할 수 있습니다.
COM 개체에 대한 잘못된 액세스 제어(LaunchPermission, AccessPermission) - 남용 가능한 COM 메서드를 통한 LPE, DCOM 인증 릴레이. PermissionHunter
입니다.
COM 개체에 대한 잘못된 레지스트리 권한 - COM 하이재킹을 통한 LPE. ComDiver
입니다.
새로운 고도 이름 - UAC 우회를 찾으세요. 그것은 MonikerHound
입니다.
특정 CLSID에 대한 자세한 정보 얻기 - COM 개체를 검사하여 악용 가능한 COM 메서드를 찾습니다. ClsidExplorer
입니다.
권한이 낮은 사용자를 대신하여 교차 세션 활성화를 확인하십시오 - LPE에 대해 다른 사람의 세션에서 객체를 인스턴스화하려고 합니다. ComTraveller
입니다.
이 도구를 몇 달 전에 게시했다면(예: 2024년 봄) CVE-2024-38100(FakePotato) 및 CVE-2024-38061(SilverPotato)을 발견했을 것입니다.
이 도구를 사용하기 시작하면 Windows 시스템에서 권한을 높이는 더 많은 방법을 찾을 수 있습니다. 자동화된 OleViewDotnet과 같습니다 :)
PermissionHunter는 시스템의 모든 COM 개체에 대한 LaunchPermission 및 ActivatePermission을 검사할 수 있는 도구입니다.
PS A:mzhmo> .PermissionHunter.exe -h , `-. .-' ,-"`````""-__ | / '-.._ _.-'` '-o, _>--:{{< ) |) .-'' '-.__ .-o` '-._____..-/` | ,-' / `-. ` PermissionHunter - 잘못된 LaunchPermission 및 ActivatePermission 찾기 CICADA8 연구팀 제공: Michael Zhmaylo(MzHmO)PermissionHunter.exe 잘못된 LaunchPermission 및 ActivatePermission이 있는 취약한 COM 개체를 찾을 수 있는 작은 도구입니다.[OPTIONS]-outfile: 출력 파일 이름-outformat: 출력 형식. 허용되는 'csv' 및 'xlsx'-h/--help: 이 창을 표시합니다.
여기에는 두 가지 인수만 있습니다.
-outfile
- 권리 보고서가 포함된 파일의 이름입니다.
-outformat
- 보고서가 포함된 파일 형식으로, csv와 xlsx로 출력할 수 있습니다. Excel이 없으면 xlsx 형식으로 출력할 수 없기 때문에 csv로 출력하는 것이 좋습니다.
예:
PS A:mzhmo> .PermissionHunter -outfile 결과 -outformat xlsx , `-. .-' ,-"`````""-__ | / '-.._ _.-'` '-o, _>--:{{< ) |) .-'' '-.__ .-o` '-._____..-/` | ,-' / `-. ` PermissionHunter - 잘못된 LaunchPermission 및 ActivatePermission 찾기 CICADA8 연구팀 Michael Zhmaylo(MzHmO)[+] 결과는 xlsx[+] 형식의 결과가 됩니다. 성공
그런 다음 기존 COM 개체에 대한 모든 권한을 나열하는 파일 result.xlsx를 얻게 됩니다.
다음 열을 출력합니다.
ApplicationID
- 특정 COM 개체의 ApplicationID입니다. 예: {69AD4AEE-51BE-439b-A92C-86AE490E8B30}
;
ApplicationName
- 특정 COM 개체의 ApplicationName입니다. 예: Background Intelligent Transfer Service
;
RunAs
- COM 개체의 RunAs 레지스트리 키입니다. 예: Interactive User
;
LaunchAccess
, LaunchType
, LaunchPrincipal
, LaunchSid
- LaunchPermission 레지스트리 키. LaunchPrincipal은 COM 개체에 대한 LaunchAccess 권한이 있는 사용자를 지정합니다. LaunchType - ACE 유형: 활성화 또는 비활성화. LaunchSID - LaunchPrincipal의 SID입니다. 전:
로컬런치. 원격 실행. 로컬 활성화. 원격 활성화 액세스 허용 NT AUTHORITYSYSTEM S-1-5-18
이는 시스템에 이 COM 개체에 대한 LocalLaunch, RemoteLaunch, LocalActivation, RemoteActivation 권한이 있음을 의미합니다.
AccessAccess
, AccessType
, AccessPrincipal
, AccessSID
- 필드는 AccessPermission 컨텍스트에서만 LaunchPermissions와 동일한 의미를 갖습니다.
AuthLevel
, ImpLevel
- 인증 수준 및 가장 수준. 기본적으로 RPC_C_AUTHN_LEVEL_CONNECT
및 RPC_C_IMP_LEVEL_IDENTIFY
로 설정됩니다.
CLSIDs
- COM 개체 CLSID입니다.
예를 들어, 권한이 낮은 사용자를 대신하여 액세스할 수 있는 COM 개체를 찾은 경우 다음과 같이 이를 남용할 수 있습니다.
예를 들어, 시스템을 대신하여 임의의 파일을 작성하려면 인스턴스를 만들고 해당 COM 개체의 메서드를 호출하세요. 예를 들어, NT AUTHORITYSYSTEM
계정을 대신하여 실행되는 DeployCmdShell()
메서드가 있는 COM 개체를 찾았으며 LaunchPermissions
및 AccessPermissions
있습니다. 이 COM 개체를 시작하고, DeployCmdShell()
메서드를 호출하고, 시스템을 대신하여 코드를 실행할 수 있습니다. ClsidExplorer
사용하여 사용 가능한 방법을 볼 수 있습니다.
DCOM 인증을 남용합니다. 이에 대해서는 RemoteKrbRelay를 참조하세요.
COM 개체에 대한 모든 정보는 레지스트리에 있습니다. 하지만 등록이 잘못되었다면 어떻게 될까요? 이러한 경우 실행 파일을 하이재킹하는 등 COM 설정을 무시할 수 있습니다.
이 도구를 사용하면 이러한 취약점을 감지할 수 있으며 COM 개체를 검색할 때 표시되는 키의 우선 순위에 따라 레지스트리를 검사합니다. 이런 방식으로 Shadow COM 하이재킹도 찾을 수 있습니다. 우선순위는 다음과 같습니다.
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
에 있는 경우 실행 파일을 HKCU..TreatAs
에 작성하여 Shadow COM 하이재킹을 수행할 수 있습니다.
COM 개체가 HKCU..LocalServer32
에 있고 HKCU..LocalServer32
에 쓸 수 있는 경우 COM 하이재킹을 수행할 수 있습니다.
도구를 자세히 살펴보겠습니다.
PS A:ssdgitrepoCOMThanasiaComDiverx64Debug> .ComDiver.exe -h / o ^ o / ( ) / ____________(%%%%%%%)____________ ( / / )%%%%%%%( ) (___/___/__/ ________) ( / /(%%%%%%%) ) (__/___/ (%%%%%%%) _____) /( ) / (%%%%%) (%%%) !------------ COM 다이버 -------------- [?] com 개체에 대한 안전하지 않은 레지스트리 및 디스크 권한을 확인하는 작은 도구 [?] ARGS -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 하이재킹을 하게 됩니다.
도구 출력에 빨간색 줄이 표시되면 이는 COM 개체를 남용하는 잠재적인 방법입니다! COM 하이재킹(기존 실행 파일 스푸핑) 또는 섀도우 COM 하이재킹(누락된 실행 파일 스푸핑)을 수행할 수 있습니다. 여기에서 COM 하이재킹에 대해 자세히 알아보세요.
Windows 시스템에는 UAC를 우회하는 방법이 내장되어 있으며 이는 Elevation Moniker를 통해 수행됩니다. 여기에서 자세한 내용을 읽을 수 있습니다. 이러한 종류의 UAC 우회에는 COM 개체를 레지스트리에 등록하는 비표준 방법이 필요하며 이는 추적하기 매우 쉽습니다. 따라서 내 도구를 사용하여 UAC 우회의 새로운 방법을 찾을 수 있습니다.
예:
PS A:ssdgitrepoCOMThanasiaMonikerHoundx64Debug> .MonikerHound.exe ,_ _ _, 우/ ,(.-.), _/ |) (| _ /=-=/ ,| =/ |, _/ | / _ _!_/ MonikerHound - 나만의 UAC 우회를 찾아보세요! CICADA8 연구팀 마이클 즈마일로(MzHmO) [+] 고도 모니커에 대한 잠재적인 COM 서버가 발견되었습니다!이름: CEIPLuaElevationHelper CLSID: {01D0A625-782D-4777-8D4E-547E6457FAD5} 현지화된 문자열: @%systemroot%system32werconcpl.dll,-351 활성화됨: 1 아이콘 참조: @%systemroot%system32werconcpl.dll,-6 활성화: 성공 PID: 15800 DllHost.exe [+]...........................[+] [+] 고도 모니커에 대한 잠재적인 COM 서버가 발견되었습니다!이름: CTapiLuaLib 클래스 CLSID: {03e15b2e-cca6-451c-8fb0-1e2ee37a27dd} 현지화된 문자열: @%systemroot%system32tapiui.dll,-1 활성화됨: 1 아이콘 참조: @%systemroot%system32tapiui.dll,-201 활성화: 성공 PID: 440 DllHost.exe [+]...........................[+]
UAC Bypass의 잠재적인 후보를 발견한 후에는 이를 확인하기 시작할 수 있습니다. Elevation Moniker를 실행하기 위한 훌륭한 템플릿으로 이 기능이나 이 프로그램을 사용할 수 있습니다.
ClsidExplorer를 사용하면 특정 CLSID에 대한 정보를 검색할 수 있습니다. 프로그램은 다음 데이터를 출력합니다.
AppID
- 특정 COM 개체의 ApplicationID입니다.
ProgID
- 특정 COM 개체의 ProgID입니다.
PID
- 이 COM 개체가 실행 중인 PID입니다.
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}] 앱ID: 알 수 없음 ProgID: 알 수 없음 PID: 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 무효 이름(IN BSTR) [9] __stdcall RightsEnum GetPermissions(IN VARIANT, IN ObjectTypeEnum, IN VARIANT) [10] __stdcall void SetPermissions(IN VARIANT, IN ObjectTypeEnum, IN ActionEnum, IN RightsEnum, IN InheritTypeEnum, IN VARIANT) [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*) [끝]
이 프로그램은 ComTraveller
, PermissionHunter
또는 MonikerHound
로 발견된 COM 클래스에서 남용될 수 있는 흥미로운 방법을 확인하는 데 유용합니다.
ComTraveller - 이 도구를 사용하면 사용 가능한 모든 COM 개체를 탐색할 수 있습니다. 첫째, 흥미로운 값(RunAs 대화형 사용자), TypeLib의 가용성 및 세션 간 활성화 기능을 통해 COM 개체를 빠르게 식별할 수 있습니다. 따라서 다른 사용자 세션에서 인스턴스화되어 권한 상승으로 이어질 수 있는 개체를 신속하게 감지할 수 있습니다.
PS A:SSDgitrepoCOMThanasiaComTravellerx64Debug> .ComTraveller.exe -h ,,_ zd$$??= z$$P? 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? 나?e?JC,-,"=? """=='?"ComTraveller - 시스템에 등록된 모든 CLSID에 대한 정보를 구문 분석하고 추출하는 작은 도구Usage:--file
--file
- COM 개체에 대한 정보가 출력될 파일의 이름입니다.
--from
- Windows 시스템에는 많은 CLSID가 있습니다. 도구가 처음부터 모든 CLSID를 확인하지 않도록 하려면 시작할 CLSID를 지정할 수 있습니다(예: --from {50FDBB99-5C92-495E-9E81-E2C2F48CDDA}
--session
- 다른 사람의 세션에서 객체를 인스턴스화하려고 합니다.
--target
- 하나의 대상 clsid만 분석합니다.
예:
.ComTraveller.exe --file rep.csv --session 1
그런 다음 COM 개체에 대한 정보가 포함된 rep.csv 파일을 찾을 수 있습니다. 여기에는 여러 열이 있습니다.
CLSID
- COM 개체의 CLSID입니다.
AppId
- COM 개체의 APPID입니다.
ProgId
- COM 개체의 APPID입니다.
RunAs
- RunAs 레지스트리의 값입니다. 값이 The Interactive User
또는 NT AUTHORITYSYSTEM
이면 LPE를 만들 수 있습니다.
Username
- COM 개체가 대신 실행되는 사용자의 이름입니다.
PID
- COM 개체가 실행 중인 PID입니다.
ProcessName
- COM 개체가 실행 중인 프로세스의 이름입니다.
HasTypeLib
- COM 개체에 TypeLib이 있는지 여부입니다. 그렇다면 이 개체를 ClsidExplorer
에 제공하여 사용 가능한 메서드를 확인할 수 있습니다.
canCrossSessionActivate
- 다른 사람의 세션에서 활성화를 통해 LPE에 대해 이 COM 클래스를 남용할 수 있는지 여부입니다. 값이 +
이거나 오류가 ACCESS DENIED
인 경우 이는 LPE의 잠재적인 후보일 수 있습니다.
예를 들어, 필터를 적용하면 흥미로운 COM 클래스를 즉시 찾을 수 있습니다 :) 와, 이게 세션 간에 활성화될 수 있고 시스템을 대신하여 작동할 수 있는 COM 클래스인가요?
COM 개체가 많기 때문에 프로그램이 충돌할 수 있다는 점에 유의해야 합니다. 이 경우 다음과 같이 다시 시작할 수 있습니다.
.ComTraveller.exe --file rep.csv --session 1 --from "{0006F071-0000-0000-C000-000000000046}"