项目实习(四)多线程端口扫描器

这次是大学期间第四次项目实习,主要是利用C#技术设计一个简单的多线程端口扫描器,能够扫描网段内的各端口信息。

设计任务及目标

本次项目实习的任务是设计并实现一个简单的端口扫描器,它通过与目标主机 TCP/IP端口建立连接并请求某些服务,记录目标主机的应答,分析目标主机相关信息,从而发现目标主机某些内在的安全弱点。即实现一个端口扫描程序,判断指定的主机有哪些端口可以提供服务, 并把扫描得知的结果记录下来并显示出来。

需求分析

二十一世纪是信息化、网络化的世纪,信息是社会发展的重要资源。信息安全保障能力是一个国家综合国力、经济竞争实力和生存能力的重要组成部分,是世界各国在奋力攀登的制高点。国际标准化组织(ISO)对计算机系统安全的定义是:为数据处理系统建立和采用的技术和管理的安全保护,保护计算机硬件,软件和数据不因偶然和恶意的原因遭到破坏,更改和泄露。由此可以将计算机网络的安全理解为:通过采用各种技术和管理措施,使网络系统正常运行,从而确保网络数据的可用性、完整性和保密性。所以,建立网络安全保护措施的目的是确保经过网络传输和交换的数据不会发生增加、修改、丢失和泄露等。网络安全包括技术领域和非技术领域两大部分:非技术领域包括一些制度,政策,管理,安全意识,实体安全等方面的内容;技术领域包括隐患扫描,防火墙,入侵检测,访问控制,虚拟专用网,CA认证,操作系统等方面的内容。这些技术的目标是保证信息的可控性,可用性,保密性,完整性,和不可抵赖性。其中端口扫描属于安全探测技术范畴,对应于网络攻击技术中的网络信息收集技术。

基本介绍

  1. 端口定义
    首先先明确端口的定义。端口是由计算通信协议TCP/IP协议定义的。其中规定,用IP地址和端口作为套接字,它代表TCP链接的一个连接端,一般称为socket,具体来说,就是用[ip:端口]来定位一台主机中的进程。可以做这样的比喻,端口相当于两台计算机进程间的大门,可随便定义,其目的只是为了让两台计算机能找到对方的进程。计算机就想一座大楼,这个大楼有好多入口(端口),进到不同的入口中就可以找到不同的公司(进程)。我们这里所说的端口,不是计算机硬件的 i/o端口,而是软件形式上的概念。服务器可以向外提供多种服务,比如,一台服务器可以同时是 web服务器,也可以是 ftp服务器,同时,它也可以是邮件服务器。为什么一台服务器可以同时提供那么多的服务呢?其中一个很主要的方面,就是各种服务采用不同的端口分别提供不同的服务。根据提供服务类型的不同,端口分为两种,一种是 tcp端口,一种是 udp端口。计算机之间相互通信的时候,分为两种方式:一种是发送信息以后, 可以确认信息是否到达,也就是有应答的方式,这种方式大多采用tcp 协议;一种是发送以后就不管了,不去确认信息是否到达,这种方式大多采用 udp协议。对应这两种协议的服务提供的端口,也就分为 tcp端口和 udp端口。这样,入侵者可以通过扫描器对目标主机的端口进行扫描,即可确定哪些端口是开放的,包括网络协议和各种应用监听的窗口。从开放的端口,入侵者可以知道目标主机大致提供了哪些服务,进而猜测可能存在的漏洞,进而进行攻击。
  2. 常见端口介绍
    端口:21。服务:FTP
    说明:FTP服务器所开放的端口,用于上传,下载。最常见的攻击者用于寻找打开 anonymous的FTP 服务器的方法。这些服务器带有可读写的目录。
    端口:23。服务:Telnet
    说明:远程登录,入侵者在搜索远程登录 UNIX 的服务。大多数情况下扫描这一端口是为了找到机器运行的操作系统。还有使用其他技术,入侵者也会找到密码。
    端口:25。服务:SMTP
    说明:SMTP服务器所开放的端口,用于发送邮件。入侵者寻找 SMTP 服务器是为了传递他们的 SPAM。入侵者的帐户被关闭,他们需要连接到高带宽的 E-MAIL 服务器上,将简单的信息传递到不同的地址。
    端口:53。服务:DNS
    说明:DNS服务器所开放的端口,入侵者可能是试图进行区域传递(TCP),欺骗DNS(UDP)或隐藏其他的通信。因此防火墙常常过滤或记录此端口。
    端口:80。服务:HTTP
    说明:用于网页浏览。
    端口:110。服务:POP3
    说明:POP3 用于客户端访问服务器端的邮件服务。POP3服务有许多公认的弱点。关于用户名和密码交换缓冲区溢出的弱点至少 有20个(这意味着Hacker可以在真正登陆前进入系统)。成功登陆后还有其它缓冲区溢出错误。
    端口:443。服务:HTTPS
    说明:443端口即网页浏览端口,主要是用于HTTPS服务,是提供加密和通过安全端口传输的另一种HTTP。在一些对安全性要求较高的网站,比如银行、证券、购物等,都采用HTTPS服务,这样在这些网站上的交换信息其他人都无法看到,保证了交易的安全性。
  3. 扫描技术
    随着 Internet 的不断发展,信息技术已成为促进经济发展,社会进步的巨大推动力。端口扫描技术是网络安全扫描技术一个重要的网络安全技术。与防火墙,入侵检测系统互相配合,能够有效提高网络的安全性。通过扫描能自动检测远端或本地主机系统信息,包括主机的基本信息(如计算机名、域名、组名、操作系统型等),服务信息,用户信息以及漏洞信息,它的重要性在于能够对网络进行安全评估,及时发现安全隐患,防患于未然。网络的安全状况取决于网络中最薄弱的环节,任何疏忽都有可能引入不安全的因素,最有效的方法是定期对网络系统进行安全分析,及时发现并修正存在的脆弱,保证系统安全。国内的扫描技术是在国外的扫描器基础上发展起来的。其中有一些专门从事安全技术的公司。这些公司的扫描器以硬件为主,其特点是执行速度快,不像软件一样受到安装主机系统的限制。然而对于更多的基于主机的端口扫描而言,简单,实用,可靠才是它们的长处。扫描器是一种自动检测远程或本地主机安全性弱点的程序,通过使用扫描器你可以不留痕迹的发现远程服务器的各种 TCP 端口的分配。这就能让我们间接的或直观的了解到远程主机所存在的安全问题。为了保证网络中计算机的安全性,必须采取主动策略,快速,及时,准确,安全的检测出网络中计算机及防火墙开放的和未开放的端口。计算机端口扫描技术就是这种主动防御策略实现的重要技术手段。扫描器采用模拟攻击的形式对目标可能存在的已知安全漏洞进行逐项检查。目标可以是工作站、服务器、交换机、数据库应用等各种对象。然后根据扫描结果向系统管理员提供周密可靠的安全性分析报告,为提高网络安全整体水平产生重要依据。在网络安全体系的建设中,安全扫描工具花费低、效果好、见效快、与网络的运行相对对立、安装运行简单,可以大规模减少安全管理员的手工劳动,有利于保持全网安全政策的统一和稳定。
  4. 扫描原理
    端口扫描的原理也不复杂,简单来说,就是通过向目的端口发送探测数据包,根据收到的响应来判断端口的状态。
  5. 扫描类型
    端口扫描的类型也有很多,常见的就有TCP SYN扫描,TCP connect扫描,秘密扫描,其他扫描。此次我选择的是第二种扫描方式:TCP connect扫描。我们可以利用系统提供的connect()用来与每一个目标计算机的端口进行连接。该扫描的优点:实现简单,对操作者的权限没有严格要求。另一优点是扫描速度快。如果对每个目标端口以线性的方式,使用单独的connect()调用,可以通过同时打开多个套接字,从而加速扫描。缺点就是会在目标主机的日志记录中留下痕迹,易被发现,并且数据包会被过滤掉。目标主机的logs文件会显示一连串的连接和连接出错的服务信息,并且能很快地使它关闭。
  6. 多线程技术
    每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU。多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。

系统分析

本次课设设计的是一个简单的端口扫描器,该扫描器应具备的基本功能有:
(1)支持多线程模式扫描端口;
(2)能对单个指定主机进行扫描或扫描指定网段内的主机;
(3)能扫描特定的部分端口或对指定的端口段内的端口进行逐个扫描;
(4)能够显示所开放端口的服务名称。所使用的扫描方法为TCP connect扫描,该扫描的具体实现过程为:TCP connect端口扫描服务端与客户端建立连接成功(目标端口开放)的过程如下: ① Client端发送SYN;② Server端返回SYN/ACK,表明端口开放;③ Client端返回ACK,表明连接已建立;④ Client端主动断开连接。
该扫描器工作流程为:
(1)先确定扫描范围。即扫描目的主机的IP地址和需要扫描的端口范围;
(2)确定好后给扫描器分配好线程数;
(3)开始扫描端口,结束后将扫描结果显示出来,包括开放和未开放的端口,若端口开放则还可显示该端口提供的服务。
(4)扫描结束。

总体设计

  1. 主界面设计
    该端口扫描器是在VS2015环境下开发的,并使用C#创建主要界面和编写主要功能函数。
    端口扫描器主界面如下:
    项目实习(四)多线程端口扫描器_第1张图片
    主界面布局主要有:IP地址设置,端口范围选择,线程数设置(默认20),扫描进度条,扫描过程显示以及扫描结果显示,底部的当前扫描时间显示,还有开始扫描按钮和停止扫描按钮。此外还有三个重要选项框,分别是单主机扫描模式选择,单端口扫描模式选择,只显示开放端口选择。
    当选中单主机扫描模式时,IP地址设置的第二个编辑框消失:
    单主机扫描
    当选中单端口扫描模式时,端口范围设置的第二个编辑框消失:
    单端口扫描
  2. 扫描器工作流程图
    项目实习(四)多线程端口扫描器_第2张图片
    说明:该扫描器可以对单个主机单个端口进行扫描也可以对网段内主机和范围内端口进行逐个扫描,确定扫描IP和扫描端口后点击开始扫描按钮即可对相应IP下的端口进行侦听,并返回端口状态,如果端口开放则同时返回端口服务,扫描结束后线程停止。

详细设计

  1. 主要数据结构
private string ipStart; //起始IP地址
private string ipEnd; //结束IP地址
private int portStart; //开始端口
private int portEnd; //结束端口
private int numThread=20; //分配线程数,默认为20
private int overtime=20; //超时限制20ms
private Thread t; //定义一个线程
rivate Thread scanthread; //端口扫描线程
private bool[] done = new bool[65536];  
List str; //扫描结果集
  1. 主要函数说明
private void Form1_Load(object sender, EventArgs e)//主界面加载函数
private void checkBox1_CheckedChanged(object sender, EventArgs e)
//单主机扫描模式选择函数
private void checkBox2_CheckedChanged(object sender, EventArgs e)
//单端口扫描模式选择函数
private void button1_Click(object sender, EventArgs e)
//开始扫描按钮函数
private void button2_Click(object sender, EventArgs e)
//停止扫描按钮函数
public void wait()//扫描IP地址函数
public string State(int i)//判断端口状态函数
public string Service(int i)//返回开放端口服务函数
public void Scan(object Point)//扫描端口函数
  1. 扫描IP函数
    利用PingReply对象试探目标主机,如果超时则表示不可达,否则连通
//利用PingReply对象试探目标主机
                Ping ping = new Ping();  //初始化一个Ping类实例
                PingReply reply = ping.Send(IPAddress.Parse(ip + q), overTime);  //调用同步Send方法发送消息,将返回结果保存至PingReply实例
                if (reply.Status == IPStatus.Success)  //如果能够Ping通,则说明远端主机开放
                {
                    richTextBox1.Text += "   IP地址: " + ip + q + "\n";   
                    IPHostEntry host = Dns.GetHostEntry(ip + q);  //取得该IP主机信息
                    richTextBox1.Text += "   主机名: "+ host.HostName + "\n";
                }
                else
                {
                    listBox1.Items.Add(ip + q + "          " + "-" + "       " + "-" + "   " + "              - \n");
                    richTextBox1.Text += ip + q + "   不可达\n";
                    continue;
                }
//Ping结束
  1. 扫描端口函数
    利用系统提供的connect()函数用来与每一个目标计算机的端口进行连接。
public void Scan(object Point)
        {
            IPEndPoint IPPoint = (IPEndPoint)Point; //使用IPEndPoint类对象获取终结点的IP地址和端口号
            try
            {
                TcpClient tcp = new TcpClient(); //创建一个TcpClient类
                tcp.Connect(IPPoint); //调用Connect方法,使用指定的IP地址将客户端连接到TCP主机上
                if (tcp.Connected)  //如果连接上,证明此端口为开放状态
                    str.Add(Convert.ToString(IPPoint.Port));
            }
            catch
            {
                ;
            }
        }
  1. 多线程函数
//IP存在,则开子线程开始端口扫描,端口数由textbox1,textbox2的差值决定
                Thread[] tharr;  //创建多线程
                if (numThread < (portEnd - portStart + 1))
                {
                    tharr = new Thread[portEnd - portStart + 1];
                }
                else
                {
                    tharr = new Thread[numThread];
                }
bool iscon = true;  //第一个线程等待时间
                for (int i = 0; i < tharr.Length; i++)
                {
                    if (tharr[i] == null)  //如果端口扫不到,说明未开放,跳过继续
                        continue;
                    while (tharr[i].IsAlive && iscon)  //端口存在,对端口超时设置时间(目前200毫秒),一直等待此ip所有线程执行完毕才扫描下个ip
                    {
                        Thread.Sleep(200);
                        iscon = false;  //第一个线程给200ms等待时间,其他线程由于同步执行的,所以没等待时间了,如果线程还没执行完,说明此端口不可达
                    }
                }

使用说明

运行程序启动端口扫描器,进入扫描器主界面:
项目实习(四)多线程端口扫描器_第3张图片
(1)IP段端口扫描
当需要扫描的是IP地址段时,按界面提示输入IP地址段范围以及需要扫描的端口范围,然后可以选择只显示开放端口,完成后点击开始扫描按钮,测试结果如下:
项目实习(四)多线程端口扫描器_第4张图片
测试的IP段为10.21.123.226-10.21.123.228,扫描的端口范围是0-300号端口,分配线程数为20,点击开始扫描按钮后等待数秒扫描完成。可以看到扫描各IP地址的端口的具体过程,以及扫描结果显示的端口状态和它们提供的服务。

(2)单主机单端口扫描模式
当需要扫描的是单主机时,选择单主机模式选项,端口范围也选择单端口模式,完成后点击开始扫描按钮,测试结果如下:
项目实习(四)多线程端口扫描器_第5张图片
测试的IP地址为10.21.123.226,端口选择139端口,分配线程数为20.点击开始扫描按钮后等待数秒扫描完成。可以看到扫描结果为139端口状态为open,该端口提供的是NetBIOS/SMB服务。

(3)只显示开放端口
该扫描器还可以只显示开放端口以及它们所提供的服务,测试结果如下:
项目实习(四)多线程端口扫描器_第6张图片
可以看到10.21.123.226的0-300端口中开放的只有80,135,139端口,提供的服务分别是HTTP协议代理服务,RPC(远程过程调用)服务,NetBIOS/SMB服务。

(4)错误提示
当不按照要求输入相应的IP地址和端口范围时,扫描器将出现错误提示,如下所示:

项目实习(四)多线程端口扫描器_第7张图片

总结

  1. 任务完成情况
    本次设计任务的基本要求已经完成,即实现了一个简单的端口扫描器,能对单IP地址或IP地址段的单端口或端口范围进行扫描,并对开放端口显示它们所提供的服务。
  2. 特色与不足
    该端口扫描器具有以下几个特色:
    (1)扫描器底部有当前的扫描时间;
    (2)可以切换单主机扫描模式和单端口扫描模式;
    (3)可以设置只显示开放端口;
    (4)有扫描进度条较为直观的展示当前的扫描进度;
    (5)有错误提示。
    不足的地方也有不少,比如界面有点简单,可以说是简陋,没有太多自己的设计。还有由于采用的是TCP connect扫描方式,所以不可避免的有它自身带有的缺陷,即容易被防火墙过滤掉。
  3. 所遇到的问题
    本次课程设计中自己也遇到了不少问题,比如一开始只是设想采用TCP connect这种扫描方式,但具体代码方面如何实现却是没有头绪。还比如多线程的实现又是具体怎么操作。等等这些,自己只能通过网上跟参考书上的资料一点一点摸索。

参考文献

[1] 谢希仁.《计算机网络》[M].电子工业出版社,2013.6第6版
[2] 明日科技.《C#从入门到精通》[M].清华大学出版社,2012.9第3版
[3] 邓宇军.《C# 2.0程序设计教程》[M].清华大学出版社,2005.12第3版
[4] 肖微.《端口扫描技术的原理》[J].网络安全技术及应用,2006,(7):32-41

你可能感兴趣的:(项目实习(四)多线程端口扫描器)