
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);
// 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!")
// Exibir nossos resultados.
foreach (PKServiceObject port in result.Services)
{
Console.WriteLine("[+] IP: " + port.IP + " | " +
"Porta: " + port.Port.ToString() + " | " +
"Protocolo: " + port.Protocol.ToString() + " | " +
"Status: " + port.Status.ToString());
}
// Permitir que o usuário saia a qualquer momento.
Console.Read();
}
}
}
Por fim, mostrarei um exemplo simples de port knocking assíncrono. É essencialmente o mesmo que port knocking síncrono, exceto pelo fato de que você pode usar eventos a seu favor. Você pode obter atualizações de progresso sem se preocupar com travamentos de interfaces ou sistemas em estado bloqueado; 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.PortKnockAsyncProgressChanged += new PortKnockAsyncProgressChangedHandler(PortKnockAsyncProgressChanged);
s.PortKnockAsyncComplete += new PortKnockAsyncCompleteHandler(PortKnockAsyncComplete);
// Iniciar uma nova tarefa de varredura com nosso ip.
TaskFactory task = new TaskFactory();
task.StartNew(() => s.PortKnockAsync(ip));
// Permitir que o usuário saia a qualquer momento.
Console.Read();
}
static void PortKnockAsyncProgressChanged(object sender, PortKnockAsyncProgressChangedEventArgs e)
{
// Exibir nosso progresso para saber o tempo estimado.
if (e.Progress == 99)
{
Console.Write(e.Progress.ToString() + "%...");
Console.WriteLine("100%!");
}
else
Console.Write(e.Progress.ToString() + "%...");
}
static void PortKnockAsyncComplete(object sender, PortKnockAsyncCompleteEventArgs e)
{
// Informar ao usuário que o port knock foi concluído.
Console.WriteLine("[+] Port Knock concluído!");
// Verificar se houve algum erro.
if (e.Result == null)
Console.WriteLine("[X] O port knock não retornou nenhum dado!");
else
{
// Verificar se temos alguma porta registrada.
if (e.Result.Services.Count == 0)
Console.WriteLine("[!] Nenhuma porta estava aberta durante o knock.");
else
{
// Exibir nossas portas e seus detalhes.
foreach (PKServiceObject port in e.Result.Services)
{
Console.WriteLine("[+] IP: " + port.IP + " | " +
"Porta: " + port.Port.ToString() + " | " +
"Protocolo: " + port.Protocol.ToString() + " | " +
"Status: " + port.Status.ToString());
}
}
}
}
}
}
Ícone: monkik
https://www.flaticon.com/authors/monkik
Copyright © ∞ Jason Drawdy
Todos os direitos reservados.
A Licença MIT (MIT)
A permissão é concedida, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software"), para lidar com o Software sem restrições, incluindo, sem limitação, os direitos de usar, copiar, modificar, mesclar, publicar, distribuir, sublicenciar e/ou vender cópias do Software, e para permitir que as pessoas a quem o Software é fornecido o façam, sujeitas às seguintes condições:
O aviso de direitos autorais acima e este aviso de permissão devem ser incluídos em todas as cópias ou partes substanciais do Software.
O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM NENHUM CASO OS AUTORES OU DETENTORES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER REIVINDICAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, FORA OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.
Exceto conforme contido neste aviso, o nome do detentor dos direitos autorais acima não deve ser usado em publicidade ou de outra forma para promover a venda, uso ou outras negociações neste Software sem autorização prévia por escrito.