8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png
一种支持多线程,Ping检测和数据提取的快速可扩展网络扫描库
aiyun 2020-7-3

图片1.png

先行者

Forerunner是一个快速的,轻量级的和可扩展的网络库,它可以帮助研究人员开发一个以网络为中心的健壮的应用程序,比如说IP扫描器,端口扫描器,客户端以及服务器等等。当前版本的Forerunner,能够支持针对端口和IP地址进行同步或反向扫描,并收集关于目标设备的定位信息和终端信息,并说IP地址是否在线以及设备的物理MAC地址等等。这个库是一个完全面向对象和基于事件的库,这意味着扫描数据都将包含在精心编制的“ scan”对象之中,而这些对象试图处理覆盖从结果到异常的所有数据。

工具依赖

1、.NET Framework v4.6.1

功能介绍

方法名 描述 使用样例
扫瞄 扫描单个IP地址并收集信息 扫描(“ 192.168.1.1”);
扫描范围 扫描IP地址范围并收集信息 ScanRange(“ 192.168.1.1”,“ 192.168.1.255”)
扫描清单 扫描IP地址列表并收集信息 ScanList(“ 192.168.1.1,192.168.1.2,192.168.1.3”)
PortKnock 扫描个别IP地址的所有端口 PortKnock(“ 192.168.1.1”);
PortKnockRange 扫描IP地址范围内的所有端口 PortKnockRange(“ 192.168.1.1”,“ 192.168.1.255”);
PortKnockList 扫描IP地址列表中的所有端口 PortKnockList(“ 192.198.1.1,192.168.1.2,192.168.1.3”);
IsHostAlive 每多少毫米扫描一台主机N次 IsHostAlive(“ 192.168.1.1”,5,1000);
GetAveragePingResponse 获取目标主机的平均ping 响应 GetAveragePingResponse(“ 192.168.1.1”,5,1000);
港口开放 通过TCP&UDP来ping临时端口 IsPortOpen(“ 192.168.1.1”,45000,new TimeSpan(1000),false);

工具下载

广大研究人员可以使用以下命令将项目源码克隆至本地:

git clone https://github.com/jasondrawdy/Forerunner.git

工具使用样例

IP扫描

在网络安全研究过程中,扫描一个网络是一种非常常见的任务了,因此我们应该通过简单的方法来实现这个目标,以方便未来的安全研究人员去做同样的事情。Forerunner是一个完全面向对象的功能库,因此非常适合所谓的“即插即用”的情况。其中,用于IP扫描的对象被称为IPScanObject,这个对象包含了以下几种参数属性:

Address (String)

IP (IPAddress)

Ping (Long)

Hostname (String)

MAC (String)

isOnline (Bool)

Errors (Exception)

有了对象的概念之后,我们可以尝试创建一个新的对象,并使用它来执行一次扫描任务。最简单的方法就是先创建一个新的Scanner对象,并通过它来访问我们的扫描方法。创建一个IPScanObject对象,并使用目标IP地址来设置其Scan方法。

同步扫描:

using System;

using Forerunner; // Remember to import our library.

namespace Example

{

    class Program

    {

        static void Main(string[] args)

        {

            // Our IP we would like to scan.

            string ip = "192.168.1.1";

            // Create a new scanner object.

            Scanner s = new Scanner();

            // Create a new scan object and perform a scan.

            IPScanObject result = s.Scan(ip);

            // Output that we have finished the scan.

            if (result.Errors != null)

                Console.WriteLine("[x] An error occurred during the scan.");

            else

                Console.WriteLine("[+] " + ip + " has been successfully scanned!")

            // Allow the user to exit at any time.

            Console.Read();

        }

    }

}

另一种方法是创建Scanner对象并订阅ScanAsyncProgressChangedScanAsyncComplete之类的事件处理程序,这样我可以完全控制异步方法,我可以控制其影响应用程序的进度状态等等。

初步扫描:

using System;

using System.Threading.Tasks;

using Forerunner; // Remember to import our library.

namespace Example

{

    class Program

    {

        static void Main(string[] args)

        {

            // Our IP we would like to scan.

            string ip = "192.168.1.1";

            // Setup our scanner object.

            Scanner s = new Scanner();

            s.ScanAsyncProgressChanged += new ScanAsyncProgressChangedHandler(ScanAsyncProgressChanged);

            s.ScanAsyncComplete += new ScanAsyncCompleteHandler(ScanAsyncComplete);

            // Start a new scan task with our ip.

            TaskFactory task = new TaskFactory();

            task.StartNew(() => s.ScanAsync(ip));

            // Allow the user to exit at any time.

            Console.Read();

        }

        static void ScanAsyncProgressChanged(object sender, ScanAsyncProgressChangedEventArgs e)

        {

            // Do something here with e.Progress, or you could leave this event

            // unsubscribed so you wouldn't have to do anything.

        }

        static void ScanAsyncComplete(object sender, ScanAsyncCompleteEventArgs e)

        {

           // Do something with the IPScanObject aka e.Result.

            if (e.Result.Errors != null)

                Console.WriteLine("[x] An error occurred during the scan.");

            else

                Console.WriteLine("[+] " + e.Result.IP + " has been successfully scanned!")

        }

    }

}

范围扫描

跟IP地址扫描一样,端口扫描可以通过一组预定义的端口来尝试进行端口连接,并检查目标端口是否真正开启。尝试通过与每个端口进行连接并发送数据包来进行端口检测。这个功能实际上是通过一个自定义对象来实现的,即“ Port Knock Scan Object”,简称为“ PKScanObject”。  PKScanObject对象实际上包含一个PKServiceObjects列表,该列表将保存返回的所有端口数据,该服务对象包含以下参数属性:

IP (String)

Port (Int)

Protocol (PortType)

Status (Bool)

首先,我们需要创建一个Scanner对象,然后创建一个新的PKScanObject对象并使用目标IP到设置PortKnock方法,然后工具将显示扫描结果给我们。

同步扫描:

using System;

using Forerunner; // Remember to import our library.

namespace Example

{

    class Program

    {

        static void Main(string[] args)

        {

            // Our IP we would like to scan.

            string ip = "192.168.1.1";

            // Create a new scanner object.

            Scanner s = new Scanner();

            // Create a new scan object and perform a scan.

            PKScanObject result = s.PortKnock(ip);

            // Output that we have finished the scan.

            if (result.Errors != null)

                Console.WriteLine("[x] An error occurred during the scan.");

            else

                Console.WriteLine("[+] " + ip + " has been successfully scanned!")

           // Display our results.

           foreach (PKServiceObject port in result.Services)

           {

                Console.WriteLine("[+] IP: " + port.IP + " | " +

                                  "Port: " + port.Port.ToString() + " | " +

                                  "Protocol: " + port.Protocol.ToString() + " | " +

                                  "Status: " + port.Status.ToString());

           }

           // Allow the user to exit at any time.

           Console.Read();

        }

    }

}

初步扫描:

using System;

using System.Threading.Tasks;

using Forerunner; // Remember to import our library.

namespace Example

{

    class Program

    {

        static void Main(string[] args)

        {

            // Our IP we would like to scan.

            string ip = "192.168.1.1";

            // Setup our scanner object.

            Scanner s = new Scanner();

            s.PortKnockAsyncProgressChanged += new PortKnockAsyncProgressChangedHandler(PortKnockAsyncProgressChanged);

            s.PortKnockAsyncComplete += new PortKnockAsyncCompleteHandler(PortKnockAsyncComplete);

            // Start a new scan task with our ip.

            TaskFactory task = new TaskFactory();

            task.StartNew(() => s.PortKnockAsync(ip));

            // Allow the user to exit at any time.

            Console.Read();

        }

        static void PortKnockAsyncProgressChanged(object sender, PortKnockAsyncProgressChangedEventArgs e)

        {

            // Display our progress so we know the 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)

        {

            // Tell the user that the port knock was complete.

            Console.WriteLine("[+] Port Knock Complete!");

            // Check if we resolved an error.

            if (e.Result == null)

                Console.WriteLine("[X] The port knock did not return any data!");

            else

            {

                // Check if we have any ports recorded.

                if (e.Result.Services.Count == 0)

                    Console.WriteLine("[!] No ports were open during the knock.");

                else

                {

                    // Display our ports and their details.

                    foreach (PKServiceObject port in e.Result.Services)

                    { 

                        Console.WriteLine("[+] IP: " + port.IP + " | " +

                                          "Port: " + port.Port.ToString() + " | " +

                                          "Protocol: " + port.Protocol.ToString() + " | " +

                                          "Status: " + port.Status.ToString());

                    }

                }

            }

        }

    }

}

许可证协议

Forerunner项目的开发和发布遵循MIT开源许可证协议。

项目地址

先行者:【GitHub传送门

参考来源

jasondrawdy

最新回复 (0)
    • Ai云
      2
        立即登录 立即注册
返回