10 KiB
5353/UDP マルチキャストDNS (mDNS) と DNS-SD
AWSハッキングをゼロからヒーローまで学ぶには htARTE (HackTricks AWS Red Team Expert)をご覧ください!
HackTricksをサポートする他の方法:
- HackTricksにあなたの会社を広告したい、またはHackTricksをPDFでダウンロードしたい場合は、サブスクリプションプランをチェックしてください!
- 公式PEASS & HackTricksグッズを入手する
- The PEASS Familyを発見し、独占的なNFTsのコレクションをご覧ください
- 💬 Discordグループに参加するか、テレグラムグループに参加するか、Twitter 🐦 @carlospolopmをフォローしてください。
- HackTricks と HackTricks Cloud のgithubリポジトリにPRを提出して、あなたのハッキングのコツを共有してください。
基本情報
マルチキャストDNS (mDNS) は、従来のユニキャストDNSサーバーがないローカルネットワークで DNSのような操作 を行うための ゼロ設定プロトコル です。このプロトコルは 同じ API、パケットフォーマット、およびDNSと同じ運用セマンティクスを使用し、ローカルネットワーク上でドメイン名を解決することができます。DNSサービス検出 (DNS-SD) は、標準DNSクエリを使用してドメイン内のサービスの名前付きインスタンスのリスト(例:test._ipps._tcp.local、またはlinux._ssh._tcp.local)をクライアントが 発見する ためのプロトコルです。DNS-SDは通常mDNSと組み合わせて使用されますが、それに依存しているわけではありません。これらは、ネットワークプリンター、Apple TV、Google Chromecast、ネットワーク接続ストレージ(NAS)デバイス、カメラなど、多くのIoTデバイスによって使用されています。
デフォルトポート: 5353/UDP
PORT STATE SERVICE
5353/udp open zeroconf
mDNSの仕組み
デバイスは、ローカルネットワークに従来のユニキャストDNSサーバーがない場合にmDNSを使用します。mDNSを使用してローカルアドレスのドメイン名を解決するには、デバイスは**.localで終わるドメイン名のDNSクエリをマルチキャスト** アドレス224.0.0.251(IPv4用)またはFF02::FB(IPv6用)に送信します。グローバルドメイン名(.local以外)を解決するためにもmDNSを使用することができますが、mDNSの実装ではこの動作をデフォルトで無効にすることになっています。mDNSのリクエストとレスポンスはUDPを使用し、ソースポートと宛先ポートの両方としてポート5353を使用します。
mDNSの返信には、レコードが有効である秒数を示すTime-to-Live(TTL)値など、いくつかの重要なフラグが含まれています。TTL=0で返信を送信すると、対応するレコードをクリアする必要があることを意味します。もう一つ重要なフラグはQUビットで、クエリがユニキャストクエリかどうかを示します。QUビットが設定されていない場合、パケットはマルチキャストクエリ(QM)です。ローカルリンクの外でユニキャストクエリを受信する可能性があるため、安全なmDNS実装では常にパケット内のソースアドレスがローカルサブネットアドレス範囲と一致するかどうかを確認する必要があります。
DNS-SDの仕組み
DNS-SDはクライアントがネットワーク上で利用可能なサービスを発見することを可能にします。これを使用するには、クライアントはポインタレコード(PTR)の標準DNSクエリを送信します。これはサービスの種類をそのサービスの特定のインスタンスの名前のリストにマッピングします。
PTRレコードを要求するには、クライアントは "<Service>.<Domain>" の形式の名前を使用します。<Service>部分はサービス名の前に "_"(例えば、_ipps、_printer、または_ipp)が付き、_tcpまたは_udpです。<Domain>部分は ".local" です。
応答者はその後、対応するサービス(SRV)およびテキスト(TXT)レコードを指すPTRレコードを返します。以下はPTRレコードの例です:
_ipps._tcp.local: type PTR, class IN, test._ipps._tcp.local
PTR レコードのコロンの左側の部分はその名前であり、右側の部分はPTRレコードが指すSRV レコードです。SRVレコードには、サービスインスタンスに到達できるターゲットホストとポートがリストされています。例えば、次の画像はWiresharkにおけるホストubuntu.localとポート8000での"test._ipps._tcp.local" SRVレコードを示しています:
したがって、SRVレコードの名前は、PTRレコードに**<Instance>名(この場合はtest)が先行しているようです**。TXTはSRVレコードと同じ名前を持ち、サービスを識別するためにIPアドレスとポート番号(SRVレコードに含まれる)だけでは不十分な場合に必要な情報を含んでいます。
列挙
nmap
nmap -Pn -sUC -p5353 192.168.1.2
Starting Nmap 6.46 (http://nmap.org) at 2015-01-01 10:30 GMT
Nmap scan report for 192.168.1.2
PORT STATE SERVICE
5353/udp open zeroconf
| dns-service-discovery:
| 9/tcp workstation
| Address=192.168.1.2
| 22/tcp ssh
| Address=192.168.1.2
| 22/tcp sftp-ssh
| Address=192.168.1.2
| 445/tcp smb
| Address=192.168.1.2
ネットワーク列挙
mDNSリクエストを送信し、マルチキャストmDNSトラフィックをキャプチャすることで、ローカルネットワークについて多くのことを学ぶことができます。
ローカルネットワーク上でmDNSリクエスト(-rq)を送信し、マルチキャストmDNSトラフィックをキャプチャするために、ツールPholusを使用できます(-stimeout 10秒間):
sudo python3 pholus3.py eth0 -rq -stimeout 10
攻撃
mDNS プロービングフェーズの悪用
mDNS レスポンダーが起動するか接続性が変わると、ローカルネットワークに使用しようとしている名前のリソースがあるかを問い合わせます。応答に該当するレコードが含まれている場合、プロービングホストは新しい名前を選ばなければなりません。10秒以内に15回の競合が発生した場合、ホストは追加の試みをする前に少なくとも5秒待たなければなりません。さらに、ホストが使用されていない名前を見つけられない1分間が経過すると、ユーザーにエラーを報告しなければなりません。
以下のコマンドラインは、任意の名前が既に取られていると示すことで、新しいデバイスが新しい名前を取得するのを防ぎます:
sudo python pholus.py eth0 -afre -stimeout 1000
スプーフィング/中間者攻撃
このサービスで実行できる最も興味深い攻撃は、クライアントと実際のサーバー間の通信に対して中間者攻撃(MitM)を行うことです。プリンターとの通信を中間者攻撃することで機密ファイルを、またはWindows認証を中間者攻撃することで資格情報を取得する可能性があります。
詳細については以下を確認してください:
{% content-ref url="../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md" %} spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md {% endcontent-ref %}
参考文献
AWSハッキングをゼロからヒーローまで学ぶには、 htARTE (HackTricks AWS Red Team Expert)をご覧ください!
HackTricksをサポートする他の方法:
- HackTricksにあなたの会社を広告したい、またはHackTricksをPDFでダウンロードしたい場合は、サブスクリプションプランをチェックしてください!
- 公式PEASS & HackTricksグッズを手に入れましょう。
- The PEASS Familyを発見し、独占的なNFTsのコレクションをチェックしてください。
- 💬 Discordグループやテレグラムグループに参加するか、Twitter 🐦 @carlospolopmでフォローしてください。
- HackTricksおよびHackTricks CloudのgithubリポジトリにPRを提出して、あなたのハッキングのコツを共有してください。