Step 263. Active Directory 3 — Pass-the-Hash와 BloodHound
Level 3 — CTF 실전과 공격 스킬 심화 | 난이도 ★★★★☆ | 예상 소요 시간 4시간
전제: Step 261의 도메인 구조, Step 262의 티켓 크래킹을 마쳤다. NTLM 해시가 무엇인지는 오늘 배운다.
- 준비물: THM/HTB의 AD 랩. 이 환경에는 AD 도메인과 BloodHound가 없으므로, 공격 장면과 BloodHound 화면은 전부 출력·화면 예시로 제시합니다 — 원리와 그래프 읽는 법을 익히는 것이 오늘의 실습입니다.
- ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다.
Step 262에서는 티켓을 까서 비밀번호를 얻었습니다. 그런데 침투 현장에서는 비밀번호가 아니라 해시가 먼저 손에 들어오는 경우가 많습니다 — 장악한 머신의 메모리나 SAM 파일에서요. 평문으로 못 까면 쓸모없는 걸까요? 윈도우 NTLM 인증의 뼈아픈 설계 하나가 등장합니다 — 해시가 곧 비밀번호다. 그리고 얻은 자격증명으로 "다음에 어디로 가야 하는가"를 계산해 주는 지도 도구 BloodHound가 오늘의 후반부입니다. 해시의 재사용(Pass-the-Hash)과 경로의 계산(그래프 분석), 이 둘이 AD 침투의 실무 엔진입니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- NTLM 챌린지-응답 구조가 왜 "해시 = 비밀번호"를 만드는지 설명한다
- Pass-the-Hash로 해시만으로 인증하는 절차와 한계를 안다
- BloodHound가 모으는 데이터(노드·엣지)와 그래프 경로의 의미를 안다
- "Shortest Path to Domain Admins" 쿼리 결과를 공격 단계로 해석한다
- PtH와 BloodHound 각각의 방어 관점을 정리한다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | Kali(Impacket) + BloodHound(neo4j) — 전부 랩 기준 출력·화면 예시 |
| 오늘의 도구 | psexec.py(Impacket), SharpHound / bloodhound-python, BloodHound GUI |
| 필요한 개념 | NTLM 해시, 챌린지-응답 인증, 그래프(노드/엣지), AdminTo·MemberOf·HasSession |
| 오늘의 산출물 | PtH 원리 정리 1문단 + BloodHound 경로 해석 노트 |
2-1. NTLM 인증의 뼈 — 챌린지-응답
윈도우의 구형(그러나 아직 현역인) 인증 방식 NTLM은 이렇게 돕니다:
- 클라이언트: "나 alice로 접속할래"
- 서버: 무작위 숫자(챌린지)를 던짐 — "이걸로 증명해 봐"
- 클라이언트: 자기 비밀번호의 NTLM 해시로 챌린지를 암호화(응답)해 돌려줌
- 서버: 자기가 아는 alice의 해시로 똑같이 계산해 비교 — 같으면 통과
여기서 멈추고 볼 것 — 서버가 검사하는 것은 평문 비밀번호가 아니라 해시로 만든 응답입니다. 클라이언트가 평문에서 해시를 만들었든, 해시를 어디서 주웠든, 서버에게는 같은 해시 = 같은 사람입니다. 평문이 한 번도 선을 넘지 않는 설계인데, 그 대가로 해시 자체가 완전한 열쇠가 돼 버렸습니다. 이것이 Pass-the-Hash(PtH) — "해시를 그대로 전달하는" 공격이 성립하는 이유입니다.
2-2. PtH의 전개 — 해시는 어디서 오는가
침투 시나리오의 표준 전개는 이렇습니다. 웹 취약점으로 머신 A에 들어감 → 상승(Step 260)으로 SYSTEM 획득 → 메모리나 SAM에서 해시들을 덤프 → 그중 다른 머신에도 통하는 해시(로컬 관리자, 또는 로그인한 적 있는 도메인 계정)를 발견 → 해시 그대로 머신 B에 인증 → B에서 또 덤프 → ….
이것이 횡적 이동(lateral movement)의 모습입니다 — 한 대를 깊이 파는 것이 아니라, 자격증명을 수확하며 옆으로 옆으로 퍼져 나가는 것. 목적지는 Step 261에서 정했습니다 — Domain Admins. 문제는 "지금 내 손의 계정에서 왕좌까지 경로가 보이지 않는다"는 것인데, 그 문제를 푸는 것이 후반부의 BloodHound입니다.
2-3. BloodHound — AD를 그래프로 굽는 도구
BloodHound는 AD의 관계를 전부 긁어 그래프(점과 선)로 만든 뒤, "여기서 Domain Admin까지 가는 최단 경로"를 계산해 주는 도구입니다. 그래프의 두 부품:
- 노드(점): 사용자, 그룹, 컴퓨터 — 예:
ALICE@CORP.LOCAL,DOMAIN ADMINS@CORP.LOCAL,DB01.CORP.LOCAL - 엣지(선): 관계 —
MemberOf(이 그룹의 구성원),AdminTo(저 컴퓨터의 관리자),HasSession(저 컴퓨터에 이 계정의 로그인 세션이 살아 있음) 등
경로 하나의 예를 말로 읽으면 이렇습니다 — "ALICE는(노드) Helpdesk 그룹의 구성원이고(MemberOf), Helpdesk는 DB01의 관리자이며(AdminTo), DB01에는 관리자 BOB의 세션이 살아 있다(HasSession)." 공격 절차로 번역하면: alice로 로그인 → DB01에 관리자 권한으로 들어감 → 메모리에서 bob의 자격증명 수확 → bob으로 다음 노드로. 엣지 하나 = 공격 한 단계입니다. 지도(Step 261)가 계산 가능한 형태가 된 것입니다.
2-4. 수집과 분석의 분리 — SharpHound과 neo4j
BloodHound는 두 덩어리로 돕니다. 타깃 도메인에서 데이터를 긁는 수집기(collector) — 윈도우에서는 SharpHound, Kali에서는 bloodhound-python — 와, 그 데이터를 그래프로 굽는 분석기(BloodHound GUI, 뒤에 neo4j라는 그래프 DB). 수집기가 만든 zip을 내 머신의 GUI로 가져와 열면, 미리 만들어진 쿼리들 — 그중 왕좌가 "Shortest Path to Domain Admins" — 이 경로 그래프를 그려 줍니다.
실무 팁 하나: neo4j 설치가 번거롭다는 것이 유명한 벽입니다. 최근에는 docker compose 한 장으로 띄우는 구성이 편합니다 — 랩에서 막히면 기억하세요.
2-5. 방어 관점 — 두 기법은 어떻게 막는가
- PtH 방어: ① 로컬 관리자 비밀번호가 머신마다 다르면 해시 재사용이 끊깁니다 — LAPS(로컬 관리자 비밀번호 자동화)가 그 답. ② 해시 덤프 자체를 막는 것 — Credential Guard, 최소 권한. ③ NTLM 자체를 줄이고 Kerberos만 쓰는 환경으로 이동 (그러면 PtH가 아예 성립하지 않습니다 — 대신 Step 262의 공격들이 남습니다).
- BloodHound 방어: 완벽한 차단은 어렵습니다 — 열거는 대부분 정상 LDAP 조회라서요. 실효 방어는 경로를 짧게 유지하는 것 — 불필요한 로컬 관리자 권한 회수, 관리자 계정은 전용 머신에서만 로그인(세션을 남기지 않기), 과도한 그룹 중첩 정리. 공격자가 그래프를 그릴 수 있어도 왕좌까지 이어진 선이 없게 만드는 것입니다.
3. 따라 하기
이 환경에는 AD 도메인도 BloodHound도 없으므로, 오늘은 출력·화면 예시를 읽고 손으로 해석하는 훈련입니다. 명령은 랩에서 그대로 쓸 실제 형식입니다.
3-1. 챌린지-응답 손그림 — 왜 해시가 열쇠인가
2-1의 네 단계를 종이에 그려 보세요. 그리고 네 번째 단계 옆에 이 질문을 적습니다 — "서버가 비교하는 것은 평문인가, 해시로 만든 응답인가?" 답은 해시로 만든 응답입니다. 이 그림의 결론 칸에 오늘의 문장을 박제하세요: "NTLM 서버에게 해시는 곧 신분이다. 평문은 필요 없다."
참고로 해시 자체를 계산해 보는 실험까지 하고 싶겠지만 — NTLM 해시는 MD4 기반이라 최신 파이썬/OpenSSL 환경에서는 md4가 비활성화돼 hashlib.new('md4', ...)가 unsupported hash type md4로 실패합니다 (2026-09-09 실측 확인). 그만큼 낡은 알고리즘이라는 뜻이고, 계산은 랩의 도구(Impacket)가 알아서 해 줍니다.
3-2. PtH 인증 — 출력 예시
머신 A에서 수확한 해시가 aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0(LM:NT 형식, LM 자리의 aad3b435...은 "비어 있음"을 뜻하는 유명한 고정값)라고 합시다. Impacket의 psexec.py는 평문 대신 해시를 받습니다:
psexec.py corp.local/administrator@10.10.10.20 -hashes :31d6cfe0d16ae931b73c59d7e0c089c0
출력 예시:
[*] Requesting shares on 10.10.10.20.....
[*] Found writable share ADMIN$
[*] Uploading file pMSxKqIa.exe
[*] Opening SVCManager on 10.10.10.20.....
[*] Starting service ...
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.20348.XXXX]
C:\Windows\system32> whoami
nt authority\system
읽는 법: 평문 비밀번호는 어디에도 없습니다 — -hashes 뒤의 NT 해시 하나로 10.10.10.20의 nt authority\system 쉘이 열렸습니다. 내부적으로는 원격 머신에 임시 서비스를 올려 실행하는 방식(그래서 출력에 Starting service가 보입니다) — Step 260의 "서비스가 윈도우의 자동 실행 통로"라는 지식과 이어집니다. 해시가 곧 비밀번호라는 2-1의 문장이 화면으로 증명된 장면입니다.
3-3. PtH가 안 되는 경우 — 출력 예시
같은 명령이 이렇게 실패할 수 있습니다 (출력 예시):
[*] Requesting shares on 10.10.10.30.....
[-] SMB SessionError: STATUS_LOGON_FAILURE(The attempted logon is invalid.)
읽는 법: STATUS_LOGON_FAILURE의 후보 — ① 해시가 그 머신에서는 틀림(계정은 같은데 비밀번호가 다름 — LAPS가 걸린 환경의 정상), ② NTLM이 비활성화돼 Kerberos만 받는 환경, ③ 계정 잠김·제한. 실패도 정보입니다 — "이 환경은 해시 재사용이 끊겨 있다"는 방어 수준의 측정값이니까요. 그때는 해시를 크래킹해(Step 123) 평문을 얻거나, 다른 엣지(다음 절의 그래프)를 찾습니다.
3-4. BloodHound 수집 — 출력 예시
도메인 계정 하나로 수집기를 돌립니다 (Kali에서, 출력 예시):
bloodhound-python -u alice -p 'Password123' -d corp.local -dc dc01.corp.local -c All
INFO: Found AD domain: corp.local
INFO: Connecting to LDAP server: dc01.corp.local
INFO: Found 38 users
INFO: Found 5 groups
INFO: Found 6 computers
...
INFO: Done in 00:12
INFO: Compressing output into 20260909..._bloodhound.zip
읽는 법: "사용자 38, 그룹 5, 컴퓨터 6" — 도메인의 뼈대가 zip 하나에 들어왔습니다. 이것이 Step 261의 "도메인 지도 그리기"를 기계가 12초 만에 한 것입니다. 윈도우 측에서는 SharpHound.exe -c All이 같은 일을 합니다 (단, Defender가 잡는 대표 도구 — 랩에서는 끄고, 실무에서는 탐지됨을 전제로 합니다).
3-5. BloodHound 분석 — 화면 예시
zip을 BloodHound GUI에 넣고 미리 만들어진 쿼리 "Shortest Path to Domain Admins"를 실행합니다. 화면 예시(텍스트로 옮긴 그래프):
ALICE@CORP.LOCAL
│ MemberOf
▼
HELPDESK@CORP.LOCAL
│ AdminTo
▼
DB01.CORP.LOCAL
│ HasSession ← BOB@CORP.LOCAL 의 세션이 살아 있음
▼
BOB@CORP.LOCAL
│ MemberOf
▼
DOMAIN ADMINS@CORP.LOCAL
읽는 법 — 이것이 오늘의 정점입니다. 네 개의 엣지를 공격 절차로 번역해 봅시다:
ALICE → HELPDESK (MemberOf): alice는 Helpdesk 그룹 구성원 — 이미 내 것HELPDESK → DB01 (AdminTo): 이 그룹은 DB01의 로컬 관리자 — alice로 DB01에 관리자 접속 가능DB01 → BOB (HasSession): DB01에 bob의 로그인 세션이 살아 있음 — 관리자 권한으로 메모리에서 bob의 자격증명(해시) 수확 가능BOB → DOMAIN ADMINS (MemberOf): bob은 Domain Admins 구성원 — 수확한 해시로 PtH하면 왕좌
네 줄의 그래프가 곧 네 단계의 공격 작전서입니다. 실제 화면에서는 이 그래프가 노드 수백 개 사이에 그려지고, 경로가 여러 개면 가장 짧은 것(비용이 싼 것)부터 보여 줍니다.
3-6. 경로 해석 노트 쓰기
3-5의 그래프를 여러분의 노트에 이렇게 정리해 보세요 — 엣지 / 그 자리의 공격 기법 / 필요한 도구:
| 엣지 | 공격 단계 | 도구 |
|---|---|---|
| MemberOf (ALICE→HELPDESK) | 보유 자격 확인 | — |
| AdminTo (HELPDESK→DB01) | 원격 관리자 접속 | psexec.py 등 |
| HasSession (DB01→BOB) | 메모리 자격증명 수확 | 덤프 도구 (랩) |
| MemberOf (BOB→DA) | PtH로 왕좌 인증 | psexec.py -hashes |
이 표를 스스로 완성할 수 있으면 오늘의 목표 달성입니다 — 그래프를 "그림"이 아니라 "작전서"로 읽게 된 것입니다.
4. 미션과 연습문제
미션 — PtH 원리 문단 + BloodHound 경로 해석
- 3-1의 챌린지-응답 그림을 그리고 "왜 평문 없이 해시로 인증이 되는가"를 한 문단으로 씁니다
- (랩이 있다면) 수확한 해시로
psexec.py -hashes를 실행해whoami결과를 증거로 저장합니다 — 안 되면 3-3의 실패 해석을 적습니다 - (랩에서) SharpHound 또는
bloodhound-python으로 수집한 zip을 GUI에 넣고 "Shortest Path to Domain Admins"를 실행합니다 - 나타난 경로의 엣지 하나하나를 3-6 표 형식으로 "공격 단계 + 도구"로 번역합니다
- 방어자 관점에서 그 경로의 엣지 중 끊기 가장 쉬운 것 하나를 고르고 근거를 씁니다 —
ad-경로-분석.md로 저장합니다
연습문제
문제 1. NTLM 챌린지-응답에서 서버가 검증하는 것이 평문이 아니라 해시로 만든 응답이라는 사실이, 왜 "해시 탈취 = 계정 탈취"로 이어지는지 설명해 보세요.
문제 2. BloodHound 그래프에서 HasSession 엣지가 공격자에게 의미하는 바와, 방어자가 이 엣지를 줄이는 방법을 각각 말해 보세요.
문제 3. LAPS(머신마다 다른 로컬 관리자 비밀번호)가 PtH 횡적 이동을 끊는 원리를 설명해 보세요.
문제 4. NTLM을 완전히 끄고 Kerberos만 쓰는 환경에서 PtH가 성립하지 않는 이유와, 그럼에도 남는 위험(힌트: Step 262)을 말해 보세요.
5. 모범 답안과 완료 기준
미션 모범 답안
원리 문단의 예시: "NTLM 인증에서 서버가 비교하는 것은 클라이언트가 보낸 ‘챌린지를 해시로 암호화한 응답’과 서버가 직접 계산한 응답입니다. 평문은 과정 어디에도 오가지 않습니다. 따라서 해시를 아는 자는 평문 없이도 올바른 응답을 만들 수 있고, 서버에게 해시는 곧 신분증입니다 — 탈취된 해시는 크래킹할 필요 없이 그대로 열쇠가 됩니다."
경로 해석 검증법: ① 경로의 모든 엣지가 빠짐없이 표의 행으로 번역됐는가. ② 각 행에 "무엇을 얻어 다음으로 가는가"가 보이는가. ③ PtH 증거(whoami 결과) 또는 실패 해석(STATUS_LOGON_FAILURE의 후보 분석)이 붙었는가.
방어 분석의 모범: "이 경로에서 가장 끊기 쉬운 엣지는 HasSession이다 — bob 같은 고권한 계정이 DB01 같은 일반 서버에 세션을 남기지 않게 하면(전용 관리 워크스테이션 정책), 수확할 자격증명이 사라져 경로가 끊긴다." — 엣지 하나를 끊는 것이 전체 경로를 무산시킨다는 이해가 핵심입니다.
연습문제 해답
문제 1 해답. 인증의 증거 재료가 평문이 아니라 해시이므로, 검증을 통과하는 데 필요한 전부가 해시입니다. 공격자는 해시로 챌린지를 암호화해 올바른 응답을 만들 수 있고, 서버는 그것이 탈취품인지 구분할 방법이 없습니다. 크래킹(평문 복구)이 필요 없는 탈취 — 이것이 PtH가 무서운 이유이고, 해시 저장소(SAM, 메모리)의 보호가 곧 계정 보호인 이유입니다.
문제 2 해답. 공격자에게 HasSession은 "저 컴퓨터에 이 계정의 자격증명이 지금 살아 있다" — 즉 관리자 권한만 얻으면 수확 가능한 수확물의 위치 표시입니다. 방어자의 방법: 고권한 계정은 전용 관리 장치에서만 로그인하게 하고 일반 서버에는 로그인시키지 않기(티어드 관리), 불필요한 세션 잔류를 줄이기 — 세션이 없으면 이 엣지는 존재 자체를 하지 않습니다.
문제 3 해답. PtH 횡적 이동의 연료는 "여러 머신에 통하는 같은 해시"입니다 — 전 머신이 같은 로컬 관리자 비밀번호를 쓰면 한 대의 덤프가 전부의 열쇠입니다. LAPS는 머신마다 다른 무작위 비밀번호를 AD가 관리하므로, 머신 A에서 얻은 해시는 A에서만 유효하고 B에서는 STATUS_LOGON_FAILURE입니다. 해시 재사용의 고리가 끊기며 횡적 이동이 머신 단위로 멈춥니다.
문제 4 해답. PtH는 NTLM의 챌린지-응답이 "해시로 응답을 만든다"는 성질에 기대므로, NTLM 자체가 없으면 그 성질을 이용할 대상이 사라집니다. 그러나 Kerberos에는 Kerberos의 자격증명 공격이 있습니다 — 서비스 티켓 크래킹(Kerberoasting), 사전 인증 해제 계정(AS-REP Roasting)이 NTLM 없이도 성립합니다 (Step 262). 프로토콜을 갈아도 "암호문을 가져다 오프라인에서 깐다"는 형태의 위험은 설계를 바꿔야 사라집니다.
완료 기준 체크리스트
- [ ] NTLM 챌린지-응답의 네 단계를 그릴 수 있다
- [ ] "해시 = 비밀번호"가 성립하는 이유를 한 문장으로 말할 수 있다
- [ ]
psexec.py -hashes명령의 구조와 출력을 읽는다 - [ ]
STATUS_LOGON_FAILURE의 원인 후보 세 가지를 안다 - [ ] BloodHound의 노드/엣지와 대표 엣지(MemberOf·AdminTo·HasSession)를 설명한다
- [ ] 경로 그래프를 공격 단계 표로 번역할 수 있다
- [ ] 미션: 원리 문단 +
ad-경로-분석.md를 완성했다
6. 흔한 실수와 해결
벽 1. psexec.py가 STATUS_LOGON_FAILURE를 낸다
증상 (출력 예시): [-] SMB SessionError: STATUS_LOGON_FAILURE(...)
원인 후보: 3-3에서 본 세 가지 — 해시 불일치(머신마다 다른 비밀번호 = LAPS), NTLM 비활성화 환경, 계정 잠김.
해결: 먼저 해시가 어느 계정의 것인지 확인하세요 — 로컬 관리자 해시는 그 머신의 것이고, 도메인 계정 해시는 도메인 전체에서 시도할 수 있습니다. 도메인 계정인데도 실패하면 NTLM 비활성화를 의심하고 Kerberos 경로(Step 262)로 전환합니다. 실패를 "막힘"이 아니라 "이 환경의 방어 측정값"으로 기록하는 습관을 들이세요.
벽 2. 해시 형식을 잘못 넣는다
증상: -hashes에 붙인 값으로 인증이 안 됩니다.
원인: 형식은 LM:NT 쌍인데, 유명한 빈 LM 값(aad3b435b51404eeaad3b435b51404ee)을 빼먹거나, NT만 쓸 때 앞의 콜론을 빼먹는 실수가 잦습니다.
해결: NT 해시만 있을 때의 정답 형식은 -hashes :NT해시입니다 — 앞의 콜론이 "LM은 비어 있음" 표시입니다. 덤프 도구의 출력을 통째로 베끼는 것이 가장 안전합니다.
벽 3. BloodHound가 안 뜬다 — neo4j 설치의 늪
증상: GUI는 켜지는데 DB 연결 오류, 또는 neo4j 설치에서 시간을 다 씁니다.
원인: BloodHound는 뒤에 neo4j 그래프 DB가 필요한데, 버전 궁합이 까다롭기로 유명합니다.
해결: 수동 설치와 싸우지 말고 docker compose 구성을 쓰세요 — 최신 BloodHound(CE)는 공식 compose 파일 한 장으로 DB까지 통째로 뜹니다. 랩에서 도구 설치에 시간을 쓰는 것은 본말전도 — 컨테이너로 올리고 본론(그래프 읽기)으로 가세요.
벽 4. 수집은 했는데 그래프가 비어 있다
증상: zip을 넣었는데 경로가 안 나옵니다.
원인 후보: ① 수집 옵션이 부족 — 세션 정보(HasSession)는 별도 수집이 필요합니다. ② 정말로 경로가 없음(잘 관리된 도메인).
해결: -c All로 전부 수집했는지 확인하세요. 그래도 비어 있으면 그것이 결론일 수 있습니다 — "지금 내 계정에서 DA까지 이어진 선이 없다"는, 방어가 잘된 환경의 증거이자 보고서의 한 줄입니다. 그때는 다른 시작점(다른 계정 수확)을 노립니다.
벽 5. 그래프가 너무 복잡해서 못 읽겠다
증상: 노드 수백 개에 엣지가 얽혀 미로처럼 보입니다.
원인: 정상입니다 — 실제 도메인의 그래프는 원래 그렇게 생겼습니다.
해결: 전체를 보려 하지 마세요. BloodHound의 미리 만들어진 쿼리 — "Shortest Path to Domain Admins", "Find Principals with DCSync Rights" 등 — 가 필터 역할을 해 줍니다. 쿼리 하나 실행 → 나온 경로 하나만 3-6 표로 번역 → 다음 쿼리. 미로 전체를 이해하는 일이 아니라, 미로에서 길 하나를 뽑아 읽는 일이 오늘의 기술입니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| Pass-the-Hash | 평문 없이 NT 해시로 NTLM 인증 — 해시가 곧 신분 |
| 챌린지-응답 | 서버가 검증하는 것은 해시로 만든 응답 — PtH의 근거 |
| 횡적 이동 | 자격증명을 수확하며 옆 머신으로 퍼져 나가기 |
| BloodHound | AD 관계를 그래프로 — "DA까지 최단 경로" 계산기 |
| 노드/엣지 | 점(계정·그룹·머신)과 선(MemberOf·AdminTo·HasSession) |
| LAPS | 머신마다 다른 로컬 관리자 비밀번호 — 해시 재사용 차단 |
| HasSession 관리 | 고권한 세션의 잔류 금지 — 경로 끊기의 핵심 엣지 |
오늘의 명령어 (전부 출력 예시)
| 명령 | 하는 일 |
|---|---|
psexec.py 도메인/사용자@IP -hashes :NT해시 |
해시만으로 원격 인증·쉘 |
bloodhound-python -u ... -d 도메인 -c All |
도메인 관계 데이터 수집 |
SharpHound.exe -c All |
윈도우 측 수집기 (Defender 탐지 대상) |
| "Shortest Path to Domain Admins" | BloodHound GUI의 왕좌 경로 쿼리 |
명령어보다 중요한 감각
Step 261에서 그린 지도, 262에서 깐 티켓, 오늘의 해시와 그래프 — AD 3부작은 사실 하나의 이야기입니다. "자격증명은 형태를 바꿔 재사용되고, 관계는 계산 가능한 지도다." 평문이든 해시든 티켓이든, 손에 넣은 자격증명은 다음 문을 열고, BloodHound는 그 문들이 이어지는 길을 보여 줍니다. 방어자가 이 연재를 끊는 방법도 같은 눈으로 — 비밀번호를 크래킹 불가능하게 만들고(gMSA), 해시 재사용을 끊고(LAPS), 세션을 남기지 않고(HasSession 관리), 경로를 짧게 유지하는 것. 공격자가 지도를 읽는 만큼, 방어자도 지도를 읽어야 합니다 — 같은 그래프를 두고 벌이는 눈치 싸움이 AD 보안의 본모습입니다.
전부 체크되면 Step 263 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.