
Biblioteca de escaneo de redes rápida y extensible que cuenta con múltiples hilos, sondeo ping y extractores de escaneo.
La biblioteca Forerunner es una biblioteca de red rápida, ligera y extensible creada para ayudar en el desarrollo de aplicaciones robustas centradas en la red, tales como: Escáneres de IP, Golpeadores de Puertos, Clientes, Servidores, etc. En su estado actual, la biblioteca Forerunner es capaz de escanear y golpear puertos de direcciones IP tanto de forma síncrona como asíncrona para obtener información sobre el dispositivo ubicado en ese punto final, como: si la IP está en línea, la dirección MAC física, etc. La biblioteca es completamente orientada a objetos y basada en eventos, lo que significa que los datos de escaneo están contenidos dentro de objetos de "escaneo" especialmente diseñados que están construidos para manejar todos los datos, desde resultados hasta excepciones.
| Método | Descripción | Uso |
|---|---|---|
| Scan | Escanea una sola IP en busca de información | Scan("192.168.1.1"); |
| ScanRange | Escanea un rango de IPs en busca de información | ScanRange("192.168.1.1", "192.168.1.255") |
| ScanList | Escanea una lista de IPs en busca de información | ScanList("192.168.1.1, 192.168.1.2, 192.168.1.3") |
| PortKnock | Hace ping a cada puerto de una sola IP | PortKnock("192.168.1.1"); |
| PortKnockRange | Hace ping a cada puerto en un rango de IPs | PortKnockRange("192.168.1.1", "192.168.1.255"); |
| PortKnockList | Hace ping a cada puerto usando una lista de IPs | PortKnockList("192.198.1.1, 192.168.1.2, 192.168.1.3"); |
| IsHostAlive | Hace ping a un host N veces durante X milisegundos | IsHostAlive("192.168.1.1", 5, 1000); |
| GetAveragePingResponse | Obtiene la respuesta de ping promedio para un host | GetAveragePingResponse("192.168.1.1", 5, 1000); |
| IsPortOpen | Hace ping a puertos individuales a través de TCP y UDP | IsPortOpen("192.168.1.1", 45000, new TimeSpan(1000), false); |
Escanear una red es una tarea común en esta era digital, por lo que me he tomado la libertad de hacerlo lo más simple posible para cualquier programador futuro que desee hacer algo así de manera sencilla. La biblioteca Forerunner es completamente orientada a objetos, lo que la hace ideal para situaciones de plug and play; el objeto para el escaneo de IP se llama IPScanObject y en realidad contiene bastantes propiedades:
Teniendo el objeto en mente, intentemos crear un nuevo objeto y realizar un escaneo utilizándolo. Hay varias formas de hacerlo, sin embargo, la forma más simple de empezar es primero crear un nuevo objeto Scanner para poder acceder a nuestros métodos de escaneo. A continuación, crea un IPScanObject y luego asígnelo al método Scan con la IP que desees enumerar; por ejemplo:
using System;
using Forerunner; // Recuerda importar nuestra biblioteca.
namespace Example
{
class Program
{
static void Main(string[] args)
{
// Nuestra IP que queremos escanear.
string ip = "192.168.1.1";
// Crear un nuevo objeto scanner.
Scanner s = new Scanner();
// Crear un nuevo objeto de escaneo y realizar un escaneo.
IPScanObject result = s.Scan(ip);
// Mostrar que hemos terminado el escaneo.
if (result.Errors != null)
Console.WriteLine("[x] Ocurrió un error durante el escaneo.");
else
Console.WriteLine("[+] " + ip + " ha sido escaneado exitosamente!")
// Permitir al usuario salir en cualquier momento.
Console.Read();
}
}
}
Otra forma, que es mi método preferido de operación, es crear un objeto Scanner y suscribirse a los Manejadores de Eventos de cosas como ScanAsyncProgressChanged o ScanAsyncComplete, de esa manera tengo control total sobre mis métodos asíncronos; puedo controlar cómo sus estados de progreso afectan mi aplicación y así sucesivamente; por ejemplo:
using System;
using System.Threading.Tasks;
using Forerunner; // Recuerda importar nuestra biblioteca.
namespace Example
{
class Program
{
static void Main(string[] args)
{
// Nuestra IP que queremos escanear.
string ip = "192.168.1.1";
// Configurar nuestro objeto scanner.
Scanner s = new Scanner();
s.ScanAsyncProgressChanged += new ScanAsyncProgressChangedHandler(ScanAsyncProgressChanged);
s.ScanAsyncComplete += new ScanAsyncCompleteHandler(ScanAsyncComplete);
// Iniciar una nueva tarea de escaneo con nuestra ip.
TaskFactory task = new TaskFactory();
task.StartNew(() => s.ScanAsync(ip));
// Permitir al usuario salir en cualquier momento.
Console.Read();
}
static void ScanAsyncProgressChanged(object sender, ScanAsyncProgressChangedEventArgs e)
{
// Hacer algo aquí con e.Progress, o podrías dejar este evento
// sin suscribir para no tener que hacer nada.
}
static void ScanAsyncComplete(object sender, ScanAsyncCompleteEventArgs e)
{
// Hacer algo con el IPScanObject, es decir, e.Result.
if (e.Result.Errors != null)
Console.WriteLine("[x] Ocurrió un error durante el escaneo.");
else
Console.WriteLine("[+] " + e.Result.IP + " ha sido escaneado exitosamente!")
}
}
}
Ya sé lo que estás pensando. ¿Golpeo de puertos? Sí y no. El término no significa golpeo de puertos en el sentido tradicional de conectarse a través de un conjunto predefinido de puertos, sino más bien solo verificar si algún puerto está realmente abierto. Literalmente es "golpear" un puerto en todos los sentidos de la palabra al intentar conectarse a cada puerto y enviar datos. Al igual que con el escaneo de IP, el golpeo de puertos utiliza un objeto personalizado llamado "Port Knock Scan Object" o PKScanObject para abreviar. El PKScanObject en realidad contiene una lista de PKServiceObjects que a su vez contienen los datos de nuestros puertos; el objeto de servicio contiene las siguientes propiedades:
El golpeo de puertos es similar al escaneo de IP. Primero, crea un objeto Scanner. A continuación, crea un nuevo PKScanObject y asígnelo al método PortKnock con la IP de tu elección, luego muestra tus resultados; por ejemplo:
using System;
using Forerunner; // Recuerda importar nuestra biblioteca.
namespace Example
{
class Program
{
static void Main(string[] args)
{
// Nuestra IP que queremos escanear.
string ip = "192.168.1.1";
// Crear un nuevo objeto scanner.
Scanner s = new Scanner();
// Crear un nuevo objeto de escaneo y realizar un escaneo.
PKScanObject result = s.PortKnock(ip);
// Mostrar que hemos terminado el escaneo.
if (result.Errors != null)
Console.WriteLine("[x] Ocurrió un error durante el escaneo.");
else
Console.WriteLine("[+] " + ip + " ha sido escaneado exitosamente!")
// Mostrar nuestros resultados.
foreach (PKServiceObject port in result.Services)
{
Console.WriteLine("[+] IP: " + port.IP + " | " +
"Port: " + port.Port.ToString() + " | " +
"Protocol: " + port.Protocol.ToString() + " | " +
"Status: " + port.Status.ToString());
}
// Permitir al usuario salir en cualquier momento.
Console.Read();
}
}
}
Por último, te mostraré un ejemplo simple de golpeo de puertos de forma asíncrona. Es esencialmente lo mismo que el golpeo de puertos síncrono excepto por el hecho de que puedes usar eventos a tu favor. Puedes obtener actualizaciones de progreso sin tener que preocuparte por que las interfaces de usuario se bloqueen o que los sistemas estén en un estado bloqueado; por ejemplo:
using System;
using System.Threading.Tasks;
using Forerunner; // Recuerda importar nuestra biblioteca.
namespace Example
{
class Program
{
static void Main(string[] args)
{
// Nuestra IP que queremos escanear.
string ip = "192.168.1.1";
// Configurar nuestro objeto scanner.
Scanner s = new Scanner();
s.PortKnockAsyncProgressChanged += new PortKnockAsyncProgressChangedHandler(PortKnockAsyncProgressChanged);
s.PortKnockAsyncComplete += new PortKnockAsyncCompleteHandler(PortKnockAsyncComplete);
// Iniciar una nueva tarea de escaneo con nuestra ip.
TaskFactory task = new TaskFactory();
task.StartNew(() => s.PortKnockAsync(ip));
// Permitir al usuario salir en cualquier momento.
Console.Read();
}
static void PortKnockAsyncProgressChanged(object sender, PortKnockAsyncProgressChangedEventArgs e)
{
// Mostrar nuestro progreso para saber el ETA.
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)
{
// Decir al usuario que el golpeo de puertos ha terminado.
Console.WriteLine("[+] Golpeo de Puertos Completo!");
// Verificar si se resolvió un error.
if (e.Result == null)
Console.WriteLine("[X] El golpeo de puertos no devolvió ningún dato!");
else
{
// Verificar si tenemos algún puerto registrado.
if (e.Result.Services.Count == 0)
Console.WriteLine("[!] No había puertos abiertos durante el golpeo.");
else
{
// Mostrar nuestros puertos y sus detalles.
foreach (PKServiceObject port in e.Result.Services)
{
Console.WriteLine("[+] IP: " + port.IP + " | " +
"Port: " + port.Port.ToString() + " | " +
"Protocol: " + port.Protocol.ToString() + " | " +
"Status: " + port.Status.ToString());
}
}
}
}
}
}
Icono: monkik
https://www.flaticon.com/authors/monkik
Copyright © ∞ Jason Drawdy
Todos los derechos reservados.
La Licencia MIT (MIT)
Por la presente se otorga permiso, sin costo, a cualquier persona que obtenga una copia de este software y los archivos de documentación asociados (el "Software"), para tratar el Software sin restricción, incluyendo sin limitación los derechos para usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y/o vender copias del Software, y para permitir a las personas a quienes se les proporcione el Software hacerlo, sujeto a las siguientes condiciones:
El aviso de copyright anterior y este aviso de permiso se incluirán en todas las copias o partes sustanciales del Software.
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DEL COPYRIGHT SERÁN RESPONSABLES POR CUALQUIER RECLAMO, DAÑO U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN DE CONTRATO, AGRAVIO O DE OTRA MANERA, QUE SURJA DE, FUERA O EN CONEXIÓN CON EL SOFTWARE O EL USO U OTRAS NEGOCIACIONES EN EL SOFTWARE.
Excepto según lo contenido en este aviso, el nombre del titular del copyright anterior no se utilizará en publicidad ni para promocionar la venta, uso u otras transacciones en este Software sin autorización previa por escrito.