SlideShare a Scribd company logo
1 of 51
Download to read offline
Let your devices
enter the witchcraft
of the IoT world
Tomasz Kajtoch
Kilka słów o mnie
Frontend developer @ TSH
Backend developer & Security engineer po godzinach
Wielbiciel miauczących czworonogów 🐈
O czym będzie?
Disclaimer
Rynek urządzeń IoT
Próba stworzenia taniego,
łatwego w użyciu i bezpiecznego
modułu sterowania urządzeniami
Decyzja:
Użycie modułu WiFi ESP8266
Możliwość pracy niezależnie, bez dodatkowych układów
Koszt: kilkanaście złotych
Wysoka wydajność oraz relatywnie niskie zapotrzebowanie na energię
IoT Deploy Fail Alert
Informowanie
o nieudanym deployu
na produkcję w
widoczny sposób
🤔... bo notyfikacja email to za mało
Problem:
Brak urządzeń tego typu
na rynku
1. Skompletowanie
podzespołów
Lampa ostrzegawcza
Zasilacz do lampy
ESP8266 I przekaźnik
2. Połączenie w całość
3. Napisanie
oprogramowania
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#define WIFI_NAME "Wow"
#define WIFI_PASSWORD "Uszanowanko!"
#define GPIO_LED_STATUS 0
#define GPIO_RELAY 0
IPAddress ip(192, 168, 1, 51);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
ESP8266WebServer webServer(80);
bool relayActive = false;
Biblioteki i konfiguracja
void setup() {
pinMode(GPIO_LED_STATUS, OUTPUT);
pinMode(GPIO_RELAY, OUTPUT);
Serial.begin(115200);
WiFi.config(ip, gateway, subnet);
WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(GPIO_LED_STATUS, LOW);
delay(200);
digitalWrite(GPIO_LED_STATUS, HIGH);
delay(50);
}
webServer.on("/deploy-fail", webServerHandleDeployFail);
webServer.begin();
}
Inicjalizacja
void webServerHandleDeployFail() {
if (webServer.method() != HTTP_POST) {
webServer.send(405, "application/json", "{"error": "Method not allowed"}");
return;
}
if (relayActive) {
webServer.send(200, "application/json", "{"success": true}");
return;
}
webServer.send(200, "application/json", "{"success": true}");
relayActive = true;
digitalWrite(GPIO_RELAY, LOW);
delay(10000); // Let it be active for 10 seconds
digitalWrite(GPIO_RELAY, HIGH);
relayActive = false;
}
Przełączanie stanu przekaźnika - włączanie lampy ostrzegawczej
4. Nasłuchiwanie eventu
nieudanego deploya
DEMO
Ekspres do kawy IoT ☕
JEDEN KROK DALEJ
Sterowanie ekspresem
przez sieć
CEL
Bo to fajne
Synchronizacja
z budzikiem :O
DEMO
Od czego zacząć?
"W jaki sposób mogę
podłączyć się do ekspresu?"
Złącze serwisowe
na ratunek!
Złącze serwisowe
na ratunek!
Złącze serwisowe
na ratunek!
Pierwsza próba:
Protokół jest szyfrowany :-(
Sposoby złamania szyfru*
1. Reverse engineering
firmware sprzętu
2. Wyszukiwanie w Google
3. Research na stronach
rosyjskojęzycznych
4. Podsłuchiwanie transmisji i
próba znalezienia schematu
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Przygotowanie
Wykorzystanie chipu ESP8266 do transmisji WiFi 802.11 b/g/n
Ustanowienie komunikacji pomiędzy chipem a ekspresem do kawy
Napisanie oprogramowania do dwustronnej komunikacji z ekspresem z
użyciem protokołu HTTP i REST API
Poznawanie komend
przez brute-force
Nie polecam...
Jak przebiega komunikacja?
Urządzenie wyzwalające
(np. Telefon z budzikiem)
Domowa
sieć WiFi
Chip z naszym
oprogramowaniem
Ekspres
RaspberryPi
Odseparowana
sieć WiFi
String data = 'placki';
for (int i = 0; i < data.length(); i++) {
const char val = data.charAt(i);
for (int j = 0; j < 8; j += 2) {
char _byte = 255; // 11111111 binary
bitWrite(_byte, 2, bitRead(val, j));
bitWrite(_byte, 5, bitRead(val, j + 1));
softwareSerial.write(_byte); // <- write to the serial
}
delay(8);
}
String -> Jura
'A' => 01 00 00 01
11 0 11 1 11
11 0 11 0 11
11 0 11 0 11
11 0 11 1 11
String -> Jura
String data = "placki";
String response = "";
int bitN = 0;
char responseByte;
while (!response.endsWith("rn")) {
byte _byte = softwareSerial.read();
bitWrite(responseByte, s, bitRead(_byte, 2));
bitWrite(responseByte, s + 1, bitRead(_byte, 5));
if (( bitN += 2) >= 8) {
bitN = 0;
response += responseByte;
}
}
Jura -> String
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <SoftwareSerial.h>
#define WIFI_NAME "Wow"
#define WIFI_PASSWORD "Uszanowanko!"
#define GPIO_RX 12
#define GPIO_TX 13
#define GPIO_LED_STATUS 0
IPAddress ip(192, 168, 1, 50);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
SoftwareSerial softwareSerial(GPIO_RX, GPIO_TX);
ESP8266WebServer webServer(80);
Biblioteki i konfiguracja
void setup() {
pinMode(GPIO_LED_STATUS, OUTPUT);
Serial.begin(115200);
softwareSerial.begin(9600);
WiFi.config(ip, gateway, subnet);
WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(GPIO_LED_STATUS, LOW);
delay(200);
digitalWrite(GPIO_LED_STATUS, HIGH);
delay(50);
}
webServer.on("/execute-command", webServerHandleExecuteCommand);
webServer.begin();
}
Inicjalizacja
void webServerHandleExecuteCommand() {
if (webServer.method() != HTTP_POST) {
webServer.send(405, "text/plain", "Method not allowed");
return;
}
String command = webServer.arg("cmd");v
if (command.length() < 3) {
webServer.send(400, "text/plain", "Bad request!");
return;
}
digitalWrite(GPIO_LED_STATUS, HIGH);
String response = cmd2jura(command);
digitalWrite(GPIO_LED_STATUS, LOW);
webServer.send(200, "text/plain", response);
}
Inicjalizacja
void loop() {
webServer.handleClient();
}
Pętla główna
Odkryte komendy
TY: - Wersja sprzętu i oprogramowania
RE:XX - Odczytanie słowa pamięci EEPROM na podanym adresie
RT:XX - Odczytanie linii pamięci EEPROM na podanym adresie
RR:XX - Odczytanie linii pamięci RAM na podanym adresie
FN:XX - Włączanie/Wyłączanie komponentów ekspresu,
np. Pompy, grzałki, młynka
Serwisowe
AN:01 - Włączenie urządzenia
AN:02 - Wyłączenie urządzenia
AN:03 - Test wyświetlacza*
AN:0D - Pobranie aktualnej daty z urządzenia*
Odkryte komendy
AN:XX - Zarządzanie całym urządzeniem
FA:02 - Para
FA:03 - Przejście w tryb zaparzenia kawy zmielonej,
wsypanej do podajnika
FA:06 - Kawa mała
FA:07 - Kawa średnia
FA:08 - Kawa duża
Odkryte komendy
FA:XX - Wybór produktów
Sukces!
Pytania?
Dziękuję za uwagę!

More Related Content

Similar to Let your existing devices enter the witchcraft of IoT and the smart-home world

Programowanie sterowników w Linuksie.
Programowanie sterowników w Linuksie.Programowanie sterowników w Linuksie.
Programowanie sterowników w Linuksie.Semihalf
 
Secure Coding w praktyce.
Secure Coding w praktyce.Secure Coding w praktyce.
Secure Coding w praktyce.Semihalf
 
Not Almanach short-cut within Networking (in Polish)
Not Almanach short-cut within Networking (in Polish)Not Almanach short-cut within Networking (in Polish)
Not Almanach short-cut within Networking (in Polish)tomasz_pelczar
 
Python i elektronika
Python i elektronikaPython i elektronika
Python i elektronikariklaunim
 
Space Wars Hack - Class #1
Space Wars Hack - Class #1Space Wars Hack - Class #1
Space Wars Hack - Class #1Piotr Pawlak
 
Jak włamałem się do banku
Jak włamałem się do bankuJak włamałem się do banku
Jak włamałem się do bankuSlawomir Jasek
 
PLNOG19 - Krzysztof Banel - Nowe modele bezpieczeństwa w sieciach SDN
PLNOG19 - Krzysztof Banel - Nowe modele bezpieczeństwa w sieciach SDNPLNOG19 - Krzysztof Banel - Nowe modele bezpieczeństwa w sieciach SDN
PLNOG19 - Krzysztof Banel - Nowe modele bezpieczeństwa w sieciach SDNPROIDEA
 
Drobne błędy w portalach WWW -- prawdziwe studium przypadku
Drobne błędy w portalach WWW -- prawdziwe studium przypadkuDrobne błędy w portalach WWW -- prawdziwe studium przypadku
Drobne błędy w portalach WWW -- prawdziwe studium przypadkumsobiegraj
 
Testowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnychTestowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnychSecuRing
 
(Nie)bezpieczenstwo aplikacji mobilnych
(Nie)bezpieczenstwo aplikacji mobilnych(Nie)bezpieczenstwo aplikacji mobilnych
(Nie)bezpieczenstwo aplikacji mobilnychSecuRing
 
PLNOG 9: Robert Ślaski - SKALOWALNE SZYFROWANIE USŁUG W SIECI OPERATORA - prz...
PLNOG 9: Robert Ślaski - SKALOWALNE SZYFROWANIE USŁUG W SIECI OPERATORA - prz...PLNOG 9: Robert Ślaski - SKALOWALNE SZYFROWANIE USŁUG W SIECI OPERATORA - prz...
PLNOG 9: Robert Ślaski - SKALOWALNE SZYFROWANIE USŁUG W SIECI OPERATORA - prz...PROIDEA
 
Seminarium .Net CF 2004
Seminarium .Net CF 2004Seminarium .Net CF 2004
Seminarium .Net CF 2004Tomasz Cieplak
 
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnychGanymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnychSKN Shader
 
Technik.teleinformatyk 312[02] z1.03_u
Technik.teleinformatyk 312[02] z1.03_uTechnik.teleinformatyk 312[02] z1.03_u
Technik.teleinformatyk 312[02] z1.03_uRzeźnik Sebastian
 

Similar to Let your existing devices enter the witchcraft of IoT and the smart-home world (20)

Programowanie sterowników w Linuksie.
Programowanie sterowników w Linuksie.Programowanie sterowników w Linuksie.
Programowanie sterowników w Linuksie.
 
Secure Coding w praktyce.
Secure Coding w praktyce.Secure Coding w praktyce.
Secure Coding w praktyce.
 
Iron Python I Dlr
Iron Python I DlrIron Python I Dlr
Iron Python I Dlr
 
Not Almanach short-cut within Networking (in Polish)
Not Almanach short-cut within Networking (in Polish)Not Almanach short-cut within Networking (in Polish)
Not Almanach short-cut within Networking (in Polish)
 
Python i elektronika
Python i elektronikaPython i elektronika
Python i elektronika
 
Space Wars Hack - Class #1
Space Wars Hack - Class #1Space Wars Hack - Class #1
Space Wars Hack - Class #1
 
Jak włamałem się do banku
Jak włamałem się do bankuJak włamałem się do banku
Jak włamałem się do banku
 
Sniffing
SniffingSniffing
Sniffing
 
Praca Dyplomowa
Praca DyplomowaPraca Dyplomowa
Praca Dyplomowa
 
Praca Dyplomowa
Praca DyplomowaPraca Dyplomowa
Praca Dyplomowa
 
PLNOG19 - Krzysztof Banel - Nowe modele bezpieczeństwa w sieciach SDN
PLNOG19 - Krzysztof Banel - Nowe modele bezpieczeństwa w sieciach SDNPLNOG19 - Krzysztof Banel - Nowe modele bezpieczeństwa w sieciach SDN
PLNOG19 - Krzysztof Banel - Nowe modele bezpieczeństwa w sieciach SDN
 
Drobne błędy w portalach WWW -- prawdziwe studium przypadku
Drobne błędy w portalach WWW -- prawdziwe studium przypadkuDrobne błędy w portalach WWW -- prawdziwe studium przypadku
Drobne błędy w portalach WWW -- prawdziwe studium przypadku
 
Testowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnychTestowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnych
 
(Nie)bezpieczenstwo aplikacji mobilnych
(Nie)bezpieczenstwo aplikacji mobilnych(Nie)bezpieczenstwo aplikacji mobilnych
(Nie)bezpieczenstwo aplikacji mobilnych
 
PLNOG 9: Robert Ślaski - SKALOWALNE SZYFROWANIE USŁUG W SIECI OPERATORA - prz...
PLNOG 9: Robert Ślaski - SKALOWALNE SZYFROWANIE USŁUG W SIECI OPERATORA - prz...PLNOG 9: Robert Ślaski - SKALOWALNE SZYFROWANIE USŁUG W SIECI OPERATORA - prz...
PLNOG 9: Robert Ślaski - SKALOWALNE SZYFROWANIE USŁUG W SIECI OPERATORA - prz...
 
Seminarium .Net CF 2004
Seminarium .Net CF 2004Seminarium .Net CF 2004
Seminarium .Net CF 2004
 
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnychGanymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
 
Technik.teleinformatyk 312[02] z1.03_u
Technik.teleinformatyk 312[02] z1.03_uTechnik.teleinformatyk 312[02] z1.03_u
Technik.teleinformatyk 312[02] z1.03_u
 
1
11
1
 
Interfejsy komputera osobistego
Interfejsy komputera osobistegoInterfejsy komputera osobistego
Interfejsy komputera osobistego
 

More from The Software House

Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...The Software House
 
Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?The Software House
 
O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?The Software House
 
Chat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeChat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeThe Software House
 
Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?The Software House
 
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSAnaliza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSThe Software House
 
Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptThe Software House
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptThe Software House
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLThe Software House
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychThe Software House
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciThe Software House
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case studyThe Software House
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejThe Software House
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachThe Software House
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsThe Software House
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeThe Software House
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduThe Software House
 

More from The Software House (20)

Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
 
Uszanowanko Podsumowanko
Uszanowanko PodsumowankoUszanowanko Podsumowanko
Uszanowanko Podsumowanko
 
Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?
 
O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?
 
Chat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeChat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon Chime
 
Migracje danych serverless
Migracje danych serverlessMigracje danych serverless
Migracje danych serverless
 
Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?
 
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSAnaliza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
 
Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScript
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScript
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danych
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięci
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case study
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny Krzemowej
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzach
 
Jak poskromić AWS?
Jak poskromić AWS?Jak poskromić AWS?
Jak poskromić AWS?
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.js
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurze
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki kodu
 

Let your existing devices enter the witchcraft of IoT and the smart-home world