sabato 17 settembre 2022

Cosa uso per monitorare la casa

 Questa volta volevo darvi qualche dato sui componenti che uso da tempo per fare un pò di domotica spiccia in casa, nulla di professionale o di altamente ottimizzato e probabilmente sovradimensionato e sovra ingegnerizzato per lo scopo finale, ma va bene così, tanto mi gestisco tutto in casa (in tutti i sensi).

Allora per prima cosa perché ho tutto in casa e non in qualche cloud o soluzioni già pronte?

Bhe essenzialmente per 3 motivi:

  • Durabilità: Utilizzando servizi cloud o soluzioni già pronte se vengono chiuse o sostituite c'è il rischio di dover cambiare tutto o peggio ancora di avere dei bei sottobicchieri non più usabili (come descritto bene dal Francesco Tucci nel suo blog )
  • Costi: Tanto un nas sempre acceso ce l'ho già, perchè non usarlo anche per altro?
  • ultimo ma non ultimo, mi diverto un casino a trovare soluzioni a problemi che mi creo da solo 

Allora cominciamo...
questo un breve schema dei componenti principali







Partiamo dal cuore di tutto il sistema, per disaccoppiare i componenti utilizzo il protocollo MQTT con un semplicissimo broker (in realtà non proprio semplicissimo perchè uso Rabbit con un'estensione per MQTT, ma qua ricadiamo nel discorso sovra ingegnerizzato) che mi permette di disaccoppiare tutte le parti e poter integrare/sostituire  componenti senza stravolgere nulla.

Per consumi e produzione un fantastico shellyEM con 2 pinze amperometriche per misurare entrambi i valori che poi vengono letti e messi su un topic MQTT.

In ogni stanza della casa ho XIAOMI Mijia che mi permette di avere temperature e umidità.
Piccola pecca, non è possibile utilizzare il dispositivo direttamente perchè sarebbe necessario un hub XIAOMI (che ovviamente io non ho), ma girando per la rete, alcuni temerari si sono rifatti il firmware aggiungendo anche funzionalità e potendo utilizzare un qualsiasi hub BLE. Allo scopo ho usato un esp32 con tasmota come firmware (versione BLE) che poi mi rimanda i dati letti direttamente su un topic MQTT che poi viene letto e gestito.

Il giardino è comandato da un altro ESP32 con un paio di relè perchè deve comandare una elettrovalvola della Gardenia che avevo nel cassetto. Il come l'ho modificata, riadattata e resa comandabile lo scriverò in un altro post.

Poi a questo punto ho fatto un bot di telegram che permette un minimo di controllo dei vari componenti e di accendere/spegnere "cose".

Del "cat destroyer" ne ho già parlato in un post precedente ("Come ti moralizzo il gatto" ed è un microsistema di AI che riconosce i gatti da immagini di una telecamere e fa partire l'irrigazione con semplice comando sul topic MQTT (vedete che qua viene buono il disaccoppiamento :-) )

Poi per finire un po' di dashboard fatte con grafana su andamenti, metriche, statistiche prese da un db InfluxDB che faccio girare in un container Docker che sta sul NAS.

In realtà ho anche altri componenti, ma vene parlerò nei prossimi post.

giovedì 8 settembre 2022

Come scavalco il problema e trovo la soluzione

 Rieccoci a noi dopo un bel pò di tempo passato tra peripezie varie, l'altro giorno avevo un pò di tempo e un annoso problema da risolvere che mi affligge da un pò.

Per scopi che non sto qui a descrivere devo utilizzare un'app per controllare alcune informazioni scolastiche (non farò il nome per non creare scompiglio nel caso fortuito o sfortuito che qualcuno inciampasse in questo post) che ha dei comportamenti strani quando lo installo sul mio telefono, mentre su altri telefoni (anche dello stesso modello) tutto sembra filare correttamente.


In questi casi cosa si fà? come si capisce cosa sta facendo un'app senza avere il codice sorgente?

**** DISCLAIMER ****

Allora, premessa, questo non è un post di cybersecurity o penetration testing, ma solo due righe molto veloci su come si possano fare verifiche e controlli di come un'app comunica con l'esterno senza avere accesso al codice sorgente, quindi non vuole essere ne esaustivo e tanto meno completo.

**** FINE DISCLAIMER ****

Allora dicevo, come si fa?

Prima cosa proviamo ad applicare la tecnica "man in the middle" per capire a grandi linee come l'app comunica con l'esterno e se ci sono informazioni utili a risolvere la magagna.

Quindi provo subito con il mio fedele fiddler (classic ovviamente :-) ) e l'emulatore Android per windows, dove con qualche giro riesco a recuperare e installare l'apk della suddetta app e farla partire.


Ad un primo momento svariati errori di certificati, ma questo me lo aspettavo e nessun dato utile perchè l'app senza dare errori non effettuava chiamate, bloccate da Android per problemi di certificati self signed.


Quindi armato di santa pazienza cambio proxy e mi sposto su mitmproxy che non avevo mai usato, ma che sembra molto usato in questo genere di attività.

Armeggio un po' con questo proxy per prenderci confidenza e alla fine mi trovo sempre ad avere problemi di certificati, fino a che non trovo questo documento che mi spiega come installare nei Trusted Certified di Android il certificato di mimproxy.

Nel frattempo avevo fatto mille altre prove, cambiando sistema operativo e modalità di installazione di mimtproxy, ma nulla sempre problemi di certificati, fino a quando mi si accende la lampadina "vuoi vedere che ho installato i certificati sbagliati e quindi poi mitmproxy non si trova?", controllo ed effettivamente era così, avendo fatto dirverse prove, avevo installato in Android dei certificati (le chiavi pubbliche) di una installazione di mitmproxy che non stavo usando e dopo aver sistemato, boom!!! vedo le chiamate e mi si apre un mondo.



Superato l'entusiasmo iniziale ancora non capisco come mai, a parità di chiamate e risposte, l'app si comportava in modo diverso con telefoni diversi.
A questo punto provo ad andare un po' più a fondo decompilando l'app usando apk-mitm che fa anche altre cosine interessanti, ma che mi da modo di vedere i files che compongono l'app.

Apro la cartella dove ho scompattato l'apk e "oh bella, vedo dei files familiari"


ma vuoi vedere che l'hanno scritta con Xamarin?

Analizzo un po' ed effettivamente è scritta in Xamarin e allora mi dico "bene siamo a cavallo, da qua gioco in casa".

Apro il mio fedele IlSpy e inizio un po' a girovagare per il codice cercando di capire come mai ci fossero queste differenze.

Non vi tedio con tutte le prove e i giri che ho fatto, ma spoilero e arriviamo direttamente alla conclusione, guardando un po' le funzioni mi cade l'occhio su questo codice:




dove c'è un bel parse di una data da un formato stringa e mi chiedo "Vuoi vedere che dipende dalle impostazioni della lingua del telefono visto che lì non specificano il formato?"

Cambio la lingua di Android e la metto in Italiano e BINGO!! tutto funziona regolarmente!! e quindi metto fine a questo cruccio durato anni :-)


Poi visto che la fame viene mangiando, mi sono implementato nel mio bot il recupero di alcune informazioni che mi servivano, ma questa è storia per un'altro post.