#include <WiFi.h>
#include <WebServer.h>
#include <DHTesp.h>
DHTesp dht;
WebServer server(80);
const int PINO_DHT = 15;
const int LED_VERDE = 18;
const int LED_VERMELHO = 19;
float temperaturaReal = 0;
float temperaturaSistema = 0;
bool temperaturaForcada = false;
void paginaInicial() {
String pagina = "<html>";
pagina += "<h1>FIAP - IoT Security Lab</h1>";
pagina += "<p>Temperatura REAL: ";
pagina += String(temperaturaReal, 1);
pagina += " C</p>";
pagina += "<p>Temperatura utilizada pelo sistema: ";
pagina += String(temperaturaSistema, 1);
pagina += " C</p>";
pagina += "<p><b>Endpoint vulneravel:</b></p>";
pagina += "<p>/setTemp?value=22</p>";
pagina += "</html>";
server.send(200, "text/html", pagina);
}
// ------------------------------------------------------
// ENDPOINT VULNERAVEL
// Qualquer cliente pode alterar a temperatura
// sem autenticação.
// ------------------------------------------------------
void alterarTemperatura() {
if (server.hasArg("value")) {
temperaturaSistema = server.arg("value").toFloat();
temperaturaForcada = true;
Serial.println();
Serial.println("=================================");
Serial.println("ALTERACAO REMOTA RECEBIDA");
Serial.print("Nova temperatura utilizada: ");
Serial.println(temperaturaSistema);
Serial.println("=================================");
server.send(
200,
"text/plain",
"Temperatura alterada remotamente!"
);
} else {
server.send(
400,
"text/plain",
"Parametro value ausente"
);
}
}
void setup() {
Serial.begin(115200);
dht.setup(
PINO_DHT,
DHTesp::DHT22
);
pinMode(LED_VERDE, OUTPUT);
pinMode(LED_VERMELHO, OUTPUT);
// Wi-Fi virtual do Wokwi
WiFi.begin("Wokwi-GUEST", "");
Serial.println();
Serial.println("Conectando ao WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi conectado!");
Serial.print("IP da vitima: ");
Serial.println(WiFi.localIP());
server.on("/", paginaInicial);
server.on(
"/setTemp",
alterarTemperatura
);
server.begin();
Serial.println("Servidor HTTP iniciado.");
}
void loop() {
server.handleClient();
TempAndHumidity dados =
dht.getTempAndHumidity();
temperaturaReal =
dados.temperature;
// Se ainda não houve ataque,
// o sistema utiliza a leitura real.
if (!temperaturaForcada) {
temperaturaSistema =
temperaturaReal;
}
// ------------------------------------------------------
// DECISAO DO SISTEMA
// ------------------------------------------------------
if (temperaturaSistema >= 30) {
digitalWrite(
LED_VERMELHO,
HIGH
);
digitalWrite(
LED_VERDE,
LOW
);
} else {
digitalWrite(
LED_VERMELHO,
LOW
);
digitalWrite(
LED_VERDE,
HIGH
);
}
Serial.println();
Serial.println("----------------------------");
Serial.print("Temperatura REAL: ");
Serial.print(temperaturaReal);
Serial.println(" C");
Serial.print("Temperatura utilizada: ");
Serial.print(temperaturaSistema);
Serial.println(" C");
if (temperaturaForcada) {
Serial.println(
"ATENCAO: valor remoto ativo!"
);
}
delay(2000);
}