25 de outubro de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Checar portas abertas com ESP32

portas abertas

No artigo anterior vimos como procurar por uma determinada porta em uma rede à qual o ESP32 esteja conectado. Nesse artigo veremos algo que talvez seja ainda mais interessante: faremos o ESP32 chegar portas abertas em nosso computador. Dessa vez vou pular os conceitos de rede, que estão descritos no artigo citado ao início do parágrafo.

Scanner de portas local

Invés de fazer o scan na rede toda, dessa vez o ESP32 fará scan em somente 1 host. Para tal, o ESP32 deve ser colocado em modo AP. Ao conectar-se a ele, é iniciada a varredura do computador conectado, em busca de portas de serviço abertas. Aqui teremos alguns pontos muito interessantes.

WiFi.setTimeout(segundos)

No artigo anterior mantive o timeout padrão, o que já não é lá tão aceitável. Mas para varrer mais de 60.000 portas, é impossível manter o padrão do artigo anterior. Por essa razão, redefinimos o tempo do socket para um rápido escaneamento.

WiFi.softAPgetStationNum()

O ESP32 deve identificar uma conexão, uma vez que não há um serviço rodando para a estação se conectar a ele. Quando uma conexão ao ESP32 acontece, o número de estações conectadas é incrementada, então saímos de 0 para algum valor. Como esperamos ter apenas 1 estação conectada para o escaneamento, verificamos se o retorno dessa função é igual a 1, então chamamos a função scanPorts(). Presumidamente o IP atribuído à estação será 192.168.4.2, exceto se os parâmetros de rede sejam modificados.

Como ainda estou usando a Heltec Wireless Stick para o artigo, aproveitei o display para exibir as portas abertas. Na função scanPorts() está definido um atraso de 3 segundos, para que seja possível acompanhar no display as portas abertas. Nada que não possa ser solucionado gerando arquivos de log, salvos no sistema de arquivos do ESP32/ESP8266.

Código do scanner de portas

O código, atendendo aos requisitos supracitados, é esse:

#include <Arduino.h>
#include <WiFi.h>
#include "heltec.h"

#define OLED_UPDATE_INTERVAL 500

const char* ssid       = "ESP32 Scanner"; 
const char* password   = "01234567"; 

void scanPorts(){  
    //Hora de fazer o loop, varrendo os hosts e descobrindo se a porta está aberta
    for (unsigned long int port=23; port<5000;port++){ //0 é reserva de rede e 255 é o broadcast
        String target = "192.168.4.2";
        WiFiClient client;
        client.setTimeout(1);

        if (client.connect(target.c_str(), port)) {
                client.setTimeout(1);
                Serial.print("Porta aberta: ");
                Serial.println(port);
                client.stop(); 

                String msgH = "Porta aberta";
                String msgP = String(port);
                Heltec.display->clear();
                Heltec.display->drawString(0, 0, msgH);
                Heltec.display->drawString(0, 10, msgP);
                Heltec.display->display();
                vTaskDelay(pdMS_TO_TICKS(3000));
        }  
    }

}

void setupWIFI(){
    Heltec.display->clear();
    Heltec.display->drawString(0, 0, "Connecting...");
    Heltec.display->drawString(0, 10, String(ssid));
    Heltec.display->display();
  
    WiFi.softAP(ssid, password);

    Heltec.display->clear();
    Heltec.display->drawString(0, 0, "Conectado");
    Heltec.display->drawString(0, 10, "Ate logo");
    Heltec.display->display();
    delay(5000);
    Heltec.display->clear();
    Heltec.display->display();
  
    Heltec.display->clear();
}

void setup(){
   pinMode(0,INPUT_PULLDOWN);
    Heltec.begin(true /*DisplayEnable Enable*/, false /*LoRa Disable*/, true /*Serial Enable*/);
    pinMode(25, OUTPUT);
    while (!Serial) {
        vTaskDelay(pdMS_TO_TICKS(10));
    }
    setupWIFI();
    //se escolhida a opção 2, a primeira chamada pode ser no setup:
    vTaskDelay(pdMS_TO_TICKS(2000));
}

void loop() {
    if (WiFi.softAPgetStationNum() == 1){
        scanPorts();
    }
    delay(5000);
}

Vídeo

O vídeo de apresentação desse artigo está disponível em nosso canal DobitaobyteBrasil no Youtube. Se não é inscrito, prestigie-nos. Se gostar do vídeo, deixe seu like. Se tiver sugestões de artigos, deixe nos comentários dos vídeos.

O link direto para o vídeo é esse.

Onde comprar o Heltec Wireless Stick?

Gostou do ESP32? Esse modelo está disponível na CurtoCircuito através desse link. Já escrevi alguns artigos sobre ele, como esse color picker e recomendo bastante.

Até a próxima!

 

Revisão: Ricardo Amaral de Andrade