DEVELOPMENT.md (5817B)
1 # UDFX - Ultimate Domain Finder X 개발 명세서
2
3 ## 프로젝트 정보
4
5 | 항목 | 내용 |
6 |------|------|
7 | 프로젝트명 | UDFX (Ultimate Domain Finder X) |
8 | 버전 | 1.0.0 |
9 | 개발일 | 2025-02-06 |
10 | 개발언어 | PowerShell |
11 | 대상환경 | Windows Server / Windows 10+ |
12
13 ## 개발 배경
14
15 - 에어갭(Air-Gap) 환경에서 사용 가능한 도메인 탐색 도구 필요
16 - 기존 도구(usfx 등)는 인터넷 연결 또는 DNS 브루트포스 방식에 의존
17 - AD 통합 DNS의 경우 LDAP을 통해 직접 레코드 조회 가능
18
19 ## 아키텍처
20
21 ```
22 ┌─────────────────────────────────────────────────────────┐
23 │ UDFX (Get-ADDnsRecords.ps1) │
24 ├─────────────────────────────────────────────────────────┤
25 │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
26 │ │ Zone 검색 │→ │ Record 수집 │→ │ 결과 출력 │ │
27 │ │ (LDAP) │ │ (dnsRecord) │ │ (CSV/JSON/TXT) │ │
28 │ └─────────────┘ └─────────────┘ └─────────────────┘ │
29 └─────────────────────────────────────────────────────────┘
30 │
31 ▼
32 ┌────────────────────────┐
33 │ Active Directory │
34 │ DC=DomainDnsZones │
35 │ (LDAP Query) │
36 └────────────────────────┘
37 ```
38
39 ## 핵심 함수
40
41 ### Get-RootDomain
42
43 루트 도메인 추출 함수
44
45 ```powershell
46 function Get-RootDomain {
47 param([string]$domain)
48 # .co.kr, .or.kr 등 3단계 TLD 처리
49 # 일반 도메인: example.com → example.com
50 # 한국 도메인: example.co.kr → example.co.kr
51 }
52 ```
53
54 **지원 TLD:**
55 - 일반: .com, .net, .org, .io 등
56 - 한국: .co.kr, .or.kr, .go.kr, .ac.kr 등
57 - 영국: .co.uk, .org.uk 등
58 - 일본: .co.jp, .or.jp 등
59
60 ### Get-DnsNameFromRecord
61
62 AD DNS 바이너리 레코드에서 도메인명 추출
63
64 ```powershell
65 function Get-DnsNameFromRecord {
66 param(
67 [byte[]]$data,
68 [int]$offset
69 )
70 # DNS wire format (길이-프리픽스) 파싱
71 # 라벨별로 분리 후 점(.)으로 결합
72 }
73 ```
74
75 **DNS 레코드 바이너리 구조:**
76 ```
77 Offset | Size | Field
78 --------|------|------------------
79 0-1 | 2 | Data Length
80 2-3 | 2 | Record Type
81 4-7 | 4 | Version/Serial
82 8-11 | 4 | TTL
83 12-15 | 4 | Reserved
84 16-19 | 4 | Timestamp
85 20-23 | 4 | Reserved
86 24+ | N | Record Data
87 ```
88
89 ### Convert-DNSRecord
90
91 바이너리 DNS 레코드를 파싱하여 구조화된 데이터로 변환
92
93 ```powershell
94 function Convert-DNSRecord {
95 param([byte[]]$RecordData)
96 # Record Type에 따라 적절한 파싱 수행
97 # A: IPv4 (4 bytes)
98 # AAAA: IPv6 (16 bytes)
99 # NS/CNAME: DNS Name
100 # MX: Priority(2) + DNS Name
101 # SRV: Priority(2) + Weight(2) + Port(2) + DNS Name
102 }
103 ```
104
105 ## 레코드 타입 코드
106
107 | 타입 | 코드 | 데이터 형식 |
108 |------|------|-------------|
109 | A | 1 | 4 bytes (IPv4) |
110 | NS | 2 | DNS Name |
111 | CNAME | 5 | DNS Name |
112 | SOA | 6 | DNS Name + Serial 등 |
113 | PTR | 12 | DNS Name |
114 | MX | 15 | 2 bytes (Priority) + DNS Name |
115 | TXT | 16 | Length-prefixed string |
116 | AAAA | 28 | 16 bytes (IPv6) |
117 | SRV | 33 | 6 bytes (Pri/Wt/Port) + DNS Name |
118
119 ## LDAP 쿼리 구조
120
121 ### DNS Zone 검색
122
123 ```
124 Base DN: DC=DomainDnsZones,DC=corp,DC=example,DC=com
125 Filter: (objectClass=dnsZone)
126 ```
127
128 ### DNS Record 검색
129
130 ```
131 Base DN: DC=<ZoneName>,CN=MicrosoftDNS,DC=DomainDnsZones,...
132 Filter: (objectClass=dnsNode)
133 Attributes: name, dnsRecord
134 ```
135
136 ## 알려진 이슈
137
138 ### 1. NS/SRV 레코드 이름 파싱
139
140 **현상**: NS, SRV 레코드의 대상 호스트명이 점(.) 없이 출력됨
141
142 ```
143 예: hq-dc-01corpexamplecom (실제: hq-dc-01.corp.example.com)
144 ```
145
146 **원인**: AD DNS 바이너리 포맷의 첫 바이트(전체 이름 길이)와 라벨 구분 처리 문제
147
148 **상태**: 미해결 (A 레코드 IP는 정상 동작)
149
150 ### 2. SRV 레코드 포트/우선순위 값
151
152 **현상**: 포트, 우선순위, 가중치 값이 비정상적으로 표시됨
153
154 **원인**: 빅엔디안/리틀엔디안 바이트 순서 문제
155
156 **상태**: 부분 해결
157
158 ## 향후 개선 사항
159
160 1. [ ] NS/SRV 레코드 이름 파싱 정확도 개선
161 2. [ ] Excel 다중 시트 출력 지원 (COM 또는 ImportExcel 모듈)
162 3. [ ] 역방향 DNS (PTR) 대역 스캔 기능 추가
163 4. [ ] 결과 비교 기능 (이전 스캔과 차이점 분석)
164 5. [ ] HTML 리포트 생성 기능
165
166 ## 파일 구조
167
168 ```
169 UDFX/
170 ├── Get-ADDnsRecords.ps1 # 메인 스크립트
171 ├── README.md # 사용자 매뉴얼
172 ├── DEVELOPMENT.md # 개발 명세서
173 └── [출력 파일]
174 ├── dns_records.csv
175 ├── dns_records_root_domains.csv
176 ├── dns_records.json
177 └── dns_records.txt
178 ```
179
180 ## 참고 자료
181
182 - [MS-DNSP: Domain Name Service Protocol](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/)
183 - [AD DNS Record Binary Format](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/f97756c9-3783-428b-9451-b376f877f238)
184 - [USFX - Ultimate Subdomain Finder X](https://github.com/sqzer-x/usfx)