udfx.git

udfx

~
git clone https://github.com/debuman/udfx.git

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)