It only stays in monitor or promiscuous mode when a running process is holding it in that mode.
Embora isso seja verdade na maior parte do tempo quando corremos (no El Capitan):
# sudo tcpdump -p -I -i enX -y IEEE802_11
A interface pode ficar presa no modo monitor após o tcpdump sair (onde X
é uma placa de rede sem fio que suporta o modo monitor).
Note que eu digo "pode". Não é um erro. Algumas vezes retornou ao modo normal. Na maioria das vezes isso não aconteceu.
A execução deste comando corrigiu-o (que é a minha resposta à sua pergunta):
# sudo tcpdump -I -i enX -p
Isso nos levou a acreditar que há algo errado com o tcpdump ou Mac OS X e a forma como eles interagem entre si (o problema também pode estar na libpcap que fica no meio).
Procedeu-se a ler o código-fonte da libpcap e encontrou várias gemas preciosas sobre a alegria do modo de monitoração no Mac OS X que, por sua vez, apontou para o fato de selecionar um modo DLT específico (usando o sinalizador -y tcpdump) faria com que o Mac OS X colocasse a interface no modo monitor (sem trabalho adicional da libpcap). Além disso, ao contrário de outros sistemas, nenhuma limpeza especial do estado do modo monitor parece ocorrer na libpcap quando é executada no Mac OS X.
No nosso caso, é imperativo que consigamos obter quadros de gerenciamento 802.11 (solicitações de sondagem), mantendo a associação e a conectividade da estação base.
Acabamos construindo um programa que fazia interface diretamente com a libpcap e simplesmente solicitava o modo de monitoramento pcap_set_rfmon(pcap, 1)
(sem selecionar um modo DLT) antes de ativar a captura na interface.
Ao sair, o programa simplesmente fecha a alça de captura e tudo volta ao normal (o olho de Sauron desaparece) e a placa de rede ainda está associada à rede. O acesso à Internet está funcionando durante a execução.