¿alguna forma de descubrir dispositivos Android en tu red?


Quiero ser capaz de descubrir dispositivos Android en mi red y posiblemente recuperar alguna información del dispositivo sobre ellos. Esto es muy fácil con los dispositivos Apple, ya que ejecutan servicios Bonjour. Sin embargo, parece que no puedo encontrar ningún servicio similar que se ejecute en Android.

Esto debe funcionar sin modificar el dispositivo Android, instalar algún servicio o abrir algún puerto. Está destinado a trabajar con dispositivos Android de vainilla de la manera en que Bonjour te ayuda a encontrar dispositivos Apple de vainilla. Incluso ser capaz de verificar que el dispositivo está ejecutando Android sería suficiente.


Respuesta elegida: Aunque no es la respuesta mejor valorada (todavía), por favor eche un vistazo a la respuesta de Luis. Como menciona, puede usar una búsqueda de DNS (utilizando su servidor DNS local) para descubrir dispositivos Android. He encontrado que esto tiene una tasa de éxito del 100%, ya que Android obliga a los dispositivos a usar un nombre de host de Android-_____. Esto es aparentemente difícil de cambiar en el teléfono, incluso si está arraigado. Así que creo que este es un método bastante preciso. Gracias, Luis!

Example:
$ nslookup 192.168.1.104 192.168.1.1
Server:     192.168.1.1
Address:    192.168.1.1#53

104.1.168.192.in-addr.arpa  name = android-711c129e251f14cf.\001.

Código de ejemplo: Si desea implementar esto en Java (por ejemplo, para ejecutarse en Android), no puede usar fácilmente getHostName() porque utiliza los servidores DNS externos. Desea utilizar el servidor DNS local en su enrutador, por ejemplo. Luis menciona a continuación que podría modificar los servidores DNS de la conexión Wifi, pero que posiblemente podría romper otras cosas. En cambio, he encontrado la biblioteca dnsjava es extremadamente útil para enviar solicitudes DNS específicas. Aquí hay un ejemplo de código usando la biblioteca:

        String ipAddress = "104.1.168.192";
        String dnsblDomain = "in-addr.arpa";
        Record[] records;
        Lookup lookup = new Lookup(ipAddress + "." + dnsblDomain, Type.PTR);
        SimpleResolver resolver = new SimpleResolver();
        resolver.setAddress(InetAddress.getByName("192.168.1.1"));
        lookup.setResolver(resolver);
        records = lookup.run();

        if(lookup.getResult() == Lookup.SUCCESSFUL) {
              for (int i = 0; i < records.length; i++) {
                if(records[i] instanceof PTRRecord) {
                  PTRRecord ptr = (PTRRecord) records[i];
                  System.out.println("DNS Record: " + records[0].rdataToString());
                }
              }
        } else {
            System.out.println("Failed lookup");
        }

    } catch(Exception e) { 
        System.out.println("Exception: " + e);
    }

Esto me da la salida:

DNS Record: android-711c129e251f14cf.\001.

Bingo.

Author: gnychis, 2012-11-02

7 answers

Hay un enfoque muy simple que me dio resultados positivos en pocos dispositivos diferentes.

Cuando un dispositivo se conecta a su enrutador, recibe una IP (es decir, DHCP) y registra un nombre en DNS. El nombre que se registra parece estar siempre en la forma android_nnnnnnnn.

De cource, puede nombrar cualquier equipo con el mismo enfoque y engañar a la comprobación, lo que resulta en falsos positivos ...

Además, no puedo asegurar que todos los proveedores de dispositivos estén siguiendo el mismo enfoque, pero he descubrí que funciona correctamente en algunos dispositivos de diferentes marcas (incluidos diferentes niveles de SDK) que he probado.

EDITED EDITADO {

Cómo hacerlo

Depende de dónde estaría ejecutando el código para descubrir los dispositivos Android. Suponiendo que usted estaría ejecutando el código en un dispositivo Android:

  1. Primero descubra los dispositivos que responden a Ping en su red. Puedes usar el código en mi respuesta a este post: execComd () para ejecutar un ping comando.
  2. Obtenga el nombre de los dispositivos que responden usando el código:

    InetAddress InetAddress = InetAddress.getByName (string_with_ip_addr);

    String name = InetAddress.getCanonicalHostName();

EDIT EDITAR 2 {

Prueba de concepto

El método de abajo es solo un prof de concepto para lo que he escrito anteriormente.

Estoy usando el método isReachable() para generar la solicitud ICMP, que se dice en muchos posts que solo funciona con dispositivos rooteados, que es el caso del dispositivo utilizado para probarlo. Sin embargo, no le di permisos de root a la aplicación que ejecuta este código, así que creo que no pudo establecer el bit SIUD, que es la razón por la que algunos clain este método falla. Me gustaría aquí de alguien que lo prueba en un dispositivo no arraigado.

Para llamar use:

ArrayList<String> hosts = scanSubNet("192.168.1.");

Devuelve en hosts una lista de nombres para los dispositivos que responden a la solicitud ping.

private ArrayList<String> scanSubNet(String subnet){
    ArrayList<String> hosts = new ArrayList<String>();

    InetAddress inetAddress = null;
    for(int i=1; i<10; i++){
        Log.d(TAG, "Trying: " + subnet + String.valueOf(i));
        try {
            inetAddress = InetAddress.getByName(subnet + String.valueOf(i));
            if(inetAddress.isReachable(1000)){
                hosts.add(inetAddress.getHostName());
                Log.d(TAG, inetAddress.getHostName());
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return hosts;
}

Saludos.

 31
Author: Luis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:03:05

Android no va a ser tan fácil como iOS. No hay equivalente a Bonjour.

Android 4.0, Ice Cream Sandwich, introducido Wi-Fi Direct Redes de igual a igual. Al principio esperaba que podría ser capaz de ser escaneado en la forma en que su pensamiento, pero ayuda a los dispositivos Android comunicarse sin un punto de acceso, por lo que no son realmente "en su red". Además, ICS se ejecuta en solo una fracción de los dispositivos Android.

En lugar de un enfoque netscan activo, se queda con un enfoque de monitoreo pasivo. Si su red es segura, es posible rastrear el paquete cifrado, pero es inconveniente. Tendrás que

Si quieres ver esto en acción, Wireshark soporta WPA descifrado.

Una vez que pueda ver el tráfico Wi-Fi, notará que los dispositivos Android tienden a comunicarse con ciertos servidores de Google y sus conexiones HTTP tienen cadenas de agentes de usuario que se pueden identificar. Esta es la base para una solución pasiva viable.

Tenable Network Security ofrece productos que parecen adoptar este tipo de enfoque.

Otra idea

@ Michelle Cannon mencionó Meshlium Xtreme de Libelium cuyo enfoque no te llevará hasta allí (no sin buenas tablas de rango de direcciones MAC actualizadas). Pero podría ser parte de alcanzar un objetivo menor. Usted puede:

  • Detectar todos los dispositivos inalámbricos
  • Elimine los dispositivos Apple utilizando el Identificador Único Organizacional (OUI)
  • Tell it's a mobile device by by monitoring signal strength to determine it's moving (and mobile devices will tend to show up and go away)
  • Es posible que pueda usar el MAC OUI como una pista es Android
  • Usted puede ser capaz de utilizar el MAC OUI como una pista que no es Android (pero una computadora portátil o tarjeta inalámbrica, etc.).

Esto puede ser viable si está dispuesto a detectar dispositivos que son probablemente Android.

DHCP Fingerprinting

@Michelle Cannon sugirió las huellas dactilares DHCP. No estaba seguro al principio, pero tengo que agradecerle por sugerir lo que parece ser la mejor opción para el escaneo pasivo simple. Como advertencia, me gustaría explicar por qué llegué tarde a la fiesta.

Hay cosas que sabemos, que pensamos que no sabemos, y cosas que pensamos que sabemos pero que están equivocadas.

En muchos sentidos, es bueno que Android use el kernel de Linux. Pero no es bueno si quieres descubrir dispositivos Android en tu red. La pila TCP/IP de Android es Linux, por lo tanto, los dispositivos Android se verán como dispositivos Linux o eso pensé al principio. Pero luego me di cuenta de que Linux tiene muchos de parámetros de configuración de compilación, por lo que podría haber algo distintivo acerca de Android cuando se ve en una red, pero ¿qué?

DHCP fingerprinting utiliza las opciones DHCP exactas solicitadas por el dispositivo más el tiempo. Para que esto funcione, generalmente necesita una base de datos de huellas dactilares actualizada para que coincida con. Al principio parecía que fingerbank estaba lleno de fuentes de estos datos, pero luego me di cuenta de que sus archivos no se habían actualizado durante casi un año. Con todos los diferentes tipos de dispositivos Android, no creo que sea práctico mantenerse actualizado huellas dactilares para un solo proyecto.

Pero luego miré las firmas DHCP reales para Android y me di cuenta de esto:

Android 1.0:     dhcpvendorcode=dhcpcd 4.0.0-beta9
Android 1.5-2.1: dhcpvendorcode=dhcpcd 4.0.1
Android 2.2:     dhcpvendorcode=dhcpcd 4.0.15
Android 3.0:     dhcpvendorcode=dhcpcd-5.2.10 

Linux normalmente usa dhclient como su cliente DHCP, pero Android está usando dhcpcd. Android tiene una fuerte preferencia por el uso de software con licencia con el estilo BSD cuando sea posible y dhcpcd utiliza una licencia BSD. Parecería dhcpvendorcode podría ser utilizado como un fuerte indicador de que un dispositivo móvil está ejecutando Android.

Monitoreo DHCP

A el cliente utiliza DHCP para obtener una dirección IP al unirse a una red, por lo que se inicia sin una dirección IP. Evita este problema mediante el uso de transmisiones UDP para el intercambio inicial. En Wi-Fi, incluso con WPA, el tráfico de difusión no está cifrado. Por lo tanto, solo puede escuchar en el puerto UDP 67 para el tráfico de cliente a servidor y 68 para el inverso. Ni siquiera necesita poner su interfaz de red en modo promiscuo. Puede monitorear fácilmente este tráfico usando un analizador de protocolos como Wireshark.

I prefirió escribir código para monitorear el tráfico y decidió usar Python. Seleccioné pydhcplib para manejar los detalles de DHCP. Mi experiencia con esta biblioteca no fue fluida. Necesitaba descargar y colocar manualmente IN.py y TYPES.py archivos de soporte. Y su conversión de paquetes a cadenas dejaba el dhcpvendorfode en blanco. Analizó los paquetes DHCP correctamente, así que escribí mi propio código de impresión.

Aquí está el código que monitorea el tráfico DHCP del cliente al servidor:

#!/usr/bin/python
from pydhcplib.dhcp_packet import *
from pydhcplib.dhcp_network import *
from pydhcplib.dhcp_constants import *


netopt = {
    'client_listen_port':"68",
    'server_listen_port':"67",
    'listen_address':"0.0.0.0"
}

class Server(DhcpServer):
    def __init__(self, options):
        DhcpServer.__init__(
            self,options["listen_address"],
            options["client_listen_port"],
            options["server_listen_port"])

    def PrintOptions(self, packet, options=['vendor_class', 'host_name', 'chaddr']):

        # uncomment next line to print full details
        # print packet.str()

        for option in options:
            # chaddr is not really and option, it's in the fixed header
            if option == 'chaddr':
                begin = DhcpFields[option][0]
                end = begin+6
                opdata = packet.packet_data[begin:end]
                hex = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']
                print option+':', ':'.join([(hex[i/16]+hex[i%16]) for i in opdata])
            else:
                opdata = packet.options_data.get(option)
                if opdata:
                    print option+':', ''.join([chr(i) for i in opdata if i != 0])
        print

    def HandleDhcpDiscover(self, packet):
        print "DHCP DISCOVER"
        self.PrintOptions(packet)
    def HandleDhcpRequest(self, packet):
        print "DHCP REQUEST"
        self.PrintOptions(packet)

    ##  def HandleDhcpDecline(self, packet):
    ##      self.PrintOptions(packet)
    ##  def HandleDhcpRelease(self, packet):
    ##      self.PrintOptions(packet)
    ##  def HandleDhcpInform(self, packet):
    ##      self.PrintOptions(packet)


server = Server(netopt)

while True :
    server.GetNextDhcpPacket()

Esto el código se basa en el ejemplo de servidor de pydhcplib porque escucha las solicitudes de los clientes, como un servidor.

Cuando mi Nexus 7 Android 4.2 tablet se conecta, esta información interesante se captura (eliminado):

DHCP REQUEST
vendor_class: dhcpcd-5.5.6
host_name: android-5c1b97cdffffffff
chaddr: 10:bf:48:ff:ff:ff

DHCP DISCOVER
vendor_class: dhcpcd-5.5.6
host_name: android-5c1b97cdffffffff
chaddr: 10:bf:48:ff:ff:ff

El nombre de host parece tener un formato fijo y se analiza fácilmente. Si necesita la dirección IP, puede supervisar el tráfico del servidor al cliente. Nota: solo el intercambio inicial, cuando un nuevo cliente aparece por primera vez sin una dirección IP, se transmite. Futuras extensiones de arrendamiento, etc., no se emiten.

Búsqueda inversa de DNS

@Luis publicó una gran solución que demuestra lo simple que es mejor. Incluso después de ver el cliente DHCP de Android estaba configurando host_name a android-5c1b97cdffffffff, no pensé en preguntar al enrutador por su lista de nombres utilizando búsquedas DNS inversas. El enrutador agrega el host_name a su servidor DNS para que pueda acceder al dispositivo si cambia su dirección IP.

Se espera que el host_name permanezca listado en el DNS para la duración del contrato de arrendamiento DHCP. Usted podría comprobar si el dispositivo todavía está presente por haciendo ping.

Un inconveniente de depender del host_name es que hay formas en que esto podría cambiarse. Es fácil para el fabricante del dispositivo o el operador cambiar el host_name (aunque después de buscar, no he podido encontrar ninguna evidencia que alguna vez tengan). Hay aplicaciones para cambiar el nombre de host, pero requieren root, por lo que es, a lo sumo, un caso de borde.

Finalmente hay un abierto Problema de Android 6111: Permite especificar un nombre de host que actualmente tiene 629 estrellas. No sería sorprendente ver configurable host_name en la configuración de Android en algún momento en el futuro, tal vez pronto. Así que si comienza a depender de host_name para identificar dispositivos Android, darse cuenta de que podría ser arrancado de debajo de usted.

Si está haciendo seguimiento en vivo, otro problema potencial con la Búsqueda inversa de DNS es que tiene que decidir con qué frecuencia escanear. (Por supuesto, esto no es un problema si solo estás tomando una instantánea de una sola vez.) El escaneo frecuente consume recursos de red, lo infrecuente lo deja con datos obsoletos. Así es como agregar monitoreo DHCP puede ayudar:

  • Al iniciar use la búsqueda inversa de DNS para encontrar dispositivos
  • Ping dispositivos para ver si todavía están activos
  • Monitoree el tráfico DHCP para detectar nuevos dispositivos al instante
  • Ocasionalmente vuelve a ejecutar la búsqueda de DNS para encontrar dispositivos que podrías haber perdido
  • Si necesita notar que los dispositivos se van, ping dispositivos a la resolución de tiempo deseada

Si bien no es fácil (ni 100% preciso), hay varias técnicas que hacen que sea posible descubrir dispositivos Android en su red.

 21
Author: jimhark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-29 00:44:54

AFAIK, sistema Android no proporciona ningún zeroconf aplicación/servicio en su sistema integrado app/pila de servicios. Para habilitar la detección automática en el dispositivo real conectado a la red local, necesita instalar alguna aplicación zeroconf de terceros o desarrollar su propia aplicación/servicio e instalarla en el dispositivo real, algunas opciones de API son:

No estoy muy claro acerca de sus requisitos, si desea algo similar (es decir, auto discover and connect) en dispositivos Android vanilla, probablemente puede usar Wi-Fi direct que ahora está disponible en algún dispositivo posterior que ejecute Android 4.0, sin embargo, requiere que ambos dispositivos admitan Wi-Fi Direct y solo creen una conexión P2P ad-hoc con Wi-Fi desactivado, al igual que una conexión bluetooth con rango:

introduzca la descripción de la imagen aquí

Para obtener compatibilidad con Wi-Fi Direct API, consulta la guía oficial - Conectar dispositivos de forma inalámbrica.

 5
Author: yorkw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-18 04:49:34

Estoy mirando esto un pensamiento

Http://www.libelium.com/smartphones_iphone_android_detection

Preste especial atención a esto

¿Los usuarios necesitan tener instalada una aplicación específica o interactuar de alguna manera para ser detectados?

No, el escaneo se realiza en silencio, Meshlium solo detecta los "marcos de baliza" originados por las radios Wifi y Bluetooth integradas en los teléfonos inteligentes. Los usuarios solo necesitan tener al menos una de las dos interfaces inalámbricas encendidas en.

Hace mucho tiempo que uso una aplicación llamada stumbler en mi mac para encontrar redes wifi, creo que esto es similar

Otras ideas

Bueno, si necesito determinar los teléfonos Android en una red local cómo lo haría. Ausente de un servicio dns en ejecución solo tengo un par de posibilidades

El SSID si se está emitiendo - no me puede decir nada La dirección ip-android le permite tener mucho control sobre el nombre del host, así que supongo que podría definir un rango de ip específico para tus dispositivos Android. - no es muy útil.

Alternativamente, digamos que veo un dispositivo desconocido en la red, si Bluetooth está activado, estoy transmitiendo una firma de dispositivo bluetooth SDPP que puedo usar para deducir mi tipo de dispositivo.

Si estuviera ejecutando un servicio compatible con Android y quisiera descubrir dispositivos Android específicos en mi red, entonces podría registrar las direcciones mac de esos dispositivos y vigilarlos en la red.

Aparte de eso, lo haría necesita ejecutar un bonjour (dns-sd) o un upnpp dameon en el dispositivo.

 2
Author: Michelle Cannon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-21 20:20:48

Respuesta actualizada

Lo siento, no he entendido correctamente la pregunta original. Solo su comentario me dejó muy claro que no desea tener que instalar nada en los dispositivos de destino, sino que solo desea una forma de descubrir teléfonos aleatorios en su red.

No estoy seguro de si esto realmente sería posible de la manera que lo desea. Sin tener ningún servicio de detección de red que se ejecute en Android, no encontrará el dispositivo en primer lugar. De por supuesto, puede usar algunos protocolos de red de bajo nivel, pero eso solo le daría un indicador de que hay algo, pero no lo que es (ser un dispositivo Android, una PC, una cualquier otra cosa).

El enfoque más prometedor sería comprobar si hay aplicaciones preinstaladas que tengan algún tipo de funcionalidad de red. Por ejemplo, los dispositivos Samsung tienen Kies Air (si el usuario lo habilita), Motorola está utilizando UPnP para su servidor de medios y HTC tiene algo propio también, si no recuerdo mal. Sin embargo, no hay aplicación que se instala en todos los dispositivos Android de todos los proveedores y operadores. Por lo tanto, no puede confiar únicamente en uno de ellos, pero tendría que verificar varios servicios diferentes utilizando sus protocolos y comportamientos específicos para obtener información adicional sobre el dispositivo. Y, por supuesto, el usuario tendría que habilitar la funcionalidad para que usted pueda usarla.

Antigua respuesta

Una alternativa adicional a la lista de yorkw es AllJoyn de Qualcomm. Es un descubrimiento multiplataforma de código abierto y marco de comunicación peer-to-peer que ya he utilizado en el pasado.

Aunque Qualcomm es un gran patrocinador de AllJoyn, esto no significa que necesite un chipset Qualcomm en su definición. De hecho AllJoyn funciona en cualquier chipset incluyendo Intel y nVidia. No requiere teléfonos arraigados o cualquier otra modificación al marco de Android y solo funciona "fuera de la caja" utilizando Wi-Fi y/o Bluetooth como métodos de emparejamiento.

 1
Author: André,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-18 16:41:44

Estoy aprendiendo mucho de este tema.

También hay algo llamado huellas dactilares dhcp, aparentemente diferentes dispositivos actúan de manera diferente al tipo de análisis de red que hemos estado discutiendo, como los que utilizan NMAP un escáner de Linux. Los mapas del comportamiento de estas sondas están disponibles en el Internet.

Http://www.enterasys.com/company/literature/device-profiling-sab.pdf

Https://media.defcon.org/dc-19/presentations/Bilodeau/DEFCON-19-Bilodeau-FingerBank.pdf

Http://community.arubanetworks.com/t5/ArubaOS-and-Mobility-Controllers/COTD-DHCP-Fingerprinting-how-to-ArubaOS-6-0-1-0-and-above/td-p/11164

Http://myweb.cableone.net/xnih /

 1
Author: Michelle Cannon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-22 00:45:14

Aquí hay un trazador de líneas que hace ping a todas las máquinas en su red (suponiendo que su red es 192.168.1.x) y hace una búsqueda inversa en sus nombres:

for i in {1..255}; do echo ping -t 4 192.168.1.${i} ; done | parallel -j 0 --no-notice 2> /dev/null | awk '/ttl/ { print $4 }' | sort | uniq | sed 's/://' | xargs -n 1 host 

Requiere GNU parallel para funcionar. Puede instalar eso en OSX usando "brew install parallel"

A partir de esto, solo puede mirar los dispositivos llamados android-c40a2b8027d663dd.home. o lo que sea.

Luego puede intentar ejecutar nmap-O en un dispositivo para ver qué más puede averiguar:

sudo nmap -O android-297e7f9fccaa5b5f.home.

Pero no es realmente tan fructífero.

 0
Author: Will Schenk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-01 17:53:40