WiFinder es un sistema de advertencia con Python impulsado por Roommate

Estábamos todos ahí. Tu compañero de cuarto finalmente ha salido de la casa y tienes algo de tiempo a solas. Espera un minuto ... tu compañero de cuarto nunca dijo cuándo volverán. Sería bueno que se le avisara pronto. ¿Qué deberías hacer? [Mattia] atacó su cerebro en busca de una solución a este problema cuando se dio cuenta de que era tan simple. Sus compañeros de cuarto le advirtieron todo el tiempo. Simplemente no escuchó.

La mayoría de los lectores de La-Tecnologia probablemente tengan una red WiFi en sus hogares. La mayoría de las personas hoy en día tienen teléfonos celulares que están configurados para conectarse automáticamente a estas redes cuando se comunican. Esto suele ser inteligente porque puede ahorrarle dinero al no usar su costoso plan de datos 4G. [Mattia] se dio cuenta de que solo podía ver la red inalámbrica para ver cuándo aparecían repentinamente los teléfonos de sus compañeros de cuarto. Si sus dispositivos aparecen en la red, es probable que acaben de llegar y se dirijan a la puerta principal.

Entra un wifinder. Wifinder es un simple script de Python que Mattia escribió para escanear constantemente la web y advertirle de nuevos dispositivos. Una vez que sus compañeros de cuarto se han ido, Mattia puede comenzar el guión. Luego ejecutará NMap para obtener una lista de todos los dispositivos en la red. NMap se ejecuta periódicamente después de esto, comparando la nueva lista de alojamiento con la anterior. Si aparece algún dispositivo nuevo, lo alerta con un pitido audible y una cadena de salida bastante divertida. Este tipo de escaneo no es nada nuevo para aquellos en el campo de la seguridad de la red, pero el caso de uso es bastante nuevo.

  • Hirudinea dice:

    Parece mucho trabajo, por lo general solo grito "¡Sal o únete!"

  • joee dice:

    Hasta ese día, su compañero de cuarto olvidará su teléfono ...

    • Pablo dice:

      O si el teléfono no se conecta automáticamente de manera confiable, o si el teléfono permanece en modo avión, etc. Hay muchas formas de hacer fallar este sistema, pero muchas de ellas son casos de esquina. Trabajar lo suficientemente bien para el caso común es una marca de truco clásica.

  • Adán dice:

    Tendría más sentido usar las direcciones MAC en lugar de las IP, para que sepa exactamente quién está entrando en la casa.

  • Foobar Bazbot dice:

    Votar continuamente a través del escaneo ARP parece un poco ... brutal.

    ¿Por qué no poner la tarjeta en modo monitor (o dejarla en modo monitor; mi portátil inicia una interfaz en modo monitor en el momento del arranque y la deja constante) y buscar paquetes auténticos / asociados? Asumiendo uno No conoce la dirección MAC de interés y solo quiere notar alguien un nuevo dispositivo, como lo hace el script de Python, debe hacer algo como esto:
    tcpdump -i mon0 -elnq "(type mgt subtype assoc-req or type mgt subtype assoc-resp or type mgt subtype auth) and wlan host `iwconfig |sed -n 's/.*(([0-9A-Z]{2}:){5}[0-9A-Z]{2}).*/1/p'`"

    (Si conoce el BSSID de su AP, puede ingresarlo en lugar del "iwconfig | pero ..." que se menciona ligeramente).

    Si quieres que suene ...
    tcpdump -i mon0 -elnq "(type mgt subtype assoc-req or type mgt subtype assoc-resp or type mgt subtype auth) and wlan host `iwconfig |sed -n 's/.*(([0-9A-Z]{2}:){5}[0-9A-Z]{2}).*/1/p'`" |sed s/^/a/

    Te dejo agregar una "cadena de salida bastante alegre" como ejercicio para el lector ...

    Pero a menos que su compañero de cuarto esté ejecutando un aleatorizador MAC en su teléfono, no hay razón para que no conozca su MAC; después de hacerlo, puede hacer algo simple:
    tcpdump -i mon0 -elnq "type mgt and wlan host 00:11:22:33:44:55" |sed s/^/a/
    (replacing 00:...:55 with his phone's WLAN MAC, of course...)
    Either way, it doesn't take 49 lines of code or constant polling.

    • Foobar Bazbot dice:

      Oh, lo siento, parece que he dejado algunas citas. Eso debería ser sed s/^/\a/ o sed 's/^/a/', lo siento. Como está escrito, la cáscara se come el .

    • Maxwell dice:

      ¡Eso es bastante bueno! Tienes suerte de que tu tarjeta portátil tenga un modo de monitor, básicamente tuve que instalar una llave USB alfa.

      ¿No estoy diciendo que romperías eso?

      • Foobar Bazbot dice:

        Bueno, empezando por el interior `iwconfig |sed -n 's/.*(([0-9A-Z]{2}:){5}[0-9A-Z]{2}).*/1/p'` encuentra el BSSID de algunas redes a las que está conectado. De hecho, encuentra cualquier cosa que se parezca a un MAC (el BSSID es solo el MAC del AP):
        [0-9A-Z] coincide con un solo dígito hexadecimal
        [0-9A-Z]{2}: coincide con una secuencia de 2 dígitos hexadecimales, luego literal ':'
        ([0-9A-Z]{2}:){5}coincide con una secuencia de 5 de los anteriores (es decir, 10 dígitos hexadecimales, intercalados con ':' y uno ':' al final
        (([0-9A-Z]{2}:){5}[0-9A-Z]{2})coincide con esa secuencia más 2 dígitos hexadecimales adicionales al final (es decir, 12 dígitos hexadecimales, con ':' intercalado - MAC / BSSID)

        luego sed -n 's/.*(~~~~~).*/1/p' simplemente busque cualquier línea que contenga ~~~~~ y reemplace toda la línea con la parte ~~~~~ (en nuestro caso, el BSSID), e imprima el resultado. La -n La opción detiene el comportamiento predeterminado de pero imprime cada línea automáticamente, por lo que _sólo_ imprime el BSSID.
        Tenga en cuenta que si tiene varias tarjetas inalámbricas conectadas al mismo tiempo, recibirá varias líneas de salida, lo que provocará problemas. La solución más simple, si sabe qué interfaz está conectada a la WLAN es interesante, es reemplazar "iwconfig" con "iwconfig wlan0" (donde wlan0 es esa interfaz)

        Después de que termine, los códigos postales le dicen al shell que reemplace la salida (es decir, el BSSID) en el comando, dejándonos con algo como:
        tcpdump -i mon0 -elnq "(type mgt subtype assoc-req or type mgt subtype assoc-resp or type mgt subtype auth) and wlan host 01:23:45:67:89:AB" |sed 's/^/a/'

        Toma esa pieza por pieza:
        tcpdump - programa de agrupación general: a pesar del nombre, no se limita a TCP o IP, sino que también puede manejar otros protocolos, incluidos (según sea necesario) paquetes de nivel de ethernet o wifi.
        -i mon0 - la interfaz web para leer paquetes. Si su interfaz de modo de monitor es diferente, reemplace "mon0" con lo que sea.
        -elnq - Algunas opciones diversas que suelo usar para tal cosa, no estoy seguro de que todas sean válidas en este caso:
        - -e imprime un encabezado a nivel de madera (incluidas las direcciones MAC) en cada línea de salida. (Bueno si aún no conoce el MAC de su compañero de cuarto, pero no es obligatorio)
        - -l hace el búfer de línea de salida, asegurando que el siguiente proceso (pero en nuestro caso) obtenga cada línea inmediatamente, en lugar de esperar hasta que un búfer lleno esté listo al mismo tiempo. (Esta es la única especialidad real)
        - -n le dice a tcpdump que genere direcciones numéricamente, en lugar de intentar buscar los nombres de host correspondientes.
        - -q reduce el juego de palabras, disminuyendo las líneas de salida

        "(type mgt subtype assoc-req or type mgt subtype assoc-resp or type mgt subtype auth) and wlan host 01:23:45:67:89:AB" - un término de filtro que determina qué paquetes descartar. En estas expresiones, los filtros individuales están conectados por "y", "o" y corchetes exactamente como cabría esperar.
        (type mgt subtype assoc-req or type mgt subtype assoc-resp or type mgt subtype auth) - "Type foo subtipo bar" es un filtro único que contiene solo paquetes del subtipo especificado, por lo que pasa paquetes de mgt / assoc-reg, mgt / assoc-resp o mgt / auth: todos los tipos de paquetes que espera ver cuando un cliente se asocia.
        wlan host 01:23:45:67:89:AB - "host foo" solo pasa paquetes con foo como origen o destino. El modificador "wlan" especifica que estamos buscando un host de nivel de registro, a diferencia de, dice, un host IP. Al especificar que los paquetes deben ser hacia o desde nuestro AP, ignoramos cualquier cliente asociado con las redes vecinas.

        tcpdump luego generará una línea por cada paquete que coincida con esos filtros; cada línea podría verse así:
        00:15:14.718522 343829725486us tsft 1.0 Mb/s 2442 MHz 11b -65dB signal antenna 1 BSSID:00:24:xx:xx:xx:xx DA:00:24:xx:xx:xx:xx SA:00:19:xx:xx:xx:xx Assoc Request (xxxx_essid_here_xxxx) [1.0 2.0 5.5 11.0 Mbit]

        Obtendrá varias líneas de este tipo cada vez que un cliente se asocie, lo cual es bueno: no está seguro de recibir todos los paquetes, pero es suficiente para compensarlo.

        (El filtro de paquetes en el otro ejemplo, para el caso en el que conoce la dirección MAC, es similar, pero mirando los paquetes hacia / desde la dirección del cliente. Además, podemos usar un filtro más simple en un tipo de paquete; si muestra todos mgt / * AP, verá muchas balizas cuando ninguna está asociada, por lo que tenemos que elegir subtipos específicos de interés. Pero los clientes no envían balizas, por lo que casi todos los "tipos de mgt" son interesantes. deje el filtro de tipo completamente fuera, pero luego de que se asocie, también verá una gran cantidad de paquetes de datos, que pueden producirle más pitidos de los que le interesan).

        Finalmente miramos eso sed 's/^/a/' - "^" coincide con el comienzo de una línea, y " a" es la secuencia de escape para el carácter de "alarma" o "campana", también conocido como control-G, también conocido como ASCII 07. Por lo tanto, esto solo inserta el carácter de campana inicialmente de cada línea; su terminal generalmente responderá a esto con un pitido.

        • denis dice:

          una explicación asombrosa, siempre impresionado por lo que el shell de Unix puede hacer en las manos adecuadas. Gracias por su tiempo dedicado a la ortografía y no se limite a decir RTFM n00b.

        • buscador de sabiduría dice:

          ¡Gracias por tomarse el tiempo para romper eso!

        • Sebastiano dice:

          ¡Gracias por el desglose! Si alguien está interesado, lo he adaptado para que funcione en OS X (es posible que deba cambiar en0 a en1 o en2, según la cantidad de interfaces web que tenga).

          #! / bin / zsh
          bssid = `/ System / Library / PrivateFrameworks / Apple80211.framework / Versions / A / Resources / airport -I en0 | pero -n 's /.* ( ([0-9a-fA-F] {2 }: ) {5 }[0-9a-fA-F] {2 } ). * / 1 / p "
          tcpdump -I -i en0 -elq "(escriba mgt subtipo assoc-req o escriba mgt subtipo assoc-resp o escriba mgt subtipo auth) y hosts wlan $ bssid" | pero s / ^ //

          El carácter de campana no me funcionaría, así que usé ^ G. Esto no aparecerá aquí porque es un carácter de control, pero copiarlo en un editor de texto adecuado (como Text Friend) debería funcionar a menos que el sistema de comentarios lo filtre.

          • Sebastiano dice:

            Resulta que el carácter ^ G permanece intacto, pero el sistema de comentarios ha reemplazado las comillas dobles y simples por otras estilizadas. Corrija esos después de copiar y el script debería funcionar.

        • Kaz dice:

          Tales comentarios son la razón por la que leo la-tecnologia.

    • Piku (@pickoo) dice:

      Entonces, una frambuesa pi con un dongle adecuado y una idea así, pero sintonizada para su teléfono, podría funcionar para cosas básicas y desagradables de automatización del hogar.

  • galleta radical dice:

    Oh ... mi PEP 8 duele.

  • meritol dice:

    Comentarios y Léame en italiano ...: S

    • Mattia dice:

      Ahora en inglés 🙂 No esperaba interés en eso, es un fragmento de código en bruto que escribí para practicar el aprendizaje de Python. Tendré que arreglar muchas cosas.

    • Nitish KS dice:

      ¿Por qué diablos debería estar todo en inglés?
      Er zijn nog andere talen!
      Deutsch zum Beispiel.
      Eller dansk.
      ಕನ್ನಡ.
      ¡No importa!

      • Eirinn dice:

        Porque la lógica.

        • Nitish KS dice:

          ¿Qué lógica?
          Eso es BS.
          Si tu cerebro no es lo suficientemente flexible para soportar otro idioma, ya sea humano o artificial, bueno, pobre.
          ¡Adiós!

  • Badajo Clippy dice:

    ..y de repente nadie piensa en los errores de llevar a cabo la vigilancia solo porque la parte técnica es tan interesante ..

    • Shannon dice:

      "De repente" bien.

  • el vecino perseguidor dice:

    Escribí un guión, es decir, con guiones. De esta forma es posible no solo detectar a los habitantes, sino también a los vecinos ...;)
    Usándolo, para saber si la linda chica de al lado ha vuelto a casa, así puedo llamar a la puerta de todos modos 🙂

    • di0de dice:

      jajaja

    • Fabi dice:

      ¿Por qué no lo compartes? Foobar Bazbot comentó con un buen ejemplo;)

  • Tommy dice:

    Eso es un montón de problemas solo para la corte.

    • Decano dice:

      Mis pensamientos son correctos ... 🙂

    • señal7 dice:

      Quizás. Me preguntaba cuántos módems se vendieron para descargas más rápidas de pornografía. ¿No es esa la razón por la que todo el mundo quiere conexiones de fibra Gb?

  • párpados dice:

    Supongo que eso funcionaría bien si el compañero de cuarto pregunta, sin preguntarse nunca, "¿Por qué diablos enciendo WiFi si estoy usando datos móviles?"

    La solución se estropea si el compañero de cuarto decide que tiene más sentido no comerse la batería al operar esa radio adicional.

    • denis dice:

      Los datos del teléfono celular superan a la batería en comparación con el wifi, mi batería dura mucho más si tengo wifi habilitado que si no lo tengo porque la mayoría de los hogares donde necesito acceso a internet tienen wifi.

Pedro Molina
Pedro Molina

Deja una respuesta

Tu dirección de correo electrónico no será publicada.