Rastrille caminando en un campo limpio o cómo recopilar direcciones MAC de dispositivos Wi-Fi cercanos

Comienzo todos mis discursos públicos (afortunadamente, no hay tantos) mencionando explícita o implícitamente la tesis "Nuestra industria es compleja, los problemas pueden revelarse en cualquier momento, incluso el paso más obvio, y es optimista suponer que todo será simple y fácil - ingenuo" . Por extraño que parezca, esta idea simple, obtenida por muchos años de conos de relleno, a veces es una revelación para especialistas más experimentados, aunque parece que todo el entusiasmo frenético y la creencia en la infalibilidad de sus propias ideas y prácticas deberían haberse resistido durante mucho tiempo. Te contaré una historia sobre esto, un ejemplo de un proyecto simple, a primera vista.




Un buen día, un amigo me lanzó un enlace a una startup interesante . Los chicos sugirieron que los representantes de las pequeñas empresas de los sectores de servicios y ventas establezcan un punto de acceso (con un portal cautivo) para sus clientes con el fin de distribuir Internet, mientras recopilan las direcciones MAC de los teléfonos inteligentes de las personas que pasan. El propósito de esta acción es muy simple: una gran cantidad de redes publicitarias le permiten orientar la lista de direcciones de dispositivos, por lo tanto, dirigiendo la empresa publicitaria a los usuarios que pasan, lo más probable es que recibamos nuevos visitantes (porque está cerca y "en algún lugar ya lo vi") . Aquellos. tal distribución de volantes virtuales. Un amigo preguntó cómo se hace esto y si podemos hacerlo nuevamente.

Una búsqueda rápida en Google sobre el tema reveló el mecanismo de dicha recopilación de datos. El adaptador WiFi se lanzó en modo de escucha de aire y recorrió los canales, capturando paquetes, analizándolos y agregando los datos recibidos. También había utilidades abiertas listas para esto, por ejemplo, airodump-ng de aircrack-ng . Aquellos. para la repetición, solo necesitamos ejecutar esta utilidad, preferiblemente en un dispositivo compacto y portátil separado, y guardar los datos recibidos en la base de datos, de la cual luego obtenemos listas listas de direcciones MAC para redes publicitarias. Parece que la tarea es simple, resuelta en una, a lo sumo: dos noches de trabajo tranquilo, casi todo está listo.

Por supuesto, este nunca fue el caso.

Como sabes, lo que está permitido a Júpiter no está permitido al toro. Y cuando se utilizan pagadores únicos, entonces hay que sacrificar, en primer lugar, los recursos informáticos y la memoria. Además, el sacrificio de recursos es seguido por el sacrificio de desarrollo y la conveniencia de depuración: no todos los sistemas permitirán arrastrar herramientas de compilación al dispositivo.

Inicialmente, queríamos tomar algo simple y barato, por ejemplo, cajas Orange Pi Zero, coloque airodump-ng allí y envíe los datos escupidos por la utilidad al servidor, donde se pueden colocar de forma segura en la base de datos. Tenía experiencia trabajando con dichos sistemas distribuidos con un centro dedicado (aunque, allí, las máquinas virtuales actuaban como caballos de batalla, atravesaban la API de la nube a través del mismo centro según fuera necesario, pero no el punto), por lo que parte del código migró con éxito a un nuevo proyecto .

La herramienta para reenviar datos al servidor fue la simple aplicación Erlang escrita, que se suponía que debía extraer datos del amortiguador de éter (análisis), serializarlos (serialización nativa de Erlang) y transferirlos a través del socket web al servidor a través de HTTPS (sin causar sospechas) Sistemas DPI y no inventando sus propios protocolos). Los procesadores Allwinner H2 + utilizados en el Orange Pi son lo suficientemente potentes como para ensamblar y depurar directamente en el dispositivo. De nuevo, en teoría, todo está bien.

La práctica ha comenzado.

1. Como resultó, el WiFi incorporado en el Orange Pi solo era bueno para recoger un punto de acceso y arrojar datos al servidor. Bueno, más precisamente, no el adaptador en sí, sino el soporte de su chipset en el núcleo. Para la mayoría de los proyectos de IoT, esto probablemente sería suficiente. Sin embargo, estábamos listos para este golpe, porque un estudio preliminar del sitio web de aircrack-ng dio un muy claro y ambiguo "no funcionará en todas partes, si eso no es culpa nuestra, adjuntaremos una lista de conjuntos de chips probados". Casi todos los dispositivos Atheros (comprados por Qualcomm) y Ralink (comprados por MediaTek) se encontraron en la lista, lo que inspiró algunas perspectivas en el caso de una transición de ARM chinos voraces a MIPS más ascéticos de conjuntos de chips para enrutadores.

Pero, aunque todo esto va de mocos y palos, es decir prototipo: debe resolver el problema aquí y ahora. Por lo tanto, aprovechamos tales características exóticas en nuestro tiempo tecnológico (cuando la comunicación inalámbrica es más ligera) como un adaptador USB Wi-Fi. Estudiar la lista de compatibilidad y compararla con la variedad de la tienda más cercana le dio a la víctima: el DLink DWA-160 en la revisión C1 (esto es importante porque otras revisiones de hardware usaron un chip diferente y causaron dolor de cabeza en términos de trabajo forzado). Doble banda, que no requiere bailar con el conductor, ya que el apoyo ha estado en el núcleo durante mucho tiempo, este silbato fue útil más adelante en otros proyectos, por lo que los compré, probablemente todos (cinco piezas) que estaban disponibles en nuestra ciudad provincial.



Después de asegurarme de que el dispositivo funcionaba, lo conecté a un dispositivo de placa única y apagué el adaptador WiFi incorporado con la expectativa de que Internet estaría disponible a través de la interfaz Ethernet.



El segundo cerdo fue puesto por aircrack-ng. Este conjunto de utilidades fue creado con el objetivo de hackear.Comprobaciones de penetración de WiFi, es decir fue escrito por hackers para hackers. No sé, gracias a qué lógica prefirieron usar el dumper inalámbrico de ether no en forma de un enfoque tradicional de unix, para escupir texto estructurado para su posterior procesamiento, sino para crear una interfaz de término completa en la que mostrar información en tiempo casi real (y teniendo en cuenta la configuración del terminal) por redes y dispositivos descubiertos, pero hicieron exactamente eso. Sí, encontré la API de Python de un grado desconocido de preparación para todo esto, pero, nuevamente, la araña de prototipos que vivía en mi cabeza prohibió estrictamente arrastrar otro idioma, cambiar a otro (recordamos, la parte del servidor ya estaba parcialmente lista y escrita estaba lejos de Python-e) o, Dios no lo quiera, implemente airodump-ng sobre la base de tcpdump. Y consecuentemente,Tuve que buscar soluciones alternativas.

Afortunadamente, los piratas informáticos inalámbricos comenzaron a sospechar que algo tan estúpido constantemente en la interfaz es tal actividad, por lo que implementaron la carga periódica de todo lo encontrado y agregado en forma de archivos CSV. Con un intervalo establecido. Ya puedes vivir con eso. Por supuesto, la opción ingenua - para ejecutar la utilidad y volver a leer el archivo en un temporizador - se dio inmediatamente a mano. Al trabajar en una computadora portátil, cuando se transfirió a una sola placa, comenzó a fallar en el proceso de lectura del archivo por razones obvias: a veces la utilidad simplemente no tenía tiempo para descargar todo y algunos de los datos se perdieron irremediablemente.

La solución a esto fue el mecanismo de notificación en el núcleo, que notifica las operaciones del archivo: tan pronto como mi código vio los cambios en el archivo de datos, inició su lectura con un ligero retraso (más bien, teniendo un valor puramente psicológico, tranquilice a su autor). Los experimentos mostraron que, en este caso, no se producen errores de lectura y pérdida de datos. Bueno, agradable, CSV parsim, poner en estructuras internas y enviar al servidor. Lo guardamos en el servidor en PostgreSQL (gracias por jsonb) y después de eso ya es posible realizar consultas, descargas de formularios, etc. Agregaremos la autorización más simple usando una clave simétrica, para que no acumulemos basura allí y podamos vincular los datos al punto donde está instalado el dispositivo, y todo parece estar bien, puedes ir a la batalla.

Sí, ahora cómo. El ensamblaje de prueba de esta cadena (y la escritura y depuración de códigos realmente tomó un par de noches) reveló un hecho curioso: la cantidad de direcciones capturadas por día en nuestra oficina, lo suficientemente lejos de los lugares públicos transitables, fluctuaba alrededor de un par de miles de piezas. Sí, por supuesto, había un pequeño hotel cerca (estaba en tiempo de aislamiento previo a la cuarentena, no se sorprenda), pero aún así, hay mucho.

Refrescando el conocimiento de la estructura de la dirección MAC y recordando el hecho de que los dispositivos móviles a menudo generan direcciones locales para ocultar sus verdaderas direcciones MAC, modifiqué la parte del servidor con un filtro simple que limpia todas las direcciones locales y de difusión en la entrada. La lista se redujo en un orden de magnitud y ya parecía la verdad. Todo estaba listo para pruebas de campo.

Como saben, cuando se cambian las ubicaciones de una oficina cálida y cómoda a condiciones de combate despiadadas, los prototipos tienden a dejar de funcionar normalmente, por lo que el proceso de implementación debe ir acompañado del suministro de un ingeniero de bolsillo que corregirá todos los problemas emergentes. Por otro lado, también es bien sabido que un dispositivo que no requiere baile adicional con una pandereta al comienzo de la operación es probable que se descomponga pronto e irrevocablemente. Esto, sin duda, se reflejó en las leyes de Murphy, pero, por desgracia, el autor de estas líneas es demasiado vago para comprobar cuál, por lo tanto, acordaremos el término "ley de maldad".

La primera instalación reveló de inmediato un montón de fallas.

En primer lugar, la mayoría de las placas de creación de prototipos chinas vienen con memoria microSD a largo plazo en comparación con los chips flash NAND / NOR. Se hace una excepción solo para SoC potente, claramente redundante para esta tarea. Por desgracia, MicroSD es el dolor de cabeza inmediato del operador: la oxidación de las almohadillas, la falla de las tarjetas SD, la dependencia de los contactos de la temperatura dentro de la carcasa (lo cual es considerable, los chips chinos no son muy eficientes energéticamente, y las placas a menudo se calculan completamente en función de consumo máximo de energía, por lo que sin un radiador adicional, bueno, de ninguna manera). Por lo tanto, resultó que cuando se desconectó la alimentación del dispositivo, el sistema entró en un estado inoperable: los archivos con el código de bytes ERTS se dañaron, después del reinicio, la aplicación se negó a funcionar.

El segundo momento desagradable: en el punto de instalación, Internet fue proporcionado por un enrutador LTE y, por decirlo suavemente, de calidad mediocre, a diferencia de un cable de oficina. La red se encendió constantemente, la aplicación a menudo se reconectó o incluso murió por mensajes acumulados en las colas.

Por supuesto, ambos problemas son superables, por ejemplo, la pérdida de datos se eliminaría al buscar la combinación óptima de una buena tarjeta microSD y la configuración del sistema de archivos, y la inestabilidad de la conexión podría compensarse mediante la agregación de datos preliminares, sesiones de envío cortas, tiempo de espera, etc. Pero los problemas que se han revelado son una ocasión para reflexionar sobre si se ha elegido el camino correcto. La necesidad de una conexión permanente al servidor pone fin a la recopilación de datos de eventos, cuando el dispositivo se cuelga de una batería externa y se arroja a una mochila, cuyo propietario va a un evento masivo, donde, por supuesto, no puede esperar la estabilidad de la conexión.

En consecuencia, el siguiente paso fue abandonar la parte del servidor y localizar el almacén de datos directamente en el dispositivo. Además, para evitar experimentos largos y muy tristes con tarjetas SD, se decidió utilizar modelos de placa de prueba con chips flash en la próxima iteración.

En ese momento, recordé que en mi colección había una maravillosa tabla Carambola 2 de los camaradas lituanos 8Devices . Y si va a su sitio, puede encontrar un dispositivo aún más compacto en el mismo chip llamado Centipede. Experimentos previos con esta clase de dispositivos mostraron que Erlang encaja completamente en los 16 MB de memoria flash asignados (y queda un poco para la aplicación). El único inconveniente (que es más bien un plus) es el MIPS de baja potencia y la necesidad de compilación cruzada, lo que hace que construir una aplicación Erlang sea un poco más trivial. Pero ya era una ruta conocida, así que pedí un par de ciempiés, y hasta ahora he portado la versión existente que funciona con el servidor a Carambol.



Cuando llegaron los componentes, comenzó una nueva fase. El chip AR9331 fue exitosamente soportado por aircrack-ng fuera de la caja, los datos se pueden tomar de la interfaz Ethernet, las últimas versiones de OpenWRT y ERTS se han recopilado y probado con éxito. La aplicación se reescribió: parte del código se movió al código del dispositivo, los datos se acumularon en un proceso separado y se volcaron periódicamente a un archivo en forma de un término de Erlang serializado. Para esto se dibujó la interfaz web más simple que recibe datos a través de websocket. Los puertos para inotify y erlexec se compilan de forma segura con OpenWRT.

Solo una cosa confundida: 300 kilobytes permanecieron en los datos. No es tan pequeño si solo almacena las direcciones MAC de los dispositivos del cliente, pero airodump-ng le brinda información mucho más interesante, incluidas las direcciones de los puntos de acceso, sus ESSID, etc., que también sería bueno recordar. Por si acaso. Bien, actuaremos según las circunstancias.

Recopilamos, verificamos. Un problema se revela sobre la marcha.

Openwrt, como todos sabemos, esta es una compilación de Linux tan minimalista que está diseñada específicamente para dispositivos con memoria limitada. Como resultado, arrojó desde allí que era posible tirar sin dolor y simplificó lo que podría simplificarse, incluido el modo multijugador. Aquellos. Es una práctica común cuando el código comienza desde la raíz y funciona con los máximos privilegios, lo que, por supuesto, facilita los problemas relacionados con los grupos, los usuarios y el control de sus acciones. Sí, sí, la letra S en la abreviatura IoT es responsable de la seguridad. El problema es que erlexec, que solía ejecutar y administrar airodump-ng, no puede realizar operaciones desde la raíz; para esto, necesita un usuario adicional, en nombre del cual generará los procesos asignados a él. Y al crear un usuario adicional con un nivel de privilegio diferente ... correctamente, evita que airodump llegue al dispositivo de red. Desatornillar esta restricción de la biblioteca parecía ser un proceso lento, por lo que erlexec fue reemplazado por puertos, el mecanismo incorporado para iniciar procesos de terceros en Erlang. Un poco, pero desagradable.

Por lo tanto, los dispositivos se reciben, se renuevan e incluso funcionan en condiciones de invernadero. Cogemos la batería, tiramos la caja en la mochila, vamos al centro comercial. Al día siguiente, observamos el resultado, un fiasco, un archivo de datos de longitud cero, o no había suficiente espacio o una distorsión de la potencia no funcionó en un muy buen momento. Corregimos el código para que el guardado ocurra en dos etapas: primero se creó un archivo temporal y luego se reemplazó el actual.

Sin embargo, las manos no pudieron comprobar la operatividad de esta opción, el próximo juguete, apareció Onion Omega2 + en el Mediatek 7688. Al igual que sus hermanos, el diseñador de LinkIt Smart 7688 , había muchas cosas, pero lo más importante es el doble de memoria flash, lo que significa que ya no puede preocuparse por la falta de espacio para el almacenamiento de datos. Bueno

Nosotros ordenamos, espera. Mes. Dos. Estalla la paciencia: escribimos a los estadounidenses sobre el tema “¿Dónde están los productos, Zin?”. Silencio. Abrir una disputa en PayPal. Los estadounidenses están despertando. Dicen: "Oh, nuestro sistema de aceptación de pedidos ha fallado, ahora enviaremos todo". Envían, esperamos tres semanas. Fuh, el dispositivo está disponible e incluso funciona.



Aquí tenemos que hacer una pequeña digresión: a pesar del hecho de que tenía varias placas LinkIt Smart a poca distancia, no las consideraba como una plataforma, porque al comienzo de la saga, un intento de usarlas como dispositivos de captura falló. Luego, los controladores para el chip se suministraron en forma de módulos ensamblados para versiones específicas del núcleo y, aparentemente, esto se convirtió en la causa de la inoperancia. En las últimas versiones de OpenWRT, aparecieron tanto el soporte nativo para 7688 como un controlador abierto, por lo que esta es una ocasión para reconsiderar el enfoque de estos dispositivos.

Sin embargo, era habitual usar WiFi directamente en el chip para el propósito previsto; después de todo, el dispositivo necesita al menos alguna interfaz de control y también en el campo, al menos para entender si funciona o no. Observar los datos obtenidos también sería útil.

En consecuencia, combinamos los enfoques anteriores: utilizamos la única interfaz USB que se muestra en el MiniDoc para un silbato WiFi para escanear el espacio, y el WiFi incorporado, para controlar el dispositivo como un punto de acceso de baja potencia. Recopilamos, verificamos, todo funciona.

Pero el apetito viene con comer. Para empezar, el archivo de datos en forma de serialización de Erlang es una gran cantidad de maníacos reales, y una gama ligeramente más amplia de profesionales especialmente capacitados necesita algo más simple. Una vez más, además de agregar datos de airodump, también me gustaría el tiempo de medición exacto y, preferiblemente, al menos algún tipo de referencia a la ubicación del dispositivo en el espacio.

Incorporamos entre un silbato WiFi y un dispositivo concentrador USB. Los ajustes (y dependen de la posición del dispositivo en el bus en el caso de OpenWRT) son boscosos, pero estos son pequeños detalles. Correcto. Sacamos el receptor USB-GPS de los escombros, afortunadamente, ya está probado y con el código escrito.Análisis NMEA-0183 (el código, por supuesto, aún tenía que corregirse). Verificamos: el dispositivo no es detectado de manera segura por el sistema, claramente hay una falta de controladores. Recopilamos los controladores serie USB y los dejamos caer en el dispositivo, también en silencio. Luego recordamos que en sistemas grandes el silbato GPS no se detectó como ttyUSBx, sino como ttyACMx, es decir Módem USB GSM. Bueno, bien, la segunda llamada para agregar controladores, éxito.

Tomamos el código, lo integramos en la aplicación. Agregue sqlite3 a la aplicación como almacenamiento. Ahora no será necesario verificar la disponibilidad del registro en el estado y, en general, el trabajo con datos se simplifica a un pequeño número de líneas. En conjunto, enseñamos al agregar datos para tomar lecturas de GPS, corregimos el código JS en la cara para mostrar en caso de un conjunto de datos incompleto (puede ocurrir cuando el GPS aún no ha captado satélites y los datos de escaneo aéreo ya están llegando). Verificamos el trabajo, parece vivir. Puedes declarar una victoria provisional.



Durante un par de semanas de trabajo ininterrumpido, muchos datos tanto en estaciones en el aire como en clientes. Ahora estoy luchando con la tentación de ofrecer este dispositivo a infobes para controlar la transmisión en los territorios encomendados y al estado para controlar el movimiento de los teléfonos de los ciudadanos. Es una broma, por supuesto, ellos mismos ya lo saben todo.

Entonces, todas las pruebas descritas anteriormente son solo un proyecto favorito con una complejidad muy baja (casi de inmediato quedó claro qué hacer y cómo), la falta de desarrollo de hardware (hola, física) y acceso a un producto algo más o menos completo. No, por supuesto, no se puede descartar que el autor de estas líneas sea un denso aficionado, y los verdaderos gurús van así en una noche entre el té de la tarde y una copa de coñac, pero hasta ahora la experiencia ha demostrado solo una cosa: las TI son complicadas y el optimismo se castiga financiera y reputacionalmente. y motivacionalmente, y aquellos que dicen "todo es simple" son genios o delincuentes, y el segundo es más probable.

All Articles