
Active Directory 환경에서 리소스 기반 제한 위임 공격 경로를 발견하는 도구
Active Directory 환경에서 리소스 기반 제한 위임(RBCD) 공격 경로를 찾는 도구
거의 전적으로 Elad Shamir의 훌륭한 블로그 게시물 "Wagging the Dog: Abusing Resource-Based Constrained Delegation to Attack Active Directory"와 harmj0y의 "A Case Study in Wagging the Dog: Computer Takeover"를 기반으로 합니다. 실제로 여기서 무슨 일이 일어나고 있는지 이해하고 싶다면 이 두 블로그 게시물을 읽어보세요. 솔직히 저도 절반밖에 이해하지 못합니다(그것도 과장입니다).
C#을 잘 모르기 때문에 SharpSploit과 SharpView의 소스 코드를 읽어 C#에서 도메인과 통신하는 방법을 알아냈습니다.
Get-RBCD-Thread는 현재 도메인의 모든 Active Directory 사용자, 그룹("Domain Admins" 및 "BUILTIN\Administrators" 같은 특권 그룹 제외) 및 컴퓨터 개체를 쿼리하여 해당 SID 목록을 수집합니다. 그런 다음 Get-RBCD-Threaded는 도메인의 컴퓨터 개체에 대한 모든 DACL을 AD에서 쿼리합니다. DACL의 각 ACE를 확인하여 사용자/그룹/컴퓨터 SID 중 하나가 컴퓨터 개체에 대해 "GenericAll", "GenericWrite", "WriteOwner" 또는 "WriteDacl" 권한을 가지고 있는지, 또는 해당 SID가 ms-DS-Allowed-To-Act-On-Behalf-Of-Other-Identity 특성(GUID: 3f78c3e5-f79a-46bd-a0b8-9d18116ddc79)에 대한 "WriteProp" 권한을 가지고 있는지 확인합니다. 그렇다면, 리소스 기반 제한 위임 공격을 시작할 준비가 된 것입니다!
Visual Studio에서 컴파일하세요. 이 도구는 DACL 개체 검색 속도를 높이기 위해 Parallel.ForEach를 사용하므로 .NET v4 이상이 필요합니다.
-u|-username=, 인증할 사용자 이름
-p|-password=, 사용자의 비밀번호
-d|-domain=, 인증할 정규화된 도메인 이름(FQDN)
-s|-searchforest, 트러스트 관계를 통해 도메인 및 포리스트를 검색합니다. 모든 도메인과 포리스트를 열거합니다.
-pwdlastset=, pwdLastSet을 기준으로 컴퓨터를 필터링하여 오래된 컴퓨터 개체를 제거합니다. 이 값을 90으로 설정하면 pwdLastSet 날짜가 90일 이상 지난 컴퓨터 개체가 결과에서 제외됩니다.
-i|-insecure, LDAPS로 인해 연결 문제가 발생할 경우 안전하지 않은 LDAP 연결을 강제합니다.
-o|-outputfile=, CSV 파일로 출력합니다. 파일의 전체 경로와 이름을 지정하세요.
-h|-?|-help, 도움말 옵션을 표시합니다.
이제 인증할 사용자 이름, 비밀번호 및 도메인을 지정할 수 있습니다. u/p/d 옵션이 비어 있으면 Get-RBCD-Threaded는 현재 사용자 컨텍스트의 도메인에 인증을 시도합니다.
-o는 CSV 파일로 출력합니다. 출력을 저장할 전체 파일 경로와 이름을 제공하세요.
기본 검색은 LDAPS를 강제하기 위해 포트 636을 사용하도록 지정합니다. 이로 인해 문제가 발생할 수 있습니다. 서버를 사용할 수 없다는 오류나 유사한 오류가 발생하면 "-i" 플래그를 사용하여 연결 문자열에서 포트 636을 제거해 보세요.
"pwdLastSet"이 필터링 옵션으로 추가되었습니다. 대규모 환경에서는 ACL에서 "대상" 개체로 더 이상 존재하지 않고 RBCD 공격에 사용할 수 없는 오래된 컴퓨터 개체가 많이 있을 수 있습니다(적어도 제가 아는 한). pwdLastSet을 일수로 설정하세요. 예: "-pwdlastset=90"을 설정하면 현재 날짜와 시간 기준으로 pwdLastSet 날짜가 90일 이상인 모든 컴퓨터 개체가 결과에서 제외됩니다.
20,000개 이상의 사용자, 그룹 및 컴퓨터(총 60,000개 이상의 개체)가 있는 환경에서 테스트했습니다. Get-RBCD-Thread는 약 60초 만에 완료되었습니다. 이에 비해 제가 이 Gist에서 임시로 작성한 PowerView 명령어로 유사한 검색을 수행했을 때는 몇 시간이 걸렸고 완료되지 않았습니다.
이 도구는 위임 공격을 직접 수행하지 않습니다. 방법을 알아보려면 Elad Shamir와 harmj0y의 블로그를 읽어야 합니다. 이 도구는 RBCD 공격을 위한 잠재적 대상을 찾는 데 도움을 줄 뿐입니다.
내 AD 랩에서의 사용 예:

이 도구는 LDAP 쿼리를 사용하여 Active Directory를 쿼리하는 것 외에는 아무것도 하지 않으므로 탐지하기 어려울 수 있습니다. Netflow를 사용하여 한 시스템에 대한 대량의 LDAP 쿼리/트래픽을 감지할 수 있습니다.
또 다른 가능한 탐지 방법은 허니팟 계정을 사용하는 것입니다. 특정 사용자/그룹이 쓰기 권한을 가진 컴퓨터 개체를 생성하는 것입니다. RBCD 공격은 컴퓨터 개체를 수정한 후 Kerberos 티켓을 위임하는 데 의존합니다. 허니팟 컴퓨터 개체에 대한 탐지 지점은 다음과 같습니다:
이 도구는 침투 테스트를 돕기 위해 만들었습니다. 그러나 방어자/블루팀/시스템 관리자도 이 도구를 사용하여 환경의 취약점을 찾고 (바라건대) 이를 해결하는 데 사용할 수 있습니다.