DCShadow 는 침해된 권한 있는 자격 증명을 가진 공격자가 악성 변경을 등록하고 복제할 수 있게 해 주는 후기 단계 킬 체인 공격입니다. 이러한 변경에는 공격자가 지속성을 구축하는 데 도움이 되는 수정 사항이 포함될 수 있습니다. Active Directory 도메인 컨트롤러(DC)를 등록하고 악성 변경을 복제합니다. 보다 구체적으로, DCShadow는 오픈 소스 해킹 도구 Mimikatz의 lsadump 모듈에 포함된 명령입니다. 2018년 초에 소개되었으며, Microsoft Directory Replication Service Remote(MS-DRSR) 프로토콜의 특정 지침을 활용합니다.
DCShadow 공격은 예방하기 어렵습니다. DCSync와 마찬가지로, 패치로 보완할 수 있는 취약점을 악용하지 않습니다. 대신 복제(Replication) 프로세스의 유효하고 필수적인 기능을 활용하며, 이는 끌 수 없고 비활성화할 수도 없습니다. 또한 공격자가 요청하는 변경 사항이 합법적인 도메인 복제로 등록·처리·커밋되기 때문에 DCShadow 공격은 탐지하기도 어렵습니다.
DCShadow 공격 개요
다음은 DCShadow 공격의 단계에 대한 개요입니다:
- 예를 들어 공격자는 보안이 취약한 그룹 관리 서비스 계정(group-managed service account)을 침해함으로써 Domain Admin 또는 Enterprise Admin 권한을 획득합니다.
- 공격자는 DCShadow를 사용해 AD 설정 스키마와 워크스테이션의 SPN을 변경하여, 컴퓨터 개체(예: 워크스테이션)를 도메인 컨트롤러로 등록합니다. 이제 AD는 해당 워크스테이션이 DC라고 판단하므로, 변경 사항을 복제(replicate)하도록 신뢰합니다.
- 공격자는 비밀번호 데이터, 계정 정보 또는 보안 그룹 멤버십에 대한 변경 사항과 같이 복제를 위한 변경 사항을 제출합니다. 복제가 트리거되면 다른 DC가 변경 사항을 게시하고 커밋합니다.
- 공격자는 DCShadow를 사용해 AD database에서 악성(rogue) 도메인 컨트롤러를 제거하여 자신의 활동을 숨깁니다.
간단한 예시: DCShadow를 사용해 사소한 변경 사항 복제하기
여기서는 DCShadow를 사용해 악성(rogue) DC를 등록한 공격자라고 가정해 보겠습니다. 다음은 도메인 내 모든 DC에 걸쳐 간단한 변경 사항을 복제하기 위해 수행할 수 있는 단계입니다.
1단계. SYSTEM 계정을 사용하도록 전환합니다.
복제(replicated)될 변경 사항을 생성하는 프로세스는 도메인 사용자 계정이 아니라 SYSTEM 계정으로 실행해야 합니다. 등록된 DC에서 발생한 변경 사항만 복제되기 때문입니다. 이를 수행하지 못하면 다음 오류 코드가 표시될 수 있습니다:
ERROR kuhl_m_lsadump_dcshadow_force_sync_partition ; IDL_DRSReplicaAdd DC=JEFFLAB,DC=local 0x80090322 (2148074274)
Mimikatz에서 SYSTEM으로 프로세스를 실행하는 한 가지 방법은 Mimikatz 를 사용하는 것입니다. PSExec:
PsExec.exe –i –s cmd.exe
현재 SYSTEM으로 실행 중인지 확인하려면 whoami 명령을 사용하십시오.
그런 다음 token::elevate 를 사용하여 모든 스레드가 SYSTEM으로 실행되도록 합니다.
2단계. 원하는 변경 사항을 푸시합니다.
이제 변경 사항을 적용할 수 있습니다. 이 간단한 예에서는 Administrator 계정의 설명을 변경해 보겠습니다:
lsadump::dcshadow /object:CN=Administrator,CN=Users,DC=JEFFLAB,DC=local /attribute:description /value:”DCShadow was here!”
3단계. 복제를 트리거합니다.
복제를 트리거하려면 다른 창을 열고 손상된 Domain Admin 계정으로( SYSTEM이 아니라) 다음 명령을 실행합니다:
lsadump::dcshadow /push
원래 창에는 다음 결과 이벤트가 표시됩니다:
4단계. 변경 사항을 확인합니다.
도메인 컨트롤러로 이동하여 description(설명) 필드를 확인하세요:
실제 사례 기반 공격: DCShadow를 사용해 지속성(persistence)을 확보하기
이제 실제 공격에서 공격자가 DCShadow를 어떻게 수행하는지 살펴봅시다. DCShadow를 실행하려면 이미 Domain Admin 또는 Enterprise Admin 권한이 있어야 하므로, 왜 굳이 DCShadow를 사용하려 할까요?
그 이유 중 하나는 데이터 유출(data exfiltration)에 Domain Admin 계정을 사용하고 싶지 않을 수 있기 때문입니다. 이러한 계정은 종종 면밀하게 모니터링되며 알람이 더 쉽게 발생하기 때문입니다. 또 다른 이유는 다른 포리스트에서 관리자 권한을 획득하기 위해서입니다.
하지만 가장 흔한 이유 중 하나는 지속성(persistence)을 만들기 위해서입니다. 즉, 자신이 손상시킨(admin) 계정에 대한 접근 권한을 잃더라도, 해당 도메인 내에서 발판을 계속 유지할 수 있기 때문입니다. 이제 DCShadow를 사용해 지속성을 확보하는 방법 한 가지를 단계별로 살펴봅시다.
기본 워크플로는 다음과 같습니다:
- 도메인에서 보호되는 계정과 그룹에 대한 템플릿 권한을 제공하는 AdminSDHolder 개체를 검토합니다.
- AdminSDHolder에 전체 제어(Full Control) 권한이 있는 새 계정을 추가합니다.
- DCShadow를 사용하여 변경 사항을 복제합니다.
1단계. AdminSDHolder 개체를 검토합니다.
AdminSDHolder 개체를 검토하기 위해 몇 가지 기본 PowerShell을 사용하겠습니다:
$AdminSDHolder = [adsi]'LDAP://CN=AdminSDHolder,CN=System,DC=JEFFLAB,DC=local'
$SDDL = $AdminSDHolder.ObjectSecurity.Sddl
결과를 더 읽기 쉬운 형식으로 변환하려면 ConvertFrom-SDDLString 명령을 사용할 수 있습니다:
2단계. AdminSDHolder 컨테이너에 계정을 추가합니다.
지속성을 만들기 위해서는 해당 SID를 사용해 AdminSDHolder에 계정을 추가해야 합니다. 필요한 것은 개체의 고유 이름(distinguished name)뿐이며, 아래 명령은 해당 SID를 변수 $UserSid에 저장합니다:
$UserToAdd = [adsi]'LDAP://CN=Bob Loblaw,OU=Business,OU=Users,OU=JEFFLAB,DC=JEFFLAB,DC=local'
$UserSid = New-Object System.Security.Principal.SecurityIdentifier($UserToAdd.objectSid[0], 0)
이제 해당 변수를 사용해 AdminSDHolder에 계정을 추가하고, Full Control 권한을 부여할 수 있습니다. 다음 PowerShell 명령을 사용합니다:
$NewSDDL = $SDDL + "(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;" + $UserSid.Value + ")"
AdminSDHolder를 다시 확인해 보면, 이제 사용자가 마지막 항목으로 표시되는 것을 볼 수 있습니다:
3단계. DCShadow를 사용해 변경 사항을 복제합니다.
이제 속성 값 형태로 새 권한이 준비되었으므로, DCShadow로 쉽게 적용할 수 있습니다. SYSTEM으로 실행하면 다음 명령을 사용해 원하는 변경을 수행할 수 있습니다:
mimikatz.exe "lsadump::dcshadow /object:CN=AdminSDHolder,CN=System,DC=JEFFLAB,DC=local /attribute:ntsecuritydescriptor /value:[output from the previous command]”
여기에서 변경 사항이 복제될 준비가 되었음을 확인할 수 있습니다:
그런 다음 lsadump::dcshadow/push 명령을 사용하여 복제를 트리거합니다. 여기서는 사용자(우리 사용자)가 추가된 업데이트된 AdminSDHolder 객체를 확인할 수 있습니다. 곧 이 변경이 도메인의 모든 보호 그룹에 적용될 것입니다.
DCShadow 공격 방지
DCShadow가 지속성을 확립하거나 그 밖의 방식으로 Active Directory 보안을 약화시키는 데 사용될 수 있는 방법 중 하나일 뿐입니다. 이러한 공격을 차단하기가 어려운 이유는, 패치로 수정할 수 있는 결함이 아니라 Active Directory의 기본 기능을 활용하기 때문입니다.
방어의 핵심은 공격자가 DCShadow 공격을 수행하려면 Domain Admin 또는 Enterprise Admin 권한을 반드시 보유해야 한다는 점에 있습니다. 따라서 이 공격을 차단하는 데 가장 효과적인 전략은 이러한 강력한 보안 그룹에 누구도 무단으로 가입하지 못하게 하는 것입니다.
DCShadow 공격 탐지
DCShadow를 사용하는 주요 이점은 공격자가 이벤트 로그에 기록되지 않는 변경을 수행할 수 있다는 점입니다. 변경이 복제를 통해 이루어지기 때문에 합법적인 것으로 간주됩니다. 그럼에도 불구하고 이벤트 로그를 사용하면 공격이 발생하고 있다는 징후를 확인할 수 있습니다. 다음은 확인해야 할 핵심 이벤트입니다.
컴퓨터 SPN 변경 사항
DCShadow가 작동하려면, 도메인 컨트롤러를 사칭(공격자가 DCShadow를 실행하는 컴퓨터)할 컴퓨터에 두 가지 특정 서비스 프린서플 이름(service principal name, SPN) 값을 추가해야 합니다. 이는 도메인에 조인된 어떤 컴퓨터든 될 수 있습니다.
이 두 가지 SPN은 다음과 같습니다:
- 글로벌 카탈로그 서버 SPN — 이 값의 형식은 GC/<DNS 호스트 이름>/<DNS 포리스트 이름>.
- 디렉터리 복제 서비스(Directory Replication Service, DRS) SPN — 이 값의 형식은 <DRS 인터페이스 GUID>/<DSA GUID>/<DNS 도메인 이름>이며 <DRS 인터페이스 GUID>는 항상 E3514235–4B06–11D1-AB04–00C04FC2DCD2입니다.
DCShadow 공격의 징후는 도메인 컨트롤러가 아닌 컴퓨터에 이러한 SPN이 추가된 뒤, 해당 SPN이 제거되는 것을 확인하면 포착할 수 있습니다. (참고로 실험실에서는 DCShadow가 Global Catalog 서버 SPN만 제거하며, DRS SPN은 그대로 둡니다.)
이러한 변경 사항을 모니터링하려면 이벤트 ID 4742를 사용할 수 있습니다. 이 이벤트는 변경을 시작한 사용자가 누구인지 보여주므로, 공격을 수행하는 데 사용되는 도메인 관리자(Domain Admin) 계정이 무엇인지 알 수 있습니다.
DC의 생성 및 삭제
DCShadow 공격의 또 다른 단계는 Configuration Namespace의 Sites 컨테이너에 DC를 생성하는 것입니다. 이는 해당 서버를 위한 서버 및 NTDS 설정을 생성하여 수행합니다. 아래에서 합법적인 도메인 컨트롤러에 해당하는 이러한 개체를 확인할 수 있습니다:
DCShadow는 DC와 해당 설정을 생성한 다음, 변경 내용이 복제되면 흔적을 지우기 위해 즉시 해당 항목을 삭제합니다. 그 결과, 새 DC가 추가되었다가 제거되는 다소 이상한 이벤트 시퀀스가 남게 됩니다.
추가는 이벤트 ID 5137로 추적할 수 있습니다. 이벤트 ID 5137에는 악성 DC(rogue DC)의 이름, 해당 GUID 및 개체 클래스, 그리고 이를 생성한 책임 계정이 포함되어 있습니다:
이벤트 ID 5141은 DC 삭제에 대해서도 동일한 정보를 표시합니다:
이상한 복제 이벤트
복제를 모니터링하여 DCShadow 공격을 탐지하는 것도 가능합니다. 그러나 트리거되는 복제 이벤트는 정상(진짜) 복제 이벤트와 구분하기 어려울 수 있습니다.
그럼에도 불구하고 이벤트 ID 4929는 유용한 단서가 될 수 있습니다. 이는 소스 네이밍 컨텍스트가 제거되었고, 해당 소스로 악성 DC(rogue DC)를 가리키게 됨을 의미하기 때문입니다. 인식된 도메인 컨트롤러가 아닌 컴퓨터에서 이 이벤트가 표시된다면 경고 신호로 받아들여야 합니다.
복제 실패
또한 이벤트 4935와 4936의 조합은 종종 DCShadow와 연관될 수 있는 복제 실패를 나타냅니다.
Netwrix가 도울 수 있는 방법
Netwrix StealthDEFEND는 DCShadow 공격을 탐지하고 대응하기 위한 업계 최고의 솔루션입니다:
탐지
Netwrix StealthDEFEND 기본 제공 DCShadow 위협 탐지를 제공합니다. 이 기능은 DCShadow 공격을 시사하는 행위를 실시간으로 파악하기 위해 모든 도메인 복제 및 변경 이벤트를 모니터링합니다. 특히 DC의 추가 및 삭제를 감시하고, 복제 트래픽을 모니터링합니다.
다음은 Netwrix StealthDEFEND가 새 도메인 컨트롤러의 추가를 감지한 예시입니다:
DC의 추가 자체만으로도 충분히 의심스럽지만, 보고서에서는 해당 장치가 도메인 컨트롤러 역할을 지원하지 않는 Windows 10을 실행 중이라는 점도 함께 강조합니다. 이벤트 세부 정보를 확장해 보면 DCShadow 공격의 일부로 수행된 구체적인 변경 사항을 확인할 수 있습니다:
대응
DCShadow 공격을 신속하게 탐지하는 것은 매우 중요하지만, 그것만으로는 충분하지 않습니다. 특히 공격자가 고도로 권한이 높은 계정을 이미 손상시켰음을 의미하기 때문입니다. 하지만 해당 계정을 단순히 비활성화하는 것만으로는 부족할 수 있습니다. DCShadow 공격을 발견할 때쯤이면, 공격자는 이미 사용 가능한 상태의 다른 네트워크 리소스와 옵션을 다수 확보해 실제로 활용하고 있을 가능성이 높기 때문입니다.
Netwrix StealthDEFEND는 다양한 자동 대응 옵션을 제공하여, 예상되는 각 위협 또는 취약성에 대해 손쉽게 효과적인 플레이북을 구축할 수 있도록 도와줍니다. DCShadow 공격의 경우 플레이북에는 다음 단계가 포함되어야 합니다:
- 조직 내에서 공격이 발생했음을 적절한 담당자에게 알리고, 효과적으로 대응하는 데 필요한 정보를 제공하십시오. Netwrix StealthDEFEND는 공격 주체(가해자), 출처, 대상 등 공격에 관한 모든 핵심 세부 정보를 제공합니다. 또한 PowerShell 또는 webhook 기능을 사용하여 Slack, Microsoft Teams, ServiceNow 및 기타 시스템과 쉽게 통합할 수 있어 신속한 커뮤니케이션을 지원합니다.
- 가해 계정 또는 워크스테이션이 추가 복제, 인증 또는 기타 작업을 수행하지 못하도록 차단합니다:
자주 묻는 질문(FAQs)
DCShadow란 무엇인가요?
DCShadow는 Mimikatz 도구의 명령으로, 공격자가 악의적인 변경 사항을 도메인 전반에 복제할 수 있도록 가짜(rogue) 도메인 컨트롤러를 등록하게 해줍니다.
DCShadow 공격은 어떻게 작동하나요?
공격자는 AD 구성 스키마와 워크스테이션의 SPN 값에 변경을 가해 자신의 컴퓨터를 도메인 컨트롤러로 등록합니다. 그런 다음 도메인에서 지속성을 확보하기 위한 변경을 포함해 변경 사항을 복제할 수 있습니다.
DCShadow 공격은 어떻게 탐지할 수 있나요?
DCShadow 공격을 탐지하는 가장 좋은 방법은 의심스러운 도메인 컨트롤러 추가를 지속적으로 감시하고 복제 트래픽에서 비정상 활동이 있는지 모니터링하는 자동화 솔루션을 사용하는 것입니다.
DCShadow 공격에 대응하는 가장 좋은 방법은 무엇입니까?
DCShadow 공격이 감지되면 시간이 가장 중요합니다. 따라서 보안 팀에 즉시 해당 이벤트를 보고하고, 계정이 도메인에서 추가 변경을 수행하지 못하도록 차단하는 자동화 워크플로를 갖추는 것이 가장 좋습니다.
공유하기
더 알아보기
저자 소개
Jeff Warren
최고 제품 책임자
Jeff Warren은 Netwrix의 제품 포트폴리오를 총괄하며, 보안에 초점을 둔 제품 관리 및 개발 분야에서 10년이 넘는 경험을 바탕으로 기여하고 있습니다. Netwrix에 합류하기 전 Jeff는 Stealthbits Technologies에서 제품 조직을 이끌었으며, 소프트웨어 엔지니어로서의 경험을 활용해 혁신적이고 엔터프라이즈 규모의 보안 솔루션을 개발했습니다. 직접적인 실행 중심의 접근 방식과 까다로운 보안 과제를 해결하는 데 강점을 지닌 Jeff는 실제로 효과가 있는 실용적인 솔루션을 구축하는 데 집중하고 있습니다. 그는 델라웨어 대학교에서 정보 시스템(Information Systems) 학사 학위를 취득했습니다.