Project iron: cómo construimos una habitación con una búsqueda de hackers

Project iron: cómo construimos una habitación con una búsqueda de hackers
Hace un par de semanas pasamos búsqueda en línea de hackers: construyeron una sala, la llenaron con dispositivos inteligentes y desde allí lanzaron una transmisión en YouTube. Los jugadores pueden controlar los dispositivos IoT desde el sitio web del juego; El objetivo era encontrar un arma escondida en la habitación (un potente puntero láser), hackearla y provocar un cortocircuito en la habitación.

Para aumentar la acción, colocamos una trituradora en la habitación, en la que cargamos 200 rublos: la trituradora se comía un billete por hora. Después de ganar el juego, puedes detener la trituradora y tomar todo el dinero restante.

ya lo hemos dicho recorridoy cómo se hizo el backend proyecto. Es hora de hablar del hardware y de cómo se montó.


Hubo muchas peticiones para mostrar el momento de limpiar una habitación: mostramos cómo la desmontamos

Arquitectura de hardware: control de sala

Comenzamos a diseñar una solución de hardware cuando ya se entendía a grandes rasgos el escenario, el backend estaba listo y teníamos una sala vacía lista para instalar el equipo.

Recordando el viejo chiste “La S en IoT significa Seguridad” (“La letra S en la abreviatura de IoT significa Seguridad”), decidimos que esta vez los jugadores en el escenario del juego interactúan solo con el front-end y el back-end. del sitio, pero no tiene la oportunidad de llegar directamente a la plancha.

Esto se hizo por razones de seguridad y espectáculo de lo que estaba sucediendo en la pantalla: con el acceso directo de los jugadores al hardware, sería mucho más difícil aislar acciones seguras y potencialmente peligrosas, por ejemplo, desplazarse rápidamente por una trituradora o controlar pirotécnica.

Antes de comenzar el diseño, formulamos varios principios para controlar los dispositivos de juego, que se convirtieron en la base del diseño:

No utilices soluciones inalámbricas.

Todo el espacio de juego está en un marco, al que se puede llegar a todos los rincones. No había una necesidad real de conexiones inalámbricas y simplemente se convertirían en otro punto de falla.

No utilice ningún dispositivo doméstico inteligente especial

Principalmente por el bien de la flexibilidad de personalización. Está claro que podemos personalizar muchas versiones en caja de sistemas domésticos inteligentes con administradores y controles listos para usar para nuestra tarea, pero los costos de mano de obra serían comparables a crear su propia solución simple.

Además, era necesario idear dispositivos que mostraran claramente que eran los jugadores quienes cambiaban su estado: lo encendían/apagaban o ponían una luz específica en las letras FALCON.

Recopilamos todos los elementos del hardware disponible públicamente que se puede comprar en las tiendas habituales de repuestos de radio: entre la entrega de pizza y cola dietética, los mensajeros Chip, Dip y Leroy visitaban constantemente el sitio.

La opción de ensamblar todo nosotros mismos simplificó la depuración; la escalabilidad, sin embargo, requirió mayor cuidado durante la instalación.

Todos los relés y arudin no deben ser visibles en el marco.

Decidimos reunir todos los elementos controlables en un solo lugar y esconderlos detrás de escena para poder monitorear su desempeño y, si es necesario, escondernos con cuidado de la vista de la cámara y reemplazar la unidad defectuosa.

Project iron: cómo construimos una habitación con una búsqueda de hackers
Al final, todo quedó oculto debajo de la mesa y la cámara se instaló de modo que no se viera nada debajo de la mesa. Este fue nuestro “punto ciego” para que el ingeniero se acercara sigilosamente.

Como resultado, obtuvimos un dispositivo inteligente: recibió el estado de cada una de sus partes del backend y lo cambió con el comando apropiado.

Desde el punto de vista de la implementación del hardware, este dispositivo controlaba 6 elementos:

  1. Varias lámparas de mesa, tienen estado de encendido/apagado y son controladas por jugadores
  2. Letras en la pared, pueden cambiar de color a las órdenes de los jugadores.
  3. Ventiladores que giran y abren el rotafolio cuando el servidor está bajo carga.
  4. Controlado por láser mediante PWM
  5. Trituradora que se comió dinero a tiempo
  6. Una máquina de humo que se disparaba antes de cada disparo láser.


Probando una máquina de humo con láser

Más tarde, se agregó una luz de escenario, que estaba detrás del marco y se controlaba exactamente como las lámparas del punto 1. La luz de escenario funcionaba en dos casos: iluminaba el láser cuando se le aplicaba energía, e iluminaba el peso antes del El láser se lanzó en modo de combate.

¿Qué era este dispositivo inteligente?

Project iron: cómo construimos una habitación con una búsqueda de hackers

En todo momento, Yura, nuestro encargado del hardware, intentó no complicar las cosas y encontrar la solución más simple y minimalista posible.

Se suponía que el VPS simplemente ejecutaría un script que recibe json con el estado de los dispositivos y lo envía al Arduino conectado vía USB.

Conectado a los puertos:

  • 16 relés regulares (fueron los que hicieron el ruido de clic que se escuchó en el video. Los elegimos principalmente por este sonido)
  • 4 relés de estado sólido para controlar canales PWM, como ventiladores,
  • salida PWM separada para láser
  • Salida que genera una señal a la tira de LED.

Aquí hay un ejemplo de un comando json que llegó al relé desde el servidor.

{"power":false,"speed":0,"period":null,"deviceIdentifier":"FAN"}

Y este es un ejemplo de una función con la que el comando llegó a Arudino.

def callback(ch, method, properties, body):    
request = json.loads(body.decode("utf-8"))    
print(request, end="n")     
send_to_serial(body)

Para rastrear el momento en que el láser finalmente quema la cuerda y el peso vuela hacia el acuario, hicimos un pequeño botón que se activaba cuando el peso caía y enviaba una señal al sistema.

Project iron: cómo construimos una habitación con una búsqueda de hackers
Botón para controlar el movimiento del peso.

A esta señal se encendían bombas de humo hechas con pelotas de ping-pong. Colocamos 4 bengalas de humo directamente en la caja del servidor y las conectamos con un hilo de nicromo, que se suponía que debía calentarse y funcionar como un encendedor.

Project iron: cómo construimos una habitación con una búsqueda de hackers
Vivienda con bombas de humo y guirnalda china.

Project iron: cómo construimos una habitación con una búsqueda de hackers

arduino

Según el plan original, se llevaron a cabo dos acciones en Arduino.

Primero, cuando se recibió una nueva solicitud, la solicitud se analizó utilizando la biblioteca ArduinoJson. A continuación, se comparó cada dispositivo gestionado con sus dos propiedades:

  • Estado de energía "encendido" o "apagado" (estado estándar)
  • el período durante el cual el dispositivo está encendido: el tiempo en microsegundos desde el inicio de la placa, cuando llega el momento de apagarlo, es decir, llevar el estado al estándar

La última vez se configuró al recibir el parámetro correspondiente en JSON, pero no se pudo transmitir, entonces el valor se estableció en 0 y no se produjo ningún reinicio.

La segunda acción que realizaba el Arduino en cada ciclo era actualizar estados, es decir, comprobar si era necesario encender algo o si era momento de apagar algún dispositivo.

Puntero láser: el mismo Megatron 3000

Project iron: cómo construimos una habitación con una búsqueda de hackers

Este es un módulo de corte y marcado láser de enfoque manual LSMVR450-3000MF 3000mW 450nm normal.

Letras Halcón

Fueron hechos de manera muy simple: simplemente copiamos las letras del logotipo, las recortamos de cartón y luego las cubrimos con cinta LED. En este caso tuve que soldar los trozos de cinta, 4 contactos en cada costura, pero el resultado valió la pena. Nuestro patrocinador Pasha demostró milagros de habilidad y lo hizo en menos de unas pocas horas.

Primeras pruebas del dispositivo iot y acabado.

Hicimos las primeras pruebas y al mismo tiempo nos llegaban nuevas tareas. El hecho es que en medio del proceso, un verdadero productor de cine y camarógrafo de VGIK, Ilya Serov, se unió al equipo: construyó el marco, agregó iluminación cinematográfica adicional y cambió ligeramente el guión del juego para hacer la trama más emocional, y la imagen más dramática y teatral.

Esto aumentó significativamente la calidad, pero aparecieron elementos que también debían conectarse al relé y prescribir el algoritmo de funcionamiento.

Otro problema fue el láser: hicimos varios experimentos con distintos tipos de cuerda y láseres de distintas potencias. Para la prueba, simplemente colgamos un peso verticalmente de una cuerda.

Cuando se ejecutó con una ficha de prueba, la potencia regulada a través del PWM fue inferior al 10% y no dañó la cuerda incluso con una exposición prolongada.

Para el modo de combate, el láser se desenfocó en aproximadamente un punto con un diámetro de 10 mm y con confianza quemó una cuerda con una carga desde una distancia de aproximadamente un metro.

Project iron: cómo construimos una habitación con una búsqueda de hackers
Entonces el láser funcionó perfectamente en las pruebas.

Cuando empezamos a probar todo en la sala con un peso suspendido, resultó que asegurar el láser de forma segura no era tan fácil. Luego, cuando la cuerda se quema, se derrite, se estira y se sale de su foco original.

Project iron: cómo construimos una habitación con una búsqueda de hackers
Pero ya no funcionó así: la cuerda se movió

Ilya movió el láser al final de la habitación frente a la cuerda para que el rayo láser atravesara todo el escenario y se viera hermoso en el encuadre, lo que duplicó la distancia.

Después de realizar varios experimentos más quemando la cuerda ya en la batalla, decidimos no torturar al destino y asegurar el corte de la cuerda con alambre de nicromo. Destruyó el hilo 120 segundos después de encender el láser en modo combate. Decidimos codificar esto, así como la desconexión del cable y el encendido de bombas de humo cuando se activa el contacto de separación, directamente en el hardware del microcontrolador.

Project iron: cómo construimos una habitación con una búsqueda de hackers
El hilo que finalmente quemó la cuerda fuera de la pantalla

Así, apareció una tercera tarea que Arduino resolvió: desarrollar las secuencias asociadas con la ejecución de estos comandos.

También decidimos darle al Arduino la necesidad de contar dinero en el televisor y hacer funcionar la trituradora. Inicialmente, se supuso que el backend haría esto y que el saldo actual sería visible en el sitio web y en el televisor mostraríamos comentarios de YouTube como un elemento interactivo adicional, informando a los espectadores que los eventos en la sala estaban sucediendo en realidad. tiempo.

Pero durante la prueba, Ilya miró la escena y sugirió mostrar el saldo del juego en la pantalla más grande: cuánto dinero queda, cuánto se ha comido y la cuenta regresiva para el próximo inicio de la trituradora.

Vinculamos Arduino a la hora actual: cada hora completa se iniciaba la trituradora. La imagen se mostró en el televisor usando rasberry, que en ese momento ya estaba recibiendo solicitudes del servidor y enviándolas al arduino para su ejecución. Se dibujaron imágenes con indicadores monetarios llamando a la utilidad de la consola fim de esta manera

image = subprocess.Popen(["fim", "-q", "-r", "1920×1080", fim_str]), где fim_str

Y se formó en base a la cantidad o tiempo requerido.

Generamos las imágenes con antelación: simplemente grabamos un vídeo ya preparado con un temporizador y exportamos 200 imágenes.

Esta es la mecánica que fue programada en la cruz. Cuando comenzó la cuenta regresiva final, todos fuimos al sitio, nos armamos con extintores y nos sentamos a esperar el incendio (que recién estaba en pleno apogeo en la discordia)

Cómo hacer una retransmisión que funcione durante una semana: elegir una cámara

Para la misión, necesitábamos una transmisión continua en YouTube durante 7 días; eso es exactamente lo que establecimos como la duración máxima del juego. Había dos cosas que podían detenernos:

  1. Sobrecalentamiento de la cámara debido al funcionamiento continuo
  2. corte de internet

La cámara tenía que proporcionar al menos una imagen Full HD para que jugar y mirar la habitación fuera cómodo.

Inicialmente, buscamos cámaras web producidas para streamers. Estábamos recortando nuestro presupuesto, así que no queríamos comprar una cámara, pero resultó que no la alquilan. Al mismo tiempo, encontramos milagrosamente una cámara Xbox Kinect en mi casa, la instalamos en mi habitación y comenzamos una transmisión de prueba durante una semana.

La cámara funcionó bien y no se sobrecalentó, pero Ilya casi de inmediato notó que le faltaban ajustes y, en particular, era imposible establecer la exposición.

Ilya buscó acercar el tipo de transmisión a los estándares de la producción de películas y videos: transmitir una escena de luz que cambia dinámicamente con fuentes de luz brillantes, un fondo oscuro y objetos en el marco. Al mismo tiempo, quería preservar la elaboración de la imagen tanto en luces como en sombras, con el mínimo ruido digital.

Por lo tanto, aunque Kinect demostró ser confiable en las pruebas y no requería una tarjeta de captura de video (otro punto de falla), decidimos abandonarlo. Después de tres días de probar diferentes cámaras, Ilya eligió la Sony FDR-AX53, una videocámara pequeña y confiable que es económica de alquilar, pero que al mismo tiempo tiene suficiente confiabilidad y características visuales.

Alquilamos una cámara, la encendimos durante una semana junto con una tarjeta de captura de vídeo y nos dimos cuenta de que con ella podíamos contar con una transmisión continua durante toda la misión.

Hacer una película: puesta en escena e iluminación

Trabajar en la iluminación requirió cierta gracia; necesitábamos construir una partitura de iluminación con medios mínimos:

1. Iluminación de objetos cuando los jugadores los encuentran (láser, peso), así como luz constante en la trituradora. Aquí utilizamos dedolight 150: dispositivos de iluminación de película confiables y compactos con lámparas halógenas de bajo voltaje, que le permiten enfocar el haz en un objeto específico sin afectar el fondo ni otros objetos.

2. Práctica luz de juego: lámpara de mesa, lámpara de pie, estrella, guirnalda. Toda la luz práctica se distribuyó armoniosamente en el marco para iluminar el área de la imagen, en el interior se encontraban lámparas LED con una temperatura de color de 3200K, la lámpara de la lámpara de pie se cubrió con un filtro de lámina roja Rosco para crear un acento de color inusual.

Project iron: cómo construimos una habitación con una búsqueda de hackers
Soy ingeniero en casa de mi mamá o el lanzamiento es mañana.

Cómo reservamos internet y electricidad

Abordaron el tema de la tolerancia a fallos casi como en un centro de datos: decidieron no desviarse de los principios básicos y reservaron según el esquema habitual N+1.

Si la transmisión en YouTube se detiene, esto significa que será imposible volver a conectarse usando el mismo enlace y continuar la transmisión. Era un momento crítico y la habitación estaba ubicada en una oficina normal.

Para ello utilizamos un enrutador basado en OpenWRT y el paquete mwan3. Probaba automáticamente la disponibilidad del canal cada 5 segundos y, en caso de una interrupción, cambiaba al módem de respaldo con Yota. Como resultado, el cambio al canal de respaldo se produjo en menos de un minuto.
Project iron: cómo construimos una habitación con una búsqueda de hackers
También era igualmente importante eliminar los cortes de energía, porque incluso una subida de tensión de corta duración provocaría el reinicio de todas las computadoras.

Por lo tanto, tomamos una fuente de alimentación ininterrumpida ippon innova g2 3000, que respaldaría todos los dispositivos de juego: el consumo total de energía de nuestro sistema fue de alrededor de 300 vatios. Duraría 75 minutos, suficiente para nuestros propósitos.

Decidimos sacrificar iluminación adicional en caso de que se cortara la electricidad en la habitación: no estaba conectada a un sistema de alimentación ininterrumpida.

Agradecimientos

  • a todo el equipo RUVDS, quien inventó e implementó el juego.
  • Por otra parte, a los administradores de RUVDS, para monitorear el trabajo de los servidores, la carga fue aceptable y todo funcionó como de costumbre.
  • al mejor jefe ntsaplin por el hecho de que en respuesta a la llamada, “Tengo una idea: tomaremos un servidor, le pondremos un acuario y colgaremos un peso encima, boom, bang, todo se inundará de agua, cortocircuito, fuego. !” él siempre dice con confianza "¡hazlo!"
  • Gracias Editorial Tilda y por separado a Mikhail Karpov por no sólo llegar a mitad de camino y permitirnos violar los Términos de uso, sino incluso por darnos una cuenta comercial durante un año cuando hablamos sobre el proyecto.
  • Ilya Serov S_ILya por unirte y convertirte en coproductor del proyecto, dispuesto a gatear media noche, pegando tiras de LED, buscando soluciones técnicas y haciendo todo lo posible para que consigamos una película de verdad.
  • zhovner por estar siempre dispuesto a salvar la situación cuando otros se dieron por vencidos, borscht, apoyo moral y conversaciones hasta la mañana.
  • samat por conectarnos con el mejor pentester del país, quien nos asesoró y ayudó en las tareas.
  • daniemilk por la genial producción de todos los videos.
  • Delphe por mano firme y ganas de trabajar hasta el final.
  • Ну Dodo Pizza Ingeniería para pizza casi siempre caliente.

Y el mayor agradecimiento para los jugadores por todas las emociones que experimentamos mientras asaltaban la misión durante dos días sin dormir e incluso posponer el trabajo.

Otros artículos sobre la misión para destruir el servidor.

Project iron: cómo construimos una habitación con una búsqueda de hackers

Fuente: habr.com

Añadir un comentario