
Biblioteca de varredura de rede rápida e extensível, com multithreading, sondagem ping e buscadores de varredura.
A biblioteca Forerunner é uma biblioteca de rede rápida, leve e extensível criada para auxiliar no desenvolvimento de aplicações robustas centradas em rede, como: scanners de IP, port knockers, clientes, servidores, etc. Em seu estado atual, a biblioteca Forerunner é capaz de escanear e realizar port knocking de forma síncrona e assíncrona em endereços IP para obter informações sobre o dispositivo localizado naquele endpoint, como: se o IP está online, o endereço MAC físico, entre outros. A biblioteca é totalmente orientada a objetos e baseada em eventos, o que significa que os dados de varredura são encapsulados em objetos "scan" especialmente criados, projetados para lidar com todos os dados, desde resultados até exceções.
| Método | Descrição | Uso |
|---|---|---|
| Scan | Escanear um único IP em busca de informações | Scan("192.168.1.1"); |
| ScanRange | Escanear um intervalo de IPs em busca de informações | ScanRange("192.168.1.1", "192.168.1.255") |
| ScanList | Escanear uma lista de IPs em busca de informações | ScanList("192.168.1.1, 192.168.1.2, 192.168.1.3") |
| PortKnock | Verificar todas as portas de um único IP | PortKnock("192.168.1.1"); |
| PortKnockRange | Verificar todas as portas em um intervalo de IPs | PortKnockRange("192.168.1.1", "192.168.1.255"); |
| PortKnockList | Verificar todas as portas usando uma lista de IPs | PortKnockList("192.198.1.1, 192.168.1.2, 192.168.1.3"); |
| IsHostAlive | Verificar se um host está ativo N vezes por X milissegundos | IsHostAlive("192.168.1.1", 5, 1000); |
| GetAveragePingResponse | Obter a resposta média de ping para um host | GetAveragePingResponse("192.168.1.1", 5, 1000); |
| IsPortOpen | Verificar portas individuais via TCP e UDP | IsPortOpen("192.168.1.1", 45000, new TimeSpan(1000), false); |
Escaneamento de rede é uma tarefa comum nesta era digital, portanto, tomei a liberdade de tornar isso o mais simples possível para qualquer futuro programador que queira fazer algo assim de forma fácil. A biblioteca Forerunner é totalmente orientada a objetos, tornando-a ideal para situações de plug and play; o objeto para varredura de IP é chamado de IPScanObject e contém algumas propriedades:
Com o objeto em mente, vamos tentar criar um novo objeto e realizar uma varredura usando-o. Existem várias maneiras de fazer isso, no entanto, a maneira mais simples de começar é primeiro criar um novo objeto Scanner para acessar nossos métodos de varredura. Em seguida, crie um IPScanObject e atribua-o ao método Scan com o IP que você deseja enumerar; por exemplo:
using System;
using Forerunner; // Lembre-se de importar nossa biblioteca.
namespace Example
{
class Program
{
static void Main(string[] args)
{
// O IP que gostaríamos de escanear.
string ip = "192.168.1.1";
// Criar um novo objeto scanner.
Scanner s = new Scanner();
// Criar um novo objeto de varredura e realizar a varredura.
IPScanObject result = s.Scan(ip);
// Exibir que a varredura foi concluída.
if (result.Errors != null)
Console.WriteLine("[x] Ocorreu um erro durante a varredura.");
else
Console.WriteLine("[+] " + ip + " foi escaneado com sucesso!")
// Permitir que o usuário saia a qualquer momento.
Console.Read();
}
}
}
Outra maneira, que é meu método preferido de operação, é criar um objeto Scanner e se inscrever nos Event Handlers de coisas como ScanAsyncProgressChanged ou ScanAsyncComplete, assim tenho controle total sobre meus métodos assíncronos; posso controlar como seus estados de progresso afetam minha aplicação e assim por diante; por exemplo:
using System;
using System.Threading.Tasks;
using Forerunner; // Lembre-se de importar nossa biblioteca.
namespace Example
{
class Program
{
static void Main(string[] args)
{
// O IP que gostaríamos de escanear.
string ip = "192.168.1.1";
// Configurar nosso objeto scanner.
Scanner s = new Scanner();
s.ScanAsyncProgressChanged += new ScanAsyncProgressChangedHandler(ScanAsyncProgressChanged);
s.ScanAsyncComplete += new ScanAsyncCompleteHandler(ScanAsyncComplete);
// Iniciar uma nova tarefa de varredura com nosso ip.
TaskFactory task = new TaskFactory();
task.StartNew(() => s.ScanAsync(ip));
// Permitir que o usuário saia a qualquer momento.
Console.Read();
}
static void ScanAsyncProgressChanged(object sender, ScanAsyncProgressChangedEventArgs e)
{
// Fazer algo aqui com e.Progress, ou você pode deixar este evento
// não inscrito para não precisar fazer nada.
}
static void ScanAsyncComplete(object sender, ScanAsyncCompleteEventArgs e)
{
// Fazer algo com o IPScanObject, ou seja, e.Result.
if (e.Result.Errors != null)
Console.WriteLine("[x] Ocorreu um erro durante a varredura.");
else
Console.WriteLine("[+] " + e.Result.IP + " foi escaneado com sucesso!")
}
}
}
Eu sei o que você está pensando. Port knocking? Sim e não. O termo não significa port knocking no sentido tradicional de conectar-se através de um conjunto predefinido de portas, mas sim apenas verificar se alguma porta está realmente aberta. É literalmente "bater" em uma porta em todos os sentidos da palavra, tentando conectar-se a cada porta e enviar dados. Assim como na varredura de IP, o port knocking usa um objeto personalizado chamado "Port Knock Scan Object" ou PKScanObject para abreviar. O PKScanObject contém uma lista de PKServiceObjects que, por sua vez, armazenam nossos dados de porta; o objeto de serviço contém as seguintes propriedades:
O port knocking é semelhante à varredura de IP. Primeiro, crie um objeto Scanner. Em seguida, crie um novo PKScanObject e atribua-o ao método PortKnock com o IP de sua escolha, depois exiba seus resultados; por exemplo:
using System;
using Forerunner; // Lembre-se de importar nossa biblioteca.
namespace Example
{
class Program
{
static void Main(string[] args)
{
// O IP que gostaríamos de escanear.
string ip = "192.168.1.1";
// Criar um novo objeto scanner.
Scanner s = new Scanner();
// Criar um novo objeto de varredura e realizar a varredura.
PKScanObject result = s.PortKnock(ip);