Step 261. Active Directory 1 — 도메인 구조 이해

Step 261. Active Directory 1 — 도메인 구조 이해

Level 3 — CTF 실전과 공격 스킬 심화 | 난이도 ★★★☆☆ | 예상 소요 시간 3시간

전제: Step 260의 윈도우 권한 상승(서비스·토큰 특권)을 마쳤다. Kerberos를 몰라도 된다 — 오늘 배우는 것이 그것이다.

  • 준비물: 종이와 펜(또는 다이어그램 도구). 오늘은 개념 챕터입니다 — AD 도메인이 없는 환경이므로, 열거 명령의 출력은 THM/HTB 랩 기준의 출력 예시로 제시합니다.
  • ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다.

지금까지의 상대는 "한 대의 머신"이었습니다. 그런데 회사를 상대하는 순간 세계가 바뀝니다 — 직원 수백 명의 계정, 수백 대의 PC, 파일 서버, 프린터가 하나의 중앙 시스템으로 묶여 있습니다. 그것이 Active Directory(AD)입니다. 그리고 중앙이 있다는 것은, 공격자에게 중앙을 먹으면 전부 끝난다는 뜻이기도 합니다. 실제 침투 테스트와 대회(HTB의 AD 트랙)에서 AD는 최종 보스의 얼굴입니다. 오늘은 그 보스의 지도를 그립니다 — 도메인이 뭐고, 도메인 컨트롤러가 왜 심장이며, Kerberos 인증이 어떻게 도는지. 오늘 지도를 정확히 그려야 다음 두 챕터의 공격(Kerberoasting, Pass-the-Hash, BloodHound)이 "왜 되는지" 보입니다.


1. 학습 목표

이 챕터를 끝내면 다음을 할 수 있습니다:

  • 도메인·트리·포레스트·도메인 컨트롤러(DC)의 관계를 그림으로 그린다
  • Kerberos 인증의 다섯 단계(AS-REQ → AS-REP → TGS-REQ → TGS-REP → 서비스 접근)를 순서대로 설명한다
  • TGT와 서비스 티켓(TGS)의 차이를 안다
  • net user /domain 등 기본 AD 열거 명령의 출력을 읽는다
  • SPN이 무엇이며 왜 다음 챕터(Kerberoasting)의 토대인지 설명한다

2. 배경 지식 — 오늘의 도구와 개념

오늘의 도구 한눈에 보기

구분 내용
언어·환경 개념 중심 — 종이에 도식 그리기 + 랩 명령 출력 예시
오늘의 명령 net user /domain, net group "Domain Admins" /domain, setspn -Q */* (전부 출력 예시)
필요한 개념 도메인/트리/포레스트, DC, TGT/TGS, SPN, 트러스트
오늘의 산출물 Kerberos 인증 흐름 손그림 1장 + 도메인 용어 지도

2-1. Active Directory란 — 회사의 호적등본

회사에 직원이 입사하면 계정을 만들어 줘야 합니다. PC가 새로 들어오면 등록해야 하고, 퇴사하면 접근을 끊어야 합니다. 직원이 천 명이면? PC마다 따로 계정을 만들 수는 없습니다. 그래서 등장한 것이 Active Directory — 계정·컴퓨터·그룹·정책을 한곳에 등록하고 모든 머신이 그곳에 물어보는 중앙 관리 시스템입니다.

이 중앙 등록소의 서버가 도메인 컨트롤러(Domain Controller, DC)이고, DC가 관리하는 영토가 도메인(domain)입니다 (corp.local 같은 이름). 도메인에 속한 모든 PC는 "이 사람 진짜 직원 맞아?"를 로컬에서 판단하지 않고 DC에 물어봅니다. 이 한 문장 — "인증이 중앙에 있다" — 이 AD 공격과 방어 전부의 출발점입니다.

2-2. 도메인 → 트리 → 포레스트 — 영토의 계층

조직이 커지면 도메인이 나뉩니다. 본사 corp.local 아래 연구소 rnd.corp.local, 해외지사 us.corp.local처럼요. 같은 이름줄(네임스페이스) 아래 묶인 도메인들이 트리(tree), 서로 다른 이름줄의 트리들이 하나의 신뢰 체계로 묶인 최대 단위가 포레스트(forest)입니다.

도메인 사이를 잇는 것이 트러스트(trust) — "저 도메인의 DC가 인증한 사용자를 우리도 믿겠다"는 약속입니다. 공격자의 눈으로 번역하면: 트러스트는 도메인 사이를 건너는 다리입니다. 한 도메인을 먹었을 때 트러스트가 걸린 다른 도메인으로 넘어갈 수 있어, 포레스트 경계가 곧 침투의 최종 경계로 취급됩니다.

2-3. Kerberos — 티켓으로 도는 인증

도메인 안에서 "나 철수인데 파일 서버 쓸게요"를 증명하는 프로토콜이 Kerberos입니다. 비밀번호를 네트워크에 매번 보내는 대신 티켓(ticket)을 발급받아 씁니다. 놀이공원에 빗대면 정확합니다 — 입장권 팔찌(TGT)를 손목에 차고, 각 놀이기구(서비스) 앞에서는 기구별 이용권(서비스 티켓)을 받아 탑니다.

등장인물은 세 명입니다 — 사용자, KDC(Key Distribution Center — DC 안에 있는 티켓 발급소), 서비스(파일 서버 등). 흐름은 다섯 단계:

사용자                KDC (DC 안의 발급소)              서비스
  |  1. AS-REQ: "나 alice, 팔찌 주세요"  |                     |
  | -----------------------------------> |                     |
  |  2. AS-REP: TGT 발급 (alice의 비번 해시로 암호화된 부분 포함) |
  | <----------------------------------- |                     |
  |  3. TGS-REQ: "이 팔찌로 파일서버 이용권 주세요"            |
  | -----------------------------------> |                     |
  |  4. TGS-REP: 서비스 티켓 발급 (서비스 계정의 비번 해시로 암호화) |
  | <----------------------------------- |                     |
  |  5. AP-REQ: 서비스 티켓 제시          |                     |
  | ---------------------------------------------------------> |

여기서 다음 챕터를 위해 꼭 붙들고 갈 문장 두 개:

  1. 2단계의 TGT는 사용자 비밀번호에서 온 키로 암호화된 부분을 포함합니다.
  2. 4단계의 서비스 티켓서비스 계정의 비밀번호에서 온 키로 암호화됩니다.

"누구의 비밀번호로 암호화됐는가"가 다음 챕터 공격의 전부입니다. 지금은 그림과 용어 — AS-REQ/AS-REP(팔찌 발급), TGS-REQ/TGS-REP(이용권 발급) — 만 확실히 하세요.

2-4. SPN — 서비스의 명찰

KDC가 "파일서버 이용권"을 발급하려면 그 서비스가 도메인의 누구인지 알아야 합니다. 서비스마다 붙은 고유 명찰이 SPN(Service Principal Name)입니다 — MSSQLSvc/db01.corp.local:1433, HTTP/web.corp.local 같은 형식("서비스종류/머신:포트").

중요한 사실: 도메인 사용자는 누구나 "저 SPN의 서비스 티켓 주세요"라고 KDC에 요청할 수 있습니다. 정상적인 업무를 위해 필요한 설계입니다. 그런데 2-3의 문장 2를 떠올려 보세요 — 그 티켓은 서비스 계정의 비밀번호로 암호화돼 옵니다. "누구나 요청 가능" + "서비스 계정 비밀번호로 암호화" = 가져다가 집에서 뜯어볼 수 있다. 이것이 Step 262 Kerberoasting의 씨앗입니다. 오늘은 "SPN = 서비스 티켓을 주문하는 주소"까지만 정리하면 됩니다.

2-5. 공격자의 첫 일 — 도메인 지도 그리기

DC를 직접 때리는 사람은 초보만 합니다. 실제 공격의 첫 단계는 조용한 열거(enumeration)입니다 — 도메인에 사용자가 몇 명인지, 누가 Domain Admins(도메인의 왕 그룹)인지, 어떤 머신이 있는지, SPN은 뭐가 있는지. 이 지도가 있어야 "지금 내 위치에서 왕좌까지의 경로"를 계산할 수 있습니다 (Step 263의 BloodHound가 이 계산을 자동화합니다). 도메인 사용자 계정 하나만 있으면 대부분의 열거가 가능하다는 것 — 그래서 AD 공격의 진짜 시작은 "첫 번째 도메인 계정 획득"입니다.


3. 따라 하기

오늘의 실습은 두 갈래입니다 — ① 개념을 손으로 그려 몸에 넣기, ② 랩 명령의 출력 예시 읽기 연습. 이 환경에는 AD 도메인이 없으므로 명령 출력은 전부 출력 예시입니다.

3-1. Kerberos 흐름 손그림 그리기

종이에 2-3의 다섯 단계를 아무것도 안 보고 그려 보세요. 세 기둥(사용자/KDC/서비스)을 세우고 화살표 다섯 개를 놓으면 됩니다. 다 그렸으면 두 문장을 화살표 옆에 적습니다 — "AS-REP은 alice의 키로 암호화", "TGS-REP은 서비스 계정의 키로 암호화".

완성 확인: 그림을 보지 않고 "TGT와 서비스 티켓의 차이"를 말할 수 있으면 성공입니다. 정답 감각 — TGT는 "나는 인증받은 사람이다"를 증명하는 신분증(발급소용), 서비스 티켓은 "이 서비스에 들어갈 수 있다"는 이용권(서비스용). 이 그림은 Step 262에서 공격 화살표가 얹힐 때 그대로 재사용됩니다.

3-2. 도메인 용어 지도 그리기

두 번째 그림은 영토 지도입니다. 이 가상 회사를 그려 보세요:

포레스트: corp.local (루트 도메인)
├── 트리: corp.local
│     ├── 본사 도메인 corp.local — DC 2대 (DC01, DC02)
│     └── 연구소 rnd.corp.local — DC 1대 (RNDDC01)
└── 트러스트: corp.local ↔ partner.com (외부 협력사 포레스트)

그린 뒤 스스로에게 묻습니다 — ① rnd.corp.local을 장악했을 때 트러스트를 타고 갈 수 있는 곳은? ② 이 회사의 "최종 경계"는 어디까지인가(도메인? 포레스트?)? 답은 5절에서 확인합니다.

3-3. 도메인 사용자 열거 — 출력 예시

랩(THM/HTB의 AD 입문 룸)에서 도메인 계정으로 접속한 뒤의 첫 명령들입니다 (출력 예시):

net user /domain
\\DC01 의 사용자 계정

-------------------------------------------------------------------------------
Administrator            alice                    bob
Guest                    krbtgt                   svc_sql
svc_backup               ...
명령을 잘 실행했습니다.

읽는 법: 도메인 전체 계정 목록입니다. 공격자의 눈이 가는 곳 — ① svc_로 시작하는 서비스 계정들(Step 262의 사냥감 후보), ② krbtgt(KDC 자신의 계정 — AD의 최고 보석, 지금은 이름만), ③ 평범한 사용자들(첫 침투의 발판 후보). 한글 윈도우에서는 마지막 줄이 "명령을 잘 실행했습니다."로 뜹니다.

3-4. 왕 그룹 확인 — Domain Admins

net group "Domain Admins" /domain

출력 예시:

그룹 이름     Domain Admins
주석          지정된 도메인 관리자

구성원
-------------------------------------------------------------------------------
Administrator            alice
명령을 잘 실행했습니다.

읽는 법: 이 목록이 이번 과의 "왕좌 명단"입니다. 침투의 종착지는 이 그룹의 계정 하나를 얻는 것 — 그 계정이면 도메인 모든 머신의 관리자이기 때문입니다. 열거할 때마다 이 명단과 대조합니다 — "내가 얻은 계정이 여기 있나? 없다면 여기까지 어떻게 가나?" 이 두 번째 질문을 기계가 계산해 주는 도구가 Step 263의 BloodHound입니다.

3-5. SPN 열거 — 출력 예시

setspn -Q */*

출력 예시 (발췌):

CN=svc_sql,OU=Service Accounts,DC=corp,DC=local
        MSSQLSvc/db01.corp.local:1433
CN=svc_backup,OU=Service Accounts,DC=corp,DC=local
        HTTP/backup.corp.local
...

읽는 법: "어떤 계정에 어떤 서비스 명찰이 붙어 있는가"의 목록입니다. svc_sql에는 MSSQL 명찰이, svc_backup에는 HTTP 명찰이 붙어 있네요 — 즉 이 두 계정은 서비스 티켓을 주문할 수 있는 주소가 있는 계정입니다. 이 목록 전체가 다음 챕터 Kerberoasting의 "사냥 목록"이 됩니다. 오늘은 "SPN = 서비스 명찰 = 티켓 주문 주소"라는 한 줄만 가져가면 됩니다.


4. 미션과 연습문제

미션 — AD 지도 제작

  1. 3-1의 Kerberos 다섯 단계 그림을 백지에 재현하고, AS-REP·TGS-REP이 "누구의 키로 암호화되는가"를 그림에 적습니다
  2. 3-2의 영토 지도를 그리고 트러스트 다리를 표시합니다
  3. 가상 회사 mega.corp의 지도를 스스로 설계합니다 — 도메인 3개(본사/연구소/지사), DC 배치, Domain Admins 2명, 서비스 계정 2개(SPN 포함)를 지도에 배치
  4. 3-3~3-5의 출력 예시를 읽고, 각 명령이 "공격자에게 주는 정보"를 한 줄씩 정리합니다
  5. ad-도메인-지도.md에 두 그림과 정리를 모아 저장합니다 — Step 262·263에서 이 파일을 계속 펼쳐 놓습니다

연습문제

문제 1. 도메인에 속한 PC가 로그인 인증을 로컬에서 하지 않고 DC에 물어보는 이유와, 그 설계가 공격자에게 주는 함의를 각각 한 문장으로 말해 보세요.

문제 2. TGT와 서비스 티켓(TGS)의 차이를 발급 주체·용도·암호화 키의 세 관점에서 비교해 보세요.

문제 3. "도메인 사용자 누구나 SPN의 서비스 티켓을 요청할 수 있다"는 사실이 왜 보안상 긴장 요소인지, 티켓의 암호화 키와 연결해 설명해 보세요.

문제 4. 포레스트 안의 두 도메인(A, B)이 트러스트로 묶여 있을 때, A를 장악한 공격자에게 B는 어떤 의미인가요? 포레스트가 "최종 경계"로 불리는 이유와 함께 설명해 보세요.


5. 모범 답안과 완료 기준

미션 모범 답안

그림 검증법: Kerberos 그림에서 5개 화살표의 이름(AS-REQ/AS-REP/TGS-REQ/TGS-REP/AP-REQ)과 방향이 맞는지, "암호화 키" 주석이 AS-REP은 사용자·TGS-REP은 서비스 계정으로 붙었는지를 봅니다. 이 두 주석이 빠졌다면 그림은 반쪽입니다 — 다음 챕터의 공격이 정확히 그 두 주석을 때리기 때문입니다.

열거 명령 정리의 예시:

명령 공격자에게 주는 정보
net user /domain 전체 계정 목록 — 서비스 계정 후보·침투 발판 후보
net group "Domain Admins" /domain 왕좌 명단 — 침투의 종착지 정의
setspn -Q */* SPN 목록 — Kerberoasting 사냥 목록

가상 지도 평가 기준: 도메인 3개에 DC가 각각 배치됐는가, 서비스 계정에 SPN이 "서비스종류/머신" 형식으로 붙었는가, 트러스트가 포레스트 안(상속)과 밖(외부)을 구분해 표시됐는가.

연습문제 해답

문제 1 해답. 이유: 계정 정보가 수백 대의 PC에 분산돼 있으면 생성·변경·삭제를 동기화할 수 없으므로, 중앙(DC)에 등록하고 모두가 물어보는 구조가 유일하게 관리 가능한 설계이기 때문입니다. 함의: 중앙이 인증의 단일 기준이므로 DC를 장악하면 도메인 전체의 인증을 손에 넣는다 — 공격의 수익이 "한 대"에서 "전부"로 뛴다는 뜻입니다.

문제 2 해답. 발급 주체: 둘 다 KDC. 용도: TGT는 "티켓 발급소에 다시 올 때 쓰는 신분증"(서비스 티켓을 청구하는 재료), 서비스 티켓은 "특정 서비스에 제시하는 이용권". 암호화 키: TGT의 사용자 부분은 사용자 비밀번호 유래 키(그리고 krbtgt 키로 서명·보호), 서비스 티켓은 해당 서비스 계정의 비밀번호 유래 키로 암호화됩니다 — 이 마지막 행이 Step 262의 핵심입니다.

문제 3 해답. 서비스 티켓은 서비스 계정 비밀번호 유래 키로 암호화된 데이터인데, 그것을 아무 도메인 사용자나 받아 갈 수 있습니다. 받아 간 티켓은 네트워크 밖으로 가져가 오프라인에서 마음껏 크래킹할 수 있습니다 — DC는 크래킹 시도를 알 수 없습니다. "정상 기능(티켓 발급)"이 그대로 공격 통로가 되는, 설계와 긴장이 공존하는 지점입니다.

문제 4 해답. B는 "다리가 이미 놓인 다음 영토"입니다 — 트러스트로 인해 A의 인증 결과를 B가 신뢰하므로, A 장악은 B로의 이동 발판이 됩니다. 트러스트는 포레스트 안에서 기본적으로 상호·전이적으로 걸리므로, 포레스트 안 어디든 도달 가능성이 열립니다. 그래서 방어의 최종 경계는 개별 도메인이 아니라 포레스트로 봐야 한다는 것이 실무의 합의입니다.

완료 기준 체크리스트

  • [ ] 도메인·트리·포레스트·DC를 한 문장씩 정의할 수 있다
  • [ ] Kerberos 다섯 단계를 백지에 그릴 수 있다
  • [ ] AS-REP과 TGS-REP이 각각 "누구의 키"로 암호화되는지 안다
  • [ ] TGT와 서비스 티켓의 차이를 말할 수 있다
  • [ ] SPN이 "티켓 주문 주소"임을 설명할 수 있다
  • [ ] net user /domain 출력에서 서비스 계정 후보를 골라낼 수 있다
  • [ ] 미션: ad-도메인-지도.md를 완성했다

6. 흔한 실수와 해결

벽 1. Kerberos 용어가 뒤섞인다

증상: AS-REQ, TGS-REQ, TGT, TGS가 뒤죽박죽입니다.

원인: 정상입니다 — 네 쌍의 용어가 한꺼번에 나옵니다. 외우려 하지 마세요.

해결: 이름을 뜯으면 끝납니다 — AS(Authentication Service)는 "팔찌 발급 창구", TGS(Ticket-Granting Service)는 "이용권 발급 창구". REQ는 요청, REP는 응답. 그러니 전부 "창구 둘, 왕복 둘"뿐입니다. 3-1의 손그림을 세 번 그리면 붙습니다.

벽 2. "티켓"과 "비밀번호"의 관계가 헷갈린다

증상: 티켓을 받았는데 왜 비밀번호 크래킹 이야기가 나오는지 모르겠습니다.

원인: 티켓의 암호화 재료를 놓친 것입니다.

해결: 이 한 문장으로 고정하세요 — "티켓은 열쇠이면서 동시에 암호문이다." 서비스 티켓은 서비스 계정 비밀번호로 암호화된 암호문이라서, 가져다 비밀번호를 대입해 보며(크래킹) 풀 수 있습니다. 정상 사용에서는 풀 필요가 없지만, 공격자에게는 크래킹 대상이 됩니다.

벽 3. 도메인과 포레스트의 크기 관계를 반대로 안다

증상: "포레스트 안에 도메인이 있다"와 "도메인 안에 포레스트가 있다"를 헷갈립니다.

원인: 숲(forest)과 나무(tree) 비유의 방향을 거꾸로 기억한 것입니다.

해결: 자연 비유 그대로입니다 — 나무(트리)가 모여 숲(포레스트). 도메인이 모여 트리, 트리가 모여 포레스트. 경계의 크기도 자연스럽습니다 — 도메인 < 트리 < 포레스트(최종 경계).

벽 4. 랩에서 net user /domain이 오류를 낸다

증상 (출력 예시): 시스템 오류 5 또는 액세스가 거부되었습니다.

원인 후보: ① 접속한 머신이 도메인에 가입돼 있지 않음(작업 그룹 머신). ② 로컬 계정으로 로그인함 — /domain은 도메인 컨텍스트가 필요합니다.

해결: 먼저 whoami로 확인하세요 — corp\alice처럼 "도메인\사용자" 형태면 정상, PC01\alice면 로컬 계정입니다. AD 룸의 첫 과제는 언제나 "도메인 컨텍스트의 발판 확보"입니다 — 그래서 첫 도메인 계정 하나의 가치가 큽니다.

벽 5. 개념은 알겠는데 "그래서 뭘 공격하는데?"가 안 보인다

증상: 구조는 이해했는데 공격과의 연결이 추상적입니다.

원인: 정상입니다 — 오늘은 지도만 그린 날입니다. 공격 화살표는 아직 안 얹었습니다.

해결: 지도 위에 물음표 두 개만 얹어 두세요 — ① "TGS-REP이 서비스 계정 키로 암호화돼 온다면, 그걸 가져다 까면?" (→ Step 262). ② "누가 어디 관리자인지 전부 열거 가능하다면, 왕좌까지의 경로를 계산할 수 있지 않나?" (→ Step 263). 물음표가 있으면 다음 챕터가 답으로 읽힙니다.


7. 정리

오늘의 개념

개념 한 줄 설명
Active Directory 계정·머신·그룹의 중앙 등록소 — 회사의 호적
도메인 컨트롤러(DC) 인증의 단일 기준 — 장악 = 도메인 전부
트리/포레스트 도메인의 계층 — 포레스트가 최종 경계
트러스트 도메인 사이의 신뢰 다리 — 횡적 이동의 통로
Kerberos 티켓 기반 인증 — AS(팔찌) → TGS(이용권)
TGT / 서비스 티켓 신분증 / 기구별 이용권 — 암호화 키가 각각 다름
SPN 서비스 명찰 = 티켓 주문 주소 — Kerberoasting의 씨앗
Domain Admins 왕 그룹 — 침투의 종착지

오늘의 명령어 (전부 출력 예시)

명령 하는 일
net user /domain 도메인 전체 계정 목록
net group "Domain Admins" /domain 왕좌 명단 확인
setspn -Q */* SPN(서비스 명찰) 열거
whoami 도메인 컨텍스트 확인 (도메인\사용자 형태)

명령어보다 중요한 감각

한 대짜리 머신과의 싸움에서 "root/SYSTEM"이 끝이었다면, AD와의 싸움은 지도와의 싸움입니다. 어디에 왕좌(Domain Admins)가 있고, 어떤 다리(트러스트)가 놓여 있고, 어떤 티켓(SPN)이 주문 가능한지 — 지도를 먼저 그리는 쪽이 이깁니다. 그리고 오늘 그림에서 꼭 남겨야 할 문장 하나: "서비스 티켓은 서비스 계정의 비밀번호로 암호화돼 온다." 이 문장이 다음 챕터의 문을 엽니다.


전부 체크되면 Step 261 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.