Multicast DNS (mDNS) é um **protocolo de configuração zero** que permite realizar **operações semelhantes ao DNS** na rede local na ausência de um servidor DNS convencional unicast. O protocolo usa a **mesma** API, **formatos de pacote** e semântica de operação que o DNS, permitindo resolver nomes de domínio na rede local. **DNS Service Discovery (DNS-SD)** é um protocolo que permite aos clientes **descobrir uma lista de instâncias nomeadas de serviços** (como test.\_ipps.\_tcp.local, ou linux.\_ssh.\_tcp.local) em um domínio usando consultas DNS padrão. O DNS-SD é mais frequentemente usado em conjunto com o mDNS, mas não depende dele. Ambos são usados por muitos dispositivos IoT, como impressoras de rede, Apple TVs, Google Chromecast, dispositivos de armazenamento conectados à rede (NAS) e câmeras.\
Os dispositivos usam o mDNS quando a rede local **não possui** um **servidor DNS unicast convencional**. Para resolver um nome de domínio para um endereço local usando o mDNS, o dispositivo envia uma **consulta DNS para um nome de domínio** terminando com **.local** para o **endereço multicast****224.0.0.251** (para IPv4) ou **FF02::FB** (para IPv6). Você também pode usar o mDNS para resolver **nomes de domínio globais** (não .local), mas as implementações do mDNS devem **desativar** esse comportamento por padrão. As solicitações e respostas do mDNS usam **UDP** e a **porta 5353** como porta de origem e destino.
As respostas do mDNS contêm várias flags importantes, incluindo um valor de **Tempo de Vida** (TTL) que significa quantos segundos o registro é válido. O envio de uma resposta com **TTL=0 significa que o registro correspondente deve ser apagado**. Outra flag importante é o bit QU, que denota se a consulta é uma consulta unicast. Se o **bit QU não estiver definido**, o pacote é uma consulta multicast (QM). Como é possível **receber consultas unicast fora do link local**, as implementações seguras do mDNS devem sempre **verificar se o endereço de origem no pacote corresponde ao intervalo de endereços da sub-rede local**.
O DNS-SD permite que os clientes **descubram serviços disponíveis na rede**. Para usá-lo, os clientes enviam consultas DNS padrão para registros de ponteiro (PTR), que mapeiam o tipo de serviço para uma lista de nomes de instâncias específicas desse tipo de serviço.
Para solicitar um registro PTR, os clientes usam a forma de nome "\<Serviço>.\<Domínio>". A parte **\<Serviço>** é o **nome do serviço** precedido por "\_" (por exemplo, \_ipps, \_printer ou \_ipp) e **\_tcp ou \_udp**. A parte **\<Domínio>** é "**.local**".\
Os **respondedores** retornam então os registros PTR que apontam para os registros de **serviço (SRV)** e **texto (TXT)** correspondentes. Aqui está um exemplo de um registro PTR:
A parte do registro PTR à **esquerda** do dois pontos é o seu **nome**, e a parte à **direita** é o registro **SRV** para o qual o registro PTR aponta. O registro **SRV** lista o **host** e a **porta** de destino onde a instância do **serviço** pode ser alcançada. Por exemplo, a próxima imagem mostra um registro SRV "test.\_ipps.\_tcp.local" no Wireshark no host ubuntu.local e na porta 8000:
Portanto, o **nome do registro SRV** é **semelhante** ao registro **PTR****precedido** pelo nome da **\<Instância>** (test neste caso). O **TXT** tem o **mesmo nome** que o registro **SRV** e contém as informações necessárias quando o endereço IP e o número da porta (contidos no registro SRV) para um serviço não são suficientes para identificá-lo.
Você pode usar a ferramenta [**Pholus**](https://github.com/aatlasis/Pholus/) para enviar solicitações mDNS (-rq) na rede local e capturar tráfego mDNS multicast (por -stimeout 10 segundos):
Quando um respondedor mDNS inicia ou altera sua conectividade, ele pergunta à rede local se há **qualquer recurso com o nome que ele planeja usar**. Se a resposta contiver o registro em questão, o host de probing **deve escolher um novo nome**. Se 15 conflitos ocorrerem dentro de 10 segundos, o host deve esperar pelo menos cinco segundos antes de qualquer tentativa adicional. Além disso, se um minuto passar durante o qual o host não conseguir encontrar um nome não utilizado, ele reportará um erro ao usuário.
O seguinte comando de linha de comando impedirá que qualquer novo dispositivo obtenha um novo nome, pois indicará que **qualquer nome já está sendo usado**:
O ataque mais interessante que você pode realizar neste serviço é realizar um **MitM** na **comunicação entre o cliente e o servidor real**. Você pode ser capaz de obter arquivos sensíveis (MitM a comunicação com a impressora) ou até mesmo credenciais (autenticação do Windows).\
* [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)
- Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
- Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
- **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me no****Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.