Forerunner
Forerunner是一个快速的、轻量级的并且可扩展的网络库,它可以帮助研究人员开发一个以网络为中心的健壮的应用程序,比如说IP扫描器、端口扫描器、客户端以及服务器等等。当前版本的Forerunner,能够支持针对端口和IP地址进行同步或异步扫描,并收集关于目标设备的地理位置信息和终端信息,比如说IP地址是否在线以及设备的物理MAC地址等等。这个库是一个完全面向对象和基于事件的库,这意味着扫描数据都将包含在精心编制的“scan”对象之中,而这些对象旨在处理涵盖从结果到异常的所有数据。
工具依赖
1、.NET Framework v4.6.1
功能介绍
方法名 | 描述 | 使用样例 |
---|---|---|
Scan | 扫描单个IP地址并收集信息 | Scan("192.168.1.1"); |
ScanRange | 扫描IP地址范围并收集信息 | ScanRange("192.168.1.1", "192.168.1.255") |
ScanList | 扫描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); |
IsPortOpen | 通过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
对象并订阅ScanAsyncProgressChanged
或ScanAsyncComplete
之类的事件处理程序,这样我可以完全控制异步方法,我可以控制它们影响应用程序的进度状态等等。
异步扫描:
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开源许可证协议。
项目地址
Forerunner:【GitHub传送门】
参考来源
猜你还喜欢
- 12-09Kali Linux字典生成工具Cewl使用全指南
- 01-12开源安全情报引擎Critical Stack使用入门
- 05-02分享一款基于Pocsuite的漏洞扫描系统
- 01-04经验分享 | Burpsuite抓取非HTTP流量
- 05-02Burpsuit结合SQLMapAPI产生的批量注入插件
- 11-25工具 | 手把手教你信息收集之子域名收集器
- 12-08burpsuite_pro_v1.7.11破解版(含下载地址)
- 11-05工具分享 | Maltego4.0.11中文汉化版
- 05-30最新BurpSuite 1.7.32 破解版[注册机]下载【无后门版】
- 07-29IBM Rational AppScan 9.0.3 (含下载)
- 随机文章
-
- 浅谈大型互联网的安全
- PHP安全编码
- 得到内网域管理员的5种常见方法
- 通杀绝⼤多数交易平台的Tradingview Dom XSS漏洞分析
- 如何使用Windows Library文件进行持久化
- 一键安装藏隐患,phpStudy批量入侵的分析与溯源
- meterpreter必知必会的15个命令
- 记一次远程命令执行漏洞的挖掘过程
- 赛门铁克邮件网关身份验证绕过漏洞(CVE-2018-12242)分析
- Swap Digger:一款功能强大的自动提取并寻找Linux用户凭证的工具
- 漏洞预警 | CVE-2018-14665 X.Org提权漏洞
- 调查 | 黑客将Python作为攻击编码语言的首选
- 探寻Metasploit Payload模式背后的秘密
- PHP代码审计实战思路浅析
- WebExec漏洞原理与分析浅谈
- 使用DDL注入绕过Windows 10受控文件夹访问保护
- PwnedOrNot:用于查找邮件账户密码是否被泄漏的Python脚本
- 一把双刃剑?网络安全中AI该如何立足
- 现实版的黑客大战,这可能是中国黑客做过最燃的事情了
- GitHub关键字扫描开源工具推荐
- 热门文章
-
- 八年专业安全团队承接渗透入侵维护服务
- Emlog黑客站模板“Milw0rm”发布
- Stuxnet纪录片-零日 Zero.Days (2016)【中文字幕】
- SQLMAP的注入命令以及使用方法
- 白帽故事汇:网络安全战士从来不是「男生」的专利
- 编辑器漏洞手册
- web安全之如何全面发现系统后台
- 常见Web源码泄露总结
- 渗透测试培训(第五期)
- 深入理解JAVA反序列化漏洞
- cmseasy前台无需登录直接获取敏感数据的SQL注入(有POC证明)
- 网站后台登陆万能密码
- 黑麒麟2016渗透培训系列教程
- 破解emlog收费模板“Begin”
- 那些强悍的PHP一句话后门
- Android平台渗透测试套件zANTI v2.5发布(含详细说明)
- 渗透工具BackTrack与KaliLinux全套视频教程
- Python列为黑客应该学的四种编程语言之一 初学者该怎么学
- CVE-2017-11882漏洞复现和利用
- 恶意程序报告在线查询工具
文章存档
- 2021年3月(4)
- 2020年12月(4)
- 2020年11月(5)
- 2020年10月(8)
- 2020年9月(8)
- 2020年8月(20)
- 2020年7月(47)
- 2020年6月(70)
- 2020年5月(41)
- 2020年4月(21)
- 2020年3月(120)
- 2020年2月(26)
- 2019年12月(12)
- 2019年11月(13)
- 2019年10月(17)
- 2019年9月(15)
- 2019年8月(13)
- 2019年7月(15)
- 2019年6月(15)
- 2019年5月(19)
- 2019年4月(23)
- 2019年3月(19)
- 2019年2月(11)
- 2019年1月(29)
- 2018年12月(24)
- 2018年11月(56)
- 2018年10月(79)
- 2018年9月(20)
- 2018年8月(17)
- 2018年7月(16)
- 2018年6月(7)
- 2018年5月(10)
- 2018年3月(6)
- 2018年2月(2)
- 2018年1月(11)
- 2017年11月(18)
- 2017年10月(6)
- 2017年9月(8)
- 2017年8月(7)
- 2017年7月(7)
- 2017年6月(15)
- 2017年5月(30)
- 2017年4月(7)
- 2017年3月(1)
- 2017年2月(4)
- 2017年1月(1)
- 2016年12月(3)
- 2016年11月(7)
- 2016年10月(6)
- 2016年9月(6)
- 2016年8月(102)
- 2016年7月(24)
- 2013年7月(1)
- 文章标签
-